Initial commit of FG1000 MFD
This commit is contained in:
parent
0117da44ff
commit
3d31775ff3
22 changed files with 6899 additions and 275 deletions
841
Aircraft/Instruments-3d/FG1000/Models/EIS_c172s.svg
Normal file
841
Aircraft/Instruments-3d/FG1000/Models/EIS_c172s.svg
Normal file
|
@ -0,0 +1,841 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||||
|
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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="210mm"
|
||||||
|
height="297mm"
|
||||||
|
viewBox="0 0 744.09448819 1052.3622047"
|
||||||
|
id="svg4136"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r13725"
|
||||||
|
sodipodi:docname="EIS_c172s_v2.svg">
|
||||||
|
<defs
|
||||||
|
id="defs4138">
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient4779"
|
||||||
|
osb:paint="gradient">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#352837;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4781" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#352837;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop4783" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="3.3515539"
|
||||||
|
inkscape:cx="4.4492679"
|
||||||
|
inkscape:cy="930.9091"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:window-width="2495"
|
||||||
|
inkscape:window-height="1416"
|
||||||
|
inkscape:window-x="65"
|
||||||
|
inkscape:window-y="24"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
showguides="false"
|
||||||
|
inkscape:snap-object-midpoints="false"
|
||||||
|
inkscape:snap-center="true" />
|
||||||
|
<metadata
|
||||||
|
id="metadata4141">
|
||||||
|
<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 />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1">
|
||||||
|
<rect
|
||||||
|
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.51325756;stroke-opacity:1"
|
||||||
|
id="SBattAmps"
|
||||||
|
width="149.48674"
|
||||||
|
height="688.48676"
|
||||||
|
x="-0.28891727"
|
||||||
|
y="56.43882"
|
||||||
|
inkscape:label="#rect4684" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.01574385;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="M 74.242188,57.513672 C 57.591382,57.455549 40.919193,63.107347 27.365234,74.480469 0.25731786,97.226713 -6.4772629,136.22443 11.429688,166.74609 l 0.875,-0.51367 C -5.3549643,136.13227 1.2859805,97.689926 28.019531,75.257812 54.753082,52.825699 93.76355,52.961876 120.33984,75.580078 c 26.5763,22.618202 32.94749,61.105902 15.07813,91.082032 l 0.87109,0.51953 C 154.40866,136.78573 147.9465,97.741579 120.99805,74.806641 107.52382,63.339172 90.892993,57.571795 74.242188,57.513672 Z"
|
||||||
|
id="OuterRPM"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="M 74.070312,60.328125 C 58.093724,60.272356 42.097371,65.691238 29.099609,76.597656 3.1040851,98.410493 -3.3615793,135.84409 13.810547,165.11328 l 4.3125,-2.5293 C 2.168248,135.38968 8.1597914,100.69426 32.3125,80.427734 56.465208,60.161205 91.672961,60.284097 115.68359,80.71875 c 24.01064,20.43465 29.76145,55.1697 13.61719,82.25195 l 4.29492,2.56055 C 150.97175,136.38266 144.76644,98.905897 118.92383,76.912109 106.00252,65.915216 90.046901,60.383894 74.070312,60.328125 Z"
|
||||||
|
id="WhiteRPM"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#009900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 103.45312,66.941406 -2.1289,4.523438 c 19.86326,9.346943 33.61421,28.13482 36.51758,49.894536 l 4.95703,-0.66016 C 139.67156,97.261392 124.84825,77.009188 103.45312,66.941406 Z"
|
||||||
|
id="GreenRPM"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 138.41016,129.90234 c 0,11.6428 -3.14777,23.06767 -9.10938,33.06836 l 4.29492,2.56055 c 6.423,-10.77468 9.81446,-23.08503 9.81446,-35.62891 l -5,0 z"
|
||||||
|
id="RedRPM"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 11.702553,167.05926 9.343911,-5.49271"
|
||||||
|
id="path4713"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 136.0776,167.56433 -9.97526,-5.93465"
|
||||||
|
id="path4715"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:FreeMono;-inkscape-font-specification:FreeMono;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
|
||||||
|
x="0.72086191"
|
||||||
|
y="180.59354"
|
||||||
|
id="text4717"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan4719"
|
||||||
|
x="0.72086191"
|
||||||
|
y="180.59354">0</tspan></text>
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text4725"
|
||||||
|
y="180.95068"
|
||||||
|
x="110.5423"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:FreeMono;-inkscape-font-specification:FreeMono;text-align:start;letter-spacing:-3px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
y="180.95068"
|
||||||
|
x="110.5423"
|
||||||
|
id="tspan4727"
|
||||||
|
sodipodi:role="line">3000</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:35px;line-height:125%;font-family:FreeMono;-inkscape-font-specification:FreeMono;text-align:start;letter-spacing:-3px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
x="40.9702"
|
||||||
|
y="184.0697"
|
||||||
|
id="RPMDisplay"
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
inkscape:label="#text4729"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan4731"
|
||||||
|
x="40.9702"
|
||||||
|
y="184.0697"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;font-family:FreeSans;-inkscape-font-specification:FreeSans">2200</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:FreeSans;-inkscape-font-specification:FreeSans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
x="52.228359"
|
||||||
|
y="154.23056"
|
||||||
|
id="text4733"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan4735"
|
||||||
|
x="52.228359"
|
||||||
|
y="154.23056">RPM</tspan></text>
|
||||||
|
<path
|
||||||
|
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 72.822029,125.96939 -59.459758,31.77936 6.366604,-9.03366 4.578139,3.17116 -0.526987,6.34826 -10.196797,-0.65694"
|
||||||
|
id="RPMPointer"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:label="#path4775"
|
||||||
|
inkscape:transform-center-x="30.347137"
|
||||||
|
inkscape:transform-center-y="17.260628" />
|
||||||
|
<g
|
||||||
|
id="g4866"
|
||||||
|
transform="translate(-0.54554609,-307.18002)">
|
||||||
|
<rect
|
||||||
|
y="544.53625"
|
||||||
|
x="8.4391518"
|
||||||
|
height="6.9623003"
|
||||||
|
width="75.530403"
|
||||||
|
id="rect4862"
|
||||||
|
style="opacity:1;fill:#00af00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||||
|
<g
|
||||||
|
transform="translate(0,21.780942)"
|
||||||
|
inkscape:label="#g4833"
|
||||||
|
id="FFLOW">
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 8.0559648,519.47505 0,12.23313 134.8260452,0.0746 -0.0746,-12.03652"
|
||||||
|
id="path4789"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cccc" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 20.684108,531.22649 0,-11.60383"
|
||||||
|
id="path4799"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4813"
|
||||||
|
d="m 34.931231,531.30108 0,-11.60383"
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 34.931231,531.30108 0,-11.60383"
|
||||||
|
id="path4815"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4819"
|
||||||
|
d="m 48.656208,531.30108 0,-11.60383"
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 62.082816,531.30108 0,-11.60383"
|
||||||
|
id="path4821"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4823"
|
||||||
|
d="m 75.509424,531.30108 0,-11.60383"
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 89.681955,531.52486 0,-11.60383"
|
||||||
|
id="path4825"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4827"
|
||||||
|
d="m 102.95938,531.22649 0,-11.60383"
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 116.53517,531.30108 0,-11.60383"
|
||||||
|
id="path4829"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4831"
|
||||||
|
d="m 129.66341,531.30108 0,-11.60383"
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text4846"
|
||||||
|
y="528.42615"
|
||||||
|
x="30.433645"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:FreeSans;-inkscape-font-specification:FreeSans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
id="tspan4850"
|
||||||
|
y="528.42615"
|
||||||
|
x="30.433645"
|
||||||
|
sodipodi:role="line">FFLOW GPH</tspan></text>
|
||||||
|
<text
|
||||||
|
id="text4854"
|
||||||
|
y="569.60107"
|
||||||
|
x="3.5804288"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:FreeSans;-inkscape-font-specification:FreeSans;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
y="569.60107"
|
||||||
|
x="3.5804288"
|
||||||
|
id="tspan4856"
|
||||||
|
sodipodi:role="line">0</tspan></text>
|
||||||
|
<text
|
||||||
|
id="text4858"
|
||||||
|
y="569.60101"
|
||||||
|
x="130.08891"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:FreeSans;-inkscape-font-specification:FreeSans;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
y="569.60101"
|
||||||
|
x="130.08891"
|
||||||
|
id="tspan4860"
|
||||||
|
sodipodi:role="line">20</tspan></text>
|
||||||
|
<path
|
||||||
|
inkscape:label="#path4864"
|
||||||
|
sodipodi:nodetypes="cccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="FuelFlowPointer"
|
||||||
|
d="m 4.5714659,539.5634 0.043695,9.19243 3.48115,3.34929 3.5075231,-3.37566 0,-9.18946 z"
|
||||||
|
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g4888"
|
||||||
|
transform="translate(-0.54554609,-238.25676)">
|
||||||
|
<rect
|
||||||
|
style="opacity:1;fill:#00af00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
id="rect4890"
|
||||||
|
width="38.714603"
|
||||||
|
height="6.9623003"
|
||||||
|
x="72.682198"
|
||||||
|
y="544.53625" />
|
||||||
|
<rect
|
||||||
|
y="544.53625"
|
||||||
|
x="138.82405"
|
||||||
|
height="6.9623003"
|
||||||
|
width="4.0085921"
|
||||||
|
id="rect4930"
|
||||||
|
style="opacity:1;fill:#ca0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||||
|
<g
|
||||||
|
id="g4892"
|
||||||
|
inkscape:label="#g4833"
|
||||||
|
transform="translate(0,21.780942)">
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4894"
|
||||||
|
d="m 8.0559648,519.47505 0,12.23313 134.8260452,0.0746 -0.0746,-12.03652"
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:FreeSans;-inkscape-font-specification:FreeSans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
x="41.193565"
|
||||||
|
y="528.42615"
|
||||||
|
id="text4916"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
x="41.193565"
|
||||||
|
y="528.42615"
|
||||||
|
id="tspan4918">OIL PRES</tspan></text>
|
||||||
|
<rect
|
||||||
|
y="544.53625"
|
||||||
|
x="8.0171986"
|
||||||
|
height="6.9622803"
|
||||||
|
width="20.886898"
|
||||||
|
id="rect4932"
|
||||||
|
style="opacity:1;fill:#aa0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 4.5714659,539.5634 0.043695,9.19243 3.48115,3.34929 3.5075231,-3.37566 0,-9.18946 z"
|
||||||
|
id="OilPressurePointer"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cccccc"
|
||||||
|
inkscape:label="#path4864" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(-0.54554609,-188.88773)"
|
||||||
|
id="g4934">
|
||||||
|
<rect
|
||||||
|
y="544.53625"
|
||||||
|
x="33.440144"
|
||||||
|
height="6.9623003"
|
||||||
|
width="105.27841"
|
||||||
|
id="rect4936"
|
||||||
|
style="opacity:1;fill:#00af00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||||
|
<rect
|
||||||
|
style="opacity:1;fill:#ca0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
id="rect4938"
|
||||||
|
width="4.0085921"
|
||||||
|
height="6.9623003"
|
||||||
|
x="138.82405"
|
||||||
|
y="544.53625" />
|
||||||
|
<g
|
||||||
|
transform="translate(0,21.780942)"
|
||||||
|
inkscape:label="#g4833"
|
||||||
|
id="g4940">
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 8.0559648,519.47505 0,12.23313 134.8260452,0.0746 -0.0746,-12.03652"
|
||||||
|
id="path4942"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cccc" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text4944"
|
||||||
|
y="528.42615"
|
||||||
|
x="41.193565"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:FreeSans;-inkscape-font-specification:FreeSans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
id="tspan4946"
|
||||||
|
y="528.42615"
|
||||||
|
x="41.193565"
|
||||||
|
sodipodi:role="line">OIL TEMP</tspan></text>
|
||||||
|
<path
|
||||||
|
inkscape:label="#path4864"
|
||||||
|
sodipodi:nodetypes="cccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="OilTempPointer"
|
||||||
|
d="m 4.5714659,539.5634 0.043695,9.19243 3.48115,3.34929 3.5075231,-3.37566 0,-9.18946 z"
|
||||||
|
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g4952"
|
||||||
|
transform="translate(-0.54554609,-142.18193)">
|
||||||
|
<g
|
||||||
|
id="g4956"
|
||||||
|
inkscape:label="#g4833"
|
||||||
|
transform="translate(0,21.780942)">
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4958"
|
||||||
|
d="m 8.0559648,519.47505 0,12.23313 134.8260452,0.0746 -0.0746,-12.03652"
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4960"
|
||||||
|
d="m 20.684108,531.22649 0,-11.60383"
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 34.931231,531.30108 0,-11.60383"
|
||||||
|
id="path4962"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4964"
|
||||||
|
d="m 34.931231,531.30108 0,-11.60383"
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 48.656208,531.30108 0,-11.60383"
|
||||||
|
id="path4966"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4968"
|
||||||
|
d="m 62.082816,531.30108 0,-11.60383"
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 75.509424,531.30108 0,-11.60383"
|
||||||
|
id="path4970"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4972"
|
||||||
|
d="m 89.681955,531.52486 0,-11.60383"
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 102.95938,531.22649 0,-11.60383"
|
||||||
|
id="path4974"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4976"
|
||||||
|
d="m 116.53517,531.30108 0,-11.60383"
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 129.66341,531.30108 0,-11.60383"
|
||||||
|
id="path4978"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:FreeSans;-inkscape-font-specification:FreeSans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
x="62.060768"
|
||||||
|
y="528.42615"
|
||||||
|
id="text4980"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
x="62.060768"
|
||||||
|
y="528.42615"
|
||||||
|
id="tspan4982">EGT</tspan></text>
|
||||||
|
<path
|
||||||
|
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 4.5714659,539.5634 0.043695,9.19243 3.48115,3.34929 3.5075231,-3.37566 0,-9.18946 z"
|
||||||
|
id="EGTPointer"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cccccc"
|
||||||
|
inkscape:label="#path4864" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:FreeSans;-inkscape-font-specification:FreeSans;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
x="3.9031074"
|
||||||
|
y="550.22003"
|
||||||
|
id="EGTCylinder"
|
||||||
|
inkscape:label="#text4994"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan4996"
|
||||||
|
x="3.9031074"
|
||||||
|
y="550.22003">1</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g4998"
|
||||||
|
transform="translate(-0.54554609,-81.176495)">
|
||||||
|
<rect
|
||||||
|
style="opacity:1;fill:#00af00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
id="rect5000"
|
||||||
|
width="37.847004"
|
||||||
|
height="6.9623003"
|
||||||
|
x="54.624344"
|
||||||
|
y="544.53625" />
|
||||||
|
<g
|
||||||
|
id="g5004"
|
||||||
|
inkscape:label="#g4833"
|
||||||
|
transform="translate(0,21.780942)">
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path5006"
|
||||||
|
d="m 8.0559648,519.47505 0,12.23313 134.8260452,0.0746 -0.0746,-12.03652"
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:FreeSans;-inkscape-font-specification:FreeSans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
x="60.289185"
|
||||||
|
y="528.42615"
|
||||||
|
id="text5008"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
x="60.289185"
|
||||||
|
y="528.42615"
|
||||||
|
id="tspan5010">VAC</tspan></text>
|
||||||
|
<path
|
||||||
|
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 4.5714659,539.5634 0.043695,9.19243 3.48115,3.34929 3.5075231,-3.37566 0,-9.18946 z"
|
||||||
|
id="VacPointer"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cccccc"
|
||||||
|
inkscape:label="#path4864" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g5014"
|
||||||
|
transform="translate(0,271.9634)">
|
||||||
|
<g
|
||||||
|
id="g5018"
|
||||||
|
inkscape:label="#g4833"
|
||||||
|
transform="translate(-0.54554609,-285.39908)">
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path5020"
|
||||||
|
d="m 8.0559648,519.47505 0,12.23313 134.8260452,0.0746 -0.0746,-12.03652"
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.39230883px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 53.078837,542.01976 0,-22.4943"
|
||||||
|
id="path5028"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path5034"
|
||||||
|
d="m 97.957359,541.88715 0,-21.89756"
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.37371683px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path5056"
|
||||||
|
d="m 8.2003174,542.28497 0,-22.4943"
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.39230883px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.37371683px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 142.83588,542.15236 0,-21.89756"
|
||||||
|
id="path5058"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
<rect
|
||||||
|
style="opacity:1;fill:#00af00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
id="rect5016"
|
||||||
|
width="100.89178"
|
||||||
|
height="6.9623003"
|
||||||
|
x="24.303904"
|
||||||
|
y="242.57767" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:FreeSans;-inkscape-font-specification:FreeSans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
x="22.578058"
|
||||||
|
y="221.09695"
|
||||||
|
id="text5042"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
x="22.578058"
|
||||||
|
y="221.09695"
|
||||||
|
id="tspan5044">FUEL QTY GAL</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:FreeSans;-inkscape-font-specification:FreeSans;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
x="3.034883"
|
||||||
|
y="272.61682"
|
||||||
|
id="text5046"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan5048"
|
||||||
|
x="3.034883"
|
||||||
|
y="272.61682"
|
||||||
|
style="font-size:15px">0</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:FreeSans;-inkscape-font-specification:FreeSans;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
x="136.70422"
|
||||||
|
y="272.93927"
|
||||||
|
id="text5050"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan5052"
|
||||||
|
x="136.70422"
|
||||||
|
y="272.93927"
|
||||||
|
style="font-size:15px">F</tspan></text>
|
||||||
|
<rect
|
||||||
|
y="242.57767"
|
||||||
|
x="7.5952349"
|
||||||
|
height="6.9623003"
|
||||||
|
width="5.0407143"
|
||||||
|
id="rect5062"
|
||||||
|
style="opacity:1;fill:#aa0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||||
|
<rect
|
||||||
|
y="242.57767"
|
||||||
|
x="12.592917"
|
||||||
|
height="6.9623003"
|
||||||
|
width="11.754019"
|
||||||
|
id="rect5064"
|
||||||
|
style="opacity:1;fill:#acaf00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:FreeSans;-inkscape-font-specification:FreeSans;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
x="43.221519"
|
||||||
|
y="272.61682"
|
||||||
|
id="text5066"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan5068"
|
||||||
|
x="43.221519"
|
||||||
|
y="272.61682"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeSans;-inkscape-font-specification:FreeSans">10</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:FreeSans;-inkscape-font-specification:FreeSans;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
x="88.535469"
|
||||||
|
y="272.61682"
|
||||||
|
id="text5070"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan5072"
|
||||||
|
x="88.535469"
|
||||||
|
y="272.61682">20</tspan></text>
|
||||||
|
<g
|
||||||
|
id="RightFuelPointer"
|
||||||
|
inkscape:label="#g4282">
|
||||||
|
<path
|
||||||
|
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 4.0259199,259.63213 -2.9100082,0 6.4348532,-12.49326 7.3051411,12.49326 -3.797618,0 z"
|
||||||
|
id="RightFuelTriangle"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cccccc"
|
||||||
|
inkscape:label="#path4864" />
|
||||||
|
<text
|
||||||
|
inkscape:label="#text5076"
|
||||||
|
id="RightFuelLabel"
|
||||||
|
y="259.8103"
|
||||||
|
x="3.8553977"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:FreeSans;-inkscape-font-specification:FreeSans;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
y="259.8103"
|
||||||
|
x="3.8553977"
|
||||||
|
id="tspan5078"
|
||||||
|
sodipodi:role="line">R</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="LeftFuelPointer"
|
||||||
|
inkscape:label="#g4277">
|
||||||
|
<path
|
||||||
|
inkscape:label="#path4864"
|
||||||
|
sodipodi:nodetypes="cccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="LeftFuelTriangle"
|
||||||
|
d="m 4.0259199,232.43184 -2.9100082,0 6.4348532,12.49326 7.3051411,-12.49326 -3.797618,0 z"
|
||||||
|
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:FreeSans;-inkscape-font-specification:FreeSans;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
x="3.8553977"
|
||||||
|
y="239.81961"
|
||||||
|
id="LeftFuelLabel"
|
||||||
|
inkscape:label="#text5076"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan5082"
|
||||||
|
x="3.8553977"
|
||||||
|
y="239.81961">L</tspan></text>
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:FreeSans;-inkscape-font-specification:FreeSans;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
x="1.7752202"
|
||||||
|
y="306.83356"
|
||||||
|
id="text5092"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan5094"
|
||||||
|
x="1.7752202"
|
||||||
|
y="306.83356">ENG HRS</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;font-family:FreeSans;-inkscape-font-specification:FreeSans;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
x="73.508011"
|
||||||
|
y="307.17853"
|
||||||
|
id="EngineHours"
|
||||||
|
inkscape:label="#text5096"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan5098"
|
||||||
|
x="73.508011"
|
||||||
|
y="307.17853">XXXX.X</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:FreeSans;-inkscape-font-specification:FreeSans;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
x="26.265755"
|
||||||
|
y="341.14606"
|
||||||
|
id="text5100"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan5102"
|
||||||
|
x="26.265755"
|
||||||
|
y="341.14606">ELECTRICAL</tspan></text>
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 120.34531,335.65557 16.45634,0.21098"
|
||||||
|
id="path5108"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path5110"
|
||||||
|
d="M 7.8936094,335.65557 24.34995,335.86655"
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:0%;font-family:FreeSans;-inkscape-font-specification:FreeSans;text-align:start;text-anchor:start;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
x="13.590033"
|
||||||
|
y="359.64337"
|
||||||
|
id="text5112"
|
||||||
|
sodipodi:linespacing="0%"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan5114"
|
||||||
|
x="13.590033"
|
||||||
|
y="359.64337">M</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:FreeSans;-inkscape-font-specification:FreeSans;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
x="56.530724"
|
||||||
|
y="359.56085"
|
||||||
|
id="text5116"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan5118"
|
||||||
|
x="56.530724"
|
||||||
|
y="359.56085">BUS</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:FreeSans;-inkscape-font-specification:FreeSans;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
x="119.29041"
|
||||||
|
y="359.64337"
|
||||||
|
id="text5120"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan5122"
|
||||||
|
x="119.29041"
|
||||||
|
y="359.64337">E</tspan></text>
|
||||||
|
<flowRoot
|
||||||
|
xml:space="preserve"
|
||||||
|
id="flowRoot5124"
|
||||||
|
style="fill-opacity:1;font-size:15px;opacity:1;fill-rule:nonzero;fill:#ffffff;stroke:#ffffff;stroke-opacity:1;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;-inkscape-font-specification:FreeSans;font-family:FreeSans;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal"><flowRegion
|
||||||
|
id="flowRegion5126"><rect
|
||||||
|
id="rect5128"
|
||||||
|
width="250.43182"
|
||||||
|
height="44.305546"
|
||||||
|
x="-18.988091"
|
||||||
|
y="931.89331" /></flowRegion><flowPara
|
||||||
|
id="flowPara5130" /></flowRoot> <text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:FreeSans;-inkscape-font-specification:FreeSans;text-align:start;text-anchor:start;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
x="9.3704567"
|
||||||
|
y="382.3924"
|
||||||
|
id="MBusVolts"
|
||||||
|
inkscape:label="#text5132"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan5134"
|
||||||
|
x="9.3704567"
|
||||||
|
y="382.3924">32.0</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:FreeSans;-inkscape-font-specification:FreeSans;text-align:start;text-anchor:start;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
x="50.673546"
|
||||||
|
y="382.84338"
|
||||||
|
id="text5136"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan5138"
|
||||||
|
x="50.673546"
|
||||||
|
y="382.84338">VOLTS</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:FreeSans;-inkscape-font-specification:FreeSans;text-align:start;text-anchor:start;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
x="112.32812"
|
||||||
|
y="381.33752"
|
||||||
|
id="EBusVolts"
|
||||||
|
inkscape:label="#text5140"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan5142"
|
||||||
|
x="112.32812"
|
||||||
|
y="381.33752">32.0</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:FreeSans;-inkscape-font-specification:FreeSans;text-align:start;text-anchor:start;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
x="15.066884"
|
||||||
|
y="425.23657"
|
||||||
|
id="text5144"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan5146"
|
||||||
|
x="15.066884"
|
||||||
|
y="425.23657">M</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:FreeSans;-inkscape-font-specification:FreeSans;text-align:start;text-anchor:start;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
x="55.660442"
|
||||||
|
y="425.23657"
|
||||||
|
id="text5148"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan5150"
|
||||||
|
x="55.660442"
|
||||||
|
y="425.23657">BATT</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:FreeSans;-inkscape-font-specification:FreeSans;text-align:start;text-anchor:start;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
x="124.56488"
|
||||||
|
y="425.15405"
|
||||||
|
id="text5152"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan5154"
|
||||||
|
x="124.56488"
|
||||||
|
y="425.15405">S</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:FreeSans;-inkscape-font-specification:FreeSans;text-align:start;text-anchor:start;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
x="5.1508813"
|
||||||
|
y="450.11658"
|
||||||
|
id="MBattAmps"
|
||||||
|
inkscape:label="#text5156"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan5158"
|
||||||
|
x="5.1508813"
|
||||||
|
y="450.11658">+110</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:FreeSans;-inkscape-font-specification:FreeSans;text-align:start;text-anchor:start;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
x="53.034382"
|
||||||
|
y="450.35657"
|
||||||
|
id="text5160"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan5162"
|
||||||
|
x="53.034382"
|
||||||
|
y="450.35657">AMPS</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:FreeSans;-inkscape-font-specification:FreeSans;text-align:start;text-anchor:start;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
x="109.16343"
|
||||||
|
y="450.11658"
|
||||||
|
id="text5164"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan5166"
|
||||||
|
x="109.16343"
|
||||||
|
y="450.11658">+110</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 46 KiB |
1744
Aircraft/Instruments-3d/FG1000/Models/MFD.svg
Normal file
1744
Aircraft/Instruments-3d/FG1000/Models/MFD.svg
Normal file
File diff suppressed because it is too large
Load diff
After Width: | Height: | Size: 90 KiB |
1745
Aircraft/Instruments-3d/FG1000/Models/MFD2.svg
Normal file
1745
Aircraft/Instruments-3d/FG1000/Models/MFD2.svg
Normal file
File diff suppressed because it is too large
Load diff
After Width: | Height: | Size: 89 KiB |
68
Aircraft/Instruments-3d/FG1000/Nasal/Drivers/EISDriver.nas
Normal file
68
Aircraft/Instruments-3d/FG1000/Nasal/Drivers/EISDriver.nas
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
# FG1000 Engine Information Display Default Driver
|
||||||
|
#
|
||||||
|
# Driver values in the EIS.
|
||||||
|
|
||||||
|
var PropMap =
|
||||||
|
{
|
||||||
|
new : func(name, property)
|
||||||
|
{
|
||||||
|
var obj = { parents : [ PropMap ] };
|
||||||
|
obj._name = name;
|
||||||
|
obj._val = 0;
|
||||||
|
obj._prop = globals.props.getNode(property, 1);
|
||||||
|
obj._val = obj._prop.getValue();
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
|
|
||||||
|
update : func()
|
||||||
|
{
|
||||||
|
me._val = me._prop.getValue();
|
||||||
|
},
|
||||||
|
|
||||||
|
getValue : func()
|
||||||
|
{
|
||||||
|
return me._val;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
var EISDriver =
|
||||||
|
{
|
||||||
|
new : func()
|
||||||
|
{
|
||||||
|
var obj = { parents : [ EISDriver ] };
|
||||||
|
|
||||||
|
# Hack to handle most aircraft not having proper engine hours
|
||||||
|
setprop("/engines/engine[0]/hours", 157.0);
|
||||||
|
|
||||||
|
obj._propmap = {
|
||||||
|
"RPM" : PropMap.new("RPM", "/engines/engine[0]/rpm"),
|
||||||
|
"MBusVolts" : PropMap.new("MBusVolts", "/systems/electrical/volts"),
|
||||||
|
"EngineHours" : PropMap.new("EngineHours", "/engines/engine[0]/hours"),
|
||||||
|
"FuelFlowGPH" : PropMap.new("FuelFlowGPH", "/engines/engine[0]/fuel-flow-gph"),
|
||||||
|
"OilPressurePSI" : PropMap.new("OilPressurePSI", "/engines/engine[0]/oil-pressure-psi"),
|
||||||
|
"OilTemperatureF" : PropMap.new("OilTemperatureF", "/engines/engine[0]/oil-temperature-degf"),
|
||||||
|
"EGTNorm" : PropMap.new("EGTNorm", "/engines/engine[0]/egt-norm"),
|
||||||
|
"VacuumSuctionInHG" : PropMap.new("VacuumSuctionInHG", "/systems/vacuum/suction-inhg"),
|
||||||
|
|
||||||
|
"LeftFuelUSGal" : PropMap.new("LeftFuelUSGal", "/consumables/fuel/tank[0]/indicated-level-gal_us"),
|
||||||
|
"RightFuelUSGal" : PropMap.new("RightFuelUSGal", "/consumables/fuel/tank[1]/indicated-level-gal_us"),
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
|
|
||||||
|
getValue : func(name)
|
||||||
|
{
|
||||||
|
if (me._propmap[name] == nil) print("Unknown Driver Key in EISDriver.nas " ~ name);
|
||||||
|
return me._propmap[name].getValue();
|
||||||
|
},
|
||||||
|
|
||||||
|
update: func () {
|
||||||
|
|
||||||
|
foreach (var tp; keys(me._propmap)) {
|
||||||
|
me._propmap[tp].update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
146
Aircraft/Instruments-3d/FG1000/Nasal/EIS.nas
Normal file
146
Aircraft/Instruments-3d/FG1000/Nasal/EIS.nas
Normal file
|
@ -0,0 +1,146 @@
|
||||||
|
# FG1000 Engine Information Display
|
||||||
|
|
||||||
|
# A mapping from names of elements to specific elements of the SVG.
|
||||||
|
# These names mapped to values by the provided EISDriver.
|
||||||
|
var DynamicTextElementMap =
|
||||||
|
{
|
||||||
|
new : func(svg, name, element_id, format)
|
||||||
|
{
|
||||||
|
var obj = { parents : [ DynamicTextElementMap ] };
|
||||||
|
obj._name = name;
|
||||||
|
obj._element_id = element_id;
|
||||||
|
obj._element = svg.getElementById(element_id);
|
||||||
|
obj._format = format;
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
|
|
||||||
|
update : func(driver)
|
||||||
|
{
|
||||||
|
me._element.setText(sprintf(me._format, driver.getValue(me._name)));
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
var DynamicSliderElementMap =
|
||||||
|
{
|
||||||
|
new : func(svg, name, element_id, min=0.0, max=1.0)
|
||||||
|
{
|
||||||
|
var obj = { parents : [ DynamicSliderElementMap ] };
|
||||||
|
obj._name = name;
|
||||||
|
obj._element_id = element_id;
|
||||||
|
obj._element = svg.getElementById(element_id);
|
||||||
|
obj._baseTranslation = obj._element.getTranslation();
|
||||||
|
obj._min = min;
|
||||||
|
obj._max = max;
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
|
|
||||||
|
update : func(driver)
|
||||||
|
{
|
||||||
|
var value = driver.getValue(me._name);
|
||||||
|
if (value == nil) value = 0.0;
|
||||||
|
|
||||||
|
# Bound value to the minimum and maximum values.
|
||||||
|
value = math.max(me._min, value);
|
||||||
|
value = math.min(me._max, value);
|
||||||
|
|
||||||
|
# Convert to normalized value
|
||||||
|
value = (value - me._min) / (me._max - me._min);
|
||||||
|
|
||||||
|
# Simply shift the slider along. All sliders have a 0 value
|
||||||
|
# at x=3.5, and a maximum value at x=138.0.
|
||||||
|
me._element.setTranslation([
|
||||||
|
me._baseTranslation[0] + (value * (138.0 - 3.5)),
|
||||||
|
me._baseTranslation[1]
|
||||||
|
]);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
var DynamicRotatingElementMap =
|
||||||
|
{
|
||||||
|
new : func(svg, name, element_id, min=0.0, max=1.0, range=360.0)
|
||||||
|
{
|
||||||
|
var obj = { parents : [ DynamicRotatingElementMap ] };
|
||||||
|
obj._name = name;
|
||||||
|
obj._element_id = element_id;
|
||||||
|
obj._element = svg.getElementById(element_id);
|
||||||
|
obj._baseTranslation = obj._element.getTranslation();
|
||||||
|
obj._min = min;
|
||||||
|
obj._max = max;
|
||||||
|
obj._range = range;
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
|
|
||||||
|
update : func(driver)
|
||||||
|
{
|
||||||
|
var value = driver.getValue(me._name);
|
||||||
|
if (value == nil) value = 0.0;
|
||||||
|
|
||||||
|
# Bound value to the minimum and maximum values.
|
||||||
|
value = math.max(me._min, value);
|
||||||
|
value = math.min(me._max, value);
|
||||||
|
|
||||||
|
# Convert to normalized value
|
||||||
|
value = (value - me._min) / (me._max - me._min);
|
||||||
|
me._element.setRotation(value * me._range * D2R, [100.0, 100.0]);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
var EIS =
|
||||||
|
{
|
||||||
|
new : func (myCanvas, EISDriver)
|
||||||
|
{
|
||||||
|
var obj = { parents : [ EIS ] };
|
||||||
|
obj._canvas = myCanvas;
|
||||||
|
obj._EISDriver = EISDriver;
|
||||||
|
|
||||||
|
obj._svg= obj._canvas.createGroup("EIS");
|
||||||
|
canvas.parsesvg(obj._svg, '/Aircraft/Instruments-3d/FG1000/Models/EIS_c172s.svg');
|
||||||
|
|
||||||
|
# Objects to display as straight text
|
||||||
|
obj._textElements = [
|
||||||
|
DynamicTextElementMap.new(obj._svg, "RPM", "RPMDisplay", "%i"),
|
||||||
|
DynamicTextElementMap.new(obj._svg, "MBusVolts" , "MBusVolts", "%.01f"),
|
||||||
|
DynamicTextElementMap.new(obj._svg, "MBusVolts" , "EBusVolts", "%.01f"),
|
||||||
|
DynamicTextElementMap.new(obj._svg, "EngineHours" , "EngineHours", "%.01f"),
|
||||||
|
];
|
||||||
|
|
||||||
|
obj._sliderElements = [
|
||||||
|
DynamicSliderElementMap.new(obj._svg, "FuelFlowGPH", "FuelFlowPointer", 0.0, 20.0),
|
||||||
|
DynamicSliderElementMap.new(obj._svg, "OilPressurePSI", "OilPressurePointer", 0.0, 115.0),
|
||||||
|
DynamicSliderElementMap.new(obj._svg, "OilTemperatureF", "OilTempPointer", 0.0, 245.0),
|
||||||
|
DynamicSliderElementMap.new(obj._svg, "EGTNorm", "EGTPointer", 0.0, 1.0),
|
||||||
|
DynamicSliderElementMap.new(obj._svg, "EGTNorm", "EGTCylinder", 0.0, 1.0),
|
||||||
|
DynamicSliderElementMap.new(obj._svg, "VacuumSuctionInHG", "VacPointer", 3.0, 7.0),
|
||||||
|
|
||||||
|
DynamicSliderElementMap.new(obj._svg, "LeftFuelUSGal", "LeftFuelPointer", 0.0, 30.0),
|
||||||
|
DynamicSliderElementMap.new(obj._svg, "RightFuelUSGal", "RightFuelPointer", 0.0, 30.0),
|
||||||
|
];
|
||||||
|
|
||||||
|
obj._rotationElements = [
|
||||||
|
DynamicRotatingElementMap.new(obj._svg, "RPM", "RPMPointer", 0.0, 3000.0, 260.0),
|
||||||
|
];
|
||||||
|
|
||||||
|
obj._svg.getElementById("RPMPointer").set("center-offset-x", 150.0);
|
||||||
|
obj._svg.getElementById("RPMPointer").set("center-offset-y", 100.0);
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
|
|
||||||
|
update : func()
|
||||||
|
{
|
||||||
|
foreach(var te; me._textElements) {
|
||||||
|
te.update(me._EISDriver);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach(var se; me._sliderElements) {
|
||||||
|
se.update(me._EISDriver);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach(var se; me._rotationElements) {
|
||||||
|
se.update(me._EISDriver);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
85
Aircraft/Instruments-3d/FG1000/Nasal/MFD.nas
Normal file
85
Aircraft/Instruments-3d/FG1000/Nasal/MFD.nas
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
# FG1000 MFD
|
||||||
|
|
||||||
|
var nasal_dir = getprop("/sim/fg-root") ~ "/Aircraft/Instruments-3d/FG1000/Nasal/";
|
||||||
|
io.load_nasal(nasal_dir ~ 'NavMap/NavMap.nas', "fg1000");
|
||||||
|
io.load_nasal(nasal_dir ~ 'NavMap/NavMapStyles.nas', "fg1000");
|
||||||
|
io.load_nasal(nasal_dir ~ 'NavMap/NavMapOptions.nas', "fg1000");
|
||||||
|
io.load_nasal(nasal_dir ~ 'NavMap/NavMapController.nas', "fg1000");
|
||||||
|
|
||||||
|
io.load_nasal(nasal_dir ~ 'TrafficMap/TrafficMap.nas', "fg1000");
|
||||||
|
io.load_nasal(nasal_dir ~ 'TrafficMap/TrafficMapStyles.nas', "fg1000");
|
||||||
|
io.load_nasal(nasal_dir ~ 'TrafficMap/TrafficMapOptions.nas', "fg1000");
|
||||||
|
io.load_nasal(nasal_dir ~ 'TrafficMap/TrafficMapController.nas', "fg1000");
|
||||||
|
|
||||||
|
io.load_nasal(nasal_dir ~ 'EIS.nas', "fg1000");
|
||||||
|
io.load_nasal(nasal_dir ~ 'Drivers/EISDriver.nas', "fg1000");
|
||||||
|
io.load_nasal(nasal_dir ~ 'PageGroupController.nas', "fg1000");
|
||||||
|
|
||||||
|
|
||||||
|
var MFD =
|
||||||
|
{
|
||||||
|
# Center of any maps
|
||||||
|
MAP_CENTER : {
|
||||||
|
X: (1024/2 + 60),
|
||||||
|
Y: (768/2 + 20)
|
||||||
|
},
|
||||||
|
|
||||||
|
# Constants for the hard-buttons on the fascia
|
||||||
|
FASCIA : {
|
||||||
|
FMS_OUTER : 0,
|
||||||
|
FMS_INNER : 1,
|
||||||
|
RANGE : 2,
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
new : func (myCanvas)
|
||||||
|
{
|
||||||
|
var obj = { parents : [ MFD ] };
|
||||||
|
|
||||||
|
obj._svg = myCanvas.createGroup("softkeys");
|
||||||
|
canvas.parsesvg(obj._svg, '/Aircraft/Instruments-3d/FG1000/Models/MFD.svg');
|
||||||
|
|
||||||
|
obj._MFDDevice = canvas.PFD_Device.new(obj._svg, 12, "SoftKey", myCanvas, "MFD");
|
||||||
|
obj._MFDDevice.RegisterWithEmesary();
|
||||||
|
|
||||||
|
# Engine Information System
|
||||||
|
obj._eisDriver = fg1000.EISDriver.new();
|
||||||
|
obj._eis = fg1000.EIS.new(myCanvas, obj._eisDriver);
|
||||||
|
|
||||||
|
# Controller for the display on the bottom left which allows selection
|
||||||
|
# of page groups and individual pages using the FMS controller.
|
||||||
|
obj._pageGroupController = fg1000.PageGroupController.new(myCanvas, obj._svg, obj._MFDDevice);
|
||||||
|
obj._pageGroupController.RegisterWithEmesary();
|
||||||
|
|
||||||
|
obj._pageGroupController.addPage("NavigationMap", fg1000.NavMap.new(myCanvas, obj._MFDDevice, obj._svg));
|
||||||
|
obj._pageGroupController.addPage("TrafficMap", fg1000.TrafficMap.new(myCanvas, obj._MFDDevice, obj._svg));
|
||||||
|
|
||||||
|
# Display the NavMap and the appropriate top level on startup.
|
||||||
|
obj._MFDDevice.selectPage(obj._pageGroupController.getPage("NavigationMap"));
|
||||||
|
|
||||||
|
# Add a wheel controller., which we will attach to the zoom.
|
||||||
|
myCanvas.addEventListener("wheel", func(e)
|
||||||
|
{
|
||||||
|
if (e.deltaY >0) {
|
||||||
|
obj._MFDDevice.current_page.controller.zoomIn();
|
||||||
|
} else {
|
||||||
|
obj._MFDDevice.current_page.controller.zoomOut();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var updateTimer = func() {
|
||||||
|
obj._eisDriver.update();
|
||||||
|
obj._eis.update();
|
||||||
|
settimer(updateTimer, 0.1);
|
||||||
|
};
|
||||||
|
|
||||||
|
updateTimer();
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
|
del: func()
|
||||||
|
{
|
||||||
|
me._pageGroupController.DeRegisterWithEmesary();
|
||||||
|
}
|
||||||
|
};
|
211
Aircraft/Instruments-3d/FG1000/Nasal/NavMap/NavMap.nas
Normal file
211
Aircraft/Instruments-3d/FG1000/Nasal/NavMap/NavMap.nas
Normal file
|
@ -0,0 +1,211 @@
|
||||||
|
# Navigation Map
|
||||||
|
var NavMap =
|
||||||
|
{
|
||||||
|
new : func (myCanvas, device, svg)
|
||||||
|
{
|
||||||
|
var obj = {
|
||||||
|
_group : myCanvas.createGroup("NavigationMapLayer"),
|
||||||
|
parents : [ NavMap, device.addPage("NavigationMap", "NavigationMapGroup") ]
|
||||||
|
};
|
||||||
|
|
||||||
|
obj.Styles = fg1000.NavMapStyles.new();
|
||||||
|
obj.Options = fg1000.NavMapOptions.new();
|
||||||
|
obj.MFDMap = obj._group.createChild("map");
|
||||||
|
|
||||||
|
# Need to display this underneath the softkeys, EIS, header.
|
||||||
|
obj._group.set("z-index", -10.0);
|
||||||
|
obj._group.setVisible(0);
|
||||||
|
|
||||||
|
obj.device = device;
|
||||||
|
|
||||||
|
# Initialize the controller:
|
||||||
|
var ctrl_ns = canvas.Map.Controller.get("Aircraft position");
|
||||||
|
var source = ctrl_ns.SOURCES["current-pos"];
|
||||||
|
if (source == nil) {
|
||||||
|
# TODO: amend
|
||||||
|
var source = ctrl_ns.SOURCES["current-pos"] = {
|
||||||
|
getPosition: func subvec(geo.aircraft_position().latlon(), 0, 2),
|
||||||
|
getAltitude: func getprop('/position/altitude-ft'),
|
||||||
|
getHeading: func {
|
||||||
|
if (me.aircraft_heading)
|
||||||
|
getprop('/orientation/heading-deg')
|
||||||
|
else 0
|
||||||
|
},
|
||||||
|
aircraft_heading: 1,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
setlistener("/sim/gui/dialogs/map-canvas/aircraft-heading-up", func(n) {
|
||||||
|
source.aircraft_heading = n.getBoolValue();
|
||||||
|
}, 1);
|
||||||
|
# Make it move with our aircraft:
|
||||||
|
obj.MFDMap.setController("Aircraft position", "current-pos"); # from aircraftpos.controller
|
||||||
|
|
||||||
|
# Center the map's origin, modified to take into account the surround.
|
||||||
|
obj.MFDMap.setTranslation(
|
||||||
|
fg1000.MFD.MAP_CENTER.X,
|
||||||
|
fg1000.MFD.MAP_CENTER.Y
|
||||||
|
);
|
||||||
|
|
||||||
|
var r = func(name,vis=1,zindex=nil) return caller(0)[0];
|
||||||
|
# TODO: we'll need some z-indexing here, right now it's just random
|
||||||
|
foreach(var type; [r('GRID'),r('TFC',0),r('APT'),r('DME'),r('VOR'),r('NDB'),r('FIX',0),r('RTE'),r('WPT'),r('FLT'),r('WXR',0),r('APS')] ) {
|
||||||
|
obj.MFDMap.addLayer(factory: canvas.SymbolLayer, type_arg: type.name,
|
||||||
|
visible: type.vis, priority: 4,
|
||||||
|
style: obj.Styles.getStyle(type.name),
|
||||||
|
options: obj.Options.getOption(type.name) );
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach(var type; [ r('STAMEN_terrain'),r('STAMEN'), r('OpenAIP') ]) {
|
||||||
|
obj.MFDMap.addLayer(factory: canvas.OverlayLayer, type_arg: type.name,
|
||||||
|
visible: 0, priority: 1,
|
||||||
|
style: obj.Styles.getStyle(type.name),
|
||||||
|
options: obj.Options.getOption(type.name) );
|
||||||
|
}
|
||||||
|
|
||||||
|
obj.controller = fg1000.NavMapController.new(obj, svg, "RangeDisplay", 8);
|
||||||
|
|
||||||
|
var topMenu = func(device, pg, menuitem) {
|
||||||
|
pg.clearMenu();
|
||||||
|
resetMenuColors(device);
|
||||||
|
pg.addMenuItem(0, "ENGINE", pg, engineMenu);
|
||||||
|
pg.addMenuItem(2, "MAP", pg, mapMenu);
|
||||||
|
pg.addMenuItem(8, "DCLTR", pg, func(dev, pg, mi) { obj.controller.incrDCLTR(dev, mi); } );
|
||||||
|
#pg.addMenuItem(9, "SHW CHRT", pg); # Optional
|
||||||
|
#pg.addMenuItem(10, "CHKLIST", pg); # Optional
|
||||||
|
device.updateMenus();
|
||||||
|
};
|
||||||
|
|
||||||
|
var engineMenu = func(device, pg, menuitem) {
|
||||||
|
pg.clearMenu();
|
||||||
|
resetMenuColors(device);
|
||||||
|
pg.addMenuItem(0, "ENGINE", pg, engineMenu);
|
||||||
|
pg.addMenuItem(1, "LEAN", pg, leanMenu);
|
||||||
|
pg.addMenuItem(2, "SYSTEM", pg, systemMenu);
|
||||||
|
pg.addMenuItem(8, "BACK", pg, topMenu);
|
||||||
|
device.updateMenus();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
# Display map toggle softkeys which change color depending
|
||||||
|
# on whether a particular layer is enabled or not.
|
||||||
|
var display_toggle = func(device, svg, mi, layer) {
|
||||||
|
var bg_name = sprintf("SoftKey%d-bg",mi.menu_id);
|
||||||
|
if (obj.controller.isEnabled(layer)) {
|
||||||
|
device.svg.getElementById(bg_name).setColorFill(0.5,0.5,0.5);
|
||||||
|
svg.setColor(0.0,0.0,0.0);
|
||||||
|
} else {
|
||||||
|
device.svg.getElementById(bg_name).setColorFill(0.0,0.0,0.0);
|
||||||
|
svg.setColor(1.0,1.0,1.0);
|
||||||
|
}
|
||||||
|
svg.setText(mi.title);
|
||||||
|
svg.setVisible(1); # display function
|
||||||
|
};
|
||||||
|
|
||||||
|
# Function to undo any colors set by display_toggle when loading a new menu
|
||||||
|
var resetMenuColors = func(device) {
|
||||||
|
for(var i = 0; i < 12; i +=1) {
|
||||||
|
var name = sprintf("SoftKey%d",i);
|
||||||
|
device.svg.getElementById(name ~ "-bg").setColorFill(0.0,0.0,0.0);
|
||||||
|
device.svg.getElementById(name).setColor(1.0,1.0,1.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var mapMenu = func(device, pg, menuitem) {
|
||||||
|
pg.clearMenu();
|
||||||
|
resetMenuColors(device);
|
||||||
|
pg.addMenuItem(0, "TRAFFIC", pg,
|
||||||
|
func(dev, pg, mi) { obj.controller.toggleLayer("TFC"); device.updateMenus(); }, # callback
|
||||||
|
func(svg, mi) { display_toggle(device, svg, mi, "TFC"); }
|
||||||
|
);
|
||||||
|
|
||||||
|
pg.addMenuItem(1, "PROFILE", pg);
|
||||||
|
pg.addMenuItem(2, "TOPO", pg,
|
||||||
|
func(dev, pg, mi) { obj.controller.toggleLayer("STAMEN"); device.updateMenus(); }, # callback
|
||||||
|
func(svg, mi) { display_toggle(device, svg, mi, "STAMEN"); }
|
||||||
|
);
|
||||||
|
|
||||||
|
pg.addMenuItem(3, "TERRAIN", pg,
|
||||||
|
func(dev, pg, mi) { obj.controller.toggleLayer("STAMEN_terrain"); device.updateMenus(); }, # callback
|
||||||
|
func(svg, mi) { display_toggle(device, svg, mi, "STAMEN_terrain"); }
|
||||||
|
);
|
||||||
|
|
||||||
|
pg.addMenuItem(4, "AIRWAYS", pg, func(dev, pg, mi) { obj.controller.incrAIRWAYS(dev, mi); } );
|
||||||
|
#pg.addMenuItem(5, "STRMSCP", pg); Optional
|
||||||
|
#pg.addMenuItem(6, "PRECIP", pg); Optional, or NEXRAD
|
||||||
|
#pg.addMenuItem(7, "XM LTNG", pg); Optional, or DL LTNG
|
||||||
|
#pg.addMenuItem(8, "METAR", pg);
|
||||||
|
#pg.addMenuItem(9, "LEGEND", pg); Optional - only available with NEXRAD/XM LTNG/METAR/PROFILE selected
|
||||||
|
pg.addMenuItem(10, "BACK", pg, topMenu); # Or should this just be the next button?
|
||||||
|
device.updateMenus();
|
||||||
|
};
|
||||||
|
|
||||||
|
var leanMenu = func(device, pg, menuitem) {
|
||||||
|
pg.clearMenu();
|
||||||
|
resetMenuColors(device);
|
||||||
|
pg.addMenuItem(0, "ENGINE", pg, engineMenu);
|
||||||
|
pg.addMenuItem(1, "LEAN", pg, leanMenu);
|
||||||
|
pg.addMenuItem(2, "SYSTEM", pg, systemMenu);
|
||||||
|
pg.addMenuItem(3, "CYL SELECT", pg);
|
||||||
|
pg.addMenuItem(4, "ASSIST", pg);
|
||||||
|
pg.addMenuItem(9, "BACK", pg, engineMenu);
|
||||||
|
device.updateMenus();
|
||||||
|
};
|
||||||
|
|
||||||
|
var systemMenu = func(device, pg, menuitem) {
|
||||||
|
pg.clearMenu();
|
||||||
|
resetMenuColors(device);
|
||||||
|
pg.addMenuItem(0, "ENGINE", pg, engineMenu);
|
||||||
|
pg.addMenuItem(1, "LEAN", pg, leanMenu);
|
||||||
|
pg.addMenuItem(2, "SYSTEM", pg, systemMenu);
|
||||||
|
pg.addMenuItem(3, "RST FUEL", pg);
|
||||||
|
pg.addMenuItem(4, "GAL REM", pg, galRemMenu);
|
||||||
|
pg.addMenuItem(5, "BACK", pg, engineMenu);
|
||||||
|
device.updateMenus();
|
||||||
|
};
|
||||||
|
|
||||||
|
var galRemMenu = func(device, pg, menuitem) {
|
||||||
|
pg.clearMenu();
|
||||||
|
resetMenuColors(device);
|
||||||
|
pg.addMenuItem(0, "ENGINE", pg, engineMenu);
|
||||||
|
pg.addMenuItem(1, "LEAN", pg, leanMenu);
|
||||||
|
pg.addMenuItem(2, "SYSTEM", pg, systemMenu);
|
||||||
|
pg.addMenuItem(3, "-10 GAL", pg);
|
||||||
|
pg.addMenuItem(4, "-1 GAL", pg);
|
||||||
|
pg.addMenuItem(5, "+1 GAL", pg);
|
||||||
|
pg.addMenuItem(6, "+10 GAL", pg);
|
||||||
|
pg.addMenuItem(7, "44 GAL", pg);
|
||||||
|
pg.addMenuItem(8, "BACK", pg, engineMenu);
|
||||||
|
device.updateMenus();
|
||||||
|
};
|
||||||
|
|
||||||
|
topMenu(device, obj, nil);
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
|
toggleLayerVisible : func(name) {
|
||||||
|
(var l = me.MFDMap.getLayer(name)).setVisible(l.getVisible());
|
||||||
|
},
|
||||||
|
setLayerVisible : func(name,n=1) {
|
||||||
|
me.MFDMap.getLayer(name).setVisible(n);
|
||||||
|
},
|
||||||
|
setRange : func(range) {
|
||||||
|
me.MFDMap.setRange(range);
|
||||||
|
},
|
||||||
|
setScreenRange : func(range) {
|
||||||
|
me.MFDMap.setScreenRange(range);
|
||||||
|
},
|
||||||
|
offdisplay : func() {
|
||||||
|
me._group.setVisible(0);
|
||||||
|
|
||||||
|
# Reset the menu colours. Shouldn't have to do this here, but
|
||||||
|
# there's not currently an obvious other location to do so.
|
||||||
|
for(var i = 0; i < 12; i +=1) {
|
||||||
|
var name = sprintf("SoftKey%d",i);
|
||||||
|
me.device.svg.getElementById(name ~ "-bg").setColorFill(0.0,0.0,0.0);
|
||||||
|
me.device.svg.getElementById(name).setColor(1.0,1.0,1.0);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
ondisplay : func() {
|
||||||
|
me._group.setVisible(1);
|
||||||
|
},
|
||||||
|
};
|
152
Aircraft/Instruments-3d/FG1000/Nasal/NavMap/NavMapController.nas
Normal file
152
Aircraft/Instruments-3d/FG1000/Nasal/NavMap/NavMapController.nas
Normal file
|
@ -0,0 +1,152 @@
|
||||||
|
# Navigation Map Controller
|
||||||
|
var NavMapController =
|
||||||
|
{
|
||||||
|
# Vertical ranges, and labels.
|
||||||
|
# 28 ranges from 500ft to 2000nm, measuring the vertical map distance.
|
||||||
|
# Vertical size of the map (once the nav box and softkey area is removed) is 689px.
|
||||||
|
# 2000nm = 12,152,000ft.
|
||||||
|
RANGES : [{range: 500/6076.12, label: "500ft"},
|
||||||
|
{range: 750/6076.12, label: "750ft"},
|
||||||
|
{range: 1000/6076.12, label: "1000ft"},
|
||||||
|
{range: 1500/6076.12, label: "1500ft"},
|
||||||
|
{range: 2000/6076.12, label: "2000ft"},
|
||||||
|
{range: 0.5, label: "0.5nm"},
|
||||||
|
{range: 0.75, label: "0.75nm"},
|
||||||
|
{range: 1, label: "1nm"},
|
||||||
|
{range: 2, label: "2nm"},
|
||||||
|
{range: 3, label: "3nm"},
|
||||||
|
{range: 4, label: "4nm"},
|
||||||
|
{range: 6, label: "6nm"},
|
||||||
|
{range: 8, label: "8nm"},
|
||||||
|
{range: 10, label: "10nm"},
|
||||||
|
{range: 12, label: "12nm"},
|
||||||
|
{range: 15, label: "15nm"},
|
||||||
|
{range: 20, label: "20nm"},
|
||||||
|
{range: 25, label: "25nm"},
|
||||||
|
{range: 30, label: "30nm"},
|
||||||
|
{range: 40, label: "40nm"},
|
||||||
|
{range: 50, label: "50nm"},
|
||||||
|
{range: 75, label: "75nm"},
|
||||||
|
{range: 100, label: "100nm"},
|
||||||
|
{range: 200, label: "200nm"},
|
||||||
|
{range: 500, label: "500nm"},
|
||||||
|
{range: 1000, label: "1000nm"},
|
||||||
|
{range: 1500, label: "1500nm"},
|
||||||
|
{range: 2000, label: "2000nm"}, ],
|
||||||
|
|
||||||
|
# Layer display configuration:
|
||||||
|
# enabled - whether this layer has been enabled by the user
|
||||||
|
# declutter - the maximum declutter level (0-3) that this layer is visible in
|
||||||
|
# range - the maximum range this layer is visible (configured by user)
|
||||||
|
# max_range - the maximum range value that a user can configure for this layer.
|
||||||
|
LAYER_RANGES : {
|
||||||
|
GRID : { enabled: 0, declutter: 1, range: 20, max_range: 2000 },
|
||||||
|
DME : { enabled: 1, declutter: 1, range: 150, max_range: 300 },
|
||||||
|
VOR : { enabled: 1, declutter: 1, range: 150, max_range: 300 },
|
||||||
|
NDB : { enabled: 1, declutter: 1, range: 15, max_range: 30 },
|
||||||
|
FIX : { enabled: 1, declutter: 1, range: 15, max_range: 30 },
|
||||||
|
RTE : { enabled: 1, declutter: 3, range: 2000, max_range: 2000 },
|
||||||
|
WPT : { enabled: 1, declutter: 3, range: 2000, max_range: 2000 },
|
||||||
|
|
||||||
|
APS : { enabled: 1, declutter: 3, range: 2000, max_range: 2000 },
|
||||||
|
FLT : { enabled: 1, declutter: 3, range: 2000, max_range: 2000 },
|
||||||
|
|
||||||
|
WXR : { enabled: 1, declutter: 2, range: 2000, max_range: 2000 },
|
||||||
|
|
||||||
|
APT : { enabled: 1, declutter: 2, range: 150, max_range: 300 },
|
||||||
|
|
||||||
|
TFC : { enabled: 0, declutter: 3, range: 150, max_range: 2000},
|
||||||
|
|
||||||
|
OpenAIP : { enabled: 1, declutter: 1, range: 150, max_range: 300 },
|
||||||
|
STAMEN : { enabled: 1, declutter: 3, range: 500, max_range: 2000 },
|
||||||
|
STAMEN_terrain : { enabled: 1, declutter: 3, range: 500, max_range: 2000 },
|
||||||
|
},
|
||||||
|
|
||||||
|
# TODO: Add STAMEN topo layer, which is visible on all levels as opposed to
|
||||||
|
# roads, railways, boundaries, cities which are only visible on declutter 0.
|
||||||
|
|
||||||
|
# Declutter levels.
|
||||||
|
DCLTR : [ "DCLTR", "DCLTR-1", "DCLTR-2", "DCLTR-3"],
|
||||||
|
|
||||||
|
# Airways levels.
|
||||||
|
AIRWAYS : [ "AIRWAYS", "AIRWY ON", "AIRWY LO", "AIRWY HI"],
|
||||||
|
|
||||||
|
new : func (navmap, svg, zoom_label, current_zoom)
|
||||||
|
{
|
||||||
|
var obj = { parents : [ NavMapController ] };
|
||||||
|
obj.current_zoom = current_zoom;
|
||||||
|
obj.declutter = 0;
|
||||||
|
obj.airways = 0;
|
||||||
|
obj.navmap = navmap;
|
||||||
|
obj.navmap.setScreenRange(689/2.0);
|
||||||
|
obj.label = svg.getElementById(zoom_label);
|
||||||
|
obj.setZoom(obj.current_zoom);
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
|
zoomIn : func() {
|
||||||
|
me.setZoom(me.current_zoom -1);
|
||||||
|
},
|
||||||
|
zoomOut : func() {
|
||||||
|
me.setZoom(me.current_zoom +1);
|
||||||
|
},
|
||||||
|
zoom : func(val)
|
||||||
|
{
|
||||||
|
var incr_or_decr = (val > 0) ? 1 : -1;
|
||||||
|
me.setZoom(me.current_zoom + incr_or_decr);
|
||||||
|
},
|
||||||
|
setZoom : func(zoom) {
|
||||||
|
if ((zoom < 0) or (zoom > (size(me.RANGES) - 1))) return;
|
||||||
|
me.current_zoom = zoom;
|
||||||
|
# Ranges above represent vertical ranges, but the display is a rectangle, so
|
||||||
|
# we need to use the diagonal range of the 1024 x 689, which is 617px.
|
||||||
|
# 617px is 1.8 x 689/2, so we need to increase the range values by x1.8
|
||||||
|
me.navmap.setRange(me.RANGES[zoom].range);
|
||||||
|
me.label.setText(me.RANGES[zoom].label);
|
||||||
|
me.updateVisibility();
|
||||||
|
},
|
||||||
|
updateVisibility : func() {
|
||||||
|
# Determine which layers should be visible.
|
||||||
|
foreach (var layer_name; keys(me.LAYER_RANGES)) {
|
||||||
|
var layer = me.LAYER_RANGES[layer_name];
|
||||||
|
if (layer.enabled and
|
||||||
|
(me.RANGES[me.current_zoom].range <= layer.range) and
|
||||||
|
(me.declutter <= layer.declutter) )
|
||||||
|
{
|
||||||
|
me.navmap.MFDMap.getLayer(layer_name).setVisible(1);
|
||||||
|
} else {
|
||||||
|
me.navmap.MFDMap.getLayer(layer_name).setVisible(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
configureLayer : func(layer, enabled, range) {
|
||||||
|
me.LAYER_RANGES[layer].enabled = enabled;
|
||||||
|
me.LAYER_RANGES[layer].range = math.min(range, me.LAYER_RANGES[layer].max_range);
|
||||||
|
},
|
||||||
|
isEnabled : func(layer) {
|
||||||
|
return me.LAYER_RANGES[layer].enabled;
|
||||||
|
},
|
||||||
|
toggleLayer : func(layer) {
|
||||||
|
me.LAYER_RANGES[layer].enabled = ! me.LAYER_RANGES[layer].enabled;
|
||||||
|
me.updateVisibility();
|
||||||
|
},
|
||||||
|
|
||||||
|
# Increment through the de-clutter levels, which impact what layers are
|
||||||
|
# displayed. We also need to update the declutter menu item.
|
||||||
|
incrDCLTR : func(device, menuItem) {
|
||||||
|
me.declutter = math.mod(me.declutter +1, 4);
|
||||||
|
menuItem.title = me.DCLTR[me.declutter];
|
||||||
|
device.updateMenus();
|
||||||
|
me.updateVisibility();
|
||||||
|
},
|
||||||
|
|
||||||
|
# Increment through the AIRWAYS levels. At present this doesn't do anything
|
||||||
|
# except change the label. It should enable/disable different airways
|
||||||
|
# information.
|
||||||
|
incrAIRWAYS : func(device, menuItem) {
|
||||||
|
me.airways = math.mod(me.airways +1, 4);
|
||||||
|
menuItem.title = me.AIRWAYS[me.airways];
|
||||||
|
device.updateMenus();
|
||||||
|
me.updateVisibility();
|
||||||
|
},
|
||||||
|
|
||||||
|
};
|
|
@ -0,0 +1,28 @@
|
||||||
|
# Navigation Map Options
|
||||||
|
var NavMapOptions =
|
||||||
|
{
|
||||||
|
new : func() {
|
||||||
|
var obj = { parents : [NavMapOptions] };
|
||||||
|
obj.Options= {};
|
||||||
|
obj.loadOptions();
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
|
|
||||||
|
getOption : func(type) {
|
||||||
|
return me.Options[type];
|
||||||
|
},
|
||||||
|
|
||||||
|
setOption : func(type, name, value) {
|
||||||
|
me.Options[type][name] = value;
|
||||||
|
},
|
||||||
|
|
||||||
|
loadOptions : func() {
|
||||||
|
me.clearOptions();
|
||||||
|
me.Options.APS = {};
|
||||||
|
},
|
||||||
|
|
||||||
|
clearOptions : func() {
|
||||||
|
me.Options = {};
|
||||||
|
},
|
||||||
|
|
||||||
|
};
|
66
Aircraft/Instruments-3d/FG1000/Nasal/NavMap/NavMapStyles.nas
Normal file
66
Aircraft/Instruments-3d/FG1000/Nasal/NavMap/NavMapStyles.nas
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
# Navigation Map Styles
|
||||||
|
var NavMapStyles =
|
||||||
|
{
|
||||||
|
new : func() {
|
||||||
|
var obj = { parents : [ NavMapStyles ]};
|
||||||
|
obj.Styles = {};
|
||||||
|
obj.loadStyles();
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
|
|
||||||
|
getStyle : func(type) {
|
||||||
|
return me.Styles[type];
|
||||||
|
},
|
||||||
|
|
||||||
|
setStyle : func(type, name, value) {
|
||||||
|
me.Styles[type][name] = value;
|
||||||
|
},
|
||||||
|
|
||||||
|
loadStyles : func() {
|
||||||
|
me. clearStyles();
|
||||||
|
me.Styles.DME = {};
|
||||||
|
me.Styles.DME.debug = 1; # HACK for benchmarking/debugging purposes
|
||||||
|
me.Styles.DME.animation_test = 0; # for prototyping animated symbols
|
||||||
|
|
||||||
|
me.Styles.DME.scale_factor = 0.4; # 40% (applied to whole group)
|
||||||
|
me.Styles.DME.line_width = 3.0;
|
||||||
|
me.Styles.DME.color_tuned = [0,1,0]; #rgb
|
||||||
|
me.Styles.DME.color_default = [1,1,0]; #rgb
|
||||||
|
|
||||||
|
me.Styles.APT = {};
|
||||||
|
me.Styles.APT.scale_factor = 0.4; # 40% (applied to whole group)
|
||||||
|
me.Styles.APT.line_width = 3.0;
|
||||||
|
me.Styles.APT.color_default = [0,0.6,0.85]; #rgb
|
||||||
|
me.Styles.APT.label_font_color = me.Styles.APT.color_default;
|
||||||
|
me.Styles.APT.label_font_size=28;
|
||||||
|
|
||||||
|
me.Styles.TFC = {};
|
||||||
|
me.Styles.TFC.scale_factor = 0.4; # 40% (applied to whole group)
|
||||||
|
|
||||||
|
me.Styles.WPT = {};
|
||||||
|
me.Styles.WPT.scale_factor = 0.5; # 50% (applied to whole group)
|
||||||
|
|
||||||
|
me.Styles.RTE = {};
|
||||||
|
me.Styles.RTE.line_width = 2;
|
||||||
|
|
||||||
|
me.Styles.FLT = {};
|
||||||
|
me.Styles.FLT.line_width = 3;
|
||||||
|
|
||||||
|
me.Styles.FIX = {};
|
||||||
|
me.Styles.FIX.color = [1,0,0];
|
||||||
|
me.Styles.FIX.scale_factor = 0.4; # 40%
|
||||||
|
|
||||||
|
me.Styles.VOR = {};
|
||||||
|
me.Styles.VOR.range_line_width = 2;
|
||||||
|
me.Styles.VOR.radial_line_width = 1;
|
||||||
|
me.Styles.VOR.scale_factor = 0.6; # 60%
|
||||||
|
|
||||||
|
me.Styles.APS = {};
|
||||||
|
me.Styles.APS.scale_factor = 0.25;
|
||||||
|
},
|
||||||
|
|
||||||
|
clearStyles : func() {
|
||||||
|
me.Styles = {};
|
||||||
|
},
|
||||||
|
|
||||||
|
};
|
195
Aircraft/Instruments-3d/FG1000/Nasal/PageGroupController.nas
Normal file
195
Aircraft/Instruments-3d/FG1000/Nasal/PageGroupController.nas
Normal file
|
@ -0,0 +1,195 @@
|
||||||
|
# Controller for the PageGroup navigation, displayed in the bottom right of the
|
||||||
|
# FMS, and controlled by the FMS knob
|
||||||
|
|
||||||
|
# Set of pages, references by SVG ID
|
||||||
|
var PAGE_GROUPS = [
|
||||||
|
|
||||||
|
{ label: "MapPageGroupLabel",
|
||||||
|
group: "MapPageGroup",
|
||||||
|
pages: [ "NavigationMap", "TrafficMap", "Stormscope", "WeatherDataLink", "TAWSB"],
|
||||||
|
},
|
||||||
|
{ label: "WPTGroupLabel",
|
||||||
|
group: "WPTPageGroup",
|
||||||
|
pages: [ "AirportInformation", "IntersectionInformation", "NDBInformation", "VORInformation", "UserWPTInformation"],
|
||||||
|
},
|
||||||
|
|
||||||
|
{ label: "AuxGroupLabel",
|
||||||
|
group: "AuxPageGroup",
|
||||||
|
pages: [ "TripPlanning", "Utility", "GPSStatus", "XMRadio", "SystemStatus"],
|
||||||
|
},
|
||||||
|
|
||||||
|
{ label: "FPLGroupLabel",
|
||||||
|
group: "FPLPageGroup",
|
||||||
|
pages: [ "ActiveFlightPlan", "FlightPlanCatalog", "StoredFlightPlan"],
|
||||||
|
},
|
||||||
|
|
||||||
|
{ label: "LstGroupLabel",
|
||||||
|
group: "LstPageGroup",
|
||||||
|
pages: [ "Checklist1", "Checklist2", "Checklist3", "Checklist4", "Checklist5"],
|
||||||
|
},
|
||||||
|
|
||||||
|
{ label: "NrstGroupLabel",
|
||||||
|
group: "NrstPageGroup",
|
||||||
|
pages: [ "NearestAirports", "NearestIntersections", "NearestNDB", "NearestVOR", "NearestUserWaypoints", "NearestFrequencies", "NearestAirspaces"],
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
var PageGroupController =
|
||||||
|
{
|
||||||
|
new : func (myCanvas, svg, device)
|
||||||
|
{
|
||||||
|
var obj = { parents : [ PageGroupController ] };
|
||||||
|
obj._canvas = myCanvas;
|
||||||
|
obj._svg = svg;
|
||||||
|
obj._device = device;
|
||||||
|
obj._menuVisible = 0;
|
||||||
|
obj._selectedPageGroup = 0;
|
||||||
|
obj._selectedPage = 0;
|
||||||
|
|
||||||
|
# List of pages to be controllers. Keys are the pages in PAGE_GROUPS;
|
||||||
|
obj._pageList = {};
|
||||||
|
|
||||||
|
# Timers to controll when to hide the menu after inactivity, and when to load
|
||||||
|
# a new page.
|
||||||
|
obj._hideMenuTimer = maketimer(5, obj, obj.hideMenu);
|
||||||
|
obj._hideMenuTimer.singleShot = 1;
|
||||||
|
|
||||||
|
obj._loadPageTimer = maketimer(0.5, obj, obj.loadPage);
|
||||||
|
obj._loadPageTimer.singleShot = 1;
|
||||||
|
|
||||||
|
# Emesary
|
||||||
|
obj._recipient = nil;
|
||||||
|
|
||||||
|
obj.hideMenu();
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
|
|
||||||
|
addPage : func(name, page)
|
||||||
|
{
|
||||||
|
me._pageList[name] = page;
|
||||||
|
},
|
||||||
|
|
||||||
|
getPage : func(name)
|
||||||
|
{
|
||||||
|
return me._pageList[name];
|
||||||
|
},
|
||||||
|
|
||||||
|
hideMenu : func()
|
||||||
|
{
|
||||||
|
foreach(var pageGroup; PAGE_GROUPS)
|
||||||
|
{
|
||||||
|
me._svg.getElementById(pageGroup.group).setVisible(0);
|
||||||
|
me._svg.getElementById(pageGroup.label).setVisible(0);
|
||||||
|
}
|
||||||
|
me._menuVisible = 0;
|
||||||
|
},
|
||||||
|
|
||||||
|
# Function to change a page based on the selection
|
||||||
|
loadPage : func()
|
||||||
|
{
|
||||||
|
var pageToLoad = PAGE_GROUPS[me._selectedPageGroup].pages[me._selectedPage];
|
||||||
|
var page = me._pageList[pageToLoad];
|
||||||
|
|
||||||
|
if (page != nil) {
|
||||||
|
me._device.selectPage(page);
|
||||||
|
} else {
|
||||||
|
printf("Unable to find page " ~ pageToLoad);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
showMenu : func()
|
||||||
|
{
|
||||||
|
foreach(var pageGroup; PAGE_GROUPS)
|
||||||
|
{
|
||||||
|
if (PAGE_GROUPS[me._selectedPageGroup].label == pageGroup.label)
|
||||||
|
{
|
||||||
|
# Display the page group and highlight the label
|
||||||
|
me._svg.getElementById(pageGroup.group).setVisible(1);
|
||||||
|
me._svg.getElementById(pageGroup.label).setVisible(1);
|
||||||
|
me._svg.getElementById(pageGroup.label).setColor(0.7,0.7,1.0);
|
||||||
|
|
||||||
|
foreach (var page; pageGroup.pages)
|
||||||
|
{
|
||||||
|
# Highlight the current page.
|
||||||
|
if (pageGroup.pages[me._selectedPage] == page) {
|
||||||
|
me._svg.getElementById(page).setColor(0.7,0.7,1.0);
|
||||||
|
} else {
|
||||||
|
me._svg.getElementById(page).setColor(0.7,0.7,0.7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
# Hide the pagegroup and unhighlight the label on the bottom
|
||||||
|
me._svg.getElementById(pageGroup.group).setVisible(0);
|
||||||
|
me._svg.getElementById(pageGroup.label).setVisible(1);
|
||||||
|
me._svg.getElementById(pageGroup.label).setColor(0.7,0.7,0.7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
me._menuVisible = 1;
|
||||||
|
me._hideMenuTimer.stop();
|
||||||
|
me._hideMenuTimer.restart(5);
|
||||||
|
me._loadPageTimer.stop();
|
||||||
|
me._loadPageTimer.restart(0.5);
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
FMSOuter : func(val)
|
||||||
|
{
|
||||||
|
if (me._menuVisible == 1) {
|
||||||
|
# Change page group
|
||||||
|
var incr_or_decr = (val > 0) ? 1 : -1;
|
||||||
|
me._selectedPageGroup = math.mod(me._selectedPageGroup + incr_or_decr, size(PAGE_GROUPS));
|
||||||
|
me._selectedPage = 0;
|
||||||
|
}
|
||||||
|
me.showMenu();
|
||||||
|
},
|
||||||
|
|
||||||
|
FMSInner : func(val)
|
||||||
|
{
|
||||||
|
if (me._menuVisible == 1) {
|
||||||
|
# Change page group
|
||||||
|
var incr_or_decr = (val > 0) ? 1 : -1;
|
||||||
|
me._selectedPage = math.mod(me._selectedPage + incr_or_decr, size(PAGE_GROUPS[me._selectedPageGroup].pages));
|
||||||
|
}
|
||||||
|
me.showMenu();
|
||||||
|
},
|
||||||
|
RegisterWithEmesary : func(transmitter = nil){
|
||||||
|
if (transmitter == nil)
|
||||||
|
transmitter = emesary.GlobalTransmitter;
|
||||||
|
|
||||||
|
if (me._recipient == nil){
|
||||||
|
me._recipient = emesary.Recipient.new("PageController_" ~ me._device.designation);
|
||||||
|
var pfd_obj = me._device;
|
||||||
|
var controller = me;
|
||||||
|
me._recipient.Receive = func(notification)
|
||||||
|
{
|
||||||
|
if (notification.Device_Id == pfd_obj.device_id
|
||||||
|
and notification.NotificationType == notifications.PFDEventNotification.DefaultType) {
|
||||||
|
if (notification.Event_Id == notifications.PFDEventNotification.HardKeyPushed
|
||||||
|
and notification.EventParameter != nil)
|
||||||
|
{
|
||||||
|
var id = notification.EventParameter.Id;
|
||||||
|
var value = notification.EventParameter.Value;
|
||||||
|
#printf("Button pressed " ~ id ~ " " ~ value);
|
||||||
|
if (id == fg1000.MFD.FASCIA.FMS_OUTER) controller.FMSOuter(value);
|
||||||
|
if (id == fg1000.MFD.FASCIA.FMS_INNER) controller.FMSInner(value);
|
||||||
|
if (id == fg1000.MFD.FASCIA.RANGE) { if (pfd_obj.current_page.controller.zoom != nil) pfd_obj.current_page.controller.zoom(value); }
|
||||||
|
}
|
||||||
|
|
||||||
|
return emesary.Transmitter.ReceiptStatus_OK;
|
||||||
|
}
|
||||||
|
return emesary.Transmitter.ReceiptStatus_NotProcessed;
|
||||||
|
};
|
||||||
|
transmitter.Register(me._recipient);
|
||||||
|
me.transmitter = transmitter;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
DeRegisterWithEmesary : func(transmitter = nil){
|
||||||
|
# remove registration from transmitter; but keep the recipient once it is created.
|
||||||
|
if (me.transmitter != nil)
|
||||||
|
me.transmitter.DeRegister(me._recipient);
|
||||||
|
me.transmitter = nil;
|
||||||
|
},
|
||||||
|
|
||||||
|
};
|
172
Aircraft/Instruments-3d/FG1000/Nasal/TrafficMap/TrafficMap.nas
Normal file
172
Aircraft/Instruments-3d/FG1000/Nasal/TrafficMap/TrafficMap.nas
Normal file
|
@ -0,0 +1,172 @@
|
||||||
|
# Traffic Map
|
||||||
|
#
|
||||||
|
# Functionally similar to the Garmin GTS 800 Unit
|
||||||
|
#
|
||||||
|
var TrafficMap =
|
||||||
|
{
|
||||||
|
new : func (myCanvas, device, svg)
|
||||||
|
{
|
||||||
|
var obj = {
|
||||||
|
_group : myCanvas.createGroup("TrafficMapLayer"),
|
||||||
|
parents : [ TrafficMap, device.addPage("TrafficMap", "TrafficMapGroup") ]
|
||||||
|
};
|
||||||
|
|
||||||
|
obj.Styles = fg1000.TrafficMapStyles.new();
|
||||||
|
obj.Options = fg1000.TrafficMapOptions.new();
|
||||||
|
obj.mapgroup = obj._group.createChild("map");
|
||||||
|
obj.device = device;
|
||||||
|
|
||||||
|
# Dynamic text elements
|
||||||
|
obj.op_label = svg.getElementById("TrafficMapOpMode");
|
||||||
|
obj.alt_label = svg.getElementById("TrafficMapAltMode");
|
||||||
|
obj.outer_label = svg.getElementById("TrafficMapOuterRange");
|
||||||
|
obj.inner_label = svg.getElementById("TrafficMapInnerRange");
|
||||||
|
|
||||||
|
# Need to display this underneath the softkeys, EIS, header.
|
||||||
|
obj._group.set("z-index", -10.0);
|
||||||
|
obj._group.setVisible(0);
|
||||||
|
|
||||||
|
# Initialize the controller:
|
||||||
|
var ctrl_ns = canvas.Map.Controller.get("Aircraft position");
|
||||||
|
var source = ctrl_ns.SOURCES["current-pos"];
|
||||||
|
if (source == nil) {
|
||||||
|
# TODO: amend
|
||||||
|
var source = ctrl_ns.SOURCES["current-pos"] = {
|
||||||
|
getPosition: func subvec(geo.aircraft_position().latlon(), 0, 2),
|
||||||
|
getAltitude: func getprop('/position/altitude-ft'),
|
||||||
|
getHeading: func {
|
||||||
|
if (me.aircraft_heading)
|
||||||
|
getprop('/orientation/heading-deg')
|
||||||
|
else 0
|
||||||
|
},
|
||||||
|
aircraft_heading: 1,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
setlistener("/sim/gui/dialogs/map-canvas/aircraft-heading-up", func(n) {
|
||||||
|
source.aircraft_heading = n.getBoolValue();
|
||||||
|
}, 1);
|
||||||
|
# Make it move with our aircraft:
|
||||||
|
obj.mapgroup.setController("Aircraft position", "current-pos"); # from aircraftpos.controller
|
||||||
|
|
||||||
|
# Center the map's origin, modified to take into account the surround.
|
||||||
|
obj.mapgroup.setTranslation(
|
||||||
|
fg1000.MFD.MAP_CENTER.X,
|
||||||
|
fg1000.MFD.MAP_CENTER.Y
|
||||||
|
);
|
||||||
|
|
||||||
|
var r = func(name,vis=1,zindex=nil) return caller(0)[0];
|
||||||
|
foreach(var type; [r('TFC',0),r('APS')] ) {
|
||||||
|
obj.mapgroup.addLayer(canvas.SymbolLayer,
|
||||||
|
type.name,
|
||||||
|
4,
|
||||||
|
obj.Styles.getStyle(type.name),
|
||||||
|
obj.Options.getOption(type.name),
|
||||||
|
type.vis );
|
||||||
|
}
|
||||||
|
|
||||||
|
obj.controller = fg1000.TrafficMapController.new(obj, svg);
|
||||||
|
|
||||||
|
var topMenu = func(device, pg, menuitem) {
|
||||||
|
pg.clearMenu();
|
||||||
|
resetMenuColors(device);
|
||||||
|
pg.addMenuItem(4, "STANDBY", pg,
|
||||||
|
func(dev, pg, mi) { pg.controller.setOperate(0); device.updateMenus(); }, # callback
|
||||||
|
func(svg, mi) { display_toggle(device, svg, mi, "STANDBY"); }
|
||||||
|
);
|
||||||
|
|
||||||
|
pg.addMenuItem(5, "OPERATE", pg,
|
||||||
|
func(dev, pg, mi) { pg.controller.setOperate(1); device.updateMenus(); }, # callback
|
||||||
|
func(svg, mi) { display_toggle(device, svg, mi, "OPERATE"); }
|
||||||
|
);
|
||||||
|
|
||||||
|
pg.addMenuItem(6, "TEST", pg, func(dev, pg, mi) { printf("Traffic Map TEST mode not implemented yet."); }, nil);
|
||||||
|
pg.addMenuItem(7, "FLT ID", pg,
|
||||||
|
func(dev, pg, mi) { pg.controller.toggleFlightID(); device.updateMenus(); }, # callback
|
||||||
|
func(svg, mi) { display_toggle(device, svg, mi, "FLT ID"); }
|
||||||
|
);
|
||||||
|
|
||||||
|
pg.addMenuItem(8, "ALT MODE", pg, altMenu);
|
||||||
|
device.updateMenus();
|
||||||
|
};
|
||||||
|
|
||||||
|
var altMenu = func(device, pg, menuitem) {
|
||||||
|
pg.clearMenu();
|
||||||
|
resetMenuColors(device);
|
||||||
|
pg.addMenuItem(4, "ABOVE", pg,
|
||||||
|
func(dev, pg, mi) { pg.controller.setAlt("ABOVE"); device.updateMenus(); }, # callback
|
||||||
|
func(svg, mi) { display_toggle(device, svg, mi, "ABOVE"); }
|
||||||
|
);
|
||||||
|
pg.addMenuItem(5, "NORMAL", pg,
|
||||||
|
func(dev, pg, mi) { pg.controller.setAlt("NORMAL"); device.updateMenus(); }, # callback
|
||||||
|
func(svg, mi) { display_toggle(device, svg, mi, "NORMAL"); }
|
||||||
|
);
|
||||||
|
|
||||||
|
pg.addMenuItem(6, "BELOW", pg,
|
||||||
|
func(dev, pg, mi) { pg.controller.setAlt("BELOW"); device.updateMenus(); }, # callback
|
||||||
|
func(svg, mi) { display_toggle(device, svg, mi, "BELOW"); }
|
||||||
|
);
|
||||||
|
|
||||||
|
pg.addMenuItem(7, "UNREST", pg,
|
||||||
|
func(dev, pg, mi) { pg.controller.setAlt("UNREST"); device.updateMenus(); }, # callback
|
||||||
|
func(svg, mi) { display_toggle(device, svg, mi, "UNREST"); }
|
||||||
|
);
|
||||||
|
|
||||||
|
pg.addMenuItem(8, "BACK", pg, topMenu);
|
||||||
|
|
||||||
|
device.updateMenus();
|
||||||
|
};
|
||||||
|
|
||||||
|
# Display map toggle softkeys which change color depending
|
||||||
|
# on whether a particular layer is enabled or not.
|
||||||
|
var display_toggle = func(device, svg, mi, layer) {
|
||||||
|
var bg_name = sprintf("SoftKey%d-bg",mi.menu_id);
|
||||||
|
if (obj.controller.isEnabled(layer)) {
|
||||||
|
device.svg.getElementById(bg_name).setColorFill(0.5,0.5,0.5);
|
||||||
|
svg.setColor(0.0,0.0,0.0);
|
||||||
|
} else {
|
||||||
|
device.svg.getElementById(bg_name).setColorFill(0.0,0.0,0.0);
|
||||||
|
svg.setColor(1.0,1.0,1.0);
|
||||||
|
}
|
||||||
|
svg.setText(mi.title);
|
||||||
|
svg.setVisible(1); # display function
|
||||||
|
};
|
||||||
|
|
||||||
|
# Function to undo any colors set by display_toggle when loading a new menu
|
||||||
|
var resetMenuColors = func(device) {
|
||||||
|
for(var i = 0; i < 12; i +=1) {
|
||||||
|
var name = sprintf("SoftKey%d",i);
|
||||||
|
device.svg.getElementById(name ~ "-bg").setColorFill(0.0,0.0,0.0);
|
||||||
|
device.svg.getElementById(name).setColor(1.0,1.0,1.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
topMenu(device, obj, nil);
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
|
setLayerVisible : func(name,n=1) {
|
||||||
|
me.mapgroup.getLayer(name).setVisible(n);
|
||||||
|
},
|
||||||
|
setRange : func(range, inner_label, outer_label) {
|
||||||
|
me.mapgroup.setRange(range);
|
||||||
|
me.inner_label.setText(inner_label);
|
||||||
|
me.outer_label.setText(outer_label);
|
||||||
|
},
|
||||||
|
setScreenRange : func(range) {
|
||||||
|
me.mapgroup.setScreenRange(range);
|
||||||
|
},
|
||||||
|
offdisplay : func() {
|
||||||
|
me._group.setVisible(0);
|
||||||
|
|
||||||
|
# Reset the menu colours. Shouldn't have to do this here, but
|
||||||
|
# there's not currently an obvious other location to do so.
|
||||||
|
for(var i = 0; i < 12; i +=1) {
|
||||||
|
var name = sprintf("SoftKey%d",i);
|
||||||
|
me.device.svg.getElementById(name ~ "-bg").setColorFill(0.0,0.0,0.0);
|
||||||
|
me.device.svg.getElementById(name).setColor(1.0,1.0,1.0);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
ondisplay : func() {
|
||||||
|
me._group.setVisible(1);
|
||||||
|
},
|
||||||
|
};
|
|
@ -0,0 +1,91 @@
|
||||||
|
# Traffic Map Controller
|
||||||
|
var TrafficMapController =
|
||||||
|
{
|
||||||
|
# Altitude levels levels.
|
||||||
|
ALTS : { ABOVE : { label: "ABOVE", ceiling_ft: 9000, floor_ft: 2700 },
|
||||||
|
NORMAL : { label: "NORMAL", ceiling_ft: 2700, floor_ft: 2700 },
|
||||||
|
BELOW : { label: "BELOW", ceiling_ft: 2700, floor_ft: 9000 },
|
||||||
|
UNREST : { label: "UNRESTRICTED", ceiling_ft: 9000, floor_ft: 9000 }},
|
||||||
|
|
||||||
|
|
||||||
|
# Three ranges available
|
||||||
|
# 2nm
|
||||||
|
# 2nm / 6nm
|
||||||
|
# 6nm / 12nm
|
||||||
|
#
|
||||||
|
# TODO: Currently we simply use the outer range, and display the inner
|
||||||
|
# range as 1/3 of the outer. Doing this properly, we should display
|
||||||
|
# different inner rings.
|
||||||
|
RANGES : [ {range: 2, inner_label: nil, outer_label: "2nm"},
|
||||||
|
{range: 6, inner_label: "2nm", outer_label: "6nm"},
|
||||||
|
{range: 12, inner_label: "4nm", outer_label: "12nm"} ],
|
||||||
|
|
||||||
|
|
||||||
|
new : func (trafficmap, svg)
|
||||||
|
{
|
||||||
|
var obj = { parents : [ TrafficMapController ] };
|
||||||
|
obj.range = 1;
|
||||||
|
obj.alt = "NORMAL";
|
||||||
|
obj.operating = 0;
|
||||||
|
obj.flight_id = 0;
|
||||||
|
obj.trafficmap = trafficmap;
|
||||||
|
obj.trafficmap.setScreenRange(689/2.0);
|
||||||
|
|
||||||
|
obj.setZoom(obj.range);
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
|
zoomIn : func() {
|
||||||
|
me.setZoom(me.current_zoom -1);
|
||||||
|
},
|
||||||
|
zoomOut : func() {
|
||||||
|
me.setZoom(me.current_zoom +1);
|
||||||
|
},
|
||||||
|
zoom : func(val)
|
||||||
|
{
|
||||||
|
var incr_or_decr = (val > 0) ? 1 : -1;
|
||||||
|
me.setZoom(me.current_zoom + incr_or_decr);
|
||||||
|
},
|
||||||
|
setZoom : func(zoom) {
|
||||||
|
if ((zoom < 0) or (zoom > (size(me.RANGES) - 1))) return;
|
||||||
|
me.current_zoom = zoom;
|
||||||
|
me.trafficmap.setRange(
|
||||||
|
me.RANGES[zoom].range,
|
||||||
|
me.RANGES[zoom].inner_label,
|
||||||
|
me.RANGES[zoom].outer_label);
|
||||||
|
},
|
||||||
|
setAlt : func(alt) {
|
||||||
|
if (me.ALTS[alt] == nil) return;
|
||||||
|
me.trafficmap.alt_label.setText(me.ALTS[alt].label);
|
||||||
|
me.alt = alt;
|
||||||
|
# Update the TFC controller to filter out the correct targets
|
||||||
|
me.trafficmap.mapgroup.getLayer("TFC").options.ceiling_ft = me.ALTS[alt].ceiling_ft;
|
||||||
|
me.trafficmap.mapgroup.getLayer("TFC").options.floor_ft = me.ALTS[alt].floor_ft;
|
||||||
|
},
|
||||||
|
setOperate : func(enabled) {
|
||||||
|
if (enabled) {
|
||||||
|
me.trafficmap.op_label.setText("OPERATING");
|
||||||
|
me.trafficmap.setLayerVisible("TFC", 1);
|
||||||
|
me.operating = 1;
|
||||||
|
} else {
|
||||||
|
me.trafficmap.op_label.setText("STANDBY");
|
||||||
|
me.trafficmap.setLayerVisible("TFC", 0);
|
||||||
|
me.operating = 0;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setFlightID : func(enabled) {
|
||||||
|
me.flight_id = enabled;
|
||||||
|
me.trafficmap.Options.setOption("TFC", "display_id", enabled);
|
||||||
|
},
|
||||||
|
toggleFlightID : func() {
|
||||||
|
me.setFlightID(! me.flight_id);
|
||||||
|
},
|
||||||
|
isEnabled : func(label) {
|
||||||
|
# Cheeky little function that returns whether the alt or operation mode
|
||||||
|
# matches the label. Used to highlight current settings in softkeys
|
||||||
|
if (label == me.alt) return 1;
|
||||||
|
if (me.operating and label == "OPERATE") return 1;
|
||||||
|
if (me.operating == 0 and label == "STANDBY") return 1;
|
||||||
|
if (me.flight_id == 1 and label == "FLT ID") return 1;
|
||||||
|
return 0;
|
||||||
|
},
|
||||||
|
};
|
|
@ -0,0 +1,34 @@
|
||||||
|
# Traffic Map Options
|
||||||
|
var TrafficMapOptions =
|
||||||
|
{
|
||||||
|
new : func() {
|
||||||
|
var obj = { parents : [TrafficMapOptions] };
|
||||||
|
obj.Options= {};
|
||||||
|
obj.loadOptions();
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
|
|
||||||
|
getOption : func(type) {
|
||||||
|
return me.Options[type];
|
||||||
|
},
|
||||||
|
|
||||||
|
setOption : func(type, name, value) {
|
||||||
|
me.Options[type][name] = value;
|
||||||
|
},
|
||||||
|
|
||||||
|
loadOptions : func() {
|
||||||
|
me.clearOptions();
|
||||||
|
me.Options.APS = {};
|
||||||
|
|
||||||
|
me.Options.TFC = {
|
||||||
|
ceiling_ft : 2700, # Display targets up to this height above the aircraft
|
||||||
|
floor_ft : 2700, # Display target from this height below the aircraft
|
||||||
|
display_id: 0,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
clearOptions : func() {
|
||||||
|
me.Options = {};
|
||||||
|
},
|
||||||
|
|
||||||
|
};
|
|
@ -0,0 +1,33 @@
|
||||||
|
# Traffic Map Styles
|
||||||
|
var TrafficMapStyles =
|
||||||
|
{
|
||||||
|
new : func() {
|
||||||
|
var obj = { parents : [ TrafficMapStyles ]};
|
||||||
|
obj.Styles = {};
|
||||||
|
obj.loadStyles();
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
|
|
||||||
|
getStyle : func(type) {
|
||||||
|
return me.Styles[type];
|
||||||
|
},
|
||||||
|
|
||||||
|
setStyle : func(type, name, value) {
|
||||||
|
me.Styles[type][name] = value;
|
||||||
|
},
|
||||||
|
|
||||||
|
loadStyles : func() {
|
||||||
|
me. clearStyles();
|
||||||
|
|
||||||
|
me.Styles.TFC = {};
|
||||||
|
me.Styles.TFC.scale_factor = 1.0; # 40% (applied to whole group)
|
||||||
|
|
||||||
|
me.Styles.APS = {};
|
||||||
|
me.Styles.APS.scale_factor = 0.25;
|
||||||
|
},
|
||||||
|
|
||||||
|
clearStyles : func() {
|
||||||
|
me.Styles = {};
|
||||||
|
},
|
||||||
|
|
||||||
|
};
|
|
@ -17,17 +17,22 @@
|
||||||
#
|
#
|
||||||
# Menu Item. There is a list of these for each page changing button per display page
|
# Menu Item. There is a list of these for each page changing button per display page
|
||||||
# Parameters:
|
# Parameters:
|
||||||
# menu_id : page change event id for this menu item. e.g. button number
|
# menu_id : page change event id for this menu item. e.g. button number
|
||||||
# title : Title Text (for display on the device)
|
# title : Title Text (for display on the device)
|
||||||
# page : Instance of page usually returned from PFD.addPage
|
# page : Instance of page usually returned from PFD.addPage
|
||||||
|
# callbackfn : Function to call when menu item is selected
|
||||||
|
# displayfn : Function to call when the menu item is displayed. Used to enable
|
||||||
|
# highlighting of menu items, for example.
|
||||||
|
|
||||||
var PFD_MenuItem =
|
var PFD_MenuItem =
|
||||||
{
|
{
|
||||||
new : func (menu_id, title, page)
|
new : func (menu_id, title, page, callbackfn=nil, displayfn=nil)
|
||||||
{
|
{
|
||||||
var obj = {parents : [PFD_MenuItem] };
|
var obj = {parents : [PFD_MenuItem] };
|
||||||
obj.page = page;
|
obj.page = page;
|
||||||
obj.menu_id = menu_id;
|
obj.menu_id = menu_id;
|
||||||
|
obj.callbackfn = callbackfn;
|
||||||
|
obj.displayfn = displayfn;
|
||||||
obj.title = title;
|
obj.title = title;
|
||||||
return obj;
|
return obj;
|
||||||
},
|
},
|
||||||
|
@ -63,7 +68,7 @@ var PFD_Page =
|
||||||
# make a page that is currenty visible not visible before making a new page visible,
|
# make a page that is currenty visible not visible before making a new page visible,
|
||||||
# however more than one page could be visible - but only one set of menu buttons can be active
|
# however more than one page could be visible - but only one set of menu buttons can be active
|
||||||
# so if two pages are visible (e.g. an overlay) then when the overlay removed it would be necessary
|
# so if two pages are visible (e.g. an overlay) then when the overlay removed it would be necessary
|
||||||
# to call setVisible on the base page to ensure that the menus are seutp
|
# to call setVisible on the base page to ensure that the menus are setup
|
||||||
setVisible : func(vis)
|
setVisible : func(vis)
|
||||||
{
|
{
|
||||||
if(me.svg != nil)
|
if(me.svg != nil)
|
||||||
|
@ -75,6 +80,21 @@ var PFD_Page =
|
||||||
me.offdisplay();
|
me.offdisplay();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
# Standard callback for buttons, causing the appropriate page to be displayed
|
||||||
|
std_callbackfn : func (device, me, mi)
|
||||||
|
{
|
||||||
|
device.selectPage(mi.page);
|
||||||
|
},
|
||||||
|
|
||||||
|
# Standard display function for buttons, displaying the text and making visible
|
||||||
|
std_displayfn : func(svg_element, menuitem)
|
||||||
|
{
|
||||||
|
svg_element.setText(menuitem.title);
|
||||||
|
svg_element.setVisible(1);
|
||||||
|
#me.buttons[mi.menu_id].setText(mi.title);
|
||||||
|
#me.buttons[mi.menu_id].setVisible(1);
|
||||||
|
},
|
||||||
|
|
||||||
#
|
#
|
||||||
# Perform action when button is pushed
|
# Perform action when button is pushed
|
||||||
notifyButton : func(button_id)
|
notifyButton : func(button_id)
|
||||||
|
@ -82,7 +102,7 @@ var PFD_Page =
|
||||||
{
|
{
|
||||||
if (mi.menu_id == button_id)
|
if (mi.menu_id == button_id)
|
||||||
{
|
{
|
||||||
me.device.selectPage(mi.page);
|
if (mi.callbackfn != nil) mi.callbackfn(me.device, me, mi);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -96,14 +116,25 @@ var PFD_Page =
|
||||||
# page that will be selected when pressed
|
# page that will be selected when pressed
|
||||||
#
|
#
|
||||||
# The corresponding menu for the selected page will automatically be loaded
|
# The corresponding menu for the selected page will automatically be loaded
|
||||||
addMenuItem : func(menu_id, title, page)
|
addMenuItem : func(menu_id, title, page, callbackfn=nil, displayfn=nil)
|
||||||
{
|
{
|
||||||
var nm = PFD_MenuItem.new(menu_id, title, page);
|
if (callbackfn == nil) callbackfn = me.std_callbackfn;
|
||||||
|
if (displayfn == nil) displayfn = me.std_displayfn;
|
||||||
|
var nm = PFD_MenuItem.new(menu_id, title, page, callbackfn, displayfn);
|
||||||
append(me.menus, nm);
|
append(me.menus, nm);
|
||||||
return nm;
|
return nm;
|
||||||
},
|
},
|
||||||
|
|
||||||
# base method for update; this can be overriden per page instance to provide update of the
|
#
|
||||||
|
# Clear all items from the menu. Use-case is where they may be a hierarchy
|
||||||
|
# of menus within the same page.
|
||||||
|
#
|
||||||
|
clearMenu : func()
|
||||||
|
{
|
||||||
|
me.menus = [];
|
||||||
|
},
|
||||||
|
|
||||||
|
# base method for update; this can be overridden per page instance to provide update of the
|
||||||
# elements on display (e.g. to display updated properties)
|
# elements on display (e.g. to display updated properties)
|
||||||
update : func(notification=nil)
|
update : func(notification=nil)
|
||||||
{
|
{
|
||||||
|
@ -133,6 +164,7 @@ var PFD_Device =
|
||||||
# - num_menu_buttons is the Number of menu buttons; starting from the bottom left then right, then top, then left.
|
# - num_menu_buttons is the Number of menu buttons; starting from the bottom left then right, then top, then left.
|
||||||
# - button prefix (e.g MI_) is the prefix of the labels in the SVG for the menu boxes.
|
# - button prefix (e.g MI_) is the prefix of the labels in the SVG for the menu boxes.
|
||||||
# - _canvas is the canvas group.
|
# - _canvas is the canvas group.
|
||||||
|
# - designation (optional) is used for Emesary designation
|
||||||
#NOTE:
|
#NOTE:
|
||||||
# This does not actually create the canvas elements, or parse the SVG, that would typically be done in
|
# This does not actually create the canvas elements, or parse the SVG, that would typically be done in
|
||||||
# a higher level class that contains an instance of this class.
|
# a higher level class that contains an instance of this class.
|
||||||
|
@ -161,7 +193,7 @@ var PFD_Device =
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
obj.buttons[idx] = msvg;
|
obj.buttons[idx] = msvg;
|
||||||
obj.buttons[idx].setText(sprintf("M",idx));
|
obj.buttons[idx].setText(sprintf("M%d",idx));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
obj.Recipient = nil;
|
obj.Recipient = nil;
|
||||||
|
@ -187,17 +219,19 @@ var PFD_Device =
|
||||||
var pfd_obj = me;
|
var pfd_obj = me;
|
||||||
me.Recipient.Receive = func(notification)
|
me.Recipient.Receive = func(notification)
|
||||||
{
|
{
|
||||||
if (notification.Device_id == pfd_obj.device_id
|
if (notification.Device_Id == pfd_obj.device_id
|
||||||
and notification.NotificationType == notifications.PFDEventNotification.DefaultType) {
|
and notification.NotificationType == notifications.PFDEventNotification.DefaultType) {
|
||||||
if (notification.Event_Id == notifications.PFDEventNotification.SoftKeyPushed
|
if (notification.Event_Id == notifications.PFDEventNotification.SoftKeyPushed
|
||||||
and notification.EventParameter != nil)
|
and notification.EventParameter != nil)
|
||||||
{
|
{
|
||||||
|
#printf("Button pressed " ~ notification.EventParameter);
|
||||||
pfd_obj.notifyButton(notification.EventParameter);
|
pfd_obj.notifyButton(notification.EventParameter);
|
||||||
}
|
}
|
||||||
else if (notification.Event_Id == notifications.PFDEventNotification.ChangeMenuText
|
else if (notification.Event_Id == notifications.PFDEventNotification.ChangeMenuText
|
||||||
and notification.EventParameter != nil)
|
and notification.EventParameter != nil)
|
||||||
{
|
{
|
||||||
foreach(var eventMenu; notification.EventParameter) {
|
foreach(var eventMenu; notification.EventParameter) {
|
||||||
|
#printf("Menu Text changed : " ~ eventMenu.Text);
|
||||||
foreach (var mi ; pfd_obj.current_page.menus) {
|
foreach (var mi ; pfd_obj.current_page.menus) {
|
||||||
if (pfd_obj.buttons[eventMenu.Id] != nil) {
|
if (pfd_obj.buttons[eventMenu.Id] != nil) {
|
||||||
pfd_obj.buttons[eventMenu.Id].setText(eventMenu.Text);
|
pfd_obj.buttons[eventMenu.Id].setText(eventMenu.Text);
|
||||||
|
@ -253,6 +287,17 @@ var PFD_Device =
|
||||||
return np;
|
return np;
|
||||||
},
|
},
|
||||||
#
|
#
|
||||||
|
# Get a named page
|
||||||
|
#
|
||||||
|
getPage : func(title)
|
||||||
|
{
|
||||||
|
foreach(var p; me.pages) {
|
||||||
|
if (p.title == title) return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil;
|
||||||
|
},
|
||||||
|
#
|
||||||
# manage the update of the currently selected page
|
# manage the update of the currently selected page
|
||||||
update : func(notification=nil)
|
update : func(notification=nil)
|
||||||
{
|
{
|
||||||
|
@ -264,6 +309,8 @@ var PFD_Device =
|
||||||
# - the page object method controls the visibility
|
# - the page object method controls the visibility
|
||||||
selectPage : func(p)
|
selectPage : func(p)
|
||||||
{
|
{
|
||||||
|
if (me.current_page == p) return;
|
||||||
|
|
||||||
if (me.current_page != nil)
|
if (me.current_page != nil)
|
||||||
me.current_page.setVisible(0);
|
me.current_page.setVisible(0);
|
||||||
if (me.buttons != nil)
|
if (me.buttons != nil)
|
||||||
|
@ -276,8 +323,7 @@ var PFD_Device =
|
||||||
{
|
{
|
||||||
if (me.buttons[mi.menu_id] != nil)
|
if (me.buttons[mi.menu_id] != nil)
|
||||||
{
|
{
|
||||||
me.buttons[mi.menu_id].setText(mi.title);
|
mi.displayfn(me.buttons[mi.menu_id], mi);
|
||||||
me.buttons[mi.menu_id].setVisible(1);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
printf("PFD_device: Menu for button not found. Menu ID '%s'",mi.menu_id);
|
printf("PFD_device: Menu for button not found. Menu ID '%s'",mi.menu_id);
|
||||||
|
@ -290,12 +336,17 @@ var PFD_Device =
|
||||||
# ensure that the menus are display correctly for the current page.
|
# ensure that the menus are display correctly for the current page.
|
||||||
updateMenus : func
|
updateMenus : func
|
||||||
{
|
{
|
||||||
|
foreach(var mb ; me.buttons)
|
||||||
|
if (mb != nil)
|
||||||
|
mb.setVisible(0);
|
||||||
|
|
||||||
|
if (me.current_page == nil) return;
|
||||||
|
|
||||||
foreach(var mi ; me.current_page.menus)
|
foreach(var mi ; me.current_page.menus)
|
||||||
{
|
{
|
||||||
if (me.buttons[mi.menu_id] != nil)
|
if (me.buttons[mi.menu_id] != nil)
|
||||||
{
|
{
|
||||||
me.buttons[mi.menu_id].setText(mi.title);
|
mi.displayfn(me.buttons[mi.menu_id], mi);
|
||||||
me.buttons[mi.menu_id].setVisible(1);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
printf("No corresponding item '%s'",mi.menu_id);
|
printf("No corresponding item '%s'",mi.menu_id);
|
||||||
|
|
40
Nasal/canvas/map/STAMEN_terrain.lcontroller
Normal file
40
Nasal/canvas/map/STAMEN_terrain.lcontroller
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
# See: http://wiki.flightgear.org/MapStructure
|
||||||
|
# Class things:
|
||||||
|
var name = 'STAMEN_terrain';
|
||||||
|
var parents = [OverlayLayer.Controller];
|
||||||
|
var __self__ = caller(0)[0];
|
||||||
|
OverlayLayer.Controller.add(name, __self__);
|
||||||
|
TileLayer.add(name, {
|
||||||
|
parents: [TileLayer],
|
||||||
|
type: name, # Layer type
|
||||||
|
df_controller: __self__, # controller to use by default -- this one
|
||||||
|
});
|
||||||
|
|
||||||
|
var new = func(layer) {
|
||||||
|
var m = {
|
||||||
|
parents: [__self__],
|
||||||
|
layer: layer,
|
||||||
|
map: layer.map,
|
||||||
|
listeners: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
layer.makeURL = string.compileTemplate('http://b.tile.stamen.com/terrain-background/{z}/{x}/{y}.png');
|
||||||
|
layer.makePath = string.compileTemplate(layer.maps_base ~ '/stamen-terrain-background/{z}/{x}/{y}.png');
|
||||||
|
|
||||||
|
#layer.makeURL = string.compileTemplate('http://b.tile.stamen.com/toner/{z}/{x}/{y}.png');
|
||||||
|
#layer.makePath = string.compileTemplate(layer.maps_base ~ '/stamen-toner/{z}/{x}/{y}.png');
|
||||||
|
|
||||||
|
|
||||||
|
m.addVisibilityListener();
|
||||||
|
m.addRangeListener();
|
||||||
|
m.addScreenRangeListener();
|
||||||
|
return m;
|
||||||
|
};
|
||||||
|
|
||||||
|
var updateLayer = func() {
|
||||||
|
}
|
||||||
|
|
||||||
|
var del = func() {
|
||||||
|
foreach (var l; me.listeners)
|
||||||
|
removelistener(l);
|
||||||
|
};
|
|
@ -11,6 +11,13 @@ SymbolLayer.add(name, {
|
||||||
parents: [MultiSymbolLayer],
|
parents: [MultiSymbolLayer],
|
||||||
type: name, # Symbol type
|
type: name, # Symbol type
|
||||||
df_controller: __self__, # controller to use by default -- this one
|
df_controller: __self__, # controller to use by default -- this one
|
||||||
|
df_style: {
|
||||||
|
},
|
||||||
|
df_options: { # default configuration options
|
||||||
|
floor_ft: 120000, # Display target from this height below the aircraft
|
||||||
|
ceiling_ft: 120000, # Display targets up to this height above the aircraft
|
||||||
|
display_id: 1, # Display aircraft ID
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
var model_root = props.globals.getNode("/ai/models/");
|
var model_root = props.globals.getNode("/ai/models/");
|
||||||
|
@ -67,7 +74,7 @@ var get_alt_diff = func(model) {
|
||||||
var model_alt = model.get_alt();
|
var model_alt = model.get_alt();
|
||||||
var alt = me.map.getAlt();
|
var alt = me.map.getAlt();
|
||||||
if (alt == nil or model_alt == nil) return 0;
|
if (alt == nil or model_alt == nil) return 0;
|
||||||
return alt-model_alt;
|
return alt - model_alt;
|
||||||
};
|
};
|
||||||
|
|
||||||
##
|
##
|
||||||
|
@ -83,6 +90,12 @@ var searchCmd_default = func {
|
||||||
var result = [];
|
var result = [];
|
||||||
var models = 0;
|
var models = 0;
|
||||||
|
|
||||||
|
var alt = me.map.getAlt();
|
||||||
|
if (alt == nil) alt = 0;
|
||||||
|
|
||||||
|
var min_alt = alt - me.layer.options.floor_ft;
|
||||||
|
var max_alt = alt + me.layer.options.ceiling_ft;
|
||||||
|
|
||||||
# AI and Multiplayer traffic
|
# AI and Multiplayer traffic
|
||||||
foreach (var t; model_root.getChildren()) {
|
foreach (var t; model_root.getChildren()) {
|
||||||
if (!t.getValue("valid")) continue;
|
if (!t.getValue("valid")) continue;
|
||||||
|
@ -95,11 +108,16 @@ var searchCmd_default = func {
|
||||||
printlog("alert", "lat/lon was nil for AI node "~t.getPath());
|
printlog("alert", "lat/lon was nil for AI node "~t.getPath());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (me.map.controller.in_range(lat, lon))
|
|
||||||
append(result, TrafficModel.new(t, nil, me.layer));
|
var tm = TrafficModel.new(t, nil, me.layer);
|
||||||
|
|
||||||
|
if ((min_alt < tm.get_alt()) and
|
||||||
|
(tm.get_alt() < max_alt) and
|
||||||
|
me.map.controller.in_range(lat, lon) ) {
|
||||||
|
append(result, tm);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#print("Found "~size(result)~" TrafficModel's in range out of "~models~" total.");
|
#print("Found "~size(result)~" TrafficModel's in range out of "~models~" total.");
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#
|
#
|
||||||
# Version : 4.8
|
# Version : 4.8
|
||||||
#
|
#
|
||||||
# Copyright © 2016 Richard Harrison Released under GPL V2
|
# Copyright <EFBFBD> 2016 Richard Harrison Released under GPL V2
|
||||||
#
|
#
|
||||||
#---------------------------------------------------------------------------*/
|
#---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
@ -542,11 +542,14 @@ var PFDEventNotification =
|
||||||
# _event_id - event ID.
|
# _event_id - event ID.
|
||||||
# 1 softkey pushed.
|
# 1 softkey pushed.
|
||||||
# 2 select page by ID
|
# 2 select page by ID
|
||||||
|
# 3 Change softkey button text
|
||||||
|
# 4 hardkey pushed - i.e. non-soft keys that don't change function based on context.
|
||||||
# _event_param - param related to the event ID. implementation specific.
|
# _event_param - param related to the event ID. implementation specific.
|
||||||
##
|
##
|
||||||
SoftKeyPushed : 1,
|
SoftKeyPushed : 1,
|
||||||
SelectPageById : 2,
|
SelectPageById : 2,
|
||||||
ChangeMenuText : 3, #event parameter contains hash of { Id: , Text: }
|
ChangeMenuText : 3, #event parameter contains array of { Id: , Text: } tuples
|
||||||
|
HardKeyPushed : 4, #event parameter contains single { Id: , Value: } tuple
|
||||||
DefaultType : "PFDEventNotification",
|
DefaultType : "PFDEventNotification",
|
||||||
|
|
||||||
new: func(_ident, _device_id,_event_id,_event_parameter_id)
|
new: func(_ident, _device_id,_event_id,_event_parameter_id)
|
||||||
|
|
|
@ -110,6 +110,7 @@
|
||||||
<performance-monitor>Monitor System Performance</performance-monitor>
|
<performance-monitor>Monitor System Performance</performance-monitor>
|
||||||
<write-video-config>Save Video Configuration</write-video-config>
|
<write-video-config>Save Video Configuration</write-video-config>
|
||||||
<property-browser>Browse Internal Properties</property-browser>
|
<property-browser>Browse Internal Properties</property-browser>
|
||||||
|
<fg1000>FG1000 MFD</fg1000>
|
||||||
<logging>Logging</logging>
|
<logging>Logging</logging>
|
||||||
<local_weather>Local Weather (Test)</local_weather>
|
<local_weather>Local Weather (Test)</local_weather>
|
||||||
<print-scene-info>Print Visible Scene Info</print-scene-info>
|
<print-scene-info>Print Visible Scene Info</print-scene-info>
|
||||||
|
|
892
gui/dialogs/fg1000.xml
Normal file
892
gui/dialogs/fg1000.xml
Normal file
|
@ -0,0 +1,892 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
|
||||||
|
<PropertyList>
|
||||||
|
<name>fg1000</name>
|
||||||
|
<layout>vbox</layout>
|
||||||
|
<resizable>true</resizable>
|
||||||
|
<default-padding>3</default-padding>
|
||||||
|
|
||||||
|
<color>
|
||||||
|
<alpha type="float">1.0</alpha>
|
||||||
|
</color>
|
||||||
|
|
||||||
|
<nasal>
|
||||||
|
<open><![CDATA[
|
||||||
|
var self = cmdarg();
|
||||||
|
var listeners = [];
|
||||||
|
var mfd = nil;
|
||||||
|
]]></open>
|
||||||
|
|
||||||
|
<close><![CDATA[
|
||||||
|
foreach (var l; listeners)
|
||||||
|
removelistener(l);
|
||||||
|
setsize(listeners, 0);
|
||||||
|
mfd.del();
|
||||||
|
|
||||||
|
]]></close>
|
||||||
|
</nasal>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<layout>hbox</layout>
|
||||||
|
<default-padding>1</default-padding>
|
||||||
|
<empty><stretch>1</stretch></empty>
|
||||||
|
|
||||||
|
<text>
|
||||||
|
<label>FG1000 MFD</label>
|
||||||
|
</text>
|
||||||
|
|
||||||
|
<empty><stretch>1</stretch></empty>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<pref-width>16</pref-width>
|
||||||
|
<pref-height>16</pref-height>
|
||||||
|
<legend></legend>
|
||||||
|
<keynum>27</keynum>
|
||||||
|
<border>2</border>
|
||||||
|
|
||||||
|
<binding>
|
||||||
|
<command>dialog-close</command>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<hrule/>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<layout>hbox</layout>
|
||||||
|
<stretch>true</stretch>
|
||||||
|
<halign>fill</halign>
|
||||||
|
|
||||||
|
<!-- Left sidebar NAV & Autopilot-->
|
||||||
|
<group>
|
||||||
|
<layout>vbox</layout>
|
||||||
|
<halign>center</halign>
|
||||||
|
<valign>top</valign>
|
||||||
|
|
||||||
|
<dial>
|
||||||
|
<name>vol</name>
|
||||||
|
<label>VOL</label>
|
||||||
|
<pref-width>30</pref-width>
|
||||||
|
<property>/gui/dialogs/fg1000/nav-vol</property>
|
||||||
|
</dial>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<name>toggle-nav</name>
|
||||||
|
<legend><-></legend>
|
||||||
|
<pref-width>30</pref-width>
|
||||||
|
<pref-height>30</pref-height>
|
||||||
|
<halign>right</halign>
|
||||||
|
<binding>
|
||||||
|
<command>property-swap</command>
|
||||||
|
<condition>
|
||||||
|
<not>
|
||||||
|
<property>/instrumentation/nav-selected</property>
|
||||||
|
</not>
|
||||||
|
</condition>
|
||||||
|
<property>/instrumentation/nav[0]/frequencies/selected-mhz</property>
|
||||||
|
<property>/instrumentation/nav[0]/frequencies/standby-mhz</property>
|
||||||
|
</binding>
|
||||||
|
<binding>
|
||||||
|
<command>property-swap</command>
|
||||||
|
<condition>
|
||||||
|
<property>/instrumentation/nav-selected</property>
|
||||||
|
</condition>
|
||||||
|
<property>/instrumentation/nav[1]/frequencies/selected-mhz</property>
|
||||||
|
<property>/instrumentation/nav[1]/frequencies/standby-mhz</property>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<text><label>NAV</label></text>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<layout>hbox</layout>
|
||||||
|
<halign>center</halign>
|
||||||
|
<default-padding>0</default-padding>
|
||||||
|
<button>
|
||||||
|
<name>nav-decrease-MHz</name>
|
||||||
|
<legend><<</legend>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<name>nav-decrease-KHz</name>
|
||||||
|
<legend><</legend>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<name>nav-increase-KHz</name>
|
||||||
|
<legend>></legend>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<name>nav-increase-MHz</name>
|
||||||
|
<legend>>></legend>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
</button>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<name>toggle-nav</name>
|
||||||
|
<legend>1-2</legend>
|
||||||
|
<pref-width>50</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<default-padding>0</default-padding>
|
||||||
|
<binding>
|
||||||
|
<command>property-toggle</command>
|
||||||
|
<property>/instrumentation/nav-selected</property>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<!-- Heading Control -->
|
||||||
|
<text><label>HDG</label></text>
|
||||||
|
|
||||||
|
<dial>
|
||||||
|
<name>hdg</name>
|
||||||
|
<width>20</width>
|
||||||
|
<property>/gui/dialogs/fg1000/hdg</property>
|
||||||
|
</dial>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<name>hdg-sync</name>
|
||||||
|
<legend>HDG SYNC</legend>
|
||||||
|
<pref-width>75</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<binding>
|
||||||
|
<command>property-toggle</command>
|
||||||
|
<property>/instrumentation/nav-selected</property>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<!-- AP Controls -->
|
||||||
|
<layout>table</layout>
|
||||||
|
<button>
|
||||||
|
<col>0</col><row>0</row>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>AP</name>
|
||||||
|
<legend>AP</legend>
|
||||||
|
<binding>
|
||||||
|
<command>property-toggle</command>
|
||||||
|
<property>/sim/instrumentation/fg1000/autopilot/ap</property>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<col>1</col><row>0</row>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>FD</name>
|
||||||
|
<legend>FD</legend>
|
||||||
|
<binding>
|
||||||
|
<command>property-toggle</command>
|
||||||
|
<property>/sim/instrumentation/fg1000/autopilot/fd</property>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<col>0</col><row>1</row>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>HDG</name>
|
||||||
|
<legend>HDG</legend>
|
||||||
|
<binding>
|
||||||
|
<command>property-toggle</command>
|
||||||
|
<property>/sim/instrumentation/fg1000/autopilot/hdg</property>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<col>1</col><row>1</row>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>ALT</name>
|
||||||
|
<legend>ALT</legend>
|
||||||
|
<binding>
|
||||||
|
<command>property-toggle</command>
|
||||||
|
<property>/sim/instrumentation/fg1000/autopilot/alt</property>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<col>0</col><row>2</row>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>NAV</name>
|
||||||
|
<legend>NAV</legend>
|
||||||
|
<binding>
|
||||||
|
<command>property-toggle</command>
|
||||||
|
<property>/sim/instrumentation/fg1000/autopilot/nav</property>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<col>1</col><row>2</row>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>VNV</name>
|
||||||
|
<legend>VNV</legend>
|
||||||
|
<binding>
|
||||||
|
<command>property-toggle</command>
|
||||||
|
<property>/sim/instrumentation/fg1000/autopilot/vnv</property>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<col>0</col><row>3</row>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>APR</name>
|
||||||
|
<legend>APR</legend>
|
||||||
|
<binding>
|
||||||
|
<command>property-toggle</command>
|
||||||
|
<property>/sim/instrumentation/fg1000/autopilot/apr</property>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<col>1</col><row>3</row>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>BC</name>
|
||||||
|
<legend>BC</legend>
|
||||||
|
<binding>
|
||||||
|
<command>property-toggle</command>
|
||||||
|
<property>/sim/instrumentation/fg1000/autopilot/bc</property>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<col>0</col><row>4</row>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>VS</name>
|
||||||
|
<legend>VS</legend>
|
||||||
|
<binding>
|
||||||
|
<command>property-toggle</command>
|
||||||
|
<property>/sim/instrumentation/fg1000/autopilot/vs</property>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<col>1</col><row>4</row>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>up</name>
|
||||||
|
<legend>UP</legend>
|
||||||
|
<binding>
|
||||||
|
<command>property-toggle</command>
|
||||||
|
<property>/sim/instrumentation/fg1000/autopilot/up</property>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<col>0</col><row>5</row>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>FLC</name>
|
||||||
|
<legend>FLC</legend>
|
||||||
|
<binding>
|
||||||
|
<command>property-toggle</command>
|
||||||
|
<property>/sim/instrumentation/fg1000/autopilot/flc</property>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<col>1</col><row>5</row>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>DN</name>
|
||||||
|
<legend>DN</legend>
|
||||||
|
<binding>
|
||||||
|
<command>property-toggle</command>
|
||||||
|
<property>/sim/instrumentation/fg1000/autopilot/dn</property>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<text><label>ALT</label></text>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<layout>hbox</layout>
|
||||||
|
<halign>center</halign>
|
||||||
|
<default-padding>0</default-padding>
|
||||||
|
|
||||||
|
<!-- ALT controller -->
|
||||||
|
<button>
|
||||||
|
<name>alt-decr-large</name>
|
||||||
|
<legend><<</legend>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<name>alt-decr-small</name>
|
||||||
|
<legend><</legend>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<name>alt-incr-small</name>
|
||||||
|
<legend>></legend>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<name>alt-incr-large</name>
|
||||||
|
<legend>>></legend>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
</button>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<!-- End of left hand stack of controls -->
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<vrule/>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<layout>vbox</layout>
|
||||||
|
<stretch>true</stretch>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<canvas>
|
||||||
|
<name>canvas-map</name>
|
||||||
|
<valign>center</valign>
|
||||||
|
<halign>center</halign>
|
||||||
|
<stretch>false</stretch>
|
||||||
|
<pref-width>1024</pref-width>
|
||||||
|
<pref-height>768</pref-height>
|
||||||
|
<width>1024</width>
|
||||||
|
<height>768</height>
|
||||||
|
<nasal><load><![CDATA[
|
||||||
|
var myCanvas = canvas.get( cmdarg() );
|
||||||
|
myCanvas.setColorBackground(0,0,0,1.0);
|
||||||
|
|
||||||
|
var nasal_dir = getprop("/sim/fg-root") ~ "/Aircraft/Instruments-3d/FG1000/Nasal/";
|
||||||
|
io.load_nasal(nasal_dir ~ 'MFD.nas', "fg1000");
|
||||||
|
mfd = fg1000.MFD.new(myCanvas);
|
||||||
|
|
||||||
|
softkeypushed = 0;
|
||||||
|
# Connect the buttons - using the provided model index to get the right ones from the model binding
|
||||||
|
var softkey_listener = setlistener("/sim/gui/dialogs/fg1000/softkey-pressed", func(v)
|
||||||
|
{
|
||||||
|
if (v != nil) {
|
||||||
|
if (v.getValue()) {
|
||||||
|
softkeypushed = v.getValue();
|
||||||
|
#printf("Button %d", softkeypushed);
|
||||||
|
#mfd._MFDDevice.notifyButton(softkeypushed);
|
||||||
|
var notification = notifications.PFDEventNotification.new("MFD", 1, notifications.PFDEventNotification.SoftKeyPushed, softkeypushed);
|
||||||
|
emesary.GlobalTransmitter.NotifyAll(notification);
|
||||||
|
softkeypushed = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
append(listeners, softkey_listener);
|
||||||
|
#append(listeners, setlistener("/sim/gui/dialogs/fg1000/fms-incr-large-pressed", func(v) { mfd._pageGroupController.incrFMSOuter(); } ));
|
||||||
|
#append(listeners, setlistener("/sim/gui/dialogs/fg1000/fms-incr-small-pressed", func(v) { mfd._pageGroupController.incrFMSInner(); } ));
|
||||||
|
#append(listeners, setlistener("/sim/gui/dialogs/fg1000/fms-decr-large-pressed", func(v) { mfd._pageGroupController.decrFMSOuter(); } ));
|
||||||
|
#append(listeners, setlistener("/sim/gui/dialogs/fg1000/fms-decr-small-pressed", func(v) { mfd._pageGroupController.decrFMSInner(); } ));
|
||||||
|
|
||||||
|
|
||||||
|
append(listeners, setlistener("/sim/gui/dialogs/fg1000/fms-incr-large-pressed", func(v) {
|
||||||
|
var notification = notifications.PFDEventNotification.new("MFD", 1, notifications.PFDEventNotification.HardKeyPushed, { Id: fg1000.MFD.FASCIA.FMS_OUTER, Value: 1.0 });
|
||||||
|
emesary.GlobalTransmitter.NotifyAll(notification);
|
||||||
|
} ));
|
||||||
|
|
||||||
|
append(listeners, setlistener("/sim/gui/dialogs/fg1000/fms-incr-small-pressed", func(v) {
|
||||||
|
var notification = notifications.PFDEventNotification.new("MFD", 1, notifications.PFDEventNotification.HardKeyPushed, { Id: fg1000.MFD.FASCIA.FMS_INNER, Value: 1.0 });
|
||||||
|
emesary.GlobalTransmitter.NotifyAll(notification);
|
||||||
|
} ));
|
||||||
|
|
||||||
|
append(listeners, setlistener("/sim/gui/dialogs/fg1000/fms-decr-large-pressed", func(v) {
|
||||||
|
var notification = notifications.PFDEventNotification.new("MFD", 1, notifications.PFDEventNotification.HardKeyPushed, { Id: fg1000.MFD.FASCIA.FMS_OUTER, Value: -1.0 });
|
||||||
|
emesary.GlobalTransmitter.NotifyAll(notification);
|
||||||
|
} ));
|
||||||
|
|
||||||
|
append(listeners, setlistener("/sim/gui/dialogs/fg1000/fms-decr-small-pressed", func(v) {
|
||||||
|
var notification = notifications.PFDEventNotification.new("MFD", 1, notifications.PFDEventNotification.HardKeyPushed, { Id: fg1000.MFD.FASCIA.FMS_INNER, Value: -1.0 });
|
||||||
|
emesary.GlobalTransmitter.NotifyAll(notification);
|
||||||
|
} ));
|
||||||
|
|
||||||
|
append(listeners, setlistener("/sim/gui/dialogs/fg1000/range-decr-pressed", func(v) {
|
||||||
|
var notification = notifications.PFDEventNotification.new("MFD", 1, notifications.PFDEventNotification.HardKeyPushed, { Id: fg1000.MFD.FASCIA.RANGE, Value: -1.0 });
|
||||||
|
emesary.GlobalTransmitter.NotifyAll(notification);
|
||||||
|
} ));
|
||||||
|
|
||||||
|
append(listeners, setlistener("/sim/gui/dialogs/fg1000/range-incr-pressed", func(v) {
|
||||||
|
var notification = notifications.PFDEventNotification.new("MFD", 1, notifications.PFDEventNotification.HardKeyPushed, { Id: fg1000.MFD.FASCIA.RANGE, Value: 1.0 });
|
||||||
|
emesary.GlobalTransmitter.NotifyAll(notification);
|
||||||
|
} ));
|
||||||
|
|
||||||
|
|
||||||
|
]]></load></nasal>
|
||||||
|
</canvas>
|
||||||
|
<layout>hbox</layout>
|
||||||
|
<stretch>true</stretch>
|
||||||
|
<halign>fill</halign>
|
||||||
|
<valign>fill</valign>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<!-- Buttons on the bottom of the fascia -->
|
||||||
|
<layout>hbox</layout>
|
||||||
|
<stretch>true</stretch>
|
||||||
|
<halign>fill</halign>
|
||||||
|
<valign>top</valign>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<name>softkey-1</name>
|
||||||
|
<legend>^</legend>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<binding>
|
||||||
|
<command>property-assign</command>
|
||||||
|
<property>/sim/gui/dialogs/fg1000/softkey-pressed</property>
|
||||||
|
<value>1</value>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<name>softkey-2</name>
|
||||||
|
<legend>^</legend>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<binding>
|
||||||
|
<command>property-assign</command>
|
||||||
|
<property>/sim/gui/dialogs/fg1000/softkey-pressed</property>
|
||||||
|
<value>2</value>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<name>softkey-3</name>
|
||||||
|
<legend>^</legend>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<binding>
|
||||||
|
<command>property-assign</command>
|
||||||
|
<property>/sim/gui/dialogs/fg1000/softkey-pressed</property>
|
||||||
|
<value>3</value>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<name>softkey-4</name>
|
||||||
|
<legend>^</legend>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<binding>
|
||||||
|
<command>property-assign</command>
|
||||||
|
<property>/sim/gui/dialogs/fg1000/softkey-pressed</property>
|
||||||
|
<value>4</value>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<name>softkey-5</name>
|
||||||
|
<legend>^</legend>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<binding>
|
||||||
|
<command>property-assign</command>
|
||||||
|
<property>/sim/gui/dialogs/fg1000/softkey-pressed</property>
|
||||||
|
<value>5</value>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<name>softkey-6</name>
|
||||||
|
<legend>^</legend>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<binding>
|
||||||
|
<command>property-assign</command>
|
||||||
|
<property>/sim/gui/dialogs/fg1000/softkey-pressed</property>
|
||||||
|
<value>6</value>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<name>softkey-7</name>
|
||||||
|
<legend>^</legend>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<binding>
|
||||||
|
<command>property-assign</command>
|
||||||
|
<property>/sim/gui/dialogs/fg1000/softkey-pressed</property>
|
||||||
|
<value>7</value>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<name>softkey-8</name>
|
||||||
|
<legend>^</legend>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<binding>
|
||||||
|
<command>property-assign</command>
|
||||||
|
<property>/sim/gui/dialogs/fg1000/softkey-pressed</property>
|
||||||
|
<value>8</value>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<name>softkey-9</name>
|
||||||
|
<legend>^</legend>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<binding>
|
||||||
|
<command>property-assign</command>
|
||||||
|
<property>/sim/gui/dialogs/fg1000/softkey-pressed</property>
|
||||||
|
<value>9</value>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<name>softkey-10</name>
|
||||||
|
<legend>^</legend>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<binding>
|
||||||
|
<command>property-assign</command>
|
||||||
|
<property>/sim/gui/dialogs/fg1000/softkey-pressed</property>
|
||||||
|
<value>10</value>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<name>softkey-11</name>
|
||||||
|
<legend>^</legend>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<binding>
|
||||||
|
<command>property-assign</command>
|
||||||
|
<property>/sim/gui/dialogs/fg1000/softkey-pressed</property>
|
||||||
|
<value>11</value>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<name>softkey-12</name>
|
||||||
|
<legend>^</legend>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<binding>
|
||||||
|
<command>property-assign</command>
|
||||||
|
<property>/sim/gui/dialogs/fg1000/softkey-pressed</property>
|
||||||
|
<value>12</value>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<!-- End of softkeys -->
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<!-- End of middle vertical panel -->
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<vrule/>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<!-- Righthand control panel -->
|
||||||
|
<layout>vbox</layout>
|
||||||
|
<halign>center</halign>
|
||||||
|
<valign>top</valign>
|
||||||
|
|
||||||
|
<dial>
|
||||||
|
<name>com-vol</name>
|
||||||
|
<label>VOL</label>
|
||||||
|
<pref-width>30</pref-width>
|
||||||
|
<property>/gui/dialogs/fg1000/com-vol</property>
|
||||||
|
</dial>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<name>toggle-com</name>
|
||||||
|
<legend><-></legend>
|
||||||
|
<pref-width>30</pref-width>
|
||||||
|
<pref-height>30</pref-height>
|
||||||
|
<halign>left</halign>
|
||||||
|
<binding>
|
||||||
|
<command>property-swap</command>
|
||||||
|
<condition>
|
||||||
|
<not>
|
||||||
|
<property>/instrumentation/com-selected</property>
|
||||||
|
</not>
|
||||||
|
</condition>
|
||||||
|
<property>/instrumentation/com[0]/frequencies/selected-mhz</property>
|
||||||
|
<property>/instrumentation/com[0]/frequencies/standby-mhz</property>
|
||||||
|
</binding>
|
||||||
|
<binding>
|
||||||
|
<command>property-swap</command>
|
||||||
|
<condition>
|
||||||
|
<property>/instrumentation/com-selected</property>
|
||||||
|
</condition>
|
||||||
|
<property>/instrumentation/com[1]/frequencies/selected-mhz</property>
|
||||||
|
<property>/instrumentation/com[1]/frequencies/standby-mhz</property>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<text><label>COM</label></text>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<layout>hbox</layout>
|
||||||
|
<halign>center</halign>
|
||||||
|
<default-padding>0</default-padding>
|
||||||
|
<button>
|
||||||
|
<name>com-decrease-MHz</name>
|
||||||
|
<legend><<</legend>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<name>com-decrease-KHz</name>
|
||||||
|
<legend><</legend>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<name>com-increase-KHz</name>
|
||||||
|
<legend>></legend>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<name>com-increase-MHz</name>
|
||||||
|
<legend>>></legend>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
</button>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<name>toggle-nav</name>
|
||||||
|
<legend>1-2</legend>
|
||||||
|
<pref-width>50</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<default-padding>0</default-padding>
|
||||||
|
<binding>
|
||||||
|
<command>property-toggle</command>
|
||||||
|
<property>/instrumentation/nav-selected</property>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
|
||||||
|
<text>
|
||||||
|
<label>BARO</label>
|
||||||
|
</text>
|
||||||
|
<dial>
|
||||||
|
<name>baro</name>
|
||||||
|
<width>20</width>
|
||||||
|
<property>/gui/dialogs/fg1000/baro</property>
|
||||||
|
</dial>
|
||||||
|
|
||||||
|
<text>
|
||||||
|
<label>CRS</label>
|
||||||
|
</text>
|
||||||
|
|
||||||
|
<dial>
|
||||||
|
<name>crs</name>
|
||||||
|
<width>20</width>
|
||||||
|
<property>/gui/dialogs/fg1000/crs</property>
|
||||||
|
<binding><command>dialog-apply</command></binding>
|
||||||
|
</dial>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<name>crs-center</name>
|
||||||
|
<legend>CRS CTR</legend>
|
||||||
|
<pref-width>75</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<binding>
|
||||||
|
<command>property-toggle</command>
|
||||||
|
<property>/instrumentation/com-selected</property>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Map Controls -->
|
||||||
|
|
||||||
|
<text><label>RANGE</label></text>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<layout>hbox</layout>
|
||||||
|
<halign>center</halign>
|
||||||
|
<default-padding>0</default-padding>
|
||||||
|
<!-- RANGE controller -->
|
||||||
|
<button>
|
||||||
|
<name>range-decr</name>
|
||||||
|
<legend><</legend>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<binding>
|
||||||
|
<command>property-assign</command>
|
||||||
|
<property>/sim/gui/dialogs/fg1000/range-incr-pressed</property>
|
||||||
|
<value>1</value>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<name>range-incr</name>
|
||||||
|
<legend>></legend>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<binding>
|
||||||
|
<command>property-assign</command>
|
||||||
|
<property>/sim/gui/dialogs/fg1000/range-decr-pressed</property>
|
||||||
|
<value>1</value>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<layout>table</layout>
|
||||||
|
<halign>center</halign>
|
||||||
|
<default-padding>0</default-padding>
|
||||||
|
<button>
|
||||||
|
<row>0</row><col>1</col>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>map-up</name>
|
||||||
|
<legend>^</legend>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<row>1</row><col>0</col>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>map-left</name>
|
||||||
|
<legend><</legend>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<row>1</row><col>1</col>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>map-ptr</name>
|
||||||
|
<legend>PTR</legend>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<row>1</row><col>2</col>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>map-right</name>
|
||||||
|
<legend>></legend>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<row>2</row><col>1</col>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>map-down</name>
|
||||||
|
<legend>v</legend>
|
||||||
|
</button>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<!-- FMS Controls -->
|
||||||
|
<layout>table</layout>
|
||||||
|
<halign>center</halign>
|
||||||
|
<button>
|
||||||
|
<col>0</col><row>0</row>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>DTO</name>
|
||||||
|
<legend>DTO</legend>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<col>1</col><row>0</row>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>menu</name>
|
||||||
|
<legend>MENU</legend>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<col>0</col><row>1</row>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>FPL</name>
|
||||||
|
<legend>FPL</legend>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<col>1</col><row>1</row>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>PROC</name>
|
||||||
|
<legend>PROC</legend>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<col>0</col><row>2</row>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>CLR</name>
|
||||||
|
<legend>CLR</legend>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<col>1</col><row>2</row>
|
||||||
|
<pref-width>40</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<name>ENT</name>
|
||||||
|
<legend>ENT</legend>
|
||||||
|
</button>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<text><label>FMS</label></text>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<layout>hbox</layout>
|
||||||
|
<halign>center</halign>
|
||||||
|
<default-padding>0</default-padding>
|
||||||
|
<!-- FMS controller -->
|
||||||
|
<button>
|
||||||
|
<name>fms-decr-large</name>
|
||||||
|
<legend><<</legend>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<binding>
|
||||||
|
<command>property-assign</command>
|
||||||
|
<property>/sim/gui/dialogs/fg1000/fms-decr-large-pressed</property>
|
||||||
|
<value>1</value>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<name>fms-decr-small</name>
|
||||||
|
<legend><</legend>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<binding>
|
||||||
|
<command>property-assign</command>
|
||||||
|
<property>/sim/gui/dialogs/fg1000/fms-decr-small-pressed</property>
|
||||||
|
<value>1</value>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<name>fms-incr-small</name>
|
||||||
|
<legend>></legend>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<binding>
|
||||||
|
<command>property-assign</command>
|
||||||
|
<property>/sim/gui/dialogs/fg1000/fms-incr-small-pressed</property>
|
||||||
|
<value>1</value>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
<button>
|
||||||
|
<name>fms-incr-large</name>
|
||||||
|
<legend>>></legend>
|
||||||
|
<pref-width>25</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
<binding>
|
||||||
|
<command>property-assign</command>
|
||||||
|
<property>/sim/gui/dialogs/fg1000/fms-incr-large-pressed</property>
|
||||||
|
<value>1</value>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<name>crsr</name>
|
||||||
|
<legend>CRSR</legend>
|
||||||
|
<pref-width>50</pref-width>
|
||||||
|
<pref-height>25</pref-height>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
</PropertyList>
|
|
@ -821,6 +821,14 @@
|
||||||
</binding>
|
</binding>
|
||||||
</item>
|
</item>
|
||||||
|
|
||||||
|
<item>
|
||||||
|
<name>fg1000</name>
|
||||||
|
<binding>
|
||||||
|
<command>dialog-show</command>
|
||||||
|
<dialog-name>fg1000</dialog-name>
|
||||||
|
</binding>
|
||||||
|
</item>
|
||||||
|
|
||||||
<item>
|
<item>
|
||||||
<name>logging</name>
|
<name>logging</name>
|
||||||
<binding>
|
<binding>
|
||||||
|
|
Loading…
Reference in a new issue