sensors: compass, maps

This commit is contained in:
jusax23 2023-09-21 00:12:01 +02:00
parent 768179ab24
commit 0ce9f9c1a1
Signed by: jusax23
GPG key ID: 499E2AA870C1CD41
10 changed files with 1823 additions and 8 deletions

6
.gitignore vendored
View file

@ -44,4 +44,8 @@ app.*.map.json
/android/app/release
key.properties
/key
/key
later.*
to_remember.txt

962
assets/compass.svg Normal file
View file

@ -0,0 +1,962 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="1148"
height="1136.3206"
id="svg2">
<metadata
id="metadata8">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs6" />
<g
transform="translate(-27.40625,-2.9765625)"
id="layer3"
style="display:inline">
<g
id="g4456">
<path
d="m 600,935 0,-728"
id="path4392"
style="fill:none;stroke:#e56107;stroke-width:12;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
d="M 564.22374,934.24243 635.77626,207.75757"
id="path4394"
style="fill:none;stroke:#00ff00;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:6, 3;stroke-dashoffset:0" />
<path
d="M 528.79203,928.98663 671.20797,213.01337"
id="path4396"
style="fill:none;stroke:#646464;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:12, 6;stroke-dashoffset:0" />
<path
d="M 494.04609,920.28322 705.95391,221.71678"
id="path4398"
style="fill:none;stroke:#00ff00;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:6, 3;stroke-dashoffset:0" />
<path
d="M 460.32054,908.21603 739.67946,233.78397"
id="path4400"
style="fill:none;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:12, 6;stroke-dashoffset:0" />
<path
d="M 427.94018,892.90126 772.05982,249.09874"
id="path4402"
style="fill:none;stroke:#00ff00;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:6, 3;stroke-dashoffset:0" />
<path
d="M 397.21685,874.48641 802.78315,267.51359"
id="path4404"
style="fill:none;stroke:#646464;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:12, 6;stroke-dashoffset:0" />
<path
d="M 368.44644,853.14882 831.55356,288.85118"
id="path4406"
style="fill:none;stroke:#00ff00;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:6, 3;stroke-dashoffset:0" />
<path
d="M 317.85117,802.55355 882.14883,339.44645"
id="path4410"
style="fill:none;stroke:#00ff00;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:6, 3;stroke-dashoffset:0" />
<path
d="M 296.51358,773.78313 903.48642,368.21687"
id="path4412"
style="fill:none;stroke:#646464;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:12, 6;stroke-dashoffset:0" />
<path
d="M 278.09873,743.0598 921.90127,398.9402"
id="path4414"
style="fill:none;stroke:#00ff00;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:6, 3;stroke-dashoffset:0" />
<path
d="M 262.78396,710.67944 937.21604,431.32056"
id="path4416"
style="fill:none;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:12, 6;stroke-dashoffset:0" />
<path
d="M 250.71677,676.95389 949.28323,465.04611"
id="path4418"
style="fill:none;stroke:#00ff00;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:6, 3;stroke-dashoffset:0" />
<path
d="M 242.01337,642.20795 957.98663,499.79205"
id="path4420"
style="fill:none;stroke:#646464;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:12, 6;stroke-dashoffset:0" />
<path
d="M 236.75757,606.77624 963.24243,535.22376"
id="path4422"
style="fill:none;stroke:#00ff00;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:6, 3;stroke-dashoffset:0" />
<path
d="M 342.61313,828.38687 857.38687,313.61313"
id="path4608"
style="fill:none;stroke:#aa8416;stroke-width:12;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:12, 12;stroke-dashoffset:0;display:inline" />
</g>
<use
transform="matrix(0,1,-1,0,1171,-29)"
id="use4474"
x="0"
y="0"
width="1203"
height="1106"
xlink:href="#g4456" />
<path
d="m 990,416 a 310,310 0 1 1 -620,0 310,310 0 1 1 620,0 z"
transform="translate(-80,155)"
id="path4628"
style="opacity:0.6;fill:#ffffff;stroke:none;display:inline" />
<text
x="600"
y="306"
id="text4648"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="600"
y="306"
id="tspan4650">64</tspan></text>
<text
x="772.83997"
y="32.925156"
transform="matrix(0.92387953,0.38268343,-0.38268343,0.92387953,0,0)"
id="text4652"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="772.83997"
y="32.925156"
id="tspan4654">4</tspan></text>
<text
x="828.02203"
y="-285.5061"
transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
id="text4656"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="828.02203"
y="-285.5061"
id="tspan4658">8</tspan></text>
<text
x="757.14526"
y="-600.81549"
transform="matrix(0.38268343,0.92387953,-0.92387953,0.38268343,0,0)"
id="text4660"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="757.14526"
y="-600.81549"
id="tspan4662">12</tspan></text>
<text
x="571"
y="-865"
transform="matrix(0,1,-1,0,0,0)"
id="text4664"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="571"
y="-865"
id="tspan4666">16</tspan></text>
<text
x="335.81549"
y="492.14526"
transform="matrix(0.92387953,-0.38268343,0.38268343,0.92387953,0,0)"
id="text4684"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="335.81549"
y="492.14526"
id="tspan4686">60</tspan></text>
<text
x="20.506107"
y="563.02203"
transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
id="text4688"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="20.506107"
y="563.02203"
id="tspan4690">56</tspan></text>
<text
x="-297.92514"
y="507.83997"
transform="matrix(0.38268343,-0.92387953,0.92387953,0.38268343,0,0)"
id="text4692"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="-297.92514"
y="507.83997"
id="tspan4694">52</tspan></text>
<text
x="-571"
y="335"
transform="matrix(0,-1,1,0,0,0)"
id="text4696"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="-571"
y="335"
id="tspan4698">48</tspan></text>
<text
x="600"
y="858"
id="text4700"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="600"
y="858"
id="tspan4702">32</tspan></text>
<text
x="335.81549"
y="1044.1453"
transform="matrix(0.92387953,-0.38268343,0.38268343,0.92387953,0,0)"
id="text4704"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="335.81549"
y="1044.1453"
id="tspan4706">28</tspan></text>
<text
x="20.506107"
y="1115.022"
transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
id="text4708"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="20.506107"
y="1115.022"
id="tspan4710">24</tspan></text>
<text
x="-297.92514"
y="1059.8398"
transform="matrix(0.38268343,-0.92387953,0.92387953,0.38268343,0,0)"
id="text4712"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="-297.92514"
y="1059.8398"
id="tspan4714">20</tspan></text>
<text
x="772.83997"
y="584.92517"
transform="matrix(0.92387953,0.38268343,-0.38268343,0.92387953,0,0)"
id="text4716"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="772.83997"
y="584.92517"
id="tspan4718">36</tspan></text>
<text
x="828.02203"
y="266.49393"
transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
id="text4720"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="828.02203"
y="266.49393"
id="tspan4722">40</tspan></text>
<text
x="757.14526"
y="-48.815453"
transform="matrix(0.38268343,0.92387953,-0.92387953,0.38268343,0,0)"
id="text4724"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="757.14526"
y="-48.815453"
id="tspan4726">44</tspan></text>
</g>
<g
transform="translate(-27.40625,-2.9765625)"
id="layer2"
style="display:inline">
<path
d="M 600,206 C 398.41607,206 235,369.41607 235,571 235,772.58393 398.41607,936 600,936 801.58393,936 965,772.58393 965,571 965,369.41607 801.58393,206 600,206 z m 0.5,9.5 C 796.83723,215.5 956,374.66277 956,571 956,767.33723 796.83723,926.5 600.5,926.5 404.16277,926.5 245,767.33723 245,571 245,374.66277 404.16277,215.5 600.5,215.5 z"
id="path2989"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<use
transform="matrix(0.98480775,0.17364818,-0.17364818,0.98480775,108.26846,-95.51413)"
id="use3787"
x="0"
y="0"
width="1203"
height="1106"
xlink:href="#g3783" />
<use
transform="matrix(0.93969262,0.34202015,-0.34202015,0.93969262,231.47793,-170.77657)"
id="use3789"
x="0"
y="0"
width="1203"
height="1106"
xlink:href="#g3783" />
<use
transform="matrix(0.8660254,0.50000001,-0.50000001,0.8660254,365.88476,-223.5005)"
id="use3791"
x="0"
y="0"
width="1203"
height="1106"
xlink:href="#g3783" />
<use
transform="matrix(0.76604444,0.64278762,-0.64278762,0.76604444,507.40506,-252.08393)"
id="use3793"
x="0"
y="0"
width="1203"
height="1106"
xlink:href="#g3783" />
<use
transform="matrix(0.6427876,0.76604445,-0.76604445,0.6427876,651.73881,-255.65839)"
id="use3795"
x="0"
y="0"
width="1203"
height="1106"
xlink:href="#g3783" />
<use
transform="matrix(0.49999999,0.86602541,-0.86602541,0.49999999,794.5005,-234.11523)"
id="use3797"
x="0"
y="0"
width="1203"
height="1106"
xlink:href="#g3783" />
<use
transform="matrix(0.34202013,0.93969263,-0.93969263,0.34202013,931.35239,-188.10907)"
id="use3799"
x="0"
y="0"
width="1203"
height="1106"
xlink:href="#g3783" />
<use
transform="matrix(0.17364816,0.98480776,-0.98480776,0.17364816,1058.1363,-119.03775)"
id="use3801"
x="0"
y="0"
width="1203"
height="1106"
xlink:href="#g3783" />
<use
transform="matrix(0,1,-1,0,1171.0001,-28.99996)"
id="use3803"
x="0"
y="0"
width="1203"
height="1106"
xlink:href="#g3783" />
<use
transform="matrix(0,1,-1,0,1171.0001,-28.99996)"
id="use3805"
x="0"
y="0"
width="1203"
height="1106"
xlink:href="#use3787" />
<use
transform="matrix(0,1,-1,0,1171.0001,-28.99996)"
id="use3807"
x="0"
y="0"
width="1203"
height="1106"
xlink:href="#use3789" />
<use
transform="matrix(0,1,-1,0,1171.0001,-28.99996)"
id="use3809"
x="0"
y="0"
width="1203"
height="1106"
xlink:href="#use3791" />
<use
transform="matrix(0,1,-1,0,1171.0001,-28.99996)"
id="use3811"
x="0"
y="0"
width="1203"
height="1106"
xlink:href="#use3793" />
<use
transform="matrix(0,1,-1,0,1171,-28.99996)"
id="use3813"
x="0"
y="0"
width="1203"
height="1106"
xlink:href="#use3795" />
<use
transform="matrix(0,1,-1,0,1171.0001,-28.99996)"
id="use3815"
x="0"
y="0"
width="1203"
height="1106"
xlink:href="#use3797" />
<use
transform="matrix(0,1,-1,0,1171.0001,-28.99996)"
id="use3817"
x="0"
y="0"
width="1203"
height="1106"
xlink:href="#use3799" />
<use
transform="matrix(0,1,-1,0,1171.0001,-28.99996)"
id="use3819"
x="0"
y="0"
width="1203"
height="1106"
xlink:href="#use3801" />
<text
x="600"
y="146"
id="text3869"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="600"
y="146"
id="tspan3871">360</tspan></text>
<text
x="690.03815"
y="33.140388"
transform="matrix(0.98480775,0.17364818,-0.17364818,0.98480775,0,0)"
id="text3879"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="690.03815"
y="33.140388"
id="tspan3881">10</tspan></text>
<text
x="759.11053"
y="-93.639587"
transform="matrix(0.93969262,0.34202015,-0.34202015,0.93969262,0,0)"
id="text3883"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="759.11053"
y="-93.639587"
id="tspan3885">20</tspan></text>
<text
x="805.11841"
y="-230.48779"
transform="matrix(0.8660254,0.50000001,-0.50000001,0.8660254,0,0)"
id="text3887"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="805.11841"
y="-230.48779"
id="tspan3889">30</tspan></text>
<text
x="826.66388"
y="-373.24612"
transform="matrix(0.76604444,0.64278762,-0.64278762,0.76604444,0,0)"
id="text3891"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="826.66388"
y="-373.24612"
id="tspan3893">40</tspan></text>
<text
x="823.09235"
y="-517.57697"
transform="matrix(0.6427876,0.76604445,-0.76604445,0.6427876,0,0)"
id="text3895"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="823.09235"
y="-517.57697"
id="tspan3897">50</tspan></text>
<text
x="794.51227"
y="-659.09491"
transform="matrix(0.49999999,0.86602541,-0.86602541,0.49999999,0,0)"
id="text3899"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="794.51227"
y="-659.09491"
id="tspan3901">60</tspan></text>
<text
x="741.79205"
y="-793.5"
transform="matrix(0.34202013,0.93969262,-0.93969262,0.34202013,0,0)"
id="text3903"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="741.79205"
y="-793.5"
id="tspan3905">70</tspan></text>
<text
x="666.53357"
y="-916.70844"
transform="matrix(0.17364817,0.98480775,-0.98480775,0.17364817,0,0)"
id="text3907"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="666.53357"
y="-916.70844"
id="tspan3909">80</tspan></text>
<text
x="571.0235"
y="-1024.9766"
transform="matrix(0,1,-1,0,0,0)"
id="text3911"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="571.0235"
y="-1024.9766"
id="tspan3913">90</tspan></text>
<text
x="491.7319"
y="241.51007"
transform="matrix(0.98480775,-0.17364818,0.17364818,0.98480775,0,0)"
id="text3923"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="491.7319"
y="241.51007"
id="tspan3925">350</tspan></text>
<text
x="368.5235"
y="316.76855"
transform="matrix(0.93969262,-0.34202015,0.34202015,0.93969262,0,0)"
id="text3927"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="368.5235"
y="316.76855"
id="tspan3929">340</tspan></text>
<text
x="234.11839"
y="369.48877"
transform="matrix(0.8660254,-0.50000001,0.50000001,0.8660254,0,0)"
id="text3931"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="234.11839"
y="369.48877"
id="tspan3933">330</tspan></text>
<text
x="92.600433"
y="398.06885"
transform="matrix(0.76604444,-0.64278762,0.64278762,0.76604444,0,0)"
id="text3935"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="92.600433"
y="398.06885"
id="tspan3937">320</tspan></text>
<text
x="-51.730431"
y="401.64041"
transform="matrix(0.6427876,-0.76604445,0.76604445,0.6427876,0,0)"
id="text3939"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="-51.730431"
y="401.64041"
id="tspan3941">310</tspan></text>
<text
x="-194.48878"
y="380.09491"
transform="matrix(0.49999999,-0.86602541,0.86602541,0.49999999,0,0)"
id="text3943"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="-194.48878"
y="380.09491"
id="tspan3945">300</tspan></text>
<text
x="-331.33698"
y="334.08701"
transform="matrix(0.34202013,-0.93969262,0.93969262,0.34202013,0,0)"
id="text3947"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="-331.33698"
y="334.08701"
id="tspan3949">290</tspan></text>
<text
x="-458.11694"
y="265.01462"
transform="matrix(0.17364817,-0.98480775,0.98480775,0.17364817,0,0)"
id="text3951"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="-458.11694"
y="265.01462"
id="tspan3953">280</tspan></text>
<text
x="-570.97656"
y="174.9765"
transform="matrix(0,-1,1,0,0,0)"
id="text3955"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="-570.97656"
y="174.9765"
id="tspan3957">270</tspan></text>
<text
x="600"
y="1018.0313"
id="text3967"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="600"
y="1018.0313"
id="tspan3969">180</tspan></text>
<text
x="491.73154"
y="1113.5454"
transform="matrix(0.98480775,-0.17364818,0.17364818,0.98480775,0,0)"
id="text3992"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="491.73154"
y="1113.5454"
id="tspan3994">170</tspan></text>
<text
x="368.52206"
y="1188.8079"
transform="matrix(0.93969262,-0.34202015,0.34202015,0.93969262,0,0)"
id="text3996"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="368.52206"
y="1188.8079"
id="tspan3998">160</tspan></text>
<text
x="234.11523"
y="1241.5317"
transform="matrix(0.8660254,-0.50000001,0.50000001,0.8660254,0,0)"
id="text4000"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="234.11523"
y="1241.5317"
id="tspan4002">150</tspan></text>
<text
x="92.594925"
y="1270.1151"
transform="matrix(0.76604444,-0.64278762,0.64278762,0.76604444,0,0)"
id="text4004"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="92.594925"
y="1270.1151"
id="tspan4006">140</tspan></text>
<text
x="-51.738831"
y="1273.6896"
transform="matrix(0.6427876,-0.76604445,0.76604445,0.6427876,0,0)"
id="text4008"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="-51.738831"
y="1273.6896"
id="tspan4010">130</tspan></text>
<text
x="-194.50053"
y="1252.1464"
transform="matrix(0.49999999,-0.86602541,0.86602541,0.49999999,0,0)"
id="text4012"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="-194.50053"
y="1252.1464"
id="tspan4014">120</tspan></text>
<text
x="-331.35242"
y="1206.1401"
transform="matrix(0.34202013,-0.93969262,0.93969262,0.34202013,0,0)"
id="text4016"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="-331.35242"
y="1206.1401"
id="tspan4018">110</tspan></text>
<text
x="-458.13632"
y="1137.0688"
transform="matrix(0.17364817,-0.98480775,0.98480775,0.17364817,0,0)"
id="text4020"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="-458.13632"
y="1137.0688"
id="tspan4022">100</tspan></text>
<text
x="690.03778"
y="905.1676"
transform="matrix(0.98480775,0.17364818,-0.17364818,0.98480775,0,0)"
id="text4024"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="690.03778"
y="905.1676"
id="tspan4026">190</tspan></text>
<text
x="759.10907"
y="778.38367"
transform="matrix(0.93969262,0.34202015,-0.34202015,0.93969262,0,0)"
id="text4028"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="759.10907"
y="778.38367"
id="tspan4030">200</tspan></text>
<text
x="805.11523"
y="641.5318"
transform="matrix(0.8660254,0.50000001,-0.50000001,0.8660254,0,0)"
id="text4032"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="805.11523"
y="641.5318"
id="tspan4034">210</tspan></text>
<text
x="826.65839"
y="498.77014"
transform="matrix(0.76604444,0.64278762,-0.64278762,0.76604444,0,0)"
id="text4036"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="826.65839"
y="498.77014"
id="tspan4038">220</tspan></text>
<text
x="823.08392"
y="354.43634"
transform="matrix(0.6427876,0.76604445,-0.76604445,0.6427876,0,0)"
id="text4040"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="823.08392"
y="354.43634"
id="tspan4042">230</tspan></text>
<text
x="794.50049"
y="212.91605"
transform="matrix(0.49999999,0.86602541,-0.86602541,0.49999999,0,0)"
id="text4044"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="794.50049"
y="212.91605"
id="tspan4046">240</tspan></text>
<text
x="741.77655"
y="78.509193"
transform="matrix(0.34202013,0.93969262,-0.93969262,0.34202013,0,0)"
id="text4048"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="741.77655"
y="78.509193"
id="tspan4050">250</tspan></text>
<text
x="666.5141"
y="-44.700287"
transform="matrix(0.17364817,0.98480775,-0.98480775,0.17364817,0,0)"
id="text4052"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
x="666.5141"
y="-44.700287"
id="tspan4054">260</tspan></text>
<g
id="g3783">
<path
d="m 600,935 0,46"
id="path4496"
style="fill:none;stroke:#604b1d;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
d="m 600,161 0,46"
id="path2986"
style="fill:none;stroke:#604b1d;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
d="m 587.26168,935.77765 -0.83758,23.98538"
id="path4572"
style="fill:none;stroke:#df1000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
d="m 613.5759,182.23697 -0.83758,23.98538"
id="path4570"
style="fill:none;stroke:#df1000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
d="m 574.54434,935.03293 -1.6796,24.01948"
id="path4568"
style="fill:none;stroke:#df1000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
d="m 627.13526,182.94759 -1.6796,24.01947"
id="path4564"
style="fill:none;stroke:#df1000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
d="m 561.85651,933.91114 -2.51807,23.95787"
id="path4562"
style="fill:none;stroke:#df1000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
d="m 640.66156,184.13099 -2.51807,23.95787"
id="path4558"
style="fill:none;stroke:#df1000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
d="m 549.19823,932.47346 -3.33655,23.74081"
id="path4556"
style="fill:none;stroke:#df1000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
d="m 654.13832,185.78573 -3.33655,23.74081"
id="path3012"
style="fill:none;stroke:#df1000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
<text
x="600"
y="46"
id="text4732"
xml:space="preserve"
style="font-size:48px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans Bold"><tspan
x="600"
y="46"
id="tspan4734">N</tspan></text>
<text
x="60"
y="586"
id="text4752"
xml:space="preserve"
style="font-size:48px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Liberation Sans;-inkscape-font-specification:Sans Bold"><tspan
x="60"
y="586"
id="tspan4754">W</tspan></text>
<text
x="1140"
y="586"
id="text4777"
xml:space="preserve"
style="font-size:48px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Liberation Sans;-inkscape-font-specification:Sans Bold"><tspan
x="1140"
y="586"
id="tspan4779">O</tspan></text>
<text
x="600"
y="1128.8284"
id="text4802"
xml:space="preserve"
style="font-size:48px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Liberation Sans;-inkscape-font-specification:Sans Bold"><tspan
x="600"
y="1128.8284"
id="tspan4804">S</tspan></text>
<text
x="130"
y="396"
id="text4875"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Sans"><tspan
x="130"
y="396"
id="tspan4877">WNW</tspan></text>
<text
x="414.5"
y="136"
id="text4879"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Sans"><tspan
x="414.5"
y="136"
id="tspan4881">NNW</tspan></text>
<text
x="400"
y="1036"
id="text4899"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Sans"><tspan
x="400"
y="1036"
id="tspan4901">SSW</tspan></text>
<text
x="119.99963"
y="766"
id="text4903"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Sans"><tspan
x="119.99963"
y="766"
id="tspan4905">WSW</tspan></text>
<text
x="250"
y="236"
id="text4907"
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Sans"><tspan
x="250"
y="236"
id="tspan4909">NW</tspan></text>
<text
x="230"
y="926"
id="text4919"
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Sans"><tspan
x="230"
y="926"
id="tspan4921">SW</tspan></text>
<text
x="790"
y="136"
id="text3194"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Sans"><tspan
x="790"
y="136"
id="tspan3196">NNO</tspan></text>
<text
x="970"
y="236"
id="text3198"
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Sans"><tspan
x="970"
y="236"
id="tspan3200">NO</tspan></text>
<text
x="1070"
y="396"
id="text3202"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Sans"><tspan
x="1070"
y="396"
id="tspan3204">ONO</tspan></text>
<text
x="790"
y="1036"
id="text3206"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Sans"><tspan
x="790"
y="1036"
id="tspan3208">SSO</tspan></text>
<text
x="970"
y="926"
id="text3210"
xml:space="preserve"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Sans"><tspan
x="970"
y="926"
id="tspan3212">SO</tspan></text>
<text
x="1070"
y="766"
id="text3214"
xml:space="preserve"
style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Sans"><tspan
x="1070"
y="766"
id="tspan3216">OSO</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 49 KiB

