Changed to a simpler layout to support Linux better

This commit is contained in:
Christoffer Martinsson 2025-05-25 13:03:50 +02:00
parent 6d22e5dc54
commit 89254b903f
3 changed files with 353 additions and 351 deletions

View File

@ -1,6 +1,6 @@
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/26.0.16 Chrome/132.0.6834.196 Electron/34.2.0 Safari/537.36" version="26.0.16" pages="5">
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/26.0.16 Chrome/132.0.6834.196 Electron/34.2.0 Safari/537.36" version="26.0.16" pages="6">
<diagram name="SC" id="1nY57bFw4Lh56mPbXi3G">
<mxGraphModel dx="1434" dy="997" 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="2074" dy="1237" 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" />
@ -193,195 +193,389 @@
</root>
</mxGraphModel>
</diagram>
<diagram name="Copy of SC" id="8fwoE9U1Da0tbMgP_bSo">
<diagram name="Copy of SC" id="sUiP1SvRhEXQG_gmGfj8">
<mxGraphModel dx="2074" dy="1237" 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="KPQZ-7z9tZGHYBku0gLQ-0" />
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-1" parent="KPQZ-7z9tZGHYBku0gLQ-0" />
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-2" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-0" />
<mxCell id="EkkbSOEkYUomZlU8jIUN-1" parent="EkkbSOEkYUomZlU8jIUN-0" />
<mxCell id="EkkbSOEkYUomZlU8jIUN-2" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="463" y="480" width="60" height="60" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-3" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-3" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="303" y="480" width="60" height="60" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-4" value="Throttle/Yaw" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillStyle=dots;fillColor=#303030;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-4" value="Throttle/Yaw&lt;div&gt;X/Y&lt;/div&gt;" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillStyle=dots;fillColor=#303030;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="53" y="630" width="200" height="200" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-5" value="Pitch/Roll" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillStyle=dots;fillColor=#303030;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-5" value="Pitch/Roll&lt;div&gt;Z/rX&lt;/div&gt;" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillStyle=dots;fillColor=#303030;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="573" y="630" width="200" height="200" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-6" value="Noice" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=hatch;fillColor=#8C1C1C;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-6" value="Noice" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=hatch;fillColor=#8C1C1C;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="293" y="670" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-7" value="&lt;div style=&quot;&quot;&gt;&lt;font style=&quot;color: rgb(255, 255, 255);&quot;&gt;L-req&lt;/font&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=auto;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-7" value="&lt;div style=&quot;&quot;&gt;&lt;font style=&quot;color: rgb(255, 255, 255);&quot;&gt;Gear&lt;/font&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=cross-hatch;fillColor=#6D8764;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="293" y="570" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-8" value="Decoy" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=hatch;fillColor=#8C1C1C;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-8" value="Decoy" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=hatch;fillColor=#8C1C1C;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="453" y="670" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-9" value="Missile/Gun&lt;div&gt;mode&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(109, 135, 100);&quot;&gt;Next missile&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(109, 135, 100);&quot;&gt;type&lt;/span&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=auto;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-9" value="CPLD" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=hatch;fillColor=#FF9933;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="453" y="570" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-10" value="&lt;div&gt;Right&lt;/div&gt;&lt;font style=&quot;color: rgb(109, 135, 100);&quot;&gt;CPLD&lt;/font&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=dots;fillColor=#303030;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxGeometry x="203" y="470" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-11" value="&lt;div&gt;&lt;font style=&quot;color: rgb(255, 255, 255);&quot;&gt;Left&lt;/font&gt;&lt;/div&gt;&lt;font style=&quot;color: rgb(109, 135, 100);&quot;&gt;Throttle&lt;/font&gt;&lt;div&gt;&lt;font style=&quot;color: rgb(109, 135, 100);&quot;&gt;Hold&lt;/font&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=dots;fillColor=#303030;strokeColor=#FFFFFF;fontColor=#FFFFFF;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxGeometry x="113" y="470" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-12" value="&lt;div&gt;NAV&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;Q mode&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(109, 135, 100);&quot;&gt;Next mode&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;&lt;/span&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxGeometry x="633" y="470" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-13" value="SCM&lt;div&gt;Gun mode&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;Prev mode&lt;/font&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxGeometry x="543" y="470" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-14" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillStyle=auto;fillColor=#303030;gradientColor=none;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxGeometry x="293" y="780" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-15" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillStyle=auto;fillColor=#303030;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxGeometry x="453" y="780" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-16" value="Ping&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;Target next&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;hostile&lt;/font&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-10" value="&lt;div&gt;Ping&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=auto;fillColor=default;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="697" y="290" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-17" value="Fire&lt;div&gt;Secondary&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=auto;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-13" value="Next&lt;div&gt;SCM/NAV&lt;/div&gt;&lt;div&gt;mode&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=auto;fillColor=default;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="543" y="470" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="EkkbSOEkYUomZlU8jIUN-14" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillStyle=auto;fillColor=#303030;gradientColor=none;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="293" y="780" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="EkkbSOEkYUomZlU8jIUN-15" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillStyle=auto;fillColor=#303030;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="453" y="780" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="EkkbSOEkYUomZlU8jIUN-16" value="&lt;div&gt;Fire/QT&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="605" y="290" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="EkkbSOEkYUomZlU8jIUN-17" value="Brake" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=hatch;fillColor=#FF9933;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="697" y="190" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-18" value="&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;Fn&lt;/font&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=auto;fillColor=#6d8764;fontColor=#ffffff;strokeColor=#3A5431;fontStyle=1" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxGeometry x="48" y="190" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-19" value="Up&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;Down&lt;/font&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=dots;fillColor=#303030;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-19" value="Up&lt;div&gt;rZ+&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=dots;fillColor=#303030;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="48" y="290" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-20" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-20" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="108" y="430" as="sourcePoint" />
<mxPoint x="28" y="510" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-21" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-21" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="718" y="430" as="sourcePoint" />
<mxPoint x="798" y="510" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-22" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-22" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="718" y="430" as="sourcePoint" />
<mxPoint x="108" y="430" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-23" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-23" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="798" y="880" as="sourcePoint" />
<mxPoint x="28" y="880" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-24" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-24" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="28" y="510" as="sourcePoint" />
<mxPoint x="28" y="880" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-25" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-25" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="798" y="510" as="sourcePoint" />
<mxPoint x="798" y="880" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-26" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-26" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="798" y="170" as="sourcePoint" />
<mxPoint x="28" y="170" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-27" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-27" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="798" y="390" as="sourcePoint" />
<mxPoint x="28" y="390" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-28" value="Reset head tracker&lt;div&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-28" value="Reset head tracker&lt;div&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="373" y="190" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-29" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-29" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="28" y="170" as="sourcePoint" />
<mxPoint x="28" y="390" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-30" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-30" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="798" y="170" as="sourcePoint" />
<mxPoint x="798" y="390" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-31" value="USB-C" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-31" value="USB-C" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="353" y="300" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-32" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-32" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="240" y="170" as="sourcePoint" />
<mxPoint x="240" y="390" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-33" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-33" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="583" y="170" as="sourcePoint" />
<mxPoint x="583" y="390" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-34" value="UP:&lt;div&gt;DOWN:&lt;/div&gt;&lt;div&gt;LEFT:&lt;/div&gt;&lt;div&gt;RIGHT:&lt;/div&gt;&lt;div&gt;BUTTON:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;UP:&lt;/font&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;DOWN:&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;LEFT:&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;RIGHT:&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;BUTTON:&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;" style="text;strokeColor=none;align=right;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxGeometry x="433" y="910" width="60" height="160" as="geometry" />
<mxCell id="EkkbSOEkYUomZlU8jIUN-34" value="UP:&lt;div&gt;DOWN:&lt;/div&gt;&lt;div&gt;LEFT:&lt;/div&gt;&lt;div&gt;RIGHT:&lt;/div&gt;&lt;div&gt;BUTTON:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;" style="text;strokeColor=none;align=right;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="433" y="910" width="60" height="90" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-35" value="UP:&lt;div&gt;DOWN:&lt;/div&gt;&lt;div&gt;LEFT:&lt;/div&gt;&lt;div&gt;RIGHT:&lt;/div&gt;&lt;div&gt;BUTTON:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;UP:&lt;/font&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;DOWN:&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;LEFT:&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;RIGHT:&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;BUTTON:&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;" style="text;strokeColor=none;align=right;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxGeometry x="273" y="910" width="55" height="160" as="geometry" />
<mxCell id="EkkbSOEkYUomZlU8jIUN-35" value="UP:&lt;div&gt;DOWN:&lt;/div&gt;&lt;div&gt;LEFT:&lt;/div&gt;&lt;div&gt;RIGHT:&lt;/div&gt;&lt;div&gt;BUTTON:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;" style="text;strokeColor=none;align=right;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="273" y="910" width="55" height="90" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-36" value="" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-36" value="" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="313" y="770" width="40" height="20" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-37" value="" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-37" value="" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="313" y="850" width="40" height="20" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-38" value="" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-38" value="" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="473" y="770" width="40" height="20" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-39" value="" style="rounded=1;whiteSpace=wrap;html=1;rotation=90;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-39" value="" style="rounded=1;whiteSpace=wrap;html=1;rotation=90;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="353" y="810" width="40" height="20" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-40" value="" style="rounded=1;whiteSpace=wrap;html=1;rotation=90;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-40" value="" style="rounded=1;whiteSpace=wrap;html=1;rotation=90;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="273" y="810" width="40" height="20" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-41" value="" style="rounded=1;whiteSpace=wrap;html=1;rotation=90;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-41" value="" style="rounded=1;whiteSpace=wrap;html=1;rotation=90;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="433" y="810" width="40" height="20" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-42" value="" style="rounded=1;whiteSpace=wrap;html=1;rotation=90;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-42" value="" style="rounded=1;whiteSpace=wrap;html=1;rotation=90;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="513" y="810" width="40" height="20" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-43" value="" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-43" value="" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="473" y="850" width="40" height="20" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-44" value="&lt;div&gt;VTOL&lt;/div&gt;&lt;div&gt;EXT&lt;/div&gt;" style="text;strokeColor=none;align=center;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-44" value="&lt;div&gt;SCM&lt;/div&gt;&lt;div&gt;(Gun)&lt;/div&gt;" style="text;strokeColor=none;align=center;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="413" y="470" width="60" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-45" value="&lt;div&gt;Power Engine&lt;/div&gt;&lt;div&gt;Power Reset&lt;/div&gt;&lt;div&gt;Power Weapons&lt;/div&gt;&lt;div&gt;Power Sheilds&lt;/div&gt;&lt;div&gt;Thrusters On/Off&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;Flight ready&lt;br&gt;&lt;/font&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;Lights On/Off&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(109, 135, 100); background-color: transparent;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(109, 135, 100); background-color: transparent;&quot;&gt;Open/Close doors&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;" style="text;strokeColor=none;align=left;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxGeometry x="328" y="910" width="110" height="160" as="geometry" />
<mxCell id="EkkbSOEkYUomZlU8jIUN-45" value="&lt;div&gt;Power Engine&lt;/div&gt;&lt;div&gt;Power Reset&lt;/div&gt;&lt;div&gt;Power Weapons&lt;/div&gt;&lt;div&gt;Power Sheilds&lt;/div&gt;&lt;div&gt;Brake&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;" style="text;strokeColor=none;align=left;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="328" y="910" width="110" height="90" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-46" value="&lt;div&gt;Target in sight&lt;/div&gt;&lt;div&gt;Target closest hostile&lt;/div&gt;&lt;div&gt;Target next friendly&lt;/div&gt;&lt;div&gt;Target next hostile&lt;/div&gt;&lt;div&gt;Clear target&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;Camera up&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;Camera down&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;Camera left&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;Camera right&lt;br&gt;&lt;/font&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;Camera On/Off&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;" style="text;strokeColor=none;align=left;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxGeometry x="493" y="910" width="135" height="160" as="geometry" />
<mxCell id="EkkbSOEkYUomZlU8jIUN-46" value="&lt;div&gt;Target in sight&lt;/div&gt;&lt;div&gt;Target closest hostile&lt;/div&gt;&lt;div&gt;Target next friendly&lt;/div&gt;&lt;div&gt;Target next hostile&lt;/div&gt;&lt;div&gt;TH&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;" style="text;strokeColor=none;align=left;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="493" y="910" width="135" height="90" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-47" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillStyle=auto;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-47" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillStyle=auto;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="318" y="495" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-48" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-48" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="478" y="495" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-49" value="&lt;div&gt;Gear&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(109, 135, 100), rgb(109, 135, 100));&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;" style="text;strokeColor=none;align=center;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=default;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-49" value="&lt;div&gt;NAV&lt;/div&gt;&lt;div&gt;(QT)&lt;/div&gt;" style="text;strokeColor=none;align=center;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=default;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="353" y="470" width="67" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-50" value="Boost&lt;br&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;Brake&lt;/font&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=dots;fillColor=#303030;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="EkkbSOEkYUomZlU8jIUN-50" value="Left&lt;div&gt;rY-&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=dots;fillColor=#303030;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="110" y="470" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="EkkbSOEkYUomZlU8jIUN-51" value="Right&lt;div&gt;rY+&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillColor=#303030;fillStyle=dots;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="200" y="470" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="wdcyabzTlTJtnx-9P4dW-0" value="Down&lt;div&gt;rZ-&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=dots;fillColor=#303030;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="48" y="190" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="wc2aKXT8cUdF5_0YO61A-0" value="Boost" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=hatch;fillColor=#FF9933;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="140" y="290" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-51" value="Fire&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;primary&lt;/span&gt;&lt;div&gt;&lt;div&gt;/ QT&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="KPQZ-7z9tZGHYBku0gLQ-1">
<mxCell id="wc2aKXT8cUdF5_0YO61A-1" value="Missile" style="whiteSpace=wrap;html=1;aspect=fixed;fillColor=default;fillStyle=auto;" vertex="1" parent="EkkbSOEkYUomZlU8jIUN-1">
<mxGeometry x="633" y="470" width="80" height="80" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram name="Copy of SC" id="8fwoE9U1Da0tbMgP_bSo">
<mxGraphModel dx="1434" dy="997" 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="KPQZ-7z9tZGHYBku0gLQ-0" />
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-1" parent="KPQZ-7z9tZGHYBku0gLQ-0" />
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-2" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="463" y="480" width="60" height="60" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-3" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="303" y="480" width="60" height="60" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-4" value="Throttle/Yaw" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillStyle=dots;fillColor=#303030;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="53" y="630" width="200" height="200" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-5" value="Pitch/Roll" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillStyle=dots;fillColor=#303030;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="573" y="630" width="200" height="200" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-6" value="Noice" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=hatch;fillColor=#8C1C1C;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="293" y="670" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-7" value="&lt;div style=&quot;&quot;&gt;&lt;font style=&quot;color: rgb(255, 255, 255);&quot;&gt;L-req&lt;/font&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=auto;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="293" y="570" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-8" value="Decoy" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=hatch;fillColor=#8C1C1C;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="453" y="670" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-9" value="Missile/Gun&lt;div&gt;mode&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(109, 135, 100);&quot;&gt;Next missile&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(109, 135, 100);&quot;&gt;type&lt;/span&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=auto;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="453" y="570" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-10" value="&lt;div&gt;Right&lt;/div&gt;&lt;font style=&quot;color: rgb(109, 135, 100);&quot;&gt;CPLD&lt;/font&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=dots;fillColor=#303030;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="203" y="470" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-11" value="&lt;div&gt;&lt;font style=&quot;color: rgb(255, 255, 255);&quot;&gt;Left&lt;/font&gt;&lt;/div&gt;&lt;font style=&quot;color: rgb(109, 135, 100);&quot;&gt;Throttle&lt;/font&gt;&lt;div&gt;&lt;font style=&quot;color: rgb(109, 135, 100);&quot;&gt;Hold&lt;/font&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=dots;fillColor=#303030;strokeColor=#FFFFFF;fontColor=#FFFFFF;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="113" y="470" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-12" value="&lt;div&gt;NAV&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;Q mode&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(109, 135, 100);&quot;&gt;Next mode&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;&lt;/span&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="633" y="470" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-13" value="SCM&lt;div&gt;Gun mode&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;Prev mode&lt;/font&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="543" y="470" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-14" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillStyle=auto;fillColor=#303030;gradientColor=none;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="293" y="780" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-15" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillStyle=auto;fillColor=#303030;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="453" y="780" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-16" value="Ping&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;Target next&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;hostile&lt;/font&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="697" y="290" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-17" value="Fire&lt;div&gt;Secondary&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=auto;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="697" y="190" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-18" value="&lt;div&gt;&lt;font color=&quot;#000000&quot;&gt;Fn&lt;/font&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=auto;fillColor=#6d8764;fontColor=#ffffff;strokeColor=#3A5431;fontStyle=1" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="48" y="190" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-19" value="Up&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;Down&lt;/font&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=dots;fillColor=#303030;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="48" y="290" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-20" value="" style="endArrow=none;html=1;rounded=0;" parent="KPQZ-7z9tZGHYBku0gLQ-1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="108" y="430" as="sourcePoint" />
<mxPoint x="28" y="510" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-21" value="" style="endArrow=none;html=1;rounded=0;" parent="KPQZ-7z9tZGHYBku0gLQ-1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="718" y="430" as="sourcePoint" />
<mxPoint x="798" y="510" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-22" value="" style="endArrow=none;html=1;rounded=0;" parent="KPQZ-7z9tZGHYBku0gLQ-1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="718" y="430" as="sourcePoint" />
<mxPoint x="108" y="430" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-23" value="" style="endArrow=none;html=1;rounded=0;" parent="KPQZ-7z9tZGHYBku0gLQ-1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="798" y="880" as="sourcePoint" />
<mxPoint x="28" y="880" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-24" value="" style="endArrow=none;html=1;rounded=0;" parent="KPQZ-7z9tZGHYBku0gLQ-1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="28" y="510" as="sourcePoint" />
<mxPoint x="28" y="880" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-25" value="" style="endArrow=none;html=1;rounded=0;" parent="KPQZ-7z9tZGHYBku0gLQ-1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="798" y="510" as="sourcePoint" />
<mxPoint x="798" y="880" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-26" value="" style="endArrow=none;html=1;rounded=0;" parent="KPQZ-7z9tZGHYBku0gLQ-1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="798" y="170" as="sourcePoint" />
<mxPoint x="28" y="170" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-27" value="" style="endArrow=none;html=1;rounded=0;" parent="KPQZ-7z9tZGHYBku0gLQ-1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="798" y="390" as="sourcePoint" />
<mxPoint x="28" y="390" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-28" value="Reset head tracker&lt;div&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="373" y="190" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-29" value="" style="endArrow=none;html=1;rounded=0;" parent="KPQZ-7z9tZGHYBku0gLQ-1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="28" y="170" as="sourcePoint" />
<mxPoint x="28" y="390" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-30" value="" style="endArrow=none;html=1;rounded=0;" parent="KPQZ-7z9tZGHYBku0gLQ-1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="798" y="170" as="sourcePoint" />
<mxPoint x="798" y="390" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-31" value="USB-C" style="rounded=1;whiteSpace=wrap;html=1;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="353" y="300" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-32" value="" style="endArrow=none;html=1;rounded=0;" parent="KPQZ-7z9tZGHYBku0gLQ-1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="240" y="170" as="sourcePoint" />
<mxPoint x="240" y="390" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-33" value="" style="endArrow=none;html=1;rounded=0;" parent="KPQZ-7z9tZGHYBku0gLQ-1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="583" y="170" as="sourcePoint" />
<mxPoint x="583" y="390" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-34" value="UP:&lt;div&gt;DOWN:&lt;/div&gt;&lt;div&gt;LEFT:&lt;/div&gt;&lt;div&gt;RIGHT:&lt;/div&gt;&lt;div&gt;BUTTON:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;UP:&lt;/font&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;DOWN:&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;LEFT:&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;RIGHT:&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;BUTTON:&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;" style="text;strokeColor=none;align=right;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="433" y="910" width="60" height="160" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-35" value="UP:&lt;div&gt;DOWN:&lt;/div&gt;&lt;div&gt;LEFT:&lt;/div&gt;&lt;div&gt;RIGHT:&lt;/div&gt;&lt;div&gt;BUTTON:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;UP:&lt;/font&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;DOWN:&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;LEFT:&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;RIGHT:&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;BUTTON:&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;" style="text;strokeColor=none;align=right;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="273" y="910" width="55" height="160" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-36" value="" style="rounded=1;whiteSpace=wrap;html=1;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="313" y="770" width="40" height="20" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-37" value="" style="rounded=1;whiteSpace=wrap;html=1;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="313" y="850" width="40" height="20" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-38" value="" style="rounded=1;whiteSpace=wrap;html=1;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="473" y="770" width="40" height="20" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-39" value="" style="rounded=1;whiteSpace=wrap;html=1;rotation=90;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="353" y="810" width="40" height="20" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-40" value="" style="rounded=1;whiteSpace=wrap;html=1;rotation=90;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="273" y="810" width="40" height="20" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-41" value="" style="rounded=1;whiteSpace=wrap;html=1;rotation=90;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="433" y="810" width="40" height="20" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-42" value="" style="rounded=1;whiteSpace=wrap;html=1;rotation=90;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="513" y="810" width="40" height="20" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-43" value="" style="rounded=1;whiteSpace=wrap;html=1;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="473" y="850" width="40" height="20" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-44" value="&lt;div&gt;VTOL&lt;/div&gt;&lt;div&gt;EXT&lt;/div&gt;" style="text;strokeColor=none;align=center;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="413" y="470" width="60" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-45" value="&lt;div&gt;Power Engine&lt;/div&gt;&lt;div&gt;Power Reset&lt;/div&gt;&lt;div&gt;Power Weapons&lt;/div&gt;&lt;div&gt;Power Sheilds&lt;/div&gt;&lt;div&gt;Thrusters On/Off&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;Flight ready&lt;br&gt;&lt;/font&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;Lights On/Off&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(109, 135, 100); background-color: transparent;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(109, 135, 100); background-color: transparent;&quot;&gt;Open/Close doors&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;" style="text;strokeColor=none;align=left;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="328" y="910" width="110" height="160" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-46" value="&lt;div&gt;Target in sight&lt;/div&gt;&lt;div&gt;Target closest hostile&lt;/div&gt;&lt;div&gt;Target next friendly&lt;/div&gt;&lt;div&gt;Target next hostile&lt;/div&gt;&lt;div&gt;Clear target&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;Camera up&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;Camera down&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;Camera left&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;Camera right&lt;br&gt;&lt;/font&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;Camera On/Off&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;" style="text;strokeColor=none;align=left;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="493" y="910" width="135" height="160" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-47" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillStyle=auto;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="318" y="495" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-48" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="478" y="495" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-49" value="&lt;div&gt;Gear&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(109, 135, 100), rgb(109, 135, 100));&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;" style="text;strokeColor=none;align=center;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=default;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="353" y="470" width="67" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-50" value="Boost&lt;br&gt;&lt;div&gt;&lt;font color=&quot;#6d8764&quot;&gt;Brake&lt;/font&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;fillStyle=dots;fillColor=#303030;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="140" y="290" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="KPQZ-7z9tZGHYBku0gLQ-51" value="Fire&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;primary&lt;/span&gt;&lt;div&gt;&lt;div&gt;/ QT&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" parent="KPQZ-7z9tZGHYBku0gLQ-1" vertex="1">
<mxGeometry x="604" y="290" width="80" height="80" as="geometry" />
</mxCell>
</root>

