diff options
-rw-r--r-- | .editorconfig | 2 | ||||
-rw-r--r-- | docs/.gitignore | 1 | ||||
-rw-r--r-- | docs/design.adoc | 73 | ||||
-rw-r--r-- | docs/figs.drawio | 26 | ||||
-rw-r--r-- | docs/img/busmaster-sequence.puml | 22 | ||||
-rw-r--r-- | docs/img/busmaster-sequence.svg | 1 | ||||
-rw-r--r-- | docs/img/puzzle-module-common-state.svg | 2 | ||||
-rw-r--r-- | docs/img/theme.ipuml | 6 | ||||
-rw-r--r-- | docs/makefile | 5 |
9 files changed, 90 insertions, 48 deletions
diff --git a/.editorconfig b/.editorconfig index cd37156..4de909a 100644 --- a/.editorconfig +++ b/.editorconfig @@ -5,7 +5,7 @@ indent_style = tab end_of_line = lf insert_final_newline = true -[*.md] +[*.{md,adoc}] indent_style = space indent_size = 2 diff --git a/docs/.gitignore b/docs/.gitignore index a2f45c2..1b1c365 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -1,5 +1,6 @@ *.pdf res +*.bkp # i know this is bad Gemfile.lock diff --git a/docs/design.adoc b/docs/design.adoc index 5ebbb15..e35c495 100644 --- a/docs/design.adoc +++ b/docs/design.adoc @@ -203,7 +203,7 @@ image::img/system-bus.svg[] == Modules This section elaborates on the top-level specifications from <<sec:lv1>> with -additional hardware specifications and software design decisions. +software design decisions and protocol specifications. === Puzzle Module Framework @@ -222,38 +222,6 @@ designed to facilitate the following: * Provide abstracted interfaces to allow for easy integration of the puzzle box as part of a larger whole (<<reqs.adoc#req:main-interface>>). -[[sec:framework-state]] -==== State - -All puzzle modules implement the same state machine shown in -<<fig:puzzle-module-common-state>>. Note that the arrows indicate state -transitions that a puzzle module may take on its own. The main controller also -allows the game operator to manually set the current state as one of the states -on the right half of <<fig:puzzle-module-common-state>>, which can be used to -skip a puzzle if a player is stuck (<<reqs.adoc#req:edge-skip-puzzle>>) or -reset a game if it is malfunctioning (<<reqs.adoc#req:edge-manual-reset>>). - -Puzzle modules start in the 'uninitialized' state, where they repeatedly send -messages to the main controller (see <<sec:main-bridge>>). The state transition -from 'uninitialized' to 'reset' is forced by the main controller upon -initialization. States on the right half of <<fig:puzzle-module-common-state>> -are used during gameplay. - -[[fig:puzzle-module-common-state]] -.Global puzzle module state machine -image::img/puzzle-module-common-state.svg[] - -The state machine described in <<fig:puzzle-module-common-state>> is referred -to as the global state. Puzzle modules may also declare and define custom state -variables, which is referred to as auxiliary state. These auxiliary state -variables contain game-specific variables; e.g. the binary state of each button -on the Neotrellis puzzle module, or the last passcode entered on the vault -puzzle module. - -Separating the auxiliary state from the generic state allows the main -controller to handle the auxiliary state as an arbitrary blob, which allows for -future expansion without modification of the main controller software. - ==== Commands The puzzle module framework describes the following commands: @@ -277,6 +245,45 @@ this, the 'update' command was created. This command is utilized for various kinds of updates, including registering new puzzle modules and updating global state. + +[[sec:framework-state]] +==== State + +All puzzle modules implement the same state machine shown in +<<fig:puzzle-module-common-state>>. Note that the arrows indicate state +transitions that a puzzle module may take on its own. The main controller also +allows the game operator to manually set the current state as one of the states +on the right half of <<fig:puzzle-module-common-state>>, which can be used to +skip a puzzle if a player is stuck (<<reqs.adoc#req:edge-skip-puzzle>>) or +reset a game if it is malfunctioning (<<reqs.adoc#req:edge-manual-reset>>). + +- Puzzle modules start in the 'uninitialized' state, during which they wait for + a handshake command (magic) from the main controller. Once the magic reply is + sent, the puzzle module transitions to the _idle_ state. +- During the 'idle' state, the puzzle module waits until the main controller + forces it into the _playing_ state. +- While in the 'playing' state, the puzzle module is active, and may be solved + by the player(s). The puzzle module's game logic is responsible for checking + if the game is finished, upon which it will transition to the _solved_ state. +- The 'solved' state is similar to the 'idle' state, with the exception that + the main controller will not re-start this puzzle module. Unless a module is + manually reset by the game operator, it does not return from this state. + +[[fig:puzzle-module-common-state]] +.Global puzzle module state machine +image::img/puzzle-module-common-state.svg[] + +The state machine described in <<fig:puzzle-module-common-state>> is referred +to as the _global state_ of a puzzle module. Puzzle modules may also declare +and define custom state variables, which is referred to as _auxiliary state_. +These auxiliary state variables contain game-specific variables (e.g. the +binary state of each button on the Neotrellis puzzle module, or the last +passcode entered on the vault puzzle module). + +Separating the auxiliary state from the generic state allows the main +controller to handle the auxiliary state as an arbitrary blob, which allows for +future expansion without modification of the main controller software. + === Main Controller This subsection defines the function and state of the main controller. diff --git a/docs/figs.drawio b/docs/figs.drawio index a40503b..a43862d 100644 --- a/docs/figs.drawio +++ b/docs/figs.drawio @@ -1,4 +1,4 @@ -<mxfile host="Electron" modified="2024-03-17T13:05:37.082Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/23.1.5 Chrome/120.0.6099.109 Electron/28.1.0 Safari/537.36" etag="7STPuaY27yiGeP_RMlUo" version="23.1.5" type="device" pages="12"> +<mxfile host="Electron" modified="2024-06-01T11:52:27.222Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.4.8 Chrome/124.0.6367.207 Electron/30.0.6 Safari/537.36" etag="qt8lwteWkdC3DiowClIP" version="24.4.8" type="device" pages="12"> <diagram name="planning-condensed" id="ntlEKQOA_ElMvQzKZB-_"> <mxGraphModel dx="1646" dy="488" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> <root> @@ -437,27 +437,27 @@ </mxGraphModel> </diagram> <diagram id="tQJt-i1klPodeKevl6yF" name="puzzle-module-common-state"> - <mxGraphModel dx="1422" dy="822" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <mxGraphModel dx="673" dy="1582" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> - <mxCell id="5xofdATqJuVrBNkdsEzn-2" value="Uninitialized" style="ellipse;whiteSpace=wrap;html=1;fontFamily=Arial;" parent="1" vertex="1"> - <mxGeometry width="80" height="80" as="geometry" /> - </mxCell> - <mxCell id="5xofdATqJuVrBNkdsEzn-6" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontFamily=Arial;" parent="1" source="5xofdATqJuVrBNkdsEzn-3" target="5xofdATqJuVrBNkdsEzn-4" edge="1"> + <mxCell id="TXo2J6VZZM4ndMLuZKAH-1" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="5xofdATqJuVrBNkdsEzn-2" target="5xofdATqJuVrBNkdsEzn-3"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="5xofdATqJuVrBNkdsEzn-3" value="Reset" style="ellipse;whiteSpace=wrap;html=1;fontFamily=Arial;" parent="1" vertex="1"> - <mxGeometry x="100" width="60" height="60" as="geometry" /> + <mxCell id="5xofdATqJuVrBNkdsEzn-2" value="uninitialized" style="ellipse;whiteSpace=wrap;html=1;fontFamily=Arial;" parent="1" vertex="1"> + <mxGeometry y="-10" width="80" height="80" as="geometry" /> + </mxCell> + <mxCell id="5xofdATqJuVrBNkdsEzn-3" value="idle" style="ellipse;whiteSpace=wrap;html=1;fontFamily=Arial;" parent="1" vertex="1"> + <mxGeometry x="100" y="-10" width="80" height="80" as="geometry" /> </mxCell> - <mxCell id="5xofdATqJuVrBNkdsEzn-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontFamily=Arial;" parent="1" source="5xofdATqJuVrBNkdsEzn-4" target="5xofdATqJuVrBNkdsEzn-5" edge="1"> + <mxCell id="5xofdATqJuVrBNkdsEzn-7" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontFamily=Arial;" parent="1" source="5xofdATqJuVrBNkdsEzn-4" target="5xofdATqJuVrBNkdsEzn-5" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="5xofdATqJuVrBNkdsEzn-4" value="Playing" style="ellipse;whiteSpace=wrap;html=1;fontFamily=Arial;" parent="1" vertex="1"> - <mxGeometry x="100" y="80" width="60" height="60" as="geometry" /> + <mxCell id="5xofdATqJuVrBNkdsEzn-4" value="playing" style="ellipse;whiteSpace=wrap;html=1;fontFamily=Arial;" parent="1" vertex="1"> + <mxGeometry x="200" y="-10" width="80" height="80" as="geometry" /> </mxCell> - <mxCell id="5xofdATqJuVrBNkdsEzn-5" value="Solved" style="ellipse;whiteSpace=wrap;html=1;fontFamily=Arial;" parent="1" vertex="1"> - <mxGeometry x="100" y="160" width="60" height="60" as="geometry" /> + <mxCell id="5xofdATqJuVrBNkdsEzn-5" value="solved" style="ellipse;whiteSpace=wrap;html=1;fontFamily=Arial;" parent="1" vertex="1"> + <mxGeometry x="300" y="-10" width="80" height="80" as="geometry" /> </mxCell> </root> </mxGraphModel> diff --git a/docs/img/busmaster-sequence.puml b/docs/img/busmaster-sequence.puml new file mode 100644 index 0000000..362227a --- /dev/null +++ b/docs/img/busmaster-sequence.puml @@ -0,0 +1,22 @@ +@startuml +!include theme.ipuml + +participant "Main controller\n(0x00)" as main +participant "Vault PM\n(0x08)" as a +participant "NeoTrellis PM\n(0x09)" as b +participant "NeoTrellis unit 1\n(0x2e)" as neo1 +participant "NeoTrellis unit 2\n(0x2f)" as neo2 + +activate main +main -> a --++: SEX? +a -> main --++: SEX +||| +main -> b --++: SEX? +b -> neo1: I<sup>2</sup>C write +neo1 -> b: I<sup>2</sup>C read +b -> neo2: I<sup>2</sup>C write +neo2 -> b: I<sup>2</sup>C read +b -> main --++: SEX +||| + +@enduml diff --git a/docs/img/busmaster-sequence.svg b/docs/img/busmaster-sequence.svg new file mode 100644 index 0000000..22d9161 --- /dev/null +++ b/docs/img/busmaster-sequence.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="us-ascii" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="387px" preserveAspectRatio="none" style="width:673px;height:387px;background:#FFFFFF;" version="1.1" viewBox="0 0 673 387" width="673px" zoomAndPan="magnify"><defs/><g><rect fill="#FFFFFF" height="22.9395" style="stroke:#000000;stroke-width:1.0;" width="10" x="70.5" y="63.8789"/><rect fill="#FFFFFF" height="55.9395" style="stroke:#000000;stroke-width:1.0;" width="10" x="70.5" y="117.7578"/><rect fill="#FFFFFF" height="34" style="stroke:#000000;stroke-width:1.0;" width="10" x="70.5" y="337.875"/><rect fill="#FFFFFF" height="30.9395" style="stroke:#000000;stroke-width:1.0;" width="10" x="193" y="86.8184"/><rect fill="#FFFFFF" height="164.1777" style="stroke:#000000;stroke-width:1.0;" width="10" x="312.5" y="173.6973"/><line style="stroke:#000000;stroke-width:1.0;" x1="75" x2="75" y1="53.8789" y2="380.875"/><line style="stroke:#000000;stroke-width:1.0;" x1="198" x2="198" y1="53.8789" y2="380.875"/><line style="stroke:#000000;stroke-width:1.0;" x1="317" x2="317" y1="53.8789" y2="380.875"/><line style="stroke:#000000;stroke-width:1.0;" x1="458" x2="458" y1="53.8789" y2="380.875"/><line style="stroke:#000000;stroke-width:1.0;" x1="607" x2="607" y1="53.8789" y2="380.875"/><rect fill="#FFFFFF" height="47.8789" style="stroke:#000000;stroke-width:1.0;" width="111" x="20" y="5"/><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="97" x="27" y="25.5625">Main controller</text><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="45" x="53" y="42.502">(0x00)</text><rect fill="#FFFFFF" height="47.8789" style="stroke:#000000;stroke-width:1.0;" width="74" x="161" y="5"/><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="60" x="168" y="25.5625">Vault PM</text><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="45" x="175.5" y="42.502">(0x08)</text><rect fill="#FFFFFF" height="47.8789" style="stroke:#000000;stroke-width:1.0;" width="105" x="265" y="5"/><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="91" x="272" y="25.5625">NeoTrellis PM</text><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="45" x="295" y="42.502">(0x09)</text><rect fill="#FFFFFF" height="47.8789" style="stroke:#000000;stroke-width:1.0;" width="117" x="400" y="5"/><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="103" x="407" y="25.5625">NeoTrellis unit 1</text><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="44" x="436.5" y="42.502">(0x2e)</text><rect fill="#FFFFFF" height="47.8789" style="stroke:#000000;stroke-width:1.0;" width="120" x="547" y="5"/><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="106" x="554" y="25.5625">NeoTrellis unit 2</text><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="41" x="586.5" y="42.502">(0x2f)</text><rect fill="#FFFFFF" height="22.9395" style="stroke:#000000;stroke-width:1.0;" width="10" x="70.5" y="63.8789"/><rect fill="#FFFFFF" height="55.9395" style="stroke:#000000;stroke-width:1.0;" width="10" x="70.5" y="117.7578"/><rect fill="#FFFFFF" height="34" style="stroke:#000000;stroke-width:1.0;" width="10" x="70.5" y="337.875"/><rect fill="#FFFFFF" height="30.9395" style="stroke:#000000;stroke-width:1.0;" width="10" x="193" y="86.8184"/><rect fill="#FFFFFF" height="164.1777" style="stroke:#000000;stroke-width:1.0;" width="10" x="312.5" y="173.6973"/><polygon fill="#000000" points="181,82.8184,191,86.8184,181,90.8184,185,86.8184" style="stroke:#000000;stroke-width:1.0;"/><line style="stroke:#000000;stroke-width:1.0;" x1="75.5" x2="187" y1="86.8184" y2="86.8184"/><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="34" x="82.5" y="81.4414">SEX?</text><polygon fill="#000000" points="91.5,113.7578,81.5,117.7578,91.5,121.7578,87.5,117.7578" style="stroke:#000000;stroke-width:1.0;"/><line style="stroke:#000000;stroke-width:1.0;" x1="85.5" x2="197" y1="117.7578" y2="117.7578"/><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="27" x="97.5" y="112.3809">SEX</text><polygon fill="#000000" points="300.5,169.6973,310.5,173.6973,300.5,177.6973,304.5,173.6973" style="stroke:#000000;stroke-width:1.0;"/><line style="stroke:#000000;stroke-width:1.0;" x1="75.5" x2="306.5" y1="173.6973" y2="173.6973"/><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="34" x="82.5" y="168.3203">SEX?</text><polygon fill="#000000" points="446.5,203.0068,456.5,207.0068,446.5,211.0068,450.5,207.0068" style="stroke:#000000;stroke-width:1.0;"/><line style="stroke:#000000;stroke-width:1.0;" x1="322.5" x2="452.5" y1="207.0068" y2="207.0068"/><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="4" x="329.5" y="201.6299">I</text><text fill="#000000" font-family="Inter" font-size="11" lengthAdjust="spacing" textLength="7" x="333.5" y="196.3535">2</text><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="10" x="340.5" y="201.6299">C</text><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="4" x="350.5" y="201.6299"> </text><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="32" x="354.5" y="201.6299">write</text><polygon fill="#000000" points="333.5,236.3164,323.5,240.3164,333.5,244.3164,329.5,240.3164" style="stroke:#000000;stroke-width:1.0;"/><line style="stroke:#000000;stroke-width:1.0;" x1="327.5" x2="457.5" y1="240.3164" y2="240.3164"/><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="4" x="339.5" y="234.9395">I</text><text fill="#000000" font-family="Inter" font-size="11" lengthAdjust="spacing" textLength="7" x="343.5" y="229.6631">2</text><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="10" x="350.5" y="234.9395">C</text><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="4" x="360.5" y="234.9395"> </text><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="30" x="364.5" y="234.9395">read</text><polygon fill="#000000" points="595,269.626,605,273.626,595,277.626,599,273.626" style="stroke:#000000;stroke-width:1.0;"/><line style="stroke:#000000;stroke-width:1.0;" x1="322.5" x2="601" y1="273.626" y2="273.626"/><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="4" x="329.5" y="268.249">I</text><text fill="#000000" font-family="Inter" font-size="11" lengthAdjust="spacing" textLength="7" x="333.5" y="262.9727">2</text><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="10" x="340.5" y="268.249">C</text><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="4" x="350.5" y="268.249"> </text><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="32" x="354.5" y="268.249">write</text><polygon fill="#000000" points="333.5,302.9355,323.5,306.9355,333.5,310.9355,329.5,306.9355" style="stroke:#000000;stroke-width:1.0;"/><line style="stroke:#000000;stroke-width:1.0;" x1="327.5" x2="606" y1="306.9355" y2="306.9355"/><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="4" x="339.5" y="301.5586">I</text><text fill="#000000" font-family="Inter" font-size="11" lengthAdjust="spacing" textLength="7" x="343.5" y="296.2822">2</text><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="10" x="350.5" y="301.5586">C</text><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="4" x="360.5" y="301.5586"> </text><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="30" x="364.5" y="301.5586">read</text><polygon fill="#000000" points="91.5,333.875,81.5,337.875,91.5,341.875,87.5,337.875" style="stroke:#000000;stroke-width:1.0;"/><line style="stroke:#000000;stroke-width:1.0;" x1="85.5" x2="316.5" y1="337.875" y2="337.875"/><text fill="#000000" font-family="Inter" font-size="14" lengthAdjust="spacing" textLength="27" x="97.5" y="332.498">SEX</text><!--SRC=[XSunQm9140NWVd_5n4gHqtEhH4GBiR0m2159aMRk775WR-_OczKKz-FDkdX44hNPXNdVW_V2DZT-Ho07AcZ0bI-CKXKwuPmhj0AT5RA5lBJYIcF8VTbk-fsclGvW3SLFTgktw8t0UXNPQsHuQzwft3WoXkiMlaMOtONUii3eWZL5RAaSFVOw-dthjLAO2nzHA6uF3oHJG4YIVdyC7ulFcS9mYSdrg9gcQN7s6sVX4gQCOJcfVJNLas7uvd1oBAH2T2dzoHtXhgth-tNzhFxFr3C0]--></g></svg>
\ No newline at end of file diff --git a/docs/img/puzzle-module-common-state.svg b/docs/img/puzzle-module-common-state.svg index b5688ef..a3ac4bb 100644 --- a/docs/img/puzzle-module-common-state.svg +++ b/docs/img/puzzle-module-common-state.svg @@ -1,3 +1,3 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="161px" height="221px" viewBox="-0.5 -0.5 161 221"><defs/><g><ellipse cx="40" cy="40" rx="40" ry="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 40px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Arial; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Uninitialized</div></div></div></foreignObject><image x="1" y="33.5" width="78" height="17" xlink:href="data:image/png;base64,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"/></switch></g><path d="M 130 60 L 130 73.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 130 78.88 L 126.5 71.88 L 130 73.63 L 133.5 71.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><ellipse cx="130" cy="30" rx="30" ry="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 30px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Arial; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Reset</div></div></div></foreignObject><image x="101" y="23.5" width="58" height="17" xlink:href="data:image/png;base64,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"/></switch></g><path d="M 130 140 L 130 160 L 130 140 L 130 153.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 130 158.88 L 126.5 151.88 L 130 153.63 L 133.5 151.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><ellipse cx="130" cy="110" rx="30" ry="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 110px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Arial; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Playing</div></div></div></foreignObject><image x="101" y="103.5" width="58" height="17" xlink:href="data:image/png;base64,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"/></switch></g><ellipse cx="130" cy="190" rx="30" ry="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 190px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Arial; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Solved</div></div></div></foreignObject><image x="101" y="183.5" width="58" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></svg>
\ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="382px" height="81px" viewBox="-0.5 -0.5 382 81"><defs/><g><g><path d="M 80 40 L 93.63 40" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 98.88 40 L 91.88 43.5 L 93.63 40 L 91.88 36.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><ellipse cx="40" cy="40" rx="40" ry="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 40px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Arial; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">uninitialized</div></div></div></foreignObject><text x="40" y="44" fill="rgb(0, 0, 0)" font-family="Arial" font-size="12px" text-anchor="middle">uninitialized</text></switch></g></g><g><ellipse cx="140" cy="40" rx="40" ry="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 40px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Arial; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="140" y="44" fill="rgb(0, 0, 0)" font-family="Arial" font-size="12px" text-anchor="middle">idle</text></switch></g></g><g><path d="M 280 40 L 293.63 40" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 298.88 40 L 291.88 43.5 L 293.63 40 L 291.88 36.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><ellipse cx="240" cy="40" rx="40" ry="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 40px; margin-left: 201px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Arial; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">playing</div></div></div></foreignObject><text x="240" y="44" fill="rgb(0, 0, 0)" font-family="Arial" font-size="12px" text-anchor="middle">playing</text></switch></g></g><g><ellipse cx="340" cy="40" rx="40" ry="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 40px; margin-left: 301px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Arial; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">solved</div></div></div></foreignObject><text x="340" y="44" fill="rgb(0, 0, 0)" font-family="Arial" font-size="12px" text-anchor="middle">solved</text></switch></g></g></g></svg>
\ No newline at end of file diff --git a/docs/img/theme.ipuml b/docs/img/theme.ipuml new file mode 100644 index 0000000..23e0ce5 --- /dev/null +++ b/docs/img/theme.ipuml @@ -0,0 +1,6 @@ +!theme plain +skinparam DefaultFontSize 14 +skinparam DefaultFontName Inter +skinparam RoundCorner 0 +skinparam maxMessageSize 200 +hide footbox diff --git a/docs/makefile b/docs/makefile index f175830..370d2db 100644 --- a/docs/makefile +++ b/docs/makefile @@ -19,3 +19,8 @@ ASCIIDOCTOR_ARGS += --backend pdf %.pdf: %.adoc $(PDFDEPS) bundle exec asciidoctor $(ASCIIDOCTOR_ARGS) $< +%.svg: %.puml img/theme.ipuml + plantuml -tsvg $< + + + |