71
assets/needle.svg Normal file
View file

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg xmlns="http://www.w3.org/2000/svg"
viewBox="-200 -200 1040 1040">
<path id="right_top"
fill="#d64355" stroke="#797979" stroke-width="1"
d="M 320.00,74.00
C 320.00,74.00 326.88,103.00 326.88,103.00
326.88,103.00 341.42,169.00 341.42,169.00
341.42,169.00 356.58,237.00 356.58,237.00
356.58,237.00 361.88,262.00 361.88,262.00
361.88,262.00 368.88,294.00 368.88,294.00
368.88,294.00 374.00,320.00 374.00,320.00
374.00,320.00 360.00,320.00 360.00,320.00
359.95,301.68 347.16,285.39 329.00,281.52
326.04,280.88 323.01,281.00 320.00,281.00
320.00,281.00 320.00,74.00 320.00,74.00 Z" />
<path id="let_top"
fill="#eb4b57" stroke="#797979" stroke-width="1"
d="M 320.00,74.00
C 320.00,74.00 313.12,103.00 313.12,103.00
313.12,103.00 298.58,169.00 298.58,169.00
298.58,169.00 283.42,237.00 283.42,237.00
283.42,237.00 278.12,262.00 278.12,262.00
278.12,262.00 271.12,294.00 271.12,294.00
271.12,294.00 266.00,320.00 266.00,320.00
266.00,320.00 280.00,320.00 280.00,320.00
280.05,301.68 292.84,285.39 311.00,281.52
313.96,280.88 316.99,281.00 320.00,281.00
320.00,281.00 320.00,74.00 320.00,74.00 Z" />
<path id="bottom_left"
fill="#b3b3b3" stroke="#797979" stroke-width="1"
d="M 320.00,566.00
C 320.00,566.00 313.12,537.00 313.12,537.00
313.12,537.00 298.58,471.00 298.58,471.00
298.58,471.00 283.42,403.00 283.42,403.00
283.42,403.00 278.12,378.00 278.12,378.00
278.12,378.00 271.12,346.00 271.12,346.00
271.12,346.00 266.00,320.00 266.00,320.00
266.00,320.00 280.00,320.00 280.00,320.00
280.05,338.32 292.84,354.61 311.00,358.48
313.96,359.12 316.99,359.00 320.00,359.00
320.00,359.00 320.00,566.00 320.00,566.00 Z" />
<path id="bottom_right"
fill="#999999" stroke="#797979" stroke-width="1"
d="M 320.00,566.00
C 320.00,566.00 326.88,537.00 326.88,537.00
326.88,537.00 341.42,471.00 341.42,471.00
341.42,471.00 356.58,403.00 356.58,403.00
356.58,403.00 361.88,378.00 361.88,378.00
361.88,378.00 368.88,346.00 368.88,346.00
368.88,346.00 374.00,320.00 374.00,320.00
374.00,320.00 360.00,320.00 360.00,320.00
359.95,338.32 347.16,354.61 329.00,358.48
326.04,359.12 323.01,359.00 320.00,359.00
320.00,359.00 320.00,566.00 320.00,566.00 Z" />
<path id="point"
fill="#555" stroke="black" stroke-width="1"
d="M 316.00,300.47
C 323.06,299.50 329.60,300.78 334.67,306.18
344.20,316.34 340.82,336.33 324.00,339.53
302.82,343.57 292.55,318.12 306.18,305.33
309.31,302.39 311.96,301.45 316.00,300.47 Z" />
<path id="dott"
fill="black" stroke="black" stroke-width="1"
d="M 318.31,317.08
C 324.37,315.74 324.33,321.40 321.69,322.92
319.05,324.44 314.12,321.65 318.31,317.08 Z" />
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

