FG1000 - PFD Flightplan and improved GroupElement
This commit is contained in:
parent
82417eb962
commit
60352375d0
8 changed files with 757 additions and 158 deletions
|
@ -23,9 +23,9 @@
|
|||
borderopacity="0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="3.2473958"
|
||||
inkscape:cx="817.98224"
|
||||
inkscape:cy="351.10971"
|
||||
inkscape:zoom="2.2962556"
|
||||
inkscape:cx="913.04869"
|
||||
inkscape:cy="547.52243"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="DirectToGroup"
|
||||
showgrid="true"
|
||||
|
@ -89,7 +89,7 @@
|
|||
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
</g>
|
||||
<path
|
||||
style="opacity:1;fill:#4b4b4b;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
style="opacity:1;fill:#181818;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m 698.99609,58.498047 0,684.503903 325.00391,0 0,-684.503903 -325.00391,0 z M 705.5,279.93359 l 314.4277,0 0,322.2793 -314.4277,0 0,-322.2793 z"
|
||||
id="rect4230"
|
||||
inkscape:connector-curvature="0" />
|
||||
|
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
443
Aircraft/Instruments-3d/FG1000/MFDPages/FlightPlanPFD.svg
Normal file
443
Aircraft/Instruments-3d/FG1000/MFDPages/FlightPlanPFD.svg
Normal file
|
@ -0,0 +1,443 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="1024px"
|
||||
height="768px"
|
||||
viewBox="0 0 1024 768"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="FlightPlanPFD.svg">
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#ffffff"
|
||||
borderopacity="0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="6.4947916"
|
||||
inkscape:cx="924.63427"
|
||||
inkscape:cy="149.93595"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="PFDInstrumentsFlightPlanGroup"
|
||||
showgrid="true"
|
||||
inkscape:window-width="2495"
|
||||
inkscape:window-height="1416"
|
||||
inkscape:window-x="65"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:snap-global="true"
|
||||
inkscape:snap-grids="true"
|
||||
inkscape:snap-bbox="true"
|
||||
inkscape:snap-others="true"
|
||||
inkscape:snap-to-guides="true"
|
||||
inkscape:bbox-paths="false"
|
||||
inkscape:snap-nodes="true"
|
||||
inkscape:snap-page="true"
|
||||
inkscape:bbox-nodes="true">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid4269" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs7962" />
|
||||
<metadata
|
||||
id="metadata7965">
|
||||
<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:groupmode="layer"
|
||||
id="layer3"
|
||||
inkscape:label="DirectToGroup">
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot4639"
|
||||
style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Sans;font-style:normal;font-weight:normal;font-size:20px;line-height:125%;letter-spacing:0px;word-spacing:0px;-inkscape-font-specification:Sans;font-stretch:normal;font-variant:normal;text-anchor:start;text-align:start;writing-mode:lr"><flowRegion
|
||||
id="flowRegion4641"><rect
|
||||
id="rect4643"
|
||||
width="330"
|
||||
height="50"
|
||||
x="695"
|
||||
y="583" /></flowRegion><flowPara
|
||||
id="flowPara4645" /></flowRoot> <g
|
||||
id="PFDInstrumentsFlightPlanGroup"
|
||||
inkscape:label="#g4725"
|
||||
transform="translate(-7.55824,-21.00195)">
|
||||
<path
|
||||
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m 728.55824,510.55258 0,218.90005 295.44176,0 0,-218.90005 z"
|
||||
id="rect4230"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="PFDInstrumentsFlightPlanName"
|
||||
y="552.80469"
|
||||
x="771.37695"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
xml:space="preserve"
|
||||
inkscape:label="#text4170"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4394"
|
||||
x="771.37695"
|
||||
y="552.80469">FLIGHT PLAN NAME</tspan></text>
|
||||
<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:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:#fffcfa;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="876.27911"
|
||||
y="527.35352"
|
||||
id="text3449"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4392"
|
||||
x="876.27911"
|
||||
y="527.35352">FLIGHT PLAN</tspan></text>
|
||||
<text
|
||||
inkscape:label="#text4166"
|
||||
sodipodi:linespacing="125%"
|
||||
id="text3565"
|
||||
y="578.64453"
|
||||
x="963.65234"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
xml:space="preserve"><tspan
|
||||
y="578.64453"
|
||||
x="963.65234"
|
||||
id="tspan3567"
|
||||
sodipodi:role="line">DIS</tspan></text>
|
||||
<text
|
||||
inkscape:label="#text4166"
|
||||
sodipodi:linespacing="125%"
|
||||
id="text58395"
|
||||
y="578.83984"
|
||||
x="886.40588"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
xml:space="preserve"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4424"
|
||||
x="886.40588"
|
||||
y="578.83984">DTK</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 735,533 280,0"
|
||||
id="path58399"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path58401"
|
||||
d="m 735,558.5 280,0"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<rect
|
||||
style="opacity:1;fill:#c0c0c0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="PFDInstrumentsFlightPlanScrollTrough"
|
||||
width="4.718811"
|
||||
height="150"
|
||||
x="1012.5582"
|
||||
y="569.00195"
|
||||
inkscape:label="#rect4267" />
|
||||
<rect
|
||||
y="569.00195"
|
||||
x="1012.5582"
|
||||
height="30"
|
||||
width="5"
|
||||
id="PFDInstrumentsFlightPlanScrollThumb"
|
||||
style="opacity:1;fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
inkscape:label="#rect4269" />
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="PFDInstrumentsFlightPlanID0"
|
||||
y="602.58008"
|
||||
x="757.28516"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
xml:space="preserve"
|
||||
inkscape:label="#text4170"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4444"
|
||||
x="757.28516"
|
||||
y="602.58008">WP1</tspan></text>
|
||||
<text
|
||||
inkscape:label="#text4170"
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';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="826.5849"
|
||||
y="602.04297"
|
||||
id="PFDInstrumentsFlightPlanType0"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
y="602.04297"
|
||||
x="826.5849"
|
||||
id="tspan4485"
|
||||
sodipodi:role="line">type</tspan></text>
|
||||
<text
|
||||
inkscape:label="#text4170"
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="889.84338"
|
||||
y="602.58008"
|
||||
id="PFDInstrumentsFlightPlanDTK0"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
y="602.58008"
|
||||
x="889.84338"
|
||||
id="tspan4489"
|
||||
sodipodi:role="line">WP1</tspan></text>
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="PFDInstrumentsFlightPlanDIS0"
|
||||
y="602.58008"
|
||||
x="1001.8555"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
xml:space="preserve"
|
||||
inkscape:label="#text4170"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4493"
|
||||
x="1001.8555"
|
||||
y="602.58008">WP1</tspan></text>
|
||||
<text
|
||||
inkscape:label="#text4170"
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="759.33594"
|
||||
y="628.93506"
|
||||
id="PFDInstrumentsFlightPlanID1"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
y="628.93506"
|
||||
x="759.33594"
|
||||
id="tspan4649"
|
||||
sodipodi:role="line">WP1</tspan></text>
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="PFDInstrumentsFlightPlanType1"
|
||||
y="628.39795"
|
||||
x="828.63568"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';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"
|
||||
inkscape:label="#text4170"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4653"
|
||||
x="828.63568"
|
||||
y="628.39795">type</tspan></text>
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="PFDInstrumentsFlightPlanDTK1"
|
||||
y="628.93506"
|
||||
x="891.89417"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
xml:space="preserve"
|
||||
inkscape:label="#text4170"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4657"
|
||||
x="891.89417"
|
||||
y="628.93506">WP1</tspan></text>
|
||||
<text
|
||||
inkscape:label="#text4170"
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="1003.9063"
|
||||
y="628.93506"
|
||||
id="PFDInstrumentsFlightPlanDIS1"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
y="628.93506"
|
||||
x="1003.9063"
|
||||
id="tspan4661"
|
||||
sodipodi:role="line">WP1</tspan></text>
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="PFDInstrumentsFlightPlanID2"
|
||||
y="655.29004"
|
||||
x="759.33594"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
xml:space="preserve"
|
||||
inkscape:label="#text4170"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4665"
|
||||
x="759.33594"
|
||||
y="655.29004">WP1</tspan></text>
|
||||
<text
|
||||
inkscape:label="#text4170"
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';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="828.63568"
|
||||
y="654.75293"
|
||||
id="PFDInstrumentsFlightPlanType2"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
y="654.75293"
|
||||
x="828.63568"
|
||||
id="tspan4669"
|
||||
sodipodi:role="line">type</tspan></text>
|
||||
<text
|
||||
inkscape:label="#text4170"
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="891.89417"
|
||||
y="655.29004"
|
||||
id="PFDInstrumentsFlightPlanDTK2"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
y="655.29004"
|
||||
x="891.89417"
|
||||
id="tspan4673"
|
||||
sodipodi:role="line">WP1</tspan></text>
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="PFDInstrumentsFlightPlanDIS2"
|
||||
y="655.29004"
|
||||
x="1003.9063"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
xml:space="preserve"
|
||||
inkscape:label="#text4170"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4677"
|
||||
x="1003.9063"
|
||||
y="655.29004">WP1</tspan></text>
|
||||
<text
|
||||
inkscape:label="#text4170"
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="759.33594"
|
||||
y="681.64502"
|
||||
id="PFDInstrumentsFlightPlanID3"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
y="681.64502"
|
||||
x="759.33594"
|
||||
id="tspan4681"
|
||||
sodipodi:role="line">WP1</tspan></text>
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="PFDInstrumentsFlightPlanType3"
|
||||
y="681.10791"
|
||||
x="828.63568"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';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"
|
||||
inkscape:label="#text4170"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4685"
|
||||
x="828.63568"
|
||||
y="681.10791">type</tspan></text>
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="PFDInstrumentsFlightPlanDTK3"
|
||||
y="681.64502"
|
||||
x="891.89417"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
xml:space="preserve"
|
||||
inkscape:label="#text4170"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4689"
|
||||
x="891.89417"
|
||||
y="681.64502">WP1</tspan></text>
|
||||
<text
|
||||
inkscape:label="#text4170"
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="1003.9063"
|
||||
y="681.64502"
|
||||
id="PFDInstrumentsFlightPlanDIS3"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
y="681.64502"
|
||||
x="1003.9063"
|
||||
id="tspan4693"
|
||||
sodipodi:role="line">WP1</tspan></text>
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="PFDInstrumentsFlightPlanID4"
|
||||
y="708"
|
||||
x="759.33594"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
xml:space="preserve"
|
||||
inkscape:label="#text4170"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4697"
|
||||
x="759.33594"
|
||||
y="708">WP1</tspan></text>
|
||||
<text
|
||||
inkscape:label="#text4170"
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';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="828.63568"
|
||||
y="707.46289"
|
||||
id="PFDInstrumentsFlightPlanType4"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
y="707.46289"
|
||||
x="828.63568"
|
||||
id="tspan4701"
|
||||
sodipodi:role="line">type</tspan></text>
|
||||
<text
|
||||
inkscape:label="#text4170"
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="891.89417"
|
||||
y="708"
|
||||
id="PFDInstrumentsFlightPlanDTK4"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
y="708"
|
||||
x="891.89417"
|
||||
id="tspan4705"
|
||||
sodipodi:role="line">WP1</tspan></text>
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="PFDInstrumentsFlightPlanDIS4"
|
||||
y="708"
|
||||
x="1003.9063"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
xml:space="preserve"
|
||||
inkscape:label="#text4170"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4709"
|
||||
x="1003.9063"
|
||||
y="708">WP1</tspan></text>
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4713"
|
||||
d="m 755,593 -5,5"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:label="#path4715"
|
||||
sodipodi:nodetypes="cccccccccccccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="PFDInstrumentsFlightPlanArrow1"
|
||||
d="m 753.96071,593 -12.88292,0.0385 -5.07699,5.03849 0.11548,20.88533 L 740,623 l 9.11468,0 0,3 5,-5 -4.84603,-4.72975 -0.077,2.73055 -6.23175,2e-5 -2.99841,-2.9984 0.077,-16.00481 3.07538,-2.9214 10.84684,-3e-5 0,-4.07618"
|
||||
style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 754.84603,568 -12.88292,0.0385 -5.07699,5.03849 0.11548,20.88533 3.88372,4.03768 9.11468,0 0,3 5,-5 -4.84603,-4.72975 -0.077,2.73055 -6.23175,2e-5 -2.99841,-2.9984 0.077,-16.00481 3.07538,-2.9214 10.84684,-3e-5 0,-4.07618"
|
||||
id="PFDInstrumentsFlightPlanArrow0"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccccccccccccc"
|
||||
inkscape:label="#path4715" />
|
||||
<path
|
||||
style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 753.96071,620 -12.88292,0.0385 -5.07699,5.03849 0.11548,20.88533 L 740,650 l 9.11468,0 0,3 5,-5 -4.84603,-4.72975 -0.077,2.73055 -6.23175,2e-5 -2.99841,-2.9984 0.077,-16.00481 3.07538,-2.9214 10.84684,-3e-5 0,-4.07618"
|
||||
id="PFDInstrumentsFlightPlanArrow2"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccccccccccccc"
|
||||
inkscape:label="#path4715" />
|
||||
<path
|
||||
inkscape:label="#path4715"
|
||||
sodipodi:nodetypes="cccccccccccccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="PFDInstrumentsFlightPlanArrow3"
|
||||
d="m 753.96071,647 -12.88292,0.0385 -5.07699,5.03849 0.11548,20.88533 L 740,677 l 9.11468,0 0,3 5,-5 -4.84603,-4.72975 -0.077,2.73055 -6.23175,2e-5 -2.99841,-2.9984 0.077,-16.00481 3.07538,-2.9214 10.84684,-3e-5 0,-4.07618"
|
||||
style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 753.96071,674 -12.88292,0.0385 -5.07699,5.03849 0.11548,20.88533 L 740,704 l 9.11468,0 0,3 5,-5 -4.84603,-4.72975 -0.077,2.73055 -6.23175,2e-5 -2.99841,-2.9984 0.077,-16.00481 3.07538,-2.9214 10.84684,-3e-5 0,-4.07618"
|
||||
id="PFDInstrumentsFlightPlanArrow4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccccccccccccc"
|
||||
inkscape:label="#path4715" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 24 KiB |
|
@ -22,84 +22,109 @@ var GenericFMSPublisher =
|
|||
var obj = {
|
||||
parents : [
|
||||
GenericFMSPublisher,
|
||||
PeriodicPropertyPublisher.new(notifications.PFDEventNotification.FMSData, frequency)
|
||||
],
|
||||
};
|
||||
|
||||
obj.addPropMap("FMSHeadingBug", "/autopilot/settings/heading-bug-deg");
|
||||
obj.addPropMap("FMSSelectedAlt", "/autopilot/settings/target-alt-ft");
|
||||
# We have two publishers here:
|
||||
#
|
||||
# 1) a triggered publisher for properties that will change ocassionally, but which
|
||||
# we need to update immediately. These are typically settings.
|
||||
#
|
||||
# 2) a periodic publisher which triggers every 0.5s to update data values.
|
||||
obj._triggeredPublisher = TriggeredPropertyPublisher.new(notifications.PFDEventNotification.FMSData);
|
||||
obj._periodicPublisher = PeriodicPropertyPublisher.new(notifications.PFDEventNotification.FMSData, frequency);
|
||||
|
||||
obj.addPropMap("FMSMode", "/instrumentation/gps/mode");
|
||||
obj.addPropMap("FMSLegValid", "/instrumentation/gps/wp/wp[1]/valid");
|
||||
obj.addPropMap("FMSPreviousLegID", "/instrumentation/gps/wp/wp[0]/ID");
|
||||
obj.addPropMap("FMSLegID", "/instrumentation/gps/wp/wp[1]/ID");
|
||||
obj.addPropMap("FMSLegBearingMagDeg", "/instrumentation/gps/wp/wp[1]/bearing-mag-deg");
|
||||
obj.addPropMap("FMSLegDistanceNM", "/instrumentation/gps/wp/wp[1]/distance-nm");
|
||||
obj.addPropMap("FMSLegCourseError", "/instrumentation/gps/wp/wp[1]/course-error-nm");
|
||||
obj.addPropMap("FMSLegDesiredTrack", "/instrumentation/gps/wp/wp[1]/desired-course-deg");
|
||||
obj.addPropMap("FMSLegTrackErrorAngle", "/instrumentation/gps/wp/wp[1]/course-deviation-deg");
|
||||
obj.addPropMap("FMSWayPointCourseError", "/instrumentation/gps/wp/wp[1]/course-error-nm");
|
||||
obj._triggeredPublisher.addPropMap("FMSHeadingBug", "/autopilot/settings/heading-bug-deg");
|
||||
obj._triggeredPublisher.addPropMap("FMSSelectedAlt", "/autopilot/settings/target-alt-ft");
|
||||
obj._triggeredPublisher.addPropMap("FMSFlightPlanActive", "/autopilot/route-manager/active");
|
||||
obj._triggeredPublisher.addPropMap("FMSFlightPlanCurrentWP", "/autopilot/route-manager/current-wp");
|
||||
obj._triggeredPublisher.addPropMap("FMSFlightPlanSequenced", "/autopilot/route-manager/signals/sequenced");
|
||||
obj._triggeredPublisher.addPropMap("FMSFlightPlanFinished", "/autopilot/route-manager/signals/finished");
|
||||
obj._triggeredPublisher.addPropMap("FMSFlightPlanEdited", "/autopilot/route-manager/signals/edited");
|
||||
|
||||
obj.addPropMap("FMSGroundspeed", "/instrumentation/gps/indicated-ground-speed-kt");
|
||||
obj._triggeredPublisher.addPropMap("FMSMode", "/instrumentation/gps/mode");
|
||||
|
||||
obj.addPropMap("FMSNav1From", "/instrumentation/nav/from-flag");
|
||||
obj.addPropMap("FMSNav2From", "/instrumentation/nav[1]/from-flag");
|
||||
obj._periodicPublisher.addPropMap("FMSLegValid", "/instrumentation/gps/wp/wp[1]/valid");
|
||||
obj._periodicPublisher.addPropMap("FMSPreviousLegID", "/instrumentation/gps/wp/wp[0]/ID");
|
||||
obj._periodicPublisher.addPropMap("FMSLegID", "/instrumentation/gps/wp/wp[1]/ID");
|
||||
obj._periodicPublisher.addPropMap("FMSLegBearingMagDeg", "/instrumentation/gps/wp/wp[1]/bearing-mag-deg");
|
||||
obj._periodicPublisher.addPropMap("FMSLegDistanceNM", "/instrumentation/gps/wp/wp[1]/distance-nm");
|
||||
obj._periodicPublisher.addPropMap("FMSLegCourseError", "/instrumentation/gps/wp/wp[1]/course-error-nm");
|
||||
obj._periodicPublisher.addPropMap("FMSLegDesiredTrack", "/instrumentation/gps/wp/wp[1]/desired-course-deg");
|
||||
obj._periodicPublisher.addPropMap("FMSLegTrackErrorAngle", "/instrumentation/gps/wp/wp[1]/course-deviation-deg");
|
||||
obj._periodicPublisher.addPropMap("FMSWayPointCourseError", "/instrumentation/gps/wp/wp[1]/course-error-nm");
|
||||
|
||||
obj._periodicPublisher.addPropMap("FMSGroundspeed", "/instrumentation/gps/indicated-ground-speed-kt");
|
||||
|
||||
obj._periodicPublisher.addPropMap("FMSNav1From", "/instrumentation/nav/from-flag");
|
||||
obj._periodicPublisher.addPropMap("FMSNav2From", "/instrumentation/nav[1]/from-flag");
|
||||
|
||||
# Custom publish method as we need to calculate some particular values manually.
|
||||
obj._periodicPublisher.publish = func() {
|
||||
var gpsdata = {};
|
||||
|
||||
foreach (var propmap; me._propmaps) {
|
||||
var name = propmap.getName();
|
||||
gpsdata[name] = propmap.getValue();
|
||||
}
|
||||
|
||||
# Some GPS properties have odd values to indicate that nothing is set, so
|
||||
# remove them from the data set.
|
||||
if (gpsdata["FMSLegBearingMagDeg"] == -9999) gpsdata["FMSLegBearingMagDeg"] = nil;
|
||||
if (gpsdata["FMSLegDistanceNM"] == -1) gpsdata["FMSLegDistanceNM"] = nil;
|
||||
|
||||
# A couple of calculated values used by the MFD Header display
|
||||
var total_fuel = getprop("/consumables/fuel/tank[0]/indicated-level-gal_us") or 0.0;
|
||||
total_fuel = total_fuel + (getprop("/consumables/fuel/tank[1]/indicated-level-gal_us") or 0.0);
|
||||
var fuel_flow = getprop("/engines/engine[0]/fuel-flow-gph") or 1.0;
|
||||
gpsdata["FuelOnBoard"] = total_fuel;
|
||||
gpsdata["EnduranceHrs"] = total_fuel / fuel_flow;
|
||||
|
||||
var plan = flightplan();
|
||||
|
||||
var dst = 0.0;
|
||||
if (plan.getPlanSize() > 0) {
|
||||
# Determine the distance to travel, based on
|
||||
# - current distance to the next WP,
|
||||
# - length of each subsequent leg.
|
||||
dst = getprop("/instrumentation/gps/wp/wp[1]/distance-nm") or 0.0;
|
||||
|
||||
if (plan.indexOfWP(plan.currentWP()) < (plan.getPlanSize() -1)) {
|
||||
for(var i=plan.indexOfWP(plan.currentWP()) + 1; i < plan.getPlanSize(); i = i+1) {
|
||||
var leg = plan.getWP(i);
|
||||
if (leg != nil ) dst = dst + leg.leg_distance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gpsdata["FMSDistance"] = dst;
|
||||
var spd = getprop("/instrumentation/gps/indicated-ground-speed-kt") or 1.0;
|
||||
var time_hrs = dst / spd;
|
||||
|
||||
gpsdata["FMSEstimatedTimeEnroute"] = time_hrs;
|
||||
gpsdata["FMSFuelOverDestination"] = total_fuel - time_hrs * fuel_flow;
|
||||
|
||||
var notification = notifications.PFDEventNotification.new(
|
||||
"MFD",
|
||||
1,
|
||||
notifications.PFDEventNotification.FMSData,
|
||||
gpsdata);
|
||||
|
||||
me._transmitter.NotifyAll(notification);
|
||||
};
|
||||
|
||||
return obj;
|
||||
},
|
||||
|
||||
# Custom publish method as we need to calculate some particular values manually.
|
||||
publish : func() {
|
||||
var gpsdata = {};
|
||||
|
||||
foreach (var propmap; me._propmaps) {
|
||||
var name = propmap.getName();
|
||||
gpsdata[name] = propmap.getValue();
|
||||
}
|
||||
|
||||
# Some GPS properties have odd values to indicate that nothing is set, so
|
||||
# remove them from the data set.
|
||||
if (gpsdata["FMSLegBearingMagDeg"] == -9999) gpsdata["FMSLegBearingMagDeg"] = nil;
|
||||
if (gpsdata["FMSLegDistanceNM"] == -1) gpsdata["FMSLegDistanceNM"] = nil;
|
||||
|
||||
# A couple of calculated values used by the MFD Header display
|
||||
var total_fuel = getprop("/consumables/fuel/tank[0]/indicated-level-gal_us") or 0.0;
|
||||
total_fuel = total_fuel + (getprop("/consumables/fuel/tank[1]/indicated-level-gal_us") or 0.0);
|
||||
var fuel_flow = getprop("/engines/engine[0]/fuel-flow-gph") or 1.0;
|
||||
gpsdata["FuelOnBoard"] = total_fuel;
|
||||
gpsdata["EnduranceHrs"] = total_fuel / fuel_flow;
|
||||
|
||||
var plan = flightplan();
|
||||
|
||||
var dst = 0.0;
|
||||
if (plan.getPlanSize() > 0) {
|
||||
# Determine the distance to travel, based on
|
||||
# - current distance to the next WP,
|
||||
# - length of each subsequent leg.
|
||||
dst = getprop("/instrumentation/gps/wp/wp[1]/distance-nm") or 0.0;
|
||||
|
||||
if (plan.indexOfWP(plan.currentWP()) < (plan.getPlanSize() -1)) {
|
||||
for(var i=plan.indexOfWP(plan.currentWP()) + 1; i < plan.getPlanSize(); i = i+1) {
|
||||
var leg = plan.getWP(i);
|
||||
if (leg != nil ) dst = dst + leg.leg_distance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gpsdata["FMSDistance"] = dst;
|
||||
var spd = getprop("/instrumentation/gps/indicated-ground-speed-kt") or 1.0;
|
||||
var time_hrs = dst / spd;
|
||||
|
||||
gpsdata["FMSEstimatedTimeEnroute"] = time_hrs;
|
||||
gpsdata["FMSFuelOverDestination"] = total_fuel - time_hrs * fuel_flow;
|
||||
|
||||
var notification = notifications.PFDEventNotification.new(
|
||||
"MFD",
|
||||
1,
|
||||
notifications.PFDEventNotification.FMSData,
|
||||
gpsdata);
|
||||
|
||||
me._transmitter.NotifyAll(notification);
|
||||
start : func() {
|
||||
me._triggeredPublisher.start();
|
||||
me._periodicPublisher.start();
|
||||
},
|
||||
|
||||
stop : func() {
|
||||
me._triggeredPublisher.stop();
|
||||
me._periodicPublisher.stop();
|
||||
},
|
||||
|
||||
|
||||
};
|
||||
|
|
|
@ -131,7 +131,7 @@ var TriggeredPropertyPublisher =
|
|||
# Set up a listener triggering on create (to ensure all values are set at
|
||||
# start of day) and only on changed values. These are the last two
|
||||
# arguments to the setlistener call.
|
||||
var listener = setlistener(prop, func(p) { me.publish(p); }, 1, 0);
|
||||
var listener = setlistener(prop, func(p) { me.publish(p); }, 1, 1);
|
||||
append(me._listeners, listener);
|
||||
}
|
||||
},
|
||||
|
|
|
@ -81,7 +81,18 @@ var PFDInstruments =
|
|||
obj._SVGGroup.setInt("z-index", 10);
|
||||
obj.insetMap = fg1000.NavMap.new(obj, obj.getElement("PFD-Map-Display"), [119,601], "rect(-109px, 109px, 109px, -109px)", 0, 2);
|
||||
|
||||
#obj.topMenu(device, obj, nil);
|
||||
# Flight Plan Window group
|
||||
obj.flightplanList = PFD.GroupElement.new(
|
||||
obj.pageName,
|
||||
svg,
|
||||
[ "FlightPlanArrow", "FlightPlanID", "FlightPlanType", "FlightPlanDTK", "FlightPlanDIS"],
|
||||
5,
|
||||
"FlightPlanArrow",
|
||||
1,
|
||||
"FlightPlanScrollTrough",
|
||||
"FlightPlanScrollThumb",
|
||||
120
|
||||
);
|
||||
|
||||
obj.setController(fg1000.PFDInstrumentsController.new(obj, svg));
|
||||
obj.setWindDisplay(0);
|
||||
|
@ -97,6 +108,7 @@ var PFDInstruments =
|
|||
obj.updateHDG(0);
|
||||
obj.updateSelectedALT(0);
|
||||
obj.updateCRS(0);
|
||||
obj.setFlightPlanVisible(0);
|
||||
|
||||
return obj;
|
||||
},
|
||||
|
@ -705,4 +717,64 @@ var PFDInstruments =
|
|||
me.getElement("PFD-Map-bg").setVisible(enabled);
|
||||
me.insetMap.setVisible(enabled);
|
||||
},
|
||||
|
||||
setFlightPlanVisible : func(enabled) {
|
||||
me.getElement("FlightPlanGroup").setVisible(enabled);
|
||||
},
|
||||
|
||||
# Update the FlightPlan display with an updated flightplan.
|
||||
setFlightPlan : func(fp) {
|
||||
var elements = [];
|
||||
|
||||
if (fp == nil) return;
|
||||
|
||||
for (var i = 0; i < fp.getPlanSize(); i = i + 1) {
|
||||
var wp = fp.getWP(i);
|
||||
|
||||
var element = {
|
||||
FlightPlanArrow : 0,
|
||||
FlightPlanID : "",
|
||||
FlightPlanType : "",
|
||||
FlightPlanDTK : 0,
|
||||
FlightPlanDIS : 0
|
||||
};
|
||||
|
||||
if (wp.wp_name != nil) element.FlightPlanID = substr(wp.wp_name, 0, 7);
|
||||
if (wp.wp_role != nil) element.FlightPlanType = substr(wp.wp_role, 0, 4);
|
||||
if (wp.leg_distance != nil) element.FlightPlanDIS = sprintf("%.1fnm", wp.leg_distance);
|
||||
if (wp.leg_bearing != nil) element.FlightPlanDTK = sprintf("%03d°", wp.leg_bearing);
|
||||
append(elements, element);
|
||||
}
|
||||
|
||||
me.flightplanList.setValues(elements);
|
||||
|
||||
# Determine a suitable name to display, using the flightplan name if there is one,
|
||||
# but falling back to the flightplan departure / destination airports, or failing
|
||||
# that the IDs of the first and last waypoints.
|
||||
if (fp.id == nil) {
|
||||
var from = "????";
|
||||
var dest = "????";
|
||||
|
||||
if ((fp.getWP(0) != nil) and (fp.getWP(0).wp_name != nil)) {
|
||||
from = fp.getWP(0).wp_name;
|
||||
}
|
||||
|
||||
if ((fp.getWP(fp.getPlanSize() -1) != nil) and (fp.getWP(fp.getPlanSize() -1).wp_name != nil)) {
|
||||
dest = fp.getWP(fp.getPlanSize() -1).wp_name;
|
||||
}
|
||||
|
||||
if (fp.departure != nil) from = fp.departure.id;
|
||||
if (fp.destination != nil) dest = fp.destination.id;
|
||||
me.getElement("FlightPlanName").setText(from ~ " / " ~ dest);
|
||||
} else {
|
||||
me.getElement("FlightPlanName").setText(fp.id);
|
||||
}
|
||||
},
|
||||
|
||||
# Update the FlightPlan display to indicate the current waypoint
|
||||
updateFlightPlan : func(current_wp) {
|
||||
if (current_wp == -1) return;
|
||||
me.flightplanList.setCRSR(current_wp);
|
||||
me.flightplanList.displayGroup();
|
||||
},
|
||||
};
|
||||
|
|
|
@ -37,9 +37,14 @@ var PFDInstrumentsController =
|
|||
_last_alt_ft : 0,
|
||||
_last_trend : systime(),
|
||||
_selected_alt_ft : 0,
|
||||
_heading : 0,
|
||||
_heading_magnetic_deg : 0,
|
||||
_mag_var : 0,
|
||||
|
||||
_fp_active : 0,
|
||||
_fp_current_wp : 0,
|
||||
_current_flightplan : nil,
|
||||
_fp_visible : 0,
|
||||
|
||||
_leg_from :0,
|
||||
_leg_id : "",
|
||||
_leg_bearing : 0,
|
||||
|
@ -78,6 +83,12 @@ var PFDInstrumentsController =
|
|||
_adf_heading_deg : 0.0,
|
||||
};
|
||||
|
||||
obj._current_flightplan = obj.getNavData("Flightplan");
|
||||
if (obj._current_flightplan != nil) {
|
||||
obj._fp_current_wp = obj._current_flightplan.current;
|
||||
obj.page.setFlightPlan(obj._current_flightplan);
|
||||
}
|
||||
|
||||
return obj;
|
||||
},
|
||||
|
||||
|
@ -239,6 +250,37 @@ var PFDInstrumentsController =
|
|||
if (data["FMSLegCourseError"] != nil) me._deflection_dots = data["FMSLegCourseError"] /2.0;
|
||||
if (data["FMSLegCourseError"] != nil) me._leg_xtrk_nm = data["FMSLegCourseError"];
|
||||
|
||||
var update_fp = 0;
|
||||
|
||||
if (data["FMSFlightPlanEdited"] != nil) {
|
||||
# The flightplan has changed in some way, so reload it.
|
||||
update_fp = 1;
|
||||
}
|
||||
|
||||
if ((data["FMSFlightPlanActive"] != nil) and (data["FMSFlightPlanActive"] != me._fp_active)) {
|
||||
me._fp_active = data["FMSFlightPlanActive"];
|
||||
me.page.setFlightPlanVisible(me._fp_active);
|
||||
update_fp = 1;
|
||||
}
|
||||
|
||||
if ((data["FMSFlightPlanCurrentWP"] != nil) and (data["FMSFlightPlanCurrentWP"] != me._fp_current_wp)) {
|
||||
me._fp_current_wp = data["FMSFlightPlanCurrentWP"];
|
||||
update_fp = 1;
|
||||
}
|
||||
|
||||
if (update_fp and me._fp_active) {
|
||||
# For some reason the signals to indicate a FP change aren't firing, so reload the
|
||||
# flightplan here
|
||||
me._current_flightplan = me.getNavData("Flightplan");
|
||||
if (me._current_flightplan != nil) {
|
||||
me._fp_current_wp = me._current_flightplan.current;
|
||||
me.page.setFlightPlan(me._current_flightplan);
|
||||
update_fp = 1;
|
||||
}
|
||||
|
||||
me.page.updateFlightPlan(me._fp_current_wp);
|
||||
}
|
||||
|
||||
if (me.getCDISource() == "GPS") {
|
||||
if (me._leg_valid == 0) {
|
||||
# No valid leg data, likely because there's no GPS course set
|
||||
|
@ -357,6 +399,24 @@ var PFDInstrumentsController =
|
|||
return emesary.Transmitter.ReceiptStatus_OK;
|
||||
},
|
||||
|
||||
getNavData : func(type, value=nil) {
|
||||
# Use Emesary to get a piece from the NavData system, using the provided
|
||||
# type and value;
|
||||
var notification = notifications.PFDEventNotification.new(
|
||||
"MFD",
|
||||
me._page.mfd.getDeviceID(),
|
||||
notifications.PFDEventNotification.NavData,
|
||||
{Id: type, Value: value});
|
||||
|
||||
var response = me._transmitter.NotifyAll(notification);
|
||||
|
||||
if (! me._transmitter.IsFailed(response)) {
|
||||
return notification.EventParameter.Value;
|
||||
} else {
|
||||
return nil;
|
||||
}
|
||||
},
|
||||
|
||||
PFDRegisterWithEmesary : func(transmitter = nil){
|
||||
if (transmitter == nil)
|
||||
transmitter = emesary.GlobalTransmitter;
|
||||
|
|
|
@ -61,6 +61,11 @@ var PFDDisplay =
|
|||
'/Aircraft/Instruments-3d/FG1000/MFDPages/PFDInstruments.svg',
|
||||
{'font-mapper': fontmapper});
|
||||
|
||||
canvas.parsesvg(obj._svg,
|
||||
'/Aircraft/Instruments-3d/FG1000/MFDPages/FlightPlanPFD.svg',
|
||||
{'font-mapper': fontmapper});
|
||||
|
||||
|
||||
canvas.parsesvg(obj._svg,
|
||||
'/Aircraft/Instruments-3d/FG1000/MFDPages/DirectToPFD.svg',
|
||||
{'font-mapper': fontmapper});
|
||||
|
|
|
@ -20,9 +20,6 @@ new : func (pageName, svg, elementNames, size, highlightElement, arrow=0, scroll
|
|||
# must be an SVG Element [pageName][elementName]{0...pageSize}
|
||||
_size : size,
|
||||
|
||||
# Current size of the selectable elements.
|
||||
_currentSize : 0,
|
||||
|
||||
# ElementName to be highlighted. Must be an hash value from ._elementNames
|
||||
_highlightElement : highlightElement,
|
||||
|
||||
|
@ -39,13 +36,14 @@ new : func (pageName, svg, elementNames, size, highlightElement, arrow=0, scroll
|
|||
# List of SVG elements to display the values
|
||||
_elements : [],
|
||||
|
||||
# Cursor index into the elements array
|
||||
# Cursor index into the _values array
|
||||
_crsrIndex : 0,
|
||||
|
||||
# Whether the CRSR is enabled
|
||||
_crsrEnabled : 0,
|
||||
|
||||
# Page index
|
||||
# Page index - which _values index element[0] refers to. The currently
|
||||
# selected _element has index (_crsrIndex - _pageIndex)
|
||||
_pageIndex : 0,
|
||||
};
|
||||
|
||||
|
@ -97,64 +95,64 @@ setValues : func (values_array) {
|
|||
me._scrollTroughElement.setVisible(0);
|
||||
}
|
||||
|
||||
me.displayPage();
|
||||
me.displayGroup();
|
||||
},
|
||||
|
||||
nextPage : func() {
|
||||
if (size(me._values) > ((me._pageIndex +1) * me._size)) {
|
||||
me._pageIndex = me._pageIndex + 1;
|
||||
me._crsrIndex = 0;
|
||||
me.displayPage();
|
||||
} else {
|
||||
me._crsrIndex = me._currentSize -1;
|
||||
displayGroup : func () {
|
||||
|
||||
# The _crsrIndex element should be displayed as close to the middle of the
|
||||
# group as possible. So as the user scrolls the list appears to move around
|
||||
# a static cursor position.
|
||||
#
|
||||
# The exceptions to this is as the _crsrIndex approaches the ends of the list.
|
||||
# In these cases, we let the cursor move to the top or bottom of the list.
|
||||
|
||||
# Determine the middle element
|
||||
var middle_element_index = int(me._size / 2);
|
||||
me._pageIndex = me._crsrIndex - middle_element_index;
|
||||
|
||||
if (me._crsrIndex < middle_element_index) {
|
||||
# Start of list
|
||||
me._pageIndex = 0;
|
||||
} else if (me._crsrIndex > (size(me._values) - middle_element_index - 1)) {
|
||||
# End of list
|
||||
me._pageIndex = size(me._values) - me._size;
|
||||
}
|
||||
},
|
||||
|
||||
previousPage : func() {
|
||||
if (me._pageIndex > 0) {
|
||||
me._pageIndex = me._pageIndex - 1;
|
||||
me._crsrIndex = me._size -1;
|
||||
me.displayPage();
|
||||
} else {
|
||||
me._crsrIndex = 0;
|
||||
}
|
||||
},
|
||||
for (var i = 0; i < me._size; i = i + 1) {
|
||||
if (me._pageIndex + i < size(me._values)) {
|
||||
var value = me._values[me._pageIndex + i];
|
||||
foreach (var k; keys(value)) {
|
||||
if (k == me._highlightElement) {
|
||||
me._elements[i].unhighlightElement();
|
||||
|
||||
displayPage : func () {
|
||||
# Determine how many elements to display in this page
|
||||
me._currentSize = math.min(me._size, size(me._values) - me._size * me._pageIndex);
|
||||
if (me._arrow) {
|
||||
# If we're using a HighlightElement, then we only show the element
|
||||
# the cursor is on.
|
||||
if (i + me._pageIndex == me._crsrIndex) {
|
||||
me._elements[i].setVisible(1);
|
||||
if (me._crsrEnabled) me._elements[i].highlightElement();
|
||||
} else {
|
||||
me._elements[i].setVisible(0);
|
||||
}
|
||||
|
||||
for (var i = 0; i < me._currentSize; i = i + 1) {
|
||||
var value = me._values[i + me._size * me._pageIndex];
|
||||
foreach (var k; keys(value)) {
|
||||
if (k == me._highlightElement) {
|
||||
me._elements[i].unhighlightElement();
|
||||
|
||||
if (me._arrow) {
|
||||
# If we're using a HighlightElement, then we only show the element
|
||||
# the cursor is on.
|
||||
if (i == me._crsrIndex) {
|
||||
me._elements[i].setVisible(1);
|
||||
} else {
|
||||
me._elements[i].setVisible(0);
|
||||
me._elements[i].setVisible(1);
|
||||
if (me._crsrEnabled and (i + me._pageIndex == me._crsrIndex))
|
||||
me._elements[i].highlightElement();
|
||||
}
|
||||
} else {
|
||||
me._elements[i].setVisible(1);
|
||||
}
|
||||
me._elements[i].setValue(value[k]);
|
||||
} else {
|
||||
var name = me._pageName ~ k ~ i;
|
||||
var element = me._svg.getElementById(name);
|
||||
assert(element != nil, "Unable to find element " ~ name);
|
||||
element.setVisible(1);
|
||||
element.setText(value[k]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Hide any further elements
|
||||
if (me._currentSize < me._size) {
|
||||
for (var i = me._currentSize; i < me._size; i = i + 1) {
|
||||
me._elements[i].setValue(value[k]);
|
||||
} else {
|
||||
var name = me._pageName ~ k ~ i;
|
||||
var element = me._svg.getElementById(name);
|
||||
assert(element != nil, "Unable to find element " ~ name);
|
||||
element.setVisible(1);
|
||||
element.setText(value[k]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
# We've gone off the end of the values list, so hide any further values.
|
||||
foreach (var k; me._elementNames) {
|
||||
if (k == me._highlightElement) {
|
||||
me._elements[i].setVisible(0);
|
||||
|
@ -172,10 +170,9 @@ displayPage : func () {
|
|||
|
||||
if ((me._scrollThumbElement != nil) and (me._size < size(me._values))) {
|
||||
# Shift the scrollbar if it's relevant
|
||||
var numScrollPositions = math.ceil(size(me._values) / me._size) -1;
|
||||
me._scrollThumbElement.setTranslation([
|
||||
me._scrollBaseTransform[0],
|
||||
me._scrollBaseTransform[1] + me._scrollHeight * (me._pageIndex / numScrollPositions)
|
||||
me._scrollBaseTransform[1] + me._scrollHeight * (me._crsrIndex / (size(me._values) -1))
|
||||
]);
|
||||
}
|
||||
},
|
||||
|
@ -190,77 +187,74 @@ addTextElement : func(name, value) {
|
|||
},
|
||||
|
||||
showCRSR : func() {
|
||||
if (me._currentSize == 0) return;
|
||||
if (size(me._values) == 0) return;
|
||||
me._crsrEnabled = 1;
|
||||
me._elements[me._crsrIndex].highlightElement();
|
||||
me._elements[me._crsrIndex - me._pageIndex].highlightElement();
|
||||
},
|
||||
hideCRSR : func() {
|
||||
if (me._crsrEnabled == 0) return;
|
||||
me._elements[me._crsrIndex].unhighlightElement();
|
||||
me._elements[me._crsrIndex - me._pageIndex].unhighlightElement();
|
||||
|
||||
# If we're using a HighlightElement, then we need to make the cursor position visible
|
||||
if (me._arrow) me._elements[me._crsrIndex].setVisible(1);
|
||||
if (me._arrow) me._elements[me._crsrIndex - me._pageIndex].setVisible(1);
|
||||
me._crsrEnabled = 0;
|
||||
},
|
||||
setCRSR : func(index) {
|
||||
me._crsrIndex = math.min(index, me._currentSize -1);
|
||||
me._crsrIndex = math.min(index, size(me._values) -1);
|
||||
me._crsrIndex = math.max(0, me._crsrIndex);
|
||||
},
|
||||
getCursorElementName : func() {
|
||||
if (me._crsrEnabled == -1) return nil;
|
||||
return me._elements[me._crsrIndex].name;
|
||||
return me._elements[me._crsrIndex - me._pageIndex].name;
|
||||
},
|
||||
isCursorOnDataEntryElement : func() {
|
||||
if (me._crsrEnabled == -1) return 0;
|
||||
return isa(me._elements[me._crsrIndex], DataEntryElement);
|
||||
return isa(me._elements[me._crsrIndex - me._pageIndex], DataEntryElement);
|
||||
},
|
||||
enterElement : func() {
|
||||
if (me._crsrEnabled == 0) return;
|
||||
return me._elements[me._crsrIndex].enterElement();
|
||||
return me._elements[me._crsrIndex - me._pageIndex].enterElement();
|
||||
},
|
||||
getValue : func() {
|
||||
if (me._crsrEnabled == -1) return nil;
|
||||
return me._elements[me._crsrIndex].getValue();
|
||||
return me._elements[me._crsrIndex - me._pageIndex].getValue();
|
||||
},
|
||||
setValue : func(idx, key, value) {
|
||||
me._values[idx][key] = value;
|
||||
},
|
||||
clearElement : func() {
|
||||
if (me._crsrEnabled == 0) return;
|
||||
me._elements[me._crsrIndex].clearElement();
|
||||
me._elements[me._crsrIndex - me._pageIndex].clearElement();
|
||||
},
|
||||
incrSmall : func(value) {
|
||||
if (me._crsrEnabled == 0) return;
|
||||
|
||||
var incr_or_decr = (value > 0) ? 1 : -1;
|
||||
if (me._elements[me._crsrIndex].isInEdit()) {
|
||||
if (me._elements[me._crsrIndex - me._pageIndex].isInEdit()) {
|
||||
# We're editing, so pass to the element.
|
||||
#print("Moving cursor to next character entry");
|
||||
me._elements[me._crsrIndex].incrSmall();
|
||||
me._elements[me._crsrIndex - me._pageIndex].incrSmall(val);
|
||||
} else {
|
||||
# Move to next selection element
|
||||
me._elements[me._crsrIndex].unhighlightElement();
|
||||
|
||||
me._crsrIndex = me._crsrIndex + incr_or_decr;
|
||||
|
||||
if (me._crsrIndex < 0 ) me.previousPage();
|
||||
if (me._crsrIndex == me._currentSize) me.nextPage();
|
||||
|
||||
me._elements[me._crsrIndex].highlightElement();
|
||||
if (me._crsrIndex < 0 ) me._crsrIndex = 0;
|
||||
if (me._crsrIndex == size(me._values)) me._crsrIndex = size(me._values) -1;
|
||||
me.displayGroup();
|
||||
}
|
||||
},
|
||||
incrLarge : func(val) {
|
||||
if (me._crsrEnabled == 0) return;
|
||||
var incr_or_decr = (val > 0) ? 1 : -1;
|
||||
if (me._elements[me._crsrIndex].isInEdit()) {
|
||||
if (me._elements[me._crsrIndex - me._pageIndex].isInEdit()) {
|
||||
# We're editing, so pass to the element.
|
||||
#print("Moving cursor to next character entry");
|
||||
me._elements[me._crsrIndex].incrLarge();
|
||||
me._elements[me._crsrIndex - me._pageIndex].incrLarge(val);
|
||||
} else {
|
||||
# Move to next selection element
|
||||
me._elements[me._crsrIndex].unhighlightElement();
|
||||
me._crsrIndex = me._crsrIndex + incr_or_decr;
|
||||
|
||||
if (me._crsrIndex < 0 ) me.previousPage();
|
||||
if (me._crsrIndex == me._currentSize) me.nextPage();
|
||||
|
||||
me._elements[me._crsrIndex].highlightElement();
|
||||
if (me._crsrIndex < 0 ) me._crsrIndex = 0;
|
||||
if (me._crsrIndex == size(me._values)) me._crsrIndex = size(me._values) -1;
|
||||
me.displayGroup();
|
||||
}
|
||||
},
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue