#   Copyright (C) 2023, 2025  Kai Mertens <kmx@posteo.net>
#
#   This source describes Hardware of a Free Design for the Zerocat Mini
#   Machine Project and is licensed under the CERN-OHL-S v2.
#
#   You may redistribute and modify this source and make products using it under
#   the terms of the CERN-OHL-S v2 (https://ohwr.org/cern_ohl_s_v2.txt) or any
#   later version.
#
#   This source is distributed WITHOUT ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING
#   OF MERCHANTABILITY, SATISFACTORY QUALITY AND FITNESS FOR A PARTICULAR
#   PURPOSE. Please see the CERN-OHL-S v2 for applicable conditions.
#
#   Source location:   git://zerocat.org/zerocat/projects/zerocat-mini-machine.git
#
#   As per CERN-OHL-S v2 section 4, should You produce hardware based on this
#   source, You must where practicable maintain the Source Location visible on
#   the external case of the Zerocat Mini Machine Device or other products you
#   make using this source.


#   Usage
#   =====
#
#   To get an overview of targets, type:
#
#           make -C ../hardware help


#   Workaround for GNU Make < 4.3
#   =============================
#
#   Finalize commands within a $(shell) function with semicolon, e.g.:
#
#           $(shell echo;)


# Shell
SHELL                         := /bin/sh


# White Space
EMPTY                         :=
SPACE                         := $(EMPTY) $(EMPTY)
COMMA                         := ,
M5                            := ccccc
TAB1                          := $(SPACE)$(SPACE)$(SPACE)$(SPACE)


# Root Paths
ROOT                          := ../
ROOT_GIT                      := ../.git/
#   GNU Guix System ...
ROOT_GUIX                     := ../guix/
#   Code Sources ...
ROOT_SRC                      := ../src/
#   Documentation ...
ROOT_IMAGES                   := ../images/
ROOT_DOC                      := ../doc/
#   Artwork
ROOT_ARTWORK                  := ../artwork/
ROOT_ARTWORK_LOGO             := ../artwork/logo/
#   Hardware ...
ROOT_HW                       := ../hardware/
ROOT_HW_GSCHEM                := ../hardware/gschem/
ROOT_HW_LIBRECAD              := ../hardware/librecad/
ROOT_HW_OPENSCAD              := ../hardware/openscad/


# Standard Utilities
CD                            := $(shell command -v cd;)
CD_FLAGS                      :=
$(if $(strip $(CD)),,         $(error Cannot find cd utility))

CP                            := $(shell command -v cp;)
CP_FLAGS                      :=
$(if $(strip $(CP)),,         $(error Cannot find cp utility))

LN                            := $(shell command -v ln;)
LN_FLAGS                      := -s -f
$(if $(strip $(LN)),,         $(error Cannot find ln utility))

RM                            := $(shell command -v rm;)
RM_FLAGS                      := -f
$(if $(strip $(RM)),,         $(error Cannot find rm utility))

CAT                           := $(shell command -v cat;)
CAT_FLAGS                     :=
$(if $(strip $(CAT)),,        $(error Cannot find cat utility))

CUT                           := $(shell command -v cut;)
CUT_FLAGS                     := -d' '
$(if $(strip $(CUT)),,        $(error Cannot find cut utility))

GIT                           := $(shell command -v git;)
GIT_FLAGS                     :=
$(if $(strip $(GIT)),,        $(error Cannot find git utility))

SED                           := $(shell command -v sed;)
SED_FLAGS                     := -r
$(if $(strip $(SED)),,        $(error Cannot find sed utility))

SET                           := $(shell command -v set;)
SET_FLAGS                     := -f
$(if $(strip $(SET)),,        $(error Cannot find set utility))

TAR                           := $(shell command -v tar;)
TAR_FLAGS                     :=
$(if $(strip $(TAR)),,        $(error Cannot find tar utility))

DATE                          := $(shell command -v date;)
DATE_FLAGS                    := -R
$(if $(strip $(DATE)),,       $(error Cannot find date utility))

DIFF                          := $(shell command -v diff;)
DIFF_FLAGS                    :=
$(if $(strip $(DIFF)),,       $(error Cannot find diff utility))

ECHO                          := $(shell command -v echo;)
ECHO_FLAGS                    :=
$(if $(strip $(ECHO)),,       $(error Cannot find echo utility))

GREP                          := $(shell command -v grep;)
GREP_FLAGS                    :=
$(if $(strip $(GREP)),,       $(error Cannot find grep utility))

SORT                          := $(shell command -v sort;)
SORT_FLAGS                    := -u
$(if $(strip $(SORT)),,       $(error Cannot find sort utility))

UNIQ                          := $(shell command -v uniq;)
UNIQ_FLAGS                    :=
$(if $(strip $(UNIQ)),,       $(error Cannot find uniq utility))

WGET                          := $(shell command -v wget;)
WGET_FLAGS                    :=
$(if $(strip $(WGET)),,       $(error Cannot find wget utility))

FFMPEG                        := $(shell command -v ffmpeg;)
FFMPEG_FLAGS                  := -y
$(if $(strip $(FFMPEG)),,     $(error Cannot find ffmpeg utility))

PRINTF                        := $(shell command -v printf;)
PRINTF_FLAGS                  :=
$(if $(strip $(PRINTF)),,     $(error Cannot find printf utility))

MKTEMP                        := $(shell command -v mktemp;)
MKTEMP_FLAGS                  :=
$(if $(strip $(MKTEMP)),,     $(error Cannot find mktemp utility))

CONVERT                       := $(shell command -v convert;)
CONVERT_FLAGS                 :=
$(if $(strip $(CONVERT)),,    $(error Cannot find convert utility))

MARKDOWN                      := $(shell command -v markdown;)
MARKDOWN_FLAGS                :=
$(if $(strip $(MARKDOWN)),,   $(error Cannot find markdown utility))

LIBRECAD                      := $(shell command -v librecad;)
LIBRECAD_FLAGS                :=
$(if $(strip $(LIBRECAD)),,   $(error Cannot find librecad utility))

OPENSCAD                      := $(shell command -v openscad;)
OPENSCAD_FLAGS                :=
$(if $(strip $(OPENSCAD)),,   $(error Cannot find openscad utility))

GAF                           := $(shell command -v gaf;)
GAF_FLAGS                     :=
$(if $(strip $(GAF)),,        $(error Cannot find gaf utility))

SEQ                           := $(shell command -v seq;)
SEQ_FLAGS                     :=
$(if $(strip $(SEQ)),,        $(error Cannot find seq utility))


# Files
SCHEMATICS_GSCHEM             := $(wildcard $(ROOT_HW_GSCHEM)*.sch)


# Settings
PROJECT_TITLE                 := Zerocat Mini Machine
PROJECT_BRIEF                 := A word processing machine of supreme integrity.
MAKEFILE_TITLE                := Export CAD Images
PROJECT_REPO                  := git://zerocat.org/zerocat/projects/zerocat-mini-machine.git
PROJECT_NUMBER                := $(strip\
	$(shell\
		$(SET) $(SET_FLAGS)\
		&& $(GIT) $(GIT_FLAGS)\
			describe\
				--long\
				--always\
				--match v*\
		| $(SED) $(SED_FLAGS)\
			-e 's/(.*)(-g)([0-9a-f]*)/\1-\3/;'\
				-;\
	)\
)
PROJECT_BRANCH                := $(strip\
	$(shell\
		$(GIT) $(GIT_FLAGS)\
			branch\
		| $(SED) $(SED_FLAGS)\
			-e '/^\*/!d; s/^\* //;'\
				-;\
	)\
)


# Tinned Cans
define HEADER                 =
$(strip\
	$(ECHO) $(ECHO_FLAGS)    ""\
	&& $(ECHO) $(ECHO_FLAGS) "$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)"\
	&& $(ECHO) $(ECHO_FLAGS) "$(M5) $(PROJECT_TITLE)"\
	&& $(ECHO) $(ECHO_FLAGS) "$(M5) – $(PROJECT_BRIEF)"\
	&& $(ECHO) $(ECHO_FLAGS) "$(M5) $(MAKEFILE_TITLE)"\
	&& $(ECHO) $(ECHO_FLAGS) "$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)"\
)
endef
define HEADLINE               =
$(strip\
	$(ECHO) $(ECHO_FLAGS)    "$(M5) Process target “$@” $(M5)$(M5)"\
)
endef
define DONE                   =
$(strip\
	$(ECHO) $(ECHO_FLAGS)    "... end of target “$@”."\
	&& $(ECHO) $(ECHO_FLAGS) ""\
)
endef
define VIEWEXPORT             =
$(strip\
	$(OPENSCAD) $(OPENSCAD_FLAGS)\
		-o $@\
		$<\
		--view=axes,scales\
		--preview\
		--projection=$${camera[1]}\
		--colorscheme=Cornfield\
		--imgsize=2000,1125\
		--camera=$${camera[0]}\
		--autocenter\
		--export-format=png\
)
endef


# Tinned Cans: HTML_HEAD
define HTML_HEAD               =
$(strip\
	$(ECHO) $(ECHO_FLAGS)    "<head>" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=3.0, user-scalable=1\">" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "  <meta name=\"referrer\" content=\"origin\">" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "  <title>$(PROJECT_TITLE): Hardware - $@</title>" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "  <style type=\"text/css\">" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "    @charset "ISO-8859-1";" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "    @media all {" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "      html > body {" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        font-family:var(--font-mono, monospace);" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        font-size:large;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        line-height:140%;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        margin-top:3em;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        margin-bottom:5em;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        margin-left:5em;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        margin-right:8em;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        max-width:56em;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "      }" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "      h1,h2,h3,h4,h5,h6 {" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        line-height:200%;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        margin-top:2em;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        margin-bottom:2em;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "      }" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "    }" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "    @media all and (max-width:540px) {" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "      html > body {" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        margin-left:.6em;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        margin-right:.6em;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "      }" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "      ul { margin-left:-2em; }" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "    }" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "  </style>" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "</head>" >> $@\
)
endef


# Suffixes, to be checked for old fashioned suffix rules
.SUFFIXES :


# Intermediate Targets
#~ .INTERMEDIATE :


# Secondary Targets
#~ .SECONDARY :                  # Uncomment for debugging


# Phony Targets
.PHONY :\
	all\
	\
	hello\
	help\
	\
	docu\
	\
	gschem-images\
	dxf-views\
	dxf-convert\
	scad-views\
	\
	clean-animation-files\
	clean-gschem-images\
	clean


# Targets
#   default target
#     generate all documents
all : hello docu
	@$(HEADLINE)\
	&& $(MAKE)\
		gschem-images\
	&& $(MAKE)\
		dxf-views\
	&& $(MAKE)\
		dxf-convert\
	&& $(MAKE)\
		scad-views\
	&& $(MAKE)\
		$(ROOT_HW_OPENSCAD)chassis.ogg\
	&& $(DONE);

#   display greeting
#     provided with all, clean and help
hello :
	@$(HEADER)\
	&& $(DONE);

#   display help information
help : hello
	@$(HEADLINE)\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "List of Targets"\
	&& $(ECHO) $(ECHO_FLAGS) "==============="\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Default"\
	&& $(ECHO) $(ECHO_FLAGS) "-------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "all"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB2)generate all files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Help"\
	&& $(ECHO) $(ECHO_FLAGS) "----"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "hello"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB2)greeter, provided with targets all, clean and help"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "help"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB2)list available targets"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Actions"\
	&& $(ECHO) $(ECHO_FLAGS) "------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "docu"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)generate html documentation files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "gschem-images"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB2)generate images and PDFs from gschem circuit schematics"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "dxf-views"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB2)generate views from *.dxf files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "dxf-convert"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB2)convert *.pdf files, as exported from *.dxf files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "scad-views"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB2)generate views from *.scad files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Clean"\
	&& $(ECHO) $(ECHO_FLAGS) "-----"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-animation-files"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB2)remove generated animation files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-gschem-images"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB2)remove generated gschem schematic images"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-docu"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)remove generated html documentation files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB2)remove all generated files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(DONE);

#   Generate html documentation files
docu : ./cern_ohl_s_v2.html ./cern_ohl_s_v2_user_guide.html ./README.html ./CHANGES.html
	@$(HEADLINE)\
	&& $(DONE);

#   Create html files from markdown files
%.html : %.md
	@$(HEADLINE)\
	&& $(ECHO) $(ECHO_FLAGS) "<!DOCTYPE html>" > $@\
	&& $(ECHO) $(ECHO_FLAGS) "<html>" >> $@\
	&& $(HTML_HEAD)\
	&& $(MARKDOWN) $(MARKDOWN_FLAGS)\
		$<\
			>> $@\
	&& $(ECHO) $(ECHO_FLAGS) "</body>" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "</html>" >> $@\
	&& $(DONE);

#   Create html files from txt files
%.html : %.txt
	@$(HEADLINE)\
	&& $(ECHO) $(ECHO_FLAGS) "<!DOCTYPE html>" > $@\
	&& $(ECHO) $(ECHO_FLAGS) "<html>" >> $@\
	&& $(HTML_HEAD)\
	&& $(ECHO) $(ECHO_FLAGS) "<body>" >> $@\
	&& $(SED) $(SED_FLAGS)\
		-e's/^/    /; # indent 4 spaces to make text preformatted'\
			$<\
	| $(MARKDOWN) $(MARKDOWN_FLAGS)\
		-\
			>> $@\
	&& $(ECHO) $(ECHO_FLAGS) "</body>" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "</html>" >> $@\
	&& $(DONE);

#   Generate schematic images
gschem-images : $(addsuffix .png,$(SCHEMATICS_GSCHEM)) $(addsuffix .pdf,$(SCHEMATICS_GSCHEM))
	@$(HEADLINE)\
	&& $(DONE);

#   Update schematic titleblock
%.titleblock.sch : %.sch
	@$(HEADLINE)\
	&& authors="$(strip\
		$(shell\
			$(GIT) log\
				--format="%al, "\
				--follow\
				-- $<\
			| $(SORT) $(SORT_FLAGS)\
			| $(UNIQ) $(UNIQ_FLAGS);\
		)\
	)"\
	&& $(SED) $(SED_FLAGS)\
		-e 's#\$$TITLE#$(PROJECT_TITLE)#;'\
		-e 's#\$$SUBTITLE#$(PROJECT_BRIEF)#;'\
		-e 's,\$$GITREPO,$(PROJECT_REPO),;'\
		-e 's,\$$FILENAME,$(notdir $(<)),;'\
		-e 's/\$$PAGES//;'\
		-e 's/\$$PAGE//;'\
		-e 's/\$$GITREF/$(PROJECT_NUMBER) ($(PROJECT_BRANCH))/;'\
		-e 's/\$$AUTHORS/'"$${authors%\,*}"'/;'\
			$<\
				> $@\
	&& $(DONE);

#   Generate images from schematics.
%.sch.png : %.titleblock.sch
	@$(HEADLINE)\
	&& $(GAF) $(GAF_FLAGS)\
		export\
		--color\
		--scale=7pt\
		--margins=auto\
		--output=$@\
			$<\
	&& $(DONE);

#   Generate PDFs from schematics.
%.sch.pdf : %.titleblock.sch
	@$(HEADLINE)\
	&& $(GAF) $(GAF_FLAGS)\
		export\
			--color\
			--paper=iso_a4\
			--size=auto\
			--margins=auto\
			--align=auto\
			--output=$@\
				$<\
	&& $(DONE);