133
lib/boxes/compass.dart Normal file
View file

@ -0,0 +1,133 @@
import 'dart:async';
import 'dart:ffi';
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:ju_rc_app/lib/boxes.dart';
import 'package:ju_rc_app/lib/sensors.dart';
import 'package:ju_rc_app/lib/serial.dart';
// c-structs
base class GnssLocData extends Struct {
@Uint8()
external int type;
@Uint8()
external int command;
@Int32()
external int X;
@Int32()
external int Y;
@Int32()
external int Z;
@Int32()
external int angle;
}
// end c-structs
class Compass extends JuBox {
const Compass({super.key});
@override
State<StatefulWidget> createState() => _CompassState();
}
class _CompassState extends State<Compass> {
USerial serial = getSerial();
late Timer timer;
int _magX = 0, _magY = 0, _magZ = 0, _magAngle = 0;
@override
void initState() {
super.initState();
SensorReader.listen(serialListen);
timer = Timer.periodic(const Duration(milliseconds: 500), (_) async {
serial.sprintln("<rfSystemSensor>2200", system: true);
});
}
@override
void dispose() {
SensorReader.removeListen(serialListen);
timer.cancel();
super.dispose();
}
void serialListen(int type, int command, Pointer<ArrayCStruct> ptr) {
if (type != 0x22 || command != 0x00) return;
var loc = ptr as Pointer<GnssLocData>;
setState(() {
_magX = loc.ref.X;
_magY = loc.ref.Y;
_magZ = loc.ref.Z;
int newAngle = loc.ref.angle;
if (newAngle - _magAngle > 200) newAngle -= 360;
if (newAngle - _magAngle < -200) newAngle += 360;
_magAngle = newAngle;
});
}
@override
Widget build(BuildContext context) => Stack(
children: [
SvgPicture.asset('assets/compass.svg'),
AnimatedRotation(
turns: _magAngle / 360.0,
duration: const Duration(milliseconds: 500),
alignment: Alignment.center, // Rotate around the center
child: SvgPicture.asset('assets/needle.svg')),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"x: ${(_magX * 8.0 / 32768.0 * 100.0).toStringAsFixed(2)}µT"),
Text(
"y: ${(_magY * 8.0 / 32768.0 * 100.0).toStringAsFixed(2)}µT"),
Text(
"z: ${(_magZ * 8.0 / 32768.0 * 100.0).toStringAsFixed(2)}µT"),
Expanded(
child: Align(
alignment: Alignment.bottomLeft,
child: FilledButton(
child: const Icon(Icons.calculate),
onPressed: () {
showDialog<String>(
context: context,
builder: (BuildContext context) => AlertDialog(
title: const Text('Callibrate Compass'),
content: const Text(
'When clicking okay the compass will be calibrated, \ncompletely blocking all radio communication for 10 sec. \nWhile calibrating rotate the sensor in ever direction.'),
actions: <Widget>[
TextButton(
onPressed: () => Navigator.pop(context, 'Cancel'),
child: const Text('Cancel'),
),
TextButton(
onPressed: () {
serial.sprintln("<rfSystemSensor>2201",
system: true);
Navigator.pop(context, 'OK');
},
child: const Text('OK'),
),
],
),
);
//
},
),
),
),
],
),
Expanded(
child: Align(
alignment: Alignment.topRight,
child: Text(
"t: ${(sqrt(_magX * _magX + _magY * _magY + _magZ * _magZ) * 8.0 / 32768.0 * 100.0).toStringAsFixed(2)}µT"),
))
],
);
}

