From e7eea065bf470499cb8b680edb9cf455dc2c8d83 Mon Sep 17 00:00:00 2001 From: redfast00 Date: Tue, 1 Feb 2022 08:00:20 +0100 Subject: [PATCH] Get properly started on writing manual --- docs/build.py | 20 +- docs/images/puzzle_maze/description.png | Bin 0 -> 13515 bytes docs/images/puzzle_maze/maze.png | Bin 0 -> 24256 bytes docs/prefix.yaml | 11 + docs/template.tex | 552 ++++++++++++++++++ moana/index.html | 6 + src/modules/info_serial_number/doc/index.md | 10 +- .../needy_testmodule_buttons/doc/index.md | 7 +- src/modules/puzzle_maze/3d/.gitignore | 1 + src/modules/puzzle_maze/3d/case.scad | 117 ++++ src/modules/puzzle_maze/doc/index.md | 20 + src/modules/puzzle_maze/graphics.svg | 309 ++++++++++ src/modules/puzzle_maze/puzzle_maze.ino | 23 + .../puzzle_testmodule_buttons/doc/index.md | 7 +- 14 files changed, 1064 insertions(+), 19 deletions(-) create mode 100644 docs/images/puzzle_maze/description.png create mode 100644 docs/images/puzzle_maze/maze.png create mode 100644 docs/prefix.yaml create mode 100644 docs/template.tex create mode 100644 src/modules/puzzle_maze/3d/.gitignore create mode 100644 src/modules/puzzle_maze/3d/case.scad create mode 100644 src/modules/puzzle_maze/doc/index.md create mode 100644 src/modules/puzzle_maze/graphics.svg create mode 100644 src/modules/puzzle_maze/puzzle_maze.ino diff --git a/docs/build.py b/docs/build.py index fa3c90e..d16b26b 100644 --- a/docs/build.py +++ b/docs/build.py @@ -1,12 +1,28 @@ import glob import os +from pathlib import PurePath +import sys # https://tex.stackexchange.com/questions/101717/converting-markdown-to-latex-in-latex/246871#246871 +remove_testmodules = True +if len(sys.argv) >= 2: + remove_testmodules = False + outfilename = '/tmp/out.md' with open(outfilename, 'w') as outfile: - for filepath in glob.iglob('../src/modules/*/doc/index.md'): + all_modules = sorted(glob.glob('../src/modules/*/doc/index.md')) + if remove_testmodules: + all_modules = [p for p in all_modules if 'testmodule_' not in p] + without_info = [p for p in all_modules if "info_" not in p] + only_info = [p for p in all_modules if "info_" in p] + for filepath in without_info: with open(filepath) as infile: outfile.write(infile.read()) outfile.write("\n\\newpage{}\n") -os.system(f"pandoc --from=markdown --output=docs.pdf {outfilename} --highlight-style=espresso") + outfile.write("\n\\part{Appendix}\\newpage\n") + for filepath in only_info: + with open(filepath) as infile: + outfile.write(infile.read()) + outfile.write("\n\\newpage{}\n") +os.system(f"pandoc --from=markdown --template=template.tex --output=docs.pdf prefix.yaml {outfilename} --highlight-style=espresso") diff --git a/docs/images/puzzle_maze/description.png b/docs/images/puzzle_maze/description.png new file mode 100644 index 0000000000000000000000000000000000000000..1f3bc1e73506b05920ec598de5028b0db2e92a2a GIT binary patch literal 13515 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 K{e|C=&;1Vw`62%R literal 0 HcmV?d00001 diff --git a/docs/images/puzzle_maze/maze.png b/docs/images/puzzle_maze/maze.png new file mode 100644 index 0000000000000000000000000000000000000000..913bff0d8a89224e4bf07b2c1abc5a17992e2a4e GIT binary patch literal 24256 zcmeIac~q0<+AjVgRq6zGJD|u=>$Yk|peizxidAY+P#MBZL=lxCAcR0dLM*k^B2Xtl znTn`LLI{Wu2n1pkP*DQn%V0=?q6ESaF@!)u;5=_Y+r7{F&iVcGt#!`%?X0CC@9@me zJzV#7KNk)=J1$?Mw*-Qq|AQv2qvKlZ%8eEmYp-IW^}eOtf1F=pR#=YGt-V@4{KH`NDwf9b&o)uEEJ;k)9N3XxW$wrK^W(cqn@TFF+i=b~QQ~Y> zc5r(Or@kshLXB~I}!u+_z4w~TQ(dzE9DhNkqRpJ{?@j^S8NEMcZ z)5zO(0~dhSf1%p|3gCOPO9`&LdPb;4iyQWCT|O(EJ!Ww^IgoRNw2|L)xrl2+P-QfWZPCw{;#Fur&iiZ=-$2GCjWZ5t- zto4^80}sw_8HX@Z@Lw0Y(*yPL!J0VT)SV)7E?XAkn6K5G->OM@UeKzE5yl6~vgnLw zH4(M>gvkfkH;sosz8vZ^;Ad{O7K)m>FHV6)%M?=qt<;yq@jvo(AShxBQuYN$cSeaJ z%CadK&3KXvCV=zP)^VsRJA@WM&9$_CY?bGyI*5yoUI9UrFTe!(wlq@f9VeN>Wyy`gY zh6aI2_H>1*V-k4OQx`0gj1NDxX~Yap6=)(wCW9iANoQmW!OJhAsE!x4!MZBd29s(s zF)V&Ou%agVKA~{{bOjpvqgAsvuzbyNW~w&$IseeDHjRma^fqKQcI*KyIiKp5w%#Bx zE!WH%T;f=R0jp|#4)5Kc)K%apA}t54fQ;giYXzFV=QhHJ3ig8M^ml=l>9WG3DchnS z4uA`g)*+;@Q9Xm+C44J&QF~m$wCAU#X-6zT0r!}36VbIWkc$A6(=G^ z<=pk(Y5mAVHRPcSBoEXTi`4q=8hH5yZSLi{f!ztu+E_o*R)x#Nb5pYqnVOyec69Ww z28ty3`d?Q)W`bntZ5vGbI%#=^>NSxArY!W`L7CjT7F}!S&MvjKvHlzxL9n*ET70Ow zDcWV{u~^)UEm&3!RyEHp?ag$dq=)XX>3x;5fz{+1A~2oC zmqFKa6hFw&)V%fM(uA7?f7#d`lo15=wnk{%K{0(l$msNm%RWt0A4aX@(k=rL*q_Lq zE?ZviUPg1zU9i)(xtziIvlES_;SBqbL%j0Ss|cm~VEDRh!GGG%E{SP0d}aMUfe&pq zFojok;a_g|ToOA`^Qfa|u$u%;G_*U{KWgI8?T=ERyRy~B8tl}pzEIgVQR8x0gl1M+ z8_O@ig>Ibz?^Sqrqr2pKf+NmHcE>~143>NEj$tq%*1mprwrI})T_V`?U3+z)-D!5? zkmagThW!rf&%lTe4{t)2^It+%|144P9B$g5wDxU__)gn~MOI#XOY28p;wxCO5B|Y- z^|Js!-Fqva+{743ue}rSA-H-|!Y>J@WMgd`v^CEQ z;v8F2HnG0p)qP({x}IJ)0)�IK+-|b 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 PQuBd*&fk|fV1D`^$l*bO literal 0 HcmV?d00001 diff --git a/docs/prefix.yaml b/docs/prefix.yaml new file mode 100644 index 0000000..a795528 --- /dev/null +++ b/docs/prefix.yaml @@ -0,0 +1,11 @@ +--- +title: OBUS handleiding +author: Zeus WPI +papersize: a4 +documentclass: scrartcl +geometry: "left=2cm,right=2cm,top=2cm,bottom=3cm" +fontsize: 14pt +--- + +\graphicspath{ {./images/} } +\newpage{} diff --git a/docs/template.tex b/docs/template.tex new file mode 100644 index 0000000..19ecaa5 --- /dev/null +++ b/docs/template.tex @@ -0,0 +1,552 @@ +% Options for packages loaded elsewhere +\PassOptionsToPackage{unicode$for(hyperrefoptions)$,$hyperrefoptions$$endfor$}{hyperref} +\PassOptionsToPackage{hyphens}{url} +$if(colorlinks)$ +\PassOptionsToPackage{dvipsnames,svgnames,x11names}{xcolor} +$endif$ +$if(dir)$ +$if(latex-dir-rtl)$ +\PassOptionsToPackage{RTLdocument}{bidi} +$endif$ +$endif$ +$if(CJKmainfont)$ +\PassOptionsToPackage{space}{xeCJK} +$endif$ +% +\documentclass[ +$if(fontsize)$ + $fontsize$, +$endif$ +$if(lang)$ + $babel-lang$, +$endif$ +$if(papersize)$ + $papersize$paper, +$endif$ +$if(beamer)$ + ignorenonframetext, +$if(handout)$ + handout, +$endif$ +$if(aspectratio)$ + aspectratio=$aspectratio$, +$endif$ +$endif$ +$for(classoption)$ + $classoption$$sep$, +$endfor$ +]{$documentclass$} +$if(beamer)$ +$if(background-image)$ +\usebackgroundtemplate{% + \includegraphics[width=\paperwidth]{$background-image$}% +} +$endif$ +\usepackage{pgfpages} + +\setbeamertemplate{caption}[numbered] +\setbeamertemplate{caption label separator}{: } +\setbeamercolor{caption name}{fg=normal text.fg} +\beamertemplatenavigationsymbols$if(navigation)$$navigation$$else$empty$endif$ +$for(beameroption)$ +\setbeameroption{$beameroption$} +$endfor$ +% Prevent slide breaks in the middle of a paragraph +\widowpenalties 1 10000 +\raggedbottom +$if(section-titles)$ +\setbeamertemplate{part page}{ + \centering + \begin{beamercolorbox}[sep=16pt,center]{part title} + \usebeamerfont{part title}\insertpart\par + \end{beamercolorbox} +} +\setbeamertemplate{section page}{ + \centering + \begin{beamercolorbox}[sep=12pt,center]{part title} + \usebeamerfont{section title}\insertsection\par + \end{beamercolorbox} +} +\setbeamertemplate{subsection page}{ + \centering + \begin{beamercolorbox}[sep=8pt,center]{part title} + \usebeamerfont{subsection title}\insertsubsection\par + \end{beamercolorbox} +} +\AtBeginPart{ + \frame{\partpage} +} +\AtBeginSection{ + \ifbibliography + \else + \frame{\sectionpage} + \fi +} +\AtBeginSubsection{ + \frame{\subsectionpage} +} +$endif$ +$endif$ +$if(beamerarticle)$ +\usepackage{beamerarticle} % needs to be loaded first +$endif$ +\usepackage{amsmath,amssymb} +$if(fontfamily)$ +\usepackage[$for(fontfamilyoptions)$$fontfamilyoptions$$sep$,$endfor$]{$fontfamily$} +$else$ +\usepackage{lmodern} +$endif$ +$if(linestretch)$ +\usepackage{setspace} +$endif$ +\usepackage{iftex} +\ifPDFTeX + \usepackage[$if(fontenc)$$fontenc$$else$T1$endif$]{fontenc} + \usepackage[utf8]{inputenc} + \usepackage{textcomp} % provide euro and other symbols +\else % if luatex or xetex +$if(mathspec)$ + \ifXeTeX + \usepackage{mathspec} + \else + \usepackage{unicode-math} + \fi +$else$ + \usepackage{unicode-math} +$endif$ + \defaultfontfeatures{Scale=MatchLowercase} + \defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1} +$if(mainfont)$ + \setmainfont[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$]{$mainfont$} +$endif$ +$if(sansfont)$ + \setsansfont[$for(sansfontoptions)$$sansfontoptions$$sep$,$endfor$]{$sansfont$} +$endif$ +$if(monofont)$ + \setmonofont[$for(monofontoptions)$$monofontoptions$$sep$,$endfor$]{$monofont$} +$endif$ +$for(fontfamilies)$ + \newfontfamily{$fontfamilies.name$}[$for(fontfamilies.options)$$fontfamilies.options$$sep$,$endfor$]{$fontfamilies.font$} +$endfor$ +$if(mathfont)$ +$if(mathspec)$ + \ifXeTeX + \setmathfont(Digits,Latin,Greek)[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} + \else + \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} + \fi +$else$ + \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} +$endif$ +$endif$ +$if(CJKmainfont)$ + \ifXeTeX + \usepackage{xeCJK} + \setCJKmainfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$} + \fi +$endif$ +$if(luatexjapresetoptions)$ + \ifLuaTeX + \usepackage[$for(luatexjapresetoptions)$$luatexjapresetoptions$$sep$,$endfor$]{luatexja-preset} + \fi +$endif$ +$if(CJKmainfont)$ + \ifLuaTeX + \usepackage[$for(luatexjafontspecoptions)$$luatexjafontspecoptions$$sep$,$endfor$]{luatexja-fontspec} + \setmainjfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$} + \fi +$endif$ +\fi +$if(zero-width-non-joiner)$ +%% Support for zero-width non-joiner characters. +\makeatletter +\def\zerowidthnonjoiner{% + % Prevent ligatures and adjust kerning, but still support hyphenating. + \texorpdfstring{% + \textormath{\nobreak\discretionary{-}{}{\kern.03em}% + \ifvmode\else\nobreak\hskip\z@skip\fi}{}% + }{}% +} +\makeatother +\ifPDFTeX + \DeclareUnicodeCharacter{200C}{\zerowidthnonjoiner} +\else + \catcode`^^^^200c=\active + \protected\def ^^^^200c{\zerowidthnonjoiner} +\fi +%% End of ZWNJ support +$endif$ +$if(beamer)$ +$if(theme)$ +\usetheme[$for(themeoptions)$$themeoptions$$sep$,$endfor$]{$theme$} +$endif$ +$if(colortheme)$ +\usecolortheme{$colortheme$} +$endif$ +$if(fonttheme)$ +\usefonttheme{$fonttheme$} +$endif$ +$if(mainfont)$ +\usefonttheme{serif} % use mainfont rather than sansfont for slide text +$endif$ +$if(innertheme)$ +\useinnertheme{$innertheme$} +$endif$ +$if(outertheme)$ +\useoutertheme{$outertheme$} +$endif$ +$endif$ +% Use upquote if available, for straight quotes in verbatim environments +\IfFileExists{upquote.sty}{\usepackage{upquote}}{} +\IfFileExists{microtype.sty}{% use microtype if available + \usepackage[$for(microtypeoptions)$$microtypeoptions$$sep$,$endfor$]{microtype} + \UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts +}{} +$if(indent)$ +$else$ +\makeatletter +\@ifundefined{KOMAClassName}{% if non-KOMA class + \IfFileExists{parskip.sty}{% + \usepackage{parskip} + }{% else + \setlength{\parindent}{0pt} + \setlength{\parskip}{6pt plus 2pt minus 1pt}} +}{% if KOMA class + \KOMAoptions{parskip=half}} +\makeatother +$endif$ +$if(verbatim-in-note)$ +\usepackage{fancyvrb} +$endif$ +\usepackage{xcolor} +\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available +\IfFileExists{bookmark.sty}{\usepackage{bookmark}}{\usepackage{hyperref}} +\hypersetup{ +$if(title-meta)$ + pdftitle={$title-meta$}, +$endif$ +$if(author-meta)$ + pdfauthor={$author-meta$}, +$endif$ +$if(lang)$ + pdflang={$lang$}, +$endif$ +$if(subject)$ + pdfsubject={$subject$}, +$endif$ +$if(keywords)$ + pdfkeywords={$for(keywords)$$keywords$$sep$, $endfor$}, +$endif$ +$if(colorlinks)$ + colorlinks=true, + linkcolor={$if(linkcolor)$$linkcolor$$else$Maroon$endif$}, + filecolor={$if(filecolor)$$filecolor$$else$Maroon$endif$}, + citecolor={$if(citecolor)$$citecolor$$else$Blue$endif$}, + urlcolor={$if(urlcolor)$$urlcolor$$else$Blue$endif$}, +$else$ + hidelinks, +$endif$ + pdfcreator={LaTeX via pandoc}} +\urlstyle{same} % disable monospaced font for URLs +$if(verbatim-in-note)$ +\VerbatimFootnotes % allow verbatim text in footnotes +$endif$ +$if(geometry)$ +$if(beamer)$ +\geometry{$for(geometry)$$geometry$$sep$,$endfor$} +$else$ +\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry} +$endif$ +$endif$ +$if(beamer)$ +\newif\ifbibliography +$endif$ +$if(listings)$ +\usepackage{listings} +\newcommand{\passthrough}[1]{#1} +\lstset{defaultdialect=[5.3]Lua} +\lstset{defaultdialect=[x86masm]Assembler} +$endif$ +$if(lhs)$ +\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{} +$endif$ +$if(highlighting-macros)$ +$highlighting-macros$ +$endif$ +$if(tables)$ +\usepackage{longtable,booktabs,array} +$if(multirow)$ +\usepackage{multirow} +$endif$ +\usepackage{calc} % for calculating minipage widths +$if(beamer)$ +\usepackage{caption} +% Make caption package work with longtable +\makeatletter +\def\fnum@table{\tablename~\thetable} +\makeatother +$else$ +% Correct order of tables after \paragraph or \subparagraph +\usepackage{etoolbox} +\makeatletter +\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{} +\makeatother +% Allow footnotes in longtable head/foot +\IfFileExists{footnotehyper.sty}{\usepackage{footnotehyper}}{\usepackage{footnote}} +\makesavenoteenv{longtable} +$endif$ +$endif$ +\usepackage{graphicx} +\makeatletter +\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi} +\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi} +\makeatother +% Scale images if necessary, so that they will not overflow the page +% margins by default, and it is still possible to overwrite the defaults +% using explicit options in \includegraphics[width, height, ...]{} +\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio} +% Set default figure placement to htbp +\makeatletter +\def\fps@figure{htbp} +\makeatother +$if(links-as-notes)$ +% Make links footnotes instead of hotlinks: +\DeclareRobustCommand{\href}[2]{#2\footnote{\url{#1}}} +$endif$ +$if(strikeout)$ +$-- also used for underline +\usepackage[normalem]{ulem} +% Avoid problems with \sout in headers with hyperref +\pdfstringdefDisableCommands{\renewcommand{\sout}{}} +$endif$ +\setlength{\emergencystretch}{3em} % prevent overfull lines +\providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} +$if(numbersections)$ +\setcounter{secnumdepth}{$if(secnumdepth)$$secnumdepth$$else$5$endif$} +$else$ +\setcounter{secnumdepth}{-\maxdimen} % remove section numbering +$endif$ +$if(beamer)$ +$else$ +$if(block-headings)$ +% Make \paragraph and \subparagraph free-standing +\ifx\paragraph\undefined\else + \let\oldparagraph\paragraph + \renewcommand{\paragraph}[1]{\oldparagraph{#1}\mbox{}} +\fi +\ifx\subparagraph\undefined\else + \let\oldsubparagraph\subparagraph + \renewcommand{\subparagraph}[1]{\oldsubparagraph{#1}\mbox{}} +\fi +$endif$ +$endif$ +$if(pagestyle)$ +\pagestyle{$pagestyle$} +$endif$ +$if(csl-refs)$ +\newlength{\cslhangindent} +\setlength{\cslhangindent}{1.5em} +\newlength{\csllabelwidth} +\setlength{\csllabelwidth}{3em} +\newlength{\cslentryspacingunit} % times entry-spacing +\setlength{\cslentryspacingunit}{\parskip} +\newenvironment{CSLReferences}[2] % #1 hanging-ident, #2 entry spacing + {% don't indent paragraphs + \setlength{\parindent}{0pt} + % turn on hanging indent if param 1 is 1 + \ifodd #1 + \let\oldpar\par + \def\par{\hangindent=\cslhangindent\oldpar} + \fi + % set entry spacing + \setlength{\parskip}{#2\cslentryspacingunit} + }% + {} +\usepackage{calc} +\newcommand{\CSLBlock}[1]{#1\hfill\break} +\newcommand{\CSLLeftMargin}[1]{\parbox[t]{\csllabelwidth}{#1}} +\newcommand{\CSLRightInline}[1]{\parbox[t]{\linewidth - \csllabelwidth}{#1}\break} +\newcommand{\CSLIndent}[1]{\hspace{\cslhangindent}#1} +$endif$ +$for(header-includes)$ +$header-includes$ +$endfor$ +$if(lang)$ +\ifXeTeX + % Load polyglossia as late as possible: uses bidi with RTL langages (e.g. Hebrew, Arabic) + \usepackage{polyglossia} + \setmainlanguage[$for(polyglossia-lang.options)$$polyglossia-lang.options$$sep$,$endfor$]{$polyglossia-lang.name$} +$for(polyglossia-otherlangs)$ + \setotherlanguage[$for(polyglossia-otherlangs.options)$$polyglossia-otherlangs.options$$sep$,$endfor$]{$polyglossia-otherlangs.name$} +$endfor$ +\else + \usepackage[$for(babel-otherlangs)$$babel-otherlangs$,$endfor$main=$babel-lang$]{babel} +% get rid of language-specific shorthands (see #6817): +\let\LanguageShortHands\languageshorthands +\def\languageshorthands#1{} +$if(babel-newcommands)$ + $babel-newcommands$ +$endif$ +\fi +$endif$ +\ifLuaTeX + \usepackage{selnolig} % disable illegal ligatures +\fi +$if(dir)$ +\ifXeTeX + % Load bidi as late as possible as it modifies e.g. graphicx + \usepackage{bidi} +\fi +\ifPDFTeX + \TeXXeTstate=1 + \newcommand{\RL}[1]{\beginR #1\endR} + \newcommand{\LR}[1]{\beginL #1\endL} + \newenvironment{RTL}{\beginR}{\endR} + \newenvironment{LTR}{\beginL}{\endL} +\fi +$endif$ +$if(natbib)$ +\usepackage[$natbiboptions$]{natbib} +\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$} +$endif$ +$if(biblatex)$ +\usepackage[$if(biblio-style)$style=$biblio-style$,$endif$$for(biblatexoptions)$$biblatexoptions$$sep$,$endfor$]{biblatex} +$for(bibliography)$ +\addbibresource{$bibliography$} +$endfor$ +$endif$ +$if(nocite-ids)$ +\nocite{$for(nocite-ids)$$it$$sep$, $endfor$} +$endif$ +$if(csquotes)$ +\usepackage{csquotes} +$endif$ + +$if(title)$ +\title{$title$$if(thanks)$\thanks{$thanks$}$endif$} +$endif$ +$if(subtitle)$ +$if(beamer)$ +$else$ +\usepackage{etoolbox} +\makeatletter +\providecommand{\subtitle}[1]{% add subtitle to \maketitle + \apptocmd{\@title}{\par {\large #1 \par}}{}{} +} +\makeatother +$endif$ +\subtitle{$subtitle$} +$endif$ +\author{$for(author)$$author$$sep$ \and $endfor$} +\date{$date$} +$if(beamer)$ +$if(institute)$ +\institute{$for(institute)$$institute$$sep$ \and $endfor$} +$endif$ +$if(titlegraphic)$ +\titlegraphic{\includegraphics{$titlegraphic$}} +$endif$ +$if(logo)$ +\logo{\includegraphics{$logo$}} +$endif$ +$endif$ + + +\usepackage{wrapfig} + +\begin{document} +$if(has-frontmatter)$ +\frontmatter +$endif$ +$if(title)$ +$if(beamer)$ +\frame{\titlepage} +$else$ +\maketitle +$endif$ +$if(abstract)$ +\begin{abstract} +$abstract$ +\end{abstract} +$endif$ +$endif$ + +$for(include-before)$ +$include-before$ + +$endfor$ +$if(toc)$ +$if(toc-title)$ +\renewcommand*\contentsname{$toc-title$} +$endif$ +$if(beamer)$ +\begin{frame}[allowframebreaks] +$if(toc-title)$ + \frametitle{$toc-title$} +$endif$ + \tableofcontents[hideallsubsections] +\end{frame} +$else$ +{ +$if(colorlinks)$ +\hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$$endif$} +$endif$ +\setcounter{tocdepth}{$toc-depth$} +\tableofcontents +} +$endif$ +$endif$ +$if(lof)$ +\listoffigures +$endif$ +$if(lot)$ +\listoftables +$endif$ +$if(linestretch)$ +\setstretch{$linestretch$} +$endif$ +$if(has-frontmatter)$ +\mainmatter +$endif$ +$body$ + +$if(has-frontmatter)$ +\backmatter +$endif$ +$if(natbib)$ +$if(bibliography)$ +$if(biblio-title)$ +$if(has-chapters)$ +\renewcommand\bibname{$biblio-title$} +$else$ +\renewcommand\refname{$biblio-title$} +$endif$ +$endif$ +$if(beamer)$ +\begin{frame}[allowframebreaks]{$biblio-title$} + \bibliographytrue +$endif$ + \bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$} +$if(beamer)$ +\end{frame} +$endif$ + +$endif$ +$endif$ +$if(biblatex)$ +$if(beamer)$ +\begin{frame}[allowframebreaks]{$biblio-title$} + \bibliographytrue + \printbibliography[heading=none] +\end{frame} +$else$ +\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$ +$endif$ + +$endif$ +$for(include-after)$ +$include-after$ + +$endfor$ +\end{document} diff --git a/moana/index.html b/moana/index.html index 4833628..119e4e8 100644 --- a/moana/index.html +++ b/moana/index.html @@ -183,6 +183,12 @@ pre { + + 0 + Zeus WPI + Doolhof + + 255 private use diff --git a/src/modules/info_serial_number/doc/index.md b/src/modules/info_serial_number/doc/index.md index bb7be81..ca4c21c 100644 --- a/src/modules/info_serial_number/doc/index.md +++ b/src/modules/info_serial_number/doc/index.md @@ -1,8 +1,4 @@ -## Serial number +# Appendix A: Serienummer -This module provides a serial number for other modules to use. It consists of -7 random letters/digits that are shown on a LCD display. The serial number has -at least one digit and one letter. - -### Credits -Module developed by redfast00. +Het serienummer bestaat uit 7 willekeurige letters/cijfers, en bevat ten minste +één cijfer en één letter. Het wordt op een LCD-scherm getoond. diff --git a/src/modules/needy_testmodule_buttons/doc/index.md b/src/modules/needy_testmodule_buttons/doc/index.md index 56142da..26af886 100644 --- a/src/modules/needy_testmodule_buttons/doc/index.md +++ b/src/modules/needy_testmodule_buttons/doc/index.md @@ -1,6 +1,3 @@ -## Testmodule needy buttons +# Testmodule needy buttons -If the module starts making a sound, press the button. - -### Credits -Module developed by redfast00. +Als de module geluid maakt, druk op de knop. diff --git a/src/modules/puzzle_maze/3d/.gitignore b/src/modules/puzzle_maze/3d/.gitignore new file mode 100644 index 0000000..1567411 --- /dev/null +++ b/src/modules/puzzle_maze/3d/.gitignore @@ -0,0 +1 @@ +*.stl diff --git a/src/modules/puzzle_maze/3d/case.scad b/src/modules/puzzle_maze/3d/case.scad new file mode 100644 index 0000000..ab71cdf --- /dev/null +++ b/src/modules/puzzle_maze/3d/case.scad @@ -0,0 +1,117 @@ +led_display_size=32; +led_display_total_size=50; +border_clearance = 10; +front_panel_thickness=2; +button_size=12; +button_clearance=1.5; +cut=50; +button_under_size=button_size+3; +button_under_thickness=2; +container_wall_thickness=1; +$fn=50; + +front_panel_height=border_clearance + led_display_size + 3 * button_under_size + 4 + border_clearance/4; +front_panel_width=border_clearance + led_display_size + border_clearance; + +module ccube(size = [1,1,1], center = false) +{ + sz = (len(size) == 3)?size:[size,size,size]; + if (len(center) == 1) + cube(size, center); + else + translate([center[0]?-sz[0]/2:0,center[1]?-sz[1]/2:0,center[2]?-sz[2]/2:0]) + cube(size); +} + +module button() { + color([1, 0.5, 0]) difference() { + union() { + translate([0, 0, -front_panel_thickness]) cylinder(d=button_size, h=front_panel_thickness+button_under_thickness, $fn=3); + translate([0, 0, -front_panel_thickness]) cylinder(d=button_under_size, h=button_under_thickness, $fn=3); + } + translate([0, 0, -front_panel_thickness -0.2]) cylinder(d=3.55, h=1); + } +} + +module front_panel() { + difference() { + union() { + ccube([front_panel_height, front_panel_width, front_panel_thickness], center=[0, 1, 0]); + translate([0, 0, -4]) { + translate([container_wall_thickness, -front_panel_width/2 + container_wall_thickness]) cube(5); + translate([container_wall_thickness, front_panel_width/2 - container_wall_thickness - 5]) cube(5); + translate([front_panel_height-container_wall_thickness-5, -front_panel_width/2 + container_wall_thickness]) cube(5); + translate([front_panel_height-container_wall_thickness-5, front_panel_width/2 - container_wall_thickness - 5]) cube(5); + } + } + translate([0, 0, -1]) union() { + translate([border_clearance, 0, 0]) ccube([led_display_size, led_display_size, cut], center=[0, 1, 0]); + %translate([border_clearance, 0, -12.6+1+front_panel_thickness]) ccube([50, led_display_size, 12.6], center=[0, 1, 0]); + up_button_trans=border_clearance+led_display_total_size+button_under_size/2+1; + // Up button + translate([up_button_trans, 0]) rotate([0, 0, 180]) { + translate([0, 0, 1]) %button(); + cylinder(d=button_size+button_clearance, h=cut ,$fn=3); + } + // Down button + translate([up_button_trans+(button_size+button_clearance), 0]) rotate([0, 0, 0]) { + translate([0, 0, 1]) %button(); + cylinder(d=button_size+button_clearance, h=cut ,$fn=3); + } + // Right button + translate([up_button_trans+(button_size+button_clearance)/2, button_size]) rotate([0, 0, 90]) { + translate([0, 0, 1]) %button(); + cylinder(d=button_size+button_clearance, h=cut ,$fn=3); + } + // Left button + translate([up_button_trans+(button_size+button_clearance)/2, -button_size]) rotate([0, 0, -90]) { + translate([0, 0, 1]) %button(); + cylinder(d=button_size+button_clearance, h=cut ,$fn=3); + } + } + } +} + +button_height=5; + +module back_panel() { + difference() { + union() { + ccube([front_panel_height, front_panel_width, 13+container_wall_thickness], center=[0, 1, 0]); + } + union() { + translate([container_wall_thickness, 0, container_wall_thickness]) ccube([front_panel_height-2*container_wall_thickness, front_panel_width-2*container_wall_thickness, cut], center=[0, 1, 0]); + translate([0, 0, -1]) { + translate([container_wall_thickness, -front_panel_width/2 + container_wall_thickness]) cube(5); + translate([container_wall_thickness, front_panel_width/2 - container_wall_thickness - 5]) cube(5); + translate([front_panel_height-container_wall_thickness-5, -front_panel_width/2 + container_wall_thickness]) cube(5); + translate([front_panel_height-container_wall_thickness-5, front_panel_width/2 - container_wall_thickness - 5]) cube(5); + } + translate([border_clearance+led_display_total_size, 0, -1]) cylinder(d=10, h=cut); + } + } + up_button_trans=border_clearance+led_display_total_size+button_under_size/2+1; + button_bottom_size=6; + pillar_height=13+container_wall_thickness - button_height - button_under_thickness; + // Up button + translate([up_button_trans, 0]) rotate([0, 0, 180+45]) { + cylinder(d=button_bottom_size, h=pillar_height, $fn=4); + } + // Down button + translate([up_button_trans+(button_size+button_clearance), 0]) rotate([0, 0, 45]) { + cylinder(d=button_bottom_size, h=pillar_height, $fn=4); + } + // Right button + translate([up_button_trans+(button_size+button_clearance)/2, button_size]) rotate([0, 0, 90+45]) { + cylinder(d=button_bottom_size, h=pillar_height, $fn=4); + } + // Left button + translate([up_button_trans+(button_size+button_clearance)/2, -button_size]) rotate([0, 0, -90+45]) { + cylinder(d=button_bottom_size, h=pillar_height, $fn=4); + } +} + + +// front_panel(); +// button(); +translate([0, 0, -13-container_wall_thickness]) back_panel(); diff --git a/src/modules/puzzle_maze/doc/index.md b/src/modules/puzzle_maze/doc/index.md new file mode 100644 index 0000000..699367b --- /dev/null +++ b/src/modules/puzzle_maze/doc/index.md @@ -0,0 +1,20 @@ +# Doolhof + +\begin{figure}[!b] + \centering + \includegraphics[width=24cm,height=5cm,keepaspectratio]{./puzzle_maze/description.png} +\end{figure} + + +- Zoek het juiste doolhof en oriëntatie van dit doolhof aan de hand van de cirkelvormige markeringen op de rand van de doolhofkaarten + +- Het knipperend licht in het doolhof is de bestemming, het licht dat blijft branden + is je karakter. Navigeer je karakter naar de bestemming met de gele knoppen, zonder + dat die door de muren van het doolhof gaat. Let wel, de ontmijner kan de muren niet zien! + + +## Doolhofkaarten + +\begin{center} + \includegraphics[width=10cm, height=10cm,keepaspectratio]{./puzzle_maze/maze.png} +\end{center} diff --git a/src/modules/puzzle_maze/graphics.svg b/src/modules/puzzle_maze/graphics.svg new file mode 100644 index 0000000..02beaa5 --- /dev/null +++ b/src/modules/puzzle_maze/graphics.svg @@ -0,0 +1,309 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/puzzle_maze/puzzle_maze.ino b/src/modules/puzzle_maze/puzzle_maze.ino new file mode 100644 index 0000000..19d7c5c --- /dev/null +++ b/src/modules/puzzle_maze/puzzle_maze.ino @@ -0,0 +1,23 @@ +// (c) 2022, redfast00 +// See the LICENSE file for conditions for copying + +#include + +void setup() { + Serial.begin(115200); + obus_module::setup(OBUS_TYPE_PUZZLE, 0); +} + +obus_can::message message; + +void loop() { + bool is_message_valid = obus_module::loopPuzzle(&message, callback_game_start, callback_game_stop); +} + +void callback_game_start() { + +} + +void callback_game_stop() { + +} diff --git a/src/modules/puzzle_testmodule_buttons/doc/index.md b/src/modules/puzzle_testmodule_buttons/doc/index.md index e68cac5..0079f7f 100644 --- a/src/modules/puzzle_testmodule_buttons/doc/index.md +++ b/src/modules/puzzle_testmodule_buttons/doc/index.md @@ -1,6 +1,3 @@ -## Testmodule buttons +# Testmodule knoppen -If the blue LED is lit, press the green button, otherwise press the red button. - -### Credits -Module developed by redfast00. +Als de LED aan is, druk op de groene knop, anders op de rode knop.