View File

@ -82,12 +82,6 @@ pub struct Button {
pub usb_changed: bool,
pub usb_changed_to_pressed: bool,
pub usb_button: usize,
pub usb_button_sec_enable: bool,
pub usb_button_sec: usize,
pub usb_button_sec_trigger_index: usize,
pub usb_button_sec_pressed: bool,
pub usb_button_toggle_enable: bool,
pub usb_release_timeout: u16,
}
#[derive(Copy, Clone)]
@ -285,119 +279,57 @@ fn main() -> ! {
// | | - | - | - | | - |C OK | - | |
// | | - | | - | |
// ---------------------------------------------------------------
// USB HID joystick map :
// ---------------------------------------------------------------
// | B4 L| B3 U| B7 U| | B26 | | B8 U| B1 U| B2 L|
// ---------------------------------------------------------------
// | | B5 | B14 | B9 | | B10 | B15 | B6 | |
// | |
// | | B13 | | B17 | |
// | | B16 | | B12 | |
// | X1/Y1 X2/Y2 |
// | | B18 | | B22 | |
// | | B21 | B11 | B19 | | B25 | TH | B23 | |
// | | B20 | | B24 | |
// ---------------------------------------------------------------
//
pub const CONFIG_BUTTON: usize = 2;
pub const BOOT_BUTTON: usize = 0;
pub const CAL_BUTTON: usize = 1;
pub const CAL_DONE_BUTTON: usize = 20;
pub const CAL_M10_GIMBLE_BUTTON: usize = 8;
pub const CAL_M7_GIMBLE_BUTTON: usize = 9;
// HW Button index map:
// ---------------------------------------------------------------
// | 0 L| 1 U| 25 U | | 2 | | 26 U | 4 U| 3 L|
// ---------------------------------------------------------------
// | | 5 | 6 | 7 | | 12 | 11 | 10 | |
// | |
// | | 8 | | 13 | |
// | | 9 | | 14 | |
// | X1/Y1 X2/Y2 |
// | | 16 | | 21 | |
// | | 19 | 15 | 17 | | 24 | 20 | 22 | |
// | | 18 | | 23 | |
// ---------------------------------------------------------------
//
// USB HID joystick map :
// ---------------------------------------------------------------
// | Fn L| B19 U| B7 U| | B32 | | B8 U| B1 U| B2 L|
// ---------------------------------------------------------------
// | | B5 | B14 | B9 | | B10 | B15 | B6 | |
// | |
// | | B13 | | B17 | |
// | | B16 | | B18 | |
// | X1/Y1 X2/Y2 |
// | | H1U | | H2U | |
// | | H1L | B11 | H1R | | H2L | B12 | H2R | |
// | | H1D | | H2D | |
// ---------------------------------------------------------------
//
// USB HID joystick map (Fn):
// ---------------------------------------------------------------
// | Fn L| B21 U| B27 U| | B32 | | B8 U| B3 U| B4 L|
// ---------------------------------------------------------------
// | | TH | B22 | B26 | | B28 | B24 | B23 | |
// | |
// | | B29 | | B31 | |
// | | B16 | | B18 | |
// | X1/Y1 X2/Y2 |
// | | H3U | | H4U | |
// | | H3L | B20 | H3R | | H4L | B25 | H4R | |
// | | H3D | | H4D | |
// ---------------------------------------------------------------
// Special button functions
// Throttle hold:
pub const TH_BUTTON: usize = 5;
pub const TH_BUTTON_TRIGGER: usize = 0;
pub const TH_BUTTON: usize = 20;
// Set up usb button layout (button 0 to 15, 20, 25 and 26)
buttons[0].usb_button = 0; // Fn. Setting to 0 to disable USB button generation
buttons[1].usb_button = 19;
buttons[1].usb_button_sec_enable = true;
buttons[1].usb_button_sec = 21;
buttons[1].usb_button_sec_trigger_index = 0;
buttons[2].usb_button = 32; // Button used as global config. Do not define secondary USB button!
// Set up usb button layout
buttons[0].usb_button = 4;
buttons[1].usb_button = 3;
buttons[2].usb_button = 26; // Button used as global config. Do not define secondary USB button!
buttons[3].usb_button = 2;
buttons[3].usb_button_sec_enable = true;
buttons[3].usb_button_sec = 4;
buttons[3].usb_button_sec_trigger_index = 0;
buttons[4].usb_button = 1;
buttons[4].usb_button_sec_enable = true;
buttons[4].usb_button_sec = 3;
buttons[4].usb_button_sec_trigger_index = 0;
buttons[5].usb_button = 5;
buttons[5].usb_button_sec_enable = true; // Set TH_BUTTON to inhibit button press on throttle hold
buttons[5].usb_button_sec = 0; // Setting to 0 to disable USB buttton generation
buttons[5].usb_button_sec_trigger_index = 0; // Set same as TH_BUTTON_TRIGGER
buttons[6].usb_button = 14;
buttons[6].usb_button_sec_enable = true;
buttons[6].usb_button_sec = 22;
buttons[6].usb_button_sec_trigger_index = 0;
buttons[7].usb_button = 9;
buttons[7].usb_button_sec_enable = true;
buttons[7].usb_button_sec = 26;
buttons[7].usb_button_sec_trigger_index = 0;
buttons[8].usb_button = 13;
buttons[8].usb_button_sec_enable = true;
buttons[8].usb_button_sec = 29;
buttons[8].usb_button_sec_trigger_index = 0;
buttons[9].usb_button = 16;
buttons[10].usb_button = 6;
buttons[10].usb_button_sec_enable = true;
buttons[10].usb_button_sec = 23;
buttons[10].usb_button_sec_trigger_index = 0;
buttons[11].usb_button = 15;
buttons[11].usb_button_sec_enable = true;
buttons[11].usb_button_sec = 24;
buttons[11].usb_button_sec_trigger_index = 0;
buttons[12].usb_button = 10;
buttons[12].usb_button_sec_enable = true;
buttons[12].usb_button_sec = 28;
buttons[12].usb_button_sec_trigger_index = 0;
buttons[13].usb_button = 17;
buttons[13].usb_button_sec_enable = true;
buttons[13].usb_button_sec = 31;
buttons[13].usb_button_sec_trigger_index = 0;
buttons[14].usb_button = 18;
buttons[14].usb_button = 12;
buttons[15].usb_button = 11;
buttons[15].usb_button_sec_enable = true;
buttons[15].usb_button_sec = 20;
buttons[15].usb_button_sec_trigger_index = 0;
buttons[20].usb_button = 12;
buttons[20].usb_button_sec_enable = true;
buttons[20].usb_button_sec = 25;
buttons[20].usb_button_sec_trigger_index = 0;
buttons[16].usb_button = 18;
buttons[17].usb_button = 19;
buttons[18].usb_button = 20;
buttons[19].usb_button = 21;
buttons[20].usb_button = 0;
buttons[21].usb_button = 22;
buttons[22].usb_button = 23;
buttons[23].usb_button = 24;
buttons[24].usb_button = 25;
buttons[25].usb_button = 7;
buttons[25].usb_button_sec_enable = true;
buttons[25].usb_button_sec = 27;
buttons[25].usb_button_sec_trigger_index = 0;
buttons[26].usb_button = 8;
// Table for gimbal expo curve lookup insded of doing floating point math for every analog read
@ -496,6 +428,27 @@ fn main() -> ! {
buttons[25].pressed = left_extra_button.is_low().unwrap();
buttons[26].pressed = right_extra_button.is_low().unwrap();
// Filter left hat swith buttons
for i in 16..=19 {
if (16..=19).filter(|&j| j != i).any(|j| buttons[j].pressed) {
buttons[i].pressed = false;
}
}
// Fix button state for center hat press on hat
if buttons[16..=19].iter().any(|b| b.pressed) {
buttons[15].pressed = false;
}
// Filter right hat swith buttons
for i in 21..=24 {
if (21..=24).filter(|&j| j != i).any(|j| buttons[j].pressed) {
buttons[i].pressed = false;
}
}
// Fix button state for center hat press on hat
if buttons[21..=24].iter().any(|b| b.pressed) {
buttons[20].pressed = false;
}
// Secondary way to enter bootloader (pressing all left hands buttons except the hat
if buttons[BOOT_BUTTON].pressed && buttons[CONFIG_BUTTON].pressed {
status_led.update(StatusMode::Bootloader);
@ -615,20 +568,7 @@ fn main() -> ! {
item.previous_value = item.value;
}
// Make sure usb will be updated during timeout countdown
for key in buttons.iter() {
if key.usb_release_timeout != 0 {
usb_activity = true;
}
}
// Generate led activity when a button is pressed
let mut th_trigger_pressed: bool = false;
for (index, key) in buttons.iter_mut().enumerate() {
if key.pressed && index == TH_BUTTON_TRIGGER {
th_trigger_pressed = true;
}
}
for (index, key) in buttons.iter_mut().enumerate() {
if key.pressed != key.previous_pressed {
key.usb_changed = true;
@ -639,7 +579,6 @@ fn main() -> ! {
if key.pressed != key.previous_pressed
&& key.pressed
&& index == TH_BUTTON
&& th_trigger_pressed
&& unprocessed_value != AXIS_CENTER
{
axis[GIMBAL_AXIS_LEFT_Y].hold = axis[GIMBAL_AXIS_LEFT_Y].value;
@ -647,7 +586,6 @@ fn main() -> ! {
} else if key.pressed != key.previous_pressed
&& key.pressed
&& index == TH_BUTTON
&& th_trigger_pressed
&& unprocessed_value == AXIS_CENTER
{
axis[GIMBAL_AXIS_LEFT_Y].hold = AXIS_CENTER;
@ -730,127 +668,12 @@ fn get_joystick_report(
let y: i16 = axis_12bit_to_i16(ADC_MAX - axis[GIMBAL_AXIS_LEFT_Y].value);
let z: i16 = axis_12bit_to_i16(axis[GIMBAL_AXIS_RIGHT_X].value);
let rx: i16 = axis_12bit_to_i16(ADC_MAX - axis[GIMBAL_AXIS_RIGHT_Y].value);
let mut hat1: u8 = 0xf;
let mut hat2: u8 = 0xf;
let mut hat3: u8 = 0xf;
let mut hat4: u8 = 0xf;
// Store hat bits
let mut hat_left: u8 = 0;
let mut hat_right: u8 = 0;
for (index, key) in matrix_keys.iter_mut().enumerate() {
if (15..=19).contains(&index) && key.pressed {
hat_left |= 1 << (index - 15);
}
if (20..=24).contains(&index) && key.pressed {
hat_right |= 1 << (index - 20);
}
}
// Convert hat switch data to HID code
let (hat_l, hat_button_l) = format_hat_value(hat_left);
let (hat_r, hat_button_r) = format_hat_value(hat_right);
// Handle sec_button (Fn) for left hat switch
let mut sec_button_pressed: bool = false;
for (sec_index, sec_key) in matrix_keys.iter().enumerate() {
if matrix_keys[15].usb_button_sec_enable
&& matrix_keys[15].usb_button_sec_trigger_index == sec_index
&& sec_key.pressed
{
sec_button_pressed = true;
break;
}
}
if matrix_keys[15].usb_changed {
matrix_keys[15].usb_button_sec_pressed = sec_button_pressed;
}
if matrix_keys[15].usb_button_sec != 0 && matrix_keys[15].usb_button_sec_pressed {
hat2 = hat_l;
} else {
hat4 = hat_l;
}
// Handle sec_button (Fn) for right hat switch
let mut sec_button_pressed: bool = false;
for (sec_index, sec_key) in matrix_keys.iter().enumerate() {
if matrix_keys[20].usb_button_sec_enable
&& matrix_keys[20].usb_button_sec_trigger_index == sec_index
&& sec_key.pressed
{
sec_button_pressed = true;
break;
}
}
if matrix_keys[20].usb_changed {
matrix_keys[20].usb_button_sec_pressed = sec_button_pressed;
}
if matrix_keys[20].usb_button_sec != 0 && matrix_keys[20].usb_button_sec_pressed {
hat1 = hat_r;
} else {
hat3 = hat_r;
}
// Fix button state for center hat press on hat
matrix_keys[15].pressed = hat_button_l != 0;
matrix_keys[20].pressed = hat_button_r != 0;
// Update button array with Sec button trigger status
// Using indexing instead of iterating to be able to iterate inside loop
for index in 0..NUMBER_OF_BUTTONS + 2 {
let mut sec_button_pressed: bool = false;
for (sec_index, sec_key) in matrix_keys.iter().enumerate() {
if matrix_keys[index].usb_button_sec_enable
&& matrix_keys[index].usb_button_sec_trigger_index == sec_index
&& sec_key.pressed
{
sec_button_pressed = true;
break;
}
}
// Only update button when "root key" is pressed (ie. Do not change sec button as soon as Fn
// key is pressed
if matrix_keys[index].usb_changed {
matrix_keys[index].usb_button_sec_pressed = sec_button_pressed;
}
}
// Update button state for joystick buttons
let mut buttons: u32 = 0;
for key in matrix_keys.iter_mut() {
// Toggle mode button
if key.usb_changed && key.usb_button_toggle_enable {
key.usb_release_timeout = RELEASE_RIMEOUT;
}
if key.pressed
&& key.usb_button != 0
&& key.usb_button_toggle_enable
&& key.usb_release_timeout > 1
{
if key.pressed && key.usb_button != 0 {
buttons |= 1 << (key.usb_button - 1);
} else if !key.pressed
&& key.usb_button_sec != 0
&& key.usb_button_toggle_enable
&& key.usb_release_timeout > 1
{
buttons |= 1 << (key.usb_button_sec - 1);
// Sec button mode
} else if key.pressed && key.usb_button_sec != 0 && key.usb_button_sec_pressed {
buttons |= 1 << (key.usb_button_sec - 1);
// Standard mode
} else if key.pressed
&& key.usb_button != 0
&& !key.usb_button_toggle_enable
&& !key.usb_button_sec_pressed
{
buttons |= 1 << (key.usb_button - 1);
}
}
// Auto release button when in toggle mode
for key in matrix_keys.iter_mut() {
if key.usb_release_timeout > 0 {
key.usb_release_timeout -= 1;
}
}
@ -864,10 +687,6 @@ fn get_joystick_report(
y,
z,
rx,
hat1,
hat2,
hat3,
hat4,
buttons,
}
}

View File

@ -63,42 +63,37 @@ impl<T, E> Try for Result<T, E> {
// Updated to 6x 12bit axis, 32x buttons and 4x hat switches
#[rustfmt::skip]
pub const JOYSTICK_DESCRIPTOR: &[u8] = &[
0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x04, // Usage (Joystick)
0xA1, 0x01, // Collection (Application)
0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x04, // Usage (Joystick)
0xA1, 0x01, // Collection (Application)
// 4 signed 16-bit axes: X, Y, Z, Rx
0x09, 0x30, // Usage (X)
0x09, 0x31, // Usage (Y)
0x09, 0x32, // Usage (Z)
0x09, 0x33, // Usage (Rx)
0x16, 0x00, 0x80,// Logical Minimum (-32768)
0x26, 0xFF, 0x7F,// Logical Maximum (32767)
0x75, 0x10, // Report Size (16)
0x95, 0x04, // Report Count (4)
0x81, 0x02, // Input (Data,Var,Abs)
// 4 Hat Switches (4-bit)
0x09, 0x39, // Usage (Hat switch)
0x09, 0x39,
0x09, 0x39,
0x09, 0x39,
0x15, 0x00, // Logical Minimum (0)
0x25, 0x07, // Logical Maximum (7)
0x35, 0x00, // Physical Minimum (0)
0x46, 0x3B, 0x01,// Physical Maximum (315)
0x65, 0x14, // Unit (Degrees)
0x75, 0x04, // Report Size (4)
0x95, 0x04, // Report Count (4)
0x81, 0x02, // Input (Data,Var,Abs)
// 32 Buttons (1-bit each)
0x05, 0x09, // Usage Page (Button)
0x19, 0x01, // Usage Minimum (1)
0x29, 0x20, // Usage Maximum (32)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x20, // Report Count (32)
0x81, 0x02, // Input (Data,Var,Abs)
0xC0 // End Collection
0x09, 0x30, // Usage (X)
0x09, 0x31, // Usage (Y)
0x09, 0x32, // Usage (Z)
0x09, 0x33, // Usage (Rx)
0x16, 0x00, 0x80, // Logical Minimum (-32768)
0x26, 0xFF, 0x7F, // Logical Maximum (32767)
0x75, 0x10, // Report Size (16)
0x95, 0x04, // Report Count (4)
0x81, 0x02, // Input (Data,Var,Abs)
// 26 Buttons (1-bit each)
0x05, 0x09, // Usage Page (Button)
0x19, 0x01, // Usage Minimum (1)
0x29, 0x1A, // Usage Maximum (26)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x1A, // Report Count (26)
0x81, 0x02, // Input (Data,Var,Abs)
// Padding to align buttons to byte boundary (26 bits → +6 bits padding)
0x75, 0x01, // Report Size (1)
0x95, 0x06, // Report Count (6)
0x81, 0x03, // Input (Const,Var,Abs)
0xC0 // End Collection
];
#[derive(Clone, Copy, Debug, Eq, PartialEq, Default)]
@ -107,10 +102,6 @@ pub struct JoystickReport {
pub y: i16, // 16bit
pub z: i16, // 16bit
pub rx: i16, // 16bit
pub hat1: u8, // 4bit
pub hat2: u8, // 4bit
pub hat3: u8, // 4bit
pub hat4: u8, // 4bit
pub buttons: u32, // 32bit
}
@ -120,7 +111,7 @@ pub struct Joystick<'a, B: UsbBus> {
impl<B: UsbBus> Joystick<'_, B> {
pub fn write_report(&mut self, report: &JoystickReport) -> Result<(), UsbHidError> {
let mut data: [u8; 14] = [0; 14];
let mut data: [u8; 12] = [0; 12];
// Did not make the packed struct work, so doing it manually
data[0] = report.x as u8;
@ -131,12 +122,10 @@ impl<B: UsbBus> Joystick<'_, B> {
data[5] = (report.z >> 8) as u8;
data[6] = report.rx as u8;
data[7] = (report.rx >> 8) as u8;
data[8] = (report.hat3) | (report.hat4 << 4);
data[9] = (report.hat1) | (report.hat2 << 4);
data[10] = report.buttons as u8;
data[11] = (report.buttons >> 8) as u8;
data[12] = (report.buttons >> 16) as u8;
data[13] = (report.buttons >> 24) as u8;
data[8] = report.buttons as u8;
data[9] = (report.buttons >> 8) as u8;
data[10] = (report.buttons >> 16) as u8;
data[11] = (report.buttons >> 24) as u8;
self.interface
.write_report(&data)