475
lib/boxes/maps.dart Normal file
View file

@ -0,0 +1,475 @@
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'dart:ffi';
import 'package:flutter_map/flutter_map.dart';
import 'package:latlong2/latlong.dart';
import 'package:ju_rc_app/lib/boxes.dart';
import 'package:ju_rc_app/lib/sensors.dart';
import 'package:ju_rc_app/lib/serial.dart';
// c-structs
base class GnssLocData extends Struct {
@Uint8()
external int type;
@Uint8()
external int command;
@Uint8()
external int isValid;
@Double()
external double lat;
@Double()
external double lng;
}
base class SpeedLocData extends Struct {
@Uint8()
external int type;
@Uint8()
external int command;
@Uint8()
external int isValid;
@Double()
external double speed;
}
base class CourseLocData extends Struct {
@Uint8()
external int type;
@Uint8()
external int command;
@Uint8()
external int isValid;
@Double()
external double course;
}
base class AltLocData extends Struct {
@Uint8()
external int type;
@Uint8()
external int command;
@Uint8()
external int isValid;
@Double()
external double alt;
}
base class SatLocData extends Struct {
@Uint8()
external int type;
@Uint8()
external int command;
@Uint8()
external int isValid;
@Uint32()
external int n;
}
base class HdopLocData extends Struct {
@Uint8()
external int type;
@Uint8()
external int command;
@Uint8()
external int isValid;
@Double()
external double hdop;
}
// c-structs end
class Maps extends JuBox {
const Maps({super.key});
@override
State<StatefulWidget> createState() => _MapsState();
}
class _MapsState extends State<Maps> with TickerProviderStateMixin {
USerial serial = getSerial();
late Timer timer;
double _lat = 51.1667, _long = 10.4500;
int _state = 0;
bool _wasVaild = false;
final _mapController = MapController();
@override
void initState() {
super.initState();
SensorReader.listen(serialListen);
timer = Timer.periodic(const Duration(seconds: 1), (_) async {
serial.sprintln("<rfSystemSensor>2300", system: true);
});
}
@override
void dispose() {
SensorReader.removeListen(serialListen);
timer.cancel();
super.dispose();
}
void serialListen(int type, int command, Pointer<ArrayCStruct> ptr) {
if (type != 0x23 || command != 0x00) return;
var loc = ptr as Pointer<GnssLocData>;
setState(() {
_lat = loc.ref.lat;
_long = loc.ref.lng;
_state = loc.ref.isValid;
//_mapController.move(LatLng(_lat, _long), _wasVaild ? 17 : 6);
_animatedMapMove(
_mapController, this, LatLng(_lat, _long), _wasVaild ? 17 : 6);
if (_state & 1 > 0) _wasVaild = true;
});
}
@override
Widget build(BuildContext context) => FlutterMap(
options: MapOptions(
center: LatLng(_lat, _long),
zoom: _wasVaild ? 17 : 6,
maxZoom: _wasVaild ? 17 : 6,
minZoom: _wasVaild ? 17 : 6,
interactiveFlags: InteractiveFlag.none,
onTap: (TapPosition pos, LatLng ll) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const SerialDetailPage()),
);
}),
mapController: _mapController,
children: [
TileLayer(
urlTemplate: 'https://tile.openstreetmap.de/{z}/{x}/{y}.png',
userAgentPackageName: 'de.jusax.ju_rc_app',
),
MarkerLayer(
markers: [
Marker(
point: LatLng(_lat, _long),
width: 100,
height: 100,
builder: (context) => Icon(
switch (_state) {
3 => Icons.location_on,
2 => Icons.location_off,
1 => Icons.location_on_outlined,
int() => Icons.location_off_outlined,
},
color: Theme.of(context).colorScheme.primary,
),
),
],
),
],
);
}
class SerialDetailPage extends StatefulWidget {
const SerialDetailPage({super.key});
@override
State<StatefulWidget> createState() => _SerialDetailPageState();
}
class _SerialDetailPageState extends State<SerialDetailPage>
with TickerProviderStateMixin {
USerial serial = getSerial();
late Timer timer;
final _mapController = MapController();
double _lat = 51.1667, _long = 10.4500;
int _state = 0;
double _mps = -1, _course = -1, _alt = -1, _hdop = -1;
bool _mpsState = false,
_courseState = false,
_altState = false,
_satNState = false,
_hdopState = false;
int _satN = -1;
bool _follow = true;
@override
void initState() {
super.initState();
timer = Timer.periodic(const Duration(seconds: 2), (_) async {
serial.sprintln("<rfSystemSensor>2303", system: true);
sleep(const Duration(milliseconds: 200));
serial.sprintln("<rfSystemSensor>2304", system: true);
sleep(const Duration(milliseconds: 200));
serial.sprintln("<rfSystemSensor>2305", system: true);
sleep(const Duration(milliseconds: 200));
serial.sprintln("<rfSystemSensor>2306", system: true);
sleep(const Duration(milliseconds: 200));
serial.sprintln("<rfSystemSensor>2307", system: true);
});
SensorReader.listen(serialListen);
}
@override
void dispose() {
SensorReader.removeListen(serialListen);
timer.cancel();
super.dispose();
}
void serialListen(int type, int command, Pointer<ArrayCStruct> ptr) {
if (type != 0x23) return;
switch (command) {
case 0:
{
var loc = ptr as Pointer<GnssLocData>;
setState(() {
_lat = loc.ref.lat;
_long = loc.ref.lng;
_state = loc.ref.isValid;
if (_follow) {
_animatedMapMove(_mapController, this, LatLng(_lat, _long),
_mapController.zoom,
currentZoom: true);
}
});
}
break;
case 3:
{
var loc = ptr as Pointer<SpeedLocData>;
setState(() {
_mps = loc.ref.speed;
_mpsState = loc.ref.isValid == 3;
});
}
break;
case 4:
{
var loc = ptr as Pointer<CourseLocData>;
setState(() {
_course = loc.ref.course;
_courseState = loc.ref.isValid == 3;
});
}
break;
case 5:
{
var loc = ptr as Pointer<AltLocData>;
setState(() {
_alt = loc.ref.alt;
_altState = loc.ref.isValid == 3;
});
}
break;
case 6:
{
var loc = ptr as Pointer<SatLocData>;
setState(() {
_satN = loc.ref.n;
_satNState = loc.ref.isValid == 3;
});
}
break;
case 7:
{
var loc = ptr as Pointer<HdopLocData>;
setState(() {
_hdop = loc.ref.hdop;
_hdopState = loc.ref.isValid == 3;
});
}
break;
case 0xff:
{}
break;
}
}
int shade() {
return MediaQuery.of(context).platformBrightness == Brightness.light
? 100
: 800;
}
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: const Text(
"Maps",
style: TextStyle(
fontSize: 16,
),
),
toolbarHeight: 40,
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
if (!_follow) _mapController.move(LatLng(_lat, _long), 17);
_follow = !_follow;
});
},
child: Icon(_follow ? Icons.near_me : Icons.near_me_outlined),
),
body: Column(children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
"Speed: ${_mps.toStringAsPrecision(3)}m/s",
style: TextStyle(
backgroundColor:
_mpsState ? Colors.green[shade()] : Colors.red[shade()]),
),
const VerticalDivider(width: 5),
Text("Course: ${_course.toStringAsFixed(0)}°",
style: TextStyle(
backgroundColor: _courseState
? Colors.green[shade()]
: Colors.red[shade()])),
const VerticalDivider(width: 5),
Text("Alt: ${_alt.toStringAsPrecision(4)}m",
style: TextStyle(
backgroundColor: _altState
? Colors.green[shade()]
: Colors.red[shade()])),
const VerticalDivider(width: 5),
Text("Sats: $_satN",
style: TextStyle(
backgroundColor: _satNState
? Colors.green[shade()]
: Colors.red[shade()])),
const VerticalDivider(width: 5),
Text("Hdop: ${_hdop.toStringAsPrecision(2)}",
style: TextStyle(
backgroundColor: _hdopState
? Colors.green[shade()]
: Colors.red[shade()])),
],
),
Expanded(
child: FlutterMap(
mapController: _mapController,
options: MapOptions(
center: const LatLng(51.1667, 10.4500),
zoom: 6,
maxZoom: 18,
interactiveFlags: InteractiveFlag.drag |
InteractiveFlag.flingAnimation |
InteractiveFlag.pinchMove |
InteractiveFlag.pinchZoom |
InteractiveFlag.doubleTapZoom,
onPositionChanged: (MapPosition pos, bool user) {
if (user) {
setState(() {
_follow = false;
});
}
}),
children: [
TileLayer(
urlTemplate: 'https://tile.openstreetmap.de/{z}/{x}/{y}.png',
//urlTemplate: 'https://sgx.geodatenzentrum.de/wmts_basemapde/tile/1.0.0/de_basemapde_web_raster_farbe/default/GLOBAL_WEBMERCATOR/{z}/{y}/{x}.png',
userAgentPackageName: 'de.jusax.ju_rc_app',
),
MarkerLayer(
markers: [
Marker(
point: LatLng(_lat, _long),
width: 100,
height: 100,
builder: (context) => Transform.rotate(
angle: _course *
(pi / 180), // Convert degrees to radians
child: Icon(
switch (_state) {
3 => Icons.navigation,
2 => Icons.location_off,
1 => Icons.navigation_outlined,
int() => Icons.location_off_outlined,
},
color: Theme.of(context).colorScheme.primary,
),
)),
],
),
],
))
]));
}
// animated Map from Map lib provider
void _animatedMapMove(MapController mapController, TickerProvider ticker,
LatLng destLocation, double destZoom,
{bool currentZoom = false}) {
const startedId = 'AnimatedMapController#MoveStarted';
const inProgressId = 'AnimatedMapController#MoveInProgress';
const finishedId = 'AnimatedMapController#MoveFinished';
// Create some tweens. These serve to split up the transition from one location to another.
// In our case, we want to split the transition be<tween> our current map center and the destination.
final camera = mapController;
final latTween =
Tween<double>(begin: camera.center.latitude, end: destLocation.latitude);
final lngTween = Tween<double>(
begin: camera.center.longitude, end: destLocation.longitude);
final zoomTween = Tween<double>(begin: camera.zoom, end: destZoom);
// Create a animation controller that has a duration and a TickerProvider.
final controller = AnimationController(
duration: const Duration(milliseconds: 500), vsync: ticker);
// The animation determines what path the animation will take. You can try different Curves values, although I found
// fastOutSlowIn to be my favorite.
final Animation<double> animation =
CurvedAnimation(parent: controller, curve: Curves.fastOutSlowIn);
// Note this method of encoding the target destination is a workaround.
// When proper animated movement is supported (see #1263) we should be able
// to detect an appropriate animated movement event which contains the
// target zoom/center.
final startIdWithTarget =
'$startedId#${destLocation.latitude},${destLocation.longitude},$destZoom';
bool hasTriggeredMove = false;
controller.addListener(() {
final String id;
if (animation.value == 1.0) {
id = finishedId;
} else if (!hasTriggeredMove) {
id = startIdWithTarget;
} else {
id = inProgressId;
}
hasTriggeredMove |= mapController.move(
LatLng(latTween.evaluate(animation), lngTween.evaluate(animation)),
currentZoom ? mapController.zoom : zoomTween.evaluate(animation),
id: id,
);
});
animation.addStatusListener((status) {
if (status == AnimationStatus.completed) {
controller.dispose();
} else if (status == AnimationStatus.dismissed) {
controller.dispose();
}
});
controller.forward();
}