dxf-views : $(ROOT_HW_LIBRECAD)acrylic-drill-plate.dxf
	@$(HEADLINE)\
	&& $(LIBRECAD) dxf2pdf $(LIBRECAD_FLAGS)\
		$<\
	&& $(DONE);

dxf-convert : $(ROOT_HW_LIBRECAD)acrylic-drill-plate.pdf
	@$(HEADLINE)\
	&& $(CONVERT) $(CONVERT_FLAGS)\
		$<\
			$(basename $<).png\
	&& $(DONE);

# chassis, view 00
$(ROOT_HW_OPENSCAD)chassis.scad.view00.png : $(ROOT_HW_OPENSCAD)chassis.scad
	@$(HEADLINE)\
	&& camera=(\
		'91.28,338.03,-38.69,62.00,0.00,35.50,1116.83'   p\
	)\
	&& $(VIEWEXPORT)\
	&& $(DONE);

# chassis, view 01
$(ROOT_HW_OPENSCAD)chassis.scad.view01.png : $(ROOT_HW_OPENSCAD)chassis.scad
	@$(HEADLINE)\
	&& camera=(\
		'127.98,401.72,4.35,71.10,0.00,242.00,1260.72'   p\
	)\
	&& $(VIEWEXPORT)\
	&& $(DONE);

# chassis, view 02
$(ROOT_HW_OPENSCAD)chassis.scad.view02.png : $(ROOT_HW_OPENSCAD)chassis.scad
	@$(HEADLINE)\
	&& camera=(\
		'123.00,389.58,-3.68,101.20,0.00,270.70,1260.72' p\
	)\
	&& $(VIEWEXPORT)\
	&& $(DONE);

# chassis, keyboard, view 03
$(ROOT_HW_OPENSCAD)chassis.scad.view03.png : $(ROOT_HW_OPENSCAD)chassis.scad
	@$(HEADLINE)\
	&& camera=(\
		'15.61,188.63,-115.16,57.80,0.00,43.90,670.03'   p\
	)\
	&& $(VIEWEXPORT)\
	&& $(DONE);

# chassis, keyboard, view 04
$(ROOT_HW_OPENSCAD)chassis.scad.view04.png : $(ROOT_HW_OPENSCAD)chassis.scad
	@$(HEADLINE)\
	&& camera=(\
		'20.84,169.63,108.58,239.50,0.00,236.10,650.00'  p\
	)\
	&& $(VIEWEXPORT)\
	&& $(DONE);

# chassis, keyboard, view 05
$(ROOT_HW_OPENSCAD)chassis.scad.view05.png : $(ROOT_HW_OPENSCAD)chassis.scad
	@$(HEADLINE)\
	&& camera=(\
		'124.00,68.14,3.57,90.00,0.00,270.00,231.80'     o\
	)\
	&& $(VIEWEXPORT)\
	&& $(DONE);

# chassis, keyboard, view 06
$(ROOT_HW_OPENSCAD)chassis.scad.view06.png : $(ROOT_HW_OPENSCAD)chassis.scad
	@$(HEADLINE)\
	&& camera=(\
		'124.80,75.16,19.14,90.00,0.00,0.00,394.86'      o\
	)\
	&& $(VIEWEXPORT)\
	&& $(DONE);

# chassis, keyboard, view 07
$(ROOT_HW_OPENSCAD)chassis.scad.view07.png : $(ROOT_HW_OPENSCAD)chassis.scad
	@$(HEADLINE)\
	&& camera=(\
		'127.23,72.55,9.08,0.00,0.00,0.00,460.84'        o\
	)\
	&& $(VIEWEXPORT)\
	&& $(DONE);