51
lib/lib/sensors.dart Normal file
View file

@ -0,0 +1,51 @@
import 'package:ju_rc_app/lib/boxes.dart';
import 'package:ju_rc_app/lib/serial.dart';
import 'package:convert/convert.dart';
import 'dart:ffi';
import 'package:ffi/ffi.dart';
base class ArrayCStruct extends Struct {
@Array<Uint8>(32)
external Array<Uint8> buffer;
}
class SensorReader {
static USerial serial = getSerial();
static final List<Function(int, int, Pointer<ArrayCStruct>)> _callback = [];
static void _serialListen(String line, SerialCommand? cmdo) {
if (cmdo == null) return;
var cmd = cmdo;
if (cmd.command != "rfSystemSensor") return;
if (cmd.arg == "lost") print("lost");
if (["noconn", "lost", "send"].contains(cmd.arg)) return;
final bytes = hex.decode(cmd.arg);
final Pointer<ArrayCStruct> buffer = calloc<ArrayCStruct>();
for (int i = 0; i < bytes.length && i < 32; i++) {
buffer.ref.buffer[i] = bytes[i];
}
for (var fnk in _callback) {
fnk(buffer.ref.buffer[0], buffer.ref.buffer[1], buffer);
}
calloc.free(buffer);
}
static bool _active = false;
static void listen(Function(int, int, Pointer<ArrayCStruct>) callback) {
_callback.add(callback);
if (!_active) {
_active = true;
serial.listen(_serialListen);
}
}
static void removeListen(Function(int, int, Pointer<ArrayCStruct>) callback) {
_callback.remove(callback);
if (_callback.isEmpty) {
_active = false;
serial.removeListen(_serialListen);
}
}
}

View file

@ -50,7 +50,7 @@ abstract class USerial {
}
LimitedList<(SerialMessageType, DateTime, String)> lines =
LimitedList(524288);
LimitedList(1024);
final List<Function(String, SerialCommand?)> _callback = [];
void _receive(String line) {
lines.add((SerialMessageType.received, DateTime.now(), line));

View file

@ -1,7 +1,9 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:ju_rc_app/boxes/compass.dart';
import 'package:ju_rc_app/boxes/console.dart';
import 'package:ju_rc_app/boxes/maps.dart';
import 'package:ju_rc_app/boxes/state.dart';
import 'package:ju_rc_app/connector.dart';
import 'package:ju_rc_app/lib/boxes.dart';
@ -45,7 +47,12 @@ class MyHomePage extends StatefulWidget {
class _MyHomePageState extends State<MyHomePage> {
ConnectionBar conBar = ConnectionBar();
static List<JuBox> boxes = [const SerialBox(), const ControllerState()];
static List<JuBox> boxes = [
const ControllerState(),
const Maps(),
const Compass(),
const SerialBox(),
];
@override
void initState() {

View file

@ -74,7 +74,7 @@ packages:
source: hosted
version: "1.18.0"
convert:
dependency: transitive
dependency: "direct main"
description:
name: convert
sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
@ -114,7 +114,7 @@ packages:
source: hosted
version: "1.3.1"
ffi:
dependency: transitive
dependency: "direct main"
description:
name: ffi
sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878"
@ -150,6 +150,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.0.3"
flutter_map:
dependency: "direct main"
description:
name: flutter_map
sha256: "5286f72f87deb132daa1489442d6cc46e986fc105cb727d9ae1b602b35b1d1f3"
url: "https://pub.dev"
source: hosted
version: "5.0.0"
flutter_svg:
dependency: "direct main"
description:
name: flutter_svg
sha256: "8c5d68a82add3ca76d792f058b186a0599414f279f00ece4830b9b231b570338"
url: "https://pub.dev"
source: hosted
version: "2.0.7"
flutter_test:
dependency: "direct dev"
description: flutter
@ -216,6 +232,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "4.8.1"
latlong2:
dependency: "direct main"
description:
name: latlong2
sha256: "18712164760cee655bc790122b0fd8f3d5b3c36da2cb7bf94b68a197fbb0811b"
url: "https://pub.dev"
source: hosted
version: "0.9.0"
libserialport:
dependency: transitive
description:
@ -232,6 +256,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.1"
lists:
dependency: transitive
description:
name: lists
sha256: "4ca5c19ae4350de036a7e996cdd1ee39c93ac0a2b840f4915459b7d0a7d4ab27"
url: "https://pub.dev"
source: hosted
version: "1.0.1"
matcher:
dependency: transitive
description:
@ -256,6 +288,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.9.1"
mgrs_dart:
dependency: transitive
description:
name: mgrs_dart
sha256: fb89ae62f05fa0bb90f70c31fc870bcbcfd516c843fb554452ab3396f78586f7
url: "https://pub.dev"
source: hosted
version: "2.0.0"
path:
dependency: transitive
description:
@ -264,6 +304,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.8.3"
path_parsing:
dependency: transitive
description:
name: path_parsing
sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf
url: "https://pub.dev"
source: hosted
version: "1.0.1"
petitparser:
dependency: transitive
description:
@ -296,14 +344,30 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.7.3"
polylabel:
dependency: transitive
description:
name: polylabel
sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b"
url: "https://pub.dev"
source: hosted
version: "1.0.1"
proj4dart:
dependency: transitive
description:
name: proj4dart
sha256: c8a659ac9b6864aa47c171e78d41bbe6f5e1d7bd790a5814249e6b68bc44324e
url: "https://pub.dev"
source: hosted
version: "2.1.0"
rive:
dependency: "direct main"
description:
name: rive
sha256: "5fbb92f9f880cddbb9181342dc24099eee323ca43339e2c8e1ae6fad85df915e"
sha256: f2117a96a189758bc79bf7933865625c7a44a420ae537d2a8f6c492900136a71
url: "https://pub.dev"
source: hosted
version: "0.11.16"
version: "0.11.17"
rive_common:
dependency: transitive
description:
@ -373,6 +437,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.3.2"
unicode:
dependency: transitive
description:
name: unicode
sha256: "0f69e46593d65245774d4f17125c6084d2c20b4e473a983f6e21b7d7762218f1"
url: "https://pub.dev"
source: hosted
version: "0.3.1"
usb_serial:
dependency: "direct main"
description:
@ -381,6 +453,30 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.5.1"
vector_graphics:
dependency: transitive
description:
name: vector_graphics
sha256: "670f6e07aca990b4a2bcdc08a784193c4ccdd1932620244c3a86bb72a0eac67f"
url: "https://pub.dev"
source: hosted
version: "1.1.7"
vector_graphics_codec:
dependency: transitive
description:
name: vector_graphics_codec
sha256: "7451721781d967db9933b63f5733b1c4533022c0ba373a01bdd79d1a5457f69f"
url: "https://pub.dev"
source: hosted
version: "1.1.7"
vector_graphics_compiler:
dependency: transitive
description:
name: vector_graphics_compiler
sha256: "80a13c613c8bde758b1464a1755a7b3a8f2b6cec61fbf0f5a53c94c30f03ba2e"
url: "https://pub.dev"
source: hosted
version: "1.1.7"
vector_math:
dependency: transitive
description:
@ -397,6 +493,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.1.4-beta"
wkt_parser:
dependency: transitive
description:
name: wkt_parser
sha256: "8a555fc60de3116c00aad67891bcab20f81a958e4219cc106e3c037aa3937f13"
url: "https://pub.dev"
source: hosted
version: "2.0.0"
xml:
dependency: transitive
description:
@ -415,4 +519,4 @@ packages:
version: "3.1.2"
sdks:
dart: ">=3.1.0-185.0.dev <4.0.0"
flutter: ">=3.0.0"
flutter: ">=3.10.0"

View file

@ -39,6 +39,11 @@ dependencies:
usb_serial: ^0.5.1
rive: ^0.11.16
intl: ^0.18.1
ffi: ^2.1.0
convert: ^3.1.1
flutter_map: ^5.0.0
latlong2: ^0.9.0
flutter_svg: ^2.0.7
dev_dependencies:
flutter_test:
@ -74,6 +79,9 @@ flutter_launcher_icons:
# The following section is specific to Flutter packages.
flutter:
assets:
- assets/compass.svg
- assets/needle.svg
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in