# chassis, mainboard, view 08
$(ROOT_HW_OPENSCAD)chassis.scad.view08.png : $(ROOT_HW_OPENSCAD)chassis.scad
	@$(HEADLINE)\
	&& camera=(\
		'70.86,290.65,-59.26,57.80,0.00,43.90,580.00'    p\
	)\
	&& $(VIEWEXPORT)\
	&& $(DONE);

# chassis, mainboard, view 09
$(ROOT_HW_OPENSCAD)chassis.scad.view09.png : $(ROOT_HW_OPENSCAD)chassis.scad
	@$(HEADLINE)\
	&& camera=(\
		'60.24,282.87,56.89,239.50,0.00,236.10,450.00'   p\
	)\
	&& $(VIEWEXPORT)\
	&& $(DONE);

# chassis, display, view 10
$(ROOT_HW_OPENSCAD)chassis.scad.view10.png : $(ROOT_HW_OPENSCAD)chassis.scad
	@$(HEADLINE)\
	&& camera=(\
		'242.29,282.45,86.63,58.10,0.00,44.10,288.62'    p\
	)\
	&& $(VIEWEXPORT)\
	&& $(DONE);

# chassis, display, view 11
$(ROOT_HW_OPENSCAD)chassis.scad.view11.png : $(ROOT_HW_OPENSCAD)chassis.scad
	@$(HEADLINE)\
	&& camera=(\
		'127.76,383.59,108.18,0.00,0.00,0.00,334.50'     p\
	)\
	&& $(VIEWEXPORT)\
	&& $(DONE);

# chassis, display, view 12
$(ROOT_HW_OPENSCAD)chassis.scad.view12.png : $(ROOT_HW_OPENSCAD)chassis.scad
	@$(HEADLINE)\
	&& camera=(\
		'116.88,403.74,22.24,239.50,0.00,236.10,376.67'  p\
	)\
	&& $(VIEWEXPORT)\
	&& $(DONE);

# chassis, transmission, view 13
$(ROOT_HW_OPENSCAD)chassis.scad.view13.png : $(ROOT_HW_OPENSCAD)chassis.scad
	@$(HEADLINE)\
	&& camera=(\
		'187.91,489.16,39.00,57.80,0.00,43.90,376.67'    p\
	)\
	&& $(VIEWEXPORT)\
	&& $(DONE);

# chassis, transmission, view 14
$(ROOT_HW_OPENSCAD)chassis.scad.view14.png : $(ROOT_HW_OPENSCAD)chassis.scad
	@$(HEADLINE)\
	&& camera=(\
		'180.81,528.31,-5.62,239.50,0.00,236.10,376.67'  p\
	)\
	&& $(VIEWEXPORT)\
	&& $(DONE);

# chassis, power, view 15
$(ROOT_HW_OPENSCAD)chassis.scad.view15.png : $(ROOT_HW_OPENSCAD)chassis.scad
	@$(HEADLINE)\
	&& camera=(\
		'457.36,445.13,157.29,66.20,0.00,51.60,22.23'    p\
	)\
	&& $(VIEWEXPORT)\
	&& $(DONE);

# chassis, power, view 16
$(ROOT_HW_OPENSCAD)chassis.scad.view16.png : $(ROOT_HW_OPENSCAD)chassis.scad
	@$(HEADLINE)\
	&& camera=(\
		'229.85,644.67,-46.70,239.50,0.00,236.10,370.00' p\
	)\
	&& $(VIEWEXPORT)\
	&& $(DONE);

# SCAD views
scad-views : $(ROOT_HW_OPENSCAD)chassis.scad.view16.png\
	$(ROOT_HW_OPENSCAD)chassis.scad.view15.png\
		$(ROOT_HW_OPENSCAD)chassis.scad.view14.png\
			$(ROOT_HW_OPENSCAD)chassis.scad.view13.png\
				$(ROOT_HW_OPENSCAD)chassis.scad.view12.png\
					$(ROOT_HW_OPENSCAD)chassis.scad.view11.png\
						$(ROOT_HW_OPENSCAD)chassis.scad.view10.png\
							$(ROOT_HW_OPENSCAD)chassis.scad.view09.png\
								$(ROOT_HW_OPENSCAD)chassis.scad.view08.png\
									$(ROOT_HW_OPENSCAD)chassis.scad.view07.png\
										$(ROOT_HW_OPENSCAD)chassis.scad.view06.png\
											$(ROOT_HW_OPENSCAD)chassis.scad.view05.png\
												$(ROOT_HW_OPENSCAD)chassis.scad.view04.png\
													$(ROOT_HW_OPENSCAD)chassis.scad.view03.png\
														$(ROOT_HW_OPENSCAD)chassis.scad.view02.png\
															$(ROOT_HW_OPENSCAD)chassis.scad.view01.png\
																$(ROOT_HW_OPENSCAD)chassis.scad.view00.png
	@$(HEADLINE)\
	&& $(DONE);

# OpenSCAD animation
$(ROOT_HW_OPENSCAD)chassis.ogg : $(ROOT_HW_OPENSCAD)chassis.scad
	@$(HEADLINE)\
	&& $(CD) $(CD_FLAGS) $(@D)\
	&& $(OPENSCAD) $(OPENSCAD_FLAGS)\
		--animate 100\
		--imgsize=1280,720\
			$(<F)\
	&& $(FFMPEG) $(FFMPEG_FLAGS)\
		-f image2\
		-framerate 25\
		-stream_loop 75\
		-i frame00000.png\
		-s 1280x720\
		-b:v 5M\
			startstop.ogg\
	&& $(FFMPEG) $(FFMPEG_FLAGS)\
		-f image2\
		-framerate 25\
		-i frame%05d.png\
		-s 1280x720\
		-b:v 5M\
			body.ogg\
	&& $(ECHO) $(ECHO_FLAGS) "file 'startstop.ogg'" > concat.txt\
	&& $(ECHO) $(ECHO_FLAGS) "file 'body.ogg'" >> concat.txt\
	&& $(ECHO) $(ECHO_FLAGS) "file 'startstop.ogg'" >> concat.txt\
	&& $(FFMPEG) $(FFMPEG_FLAGS)\
		-f concat\
		-i concat.txt\
		-c copy\
			$(@F)\
	&& $(CP) $(CP_FLAGS) -f\
		./frame00000.png\
			./poster.png\
	&& $(RM) $(RM_FLAGS)\
		./frame?????.png\
		./startstop.ogg\
		./body.ogg\
		./concat.txt\
	&& $(CD) $(CD_FLAGS) -\
	&& $(DONE);

#   Remove generated animations
clean-animation-files :
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		$(wildcard $(ROOT_HW_OPENSCAD)*.ogg)\
		$(wildcard $(ROOT_HW_OPENSCAD)frame*.png)\
		$(ROOT_HW_OPENSCAD)poster.png\
		$(ROOT_HW_OPENSCAD)concat.txt\
	&& $(DONE);

#   Remove generated schematic images
clean-gschem-images :
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		$(addsuffix .png,$(SCHEMATICS_GSCHEM))\
		$(addsuffix .pdf,$(SCHEMATICS_GSCHEM))\
		$(addsuffix ~,$(SCHEMATICS_GSCHEM))\
	&& $(DONE);

#   Clean documentation files
clean-docu :
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		./cern_ohl_s_v2.html\
		./cern_ohl_s_v2_user_guide.html\
		./README.html\
		./CHANGES.html\
	&& $(DONE);

#   clean generated files
clean : hello clean-docu clean-gschem-images clean-animation-files
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS) -r\
		$(wildcard $(ROOT_HW_OPENSCAD)*.scad.view*.png)\
		$(wildcard $(ROOT_HW_LIBRECAD)*.pdf)\
		$(wildcard $(ROOT_HW_LIBRECAD)*.png)\
		$(wildcard $(ROOT_HW_LIBRECAD)*.dxf~)\
	&& $(DONE);
