1
0
Fork 0

Merge branch 'next' of git://git.code.sf.net/p/flightgear/fgdata into next

This commit is contained in:
scttgs0 2023-08-26 16:28:25 -05:00
commit 65ffffa2cc
9 changed files with 33332 additions and 1449 deletions

File diff suppressed because it is too large Load diff

Binary file not shown.

View file

@ -1,385 +1,446 @@
var kln94 = nil;
var KLN94 = {
Page: {
new : func(owner, s, idx)
{
m = {
parents:[KLN94.Page],
section: s,
index: idx
};
return m;
},
# encode various behavioural flags as predicates
# real Pages can over-ride these defaults as needed
hasActiveIdent: func { return 0; },
numberOfCyanLines: func { return 0; },
showsCDI: func { return 0; },
isMulti: func { return 0; },
# cursor stuff
display: func(gps)
{
},
refresh: func(gps)
{
},
},
pageNames : ['APT', 'VOR', 'NDB', 'INT', 'USR', 'ACT', 'NAV', 'FPL', 'SET', 'AUX'],
PAGE_APT: 0,
PAGE_VOR: 1,
PAGE_NDB: 2,
PAGE_INT: 3,
PAGE_USR: 4,
PAGE_ACT: 5,
PAGE_NAV: 6,
PAGE_FPL: 7,
PAGE_SET: 8,
PAGE_AUX: 9,
PAGE_BAR_HEIGHT: 20,
NAV_DATA_WIDTH: 128,
canvas_settings: {
"name": "KLN94",
"size": [512, 256],
"view": [480, 160],
"mipmapping": 1,
},
new : func(prop1, placement)
{
m = { parents : [KLN94]};
m.rootNode = props.globals.initNode(prop1);
m._setupCanvas(placement);
m._page = nil;
m._messageScreenActive = 0;
m._messages = [];
m._cursorActive = 0;
m._cursorField = 0;
m._enterAction = nil;
m._setupProps();
return m;
},
_setupCanvas: func(placement)
{
me._canvas = canvas.new(KLN94.canvas_settings);
var text_style = {
'font': "LiberationFonts/LiberationMono-Bold.ttf",
'character-size': 34,
'character-aspect-ratio': 1.2
};
me.rootNode.initNode('brightness-norm', 0.5, 'DOUBLE');
me._canvas.setColorBackground(1.0, 0.0, 0.0);
me._canvas.addPlacement(placement);
me._navDataArea = me._canvas.createGroup();
me._navDataArea.setTranslation(0, 0);
me._navDataLines = [];
var navAreaH = (KLN94.canvas_settings.view[1] - KLN94.PAGE_BAR_HEIGHT) / 2;
var r1 = me._navDataArea.rect(0, 0, KLN94.NAV_DATA_WIDTH, navAreaH);
var r2 = me._navDataArea.rect(0, navAreaH, KLN94.NAV_DATA_WIDTH, navAreaH);
r1.setColor(0,1,1); # cyan
r2.setColor(0,1,1);
var lineH = (KLN94.canvas_settings.view[1] - KLN94.PAGE_BAR_HEIGHT) / 5;
for (var i=0; i<4; i +=1) {
var t = me._navDataArea.createChild("text");
t.setColor(1, 1, 1);
t._node.setValues(text_style);
t.setAlignment("left-center");
t.setTranslation(0.0, (i + 0.5) * lineH);
append(me._navDataLines, t);
}
me._pageBarArea = me._canvas.createGroup();
me._pageBarArea.setTranslation(0, KLN94.canvas_settings.view[1] - KLN94.PAGE_BAR_HEIGHT);
var ln = me._pageBarArea.createChild('path');
ln.setColor(0,1,1); # cyan
me._pageBarText = me._pageBarArea.createChild("text");
me._pageBarText._node.setValues(text_style);
me._pageBarText.setAlignment("left-center");
me._pageBarText.setColor(0, 0, 1);
me._pageBarInverseText = me._pageBarArea.createChild("text");
me._pageBarInverseText._node.setValues(text_style);
me._pageBarInverseText.setAlignment("left-center");
me._pageBarInverseText.setColor(1, 1, 1);
me._pageBarInverseText.setColorFill(0, 0, 1);
me._pageArea = me._canvas.createGroup();
me._pageBarArea.setTranslation(100, 0);
me._pageAreaLines = [];
for (var i=0; i<5; i +=1) {
var t = me._pageArea.createChild("text");
t.setColor(0, 1, 0);
t._node.setValues(text_style);
t.setAlignment("left-center");
t.setTranslation(0.0, (i + 0.5) * lineH);
append(me._pageAreaLines, t);
}
# inverted text block
me._pageAreaInverted = me._pageArea.createChild("text");
me._pageAreaInverted.setColor(0, 0, 0);
me._pageAreaInverted.setColorFill(0, 1, 0);
me._pageAreaInverted._node.setValues(text_style);
me._pageAreaInverted.setAlignment("left-center");
me._cdiGroup = me._pageArea.createChild("group");
canvas.parsesvg(me._cdiGroup, resolvepath('Aircraft/Instruments-3d/kln94/cdi.svg'));
me._cdiGroup.setTranslation(0, lineH);
},
_setupProps: func
{
var p = me.rootNode;
me.props = {
distanceToActiveNm: p.getNode(),
groundspeedKt: p.getNode(),
activeIdent: p.getNode(),
previousIdent: p.getNode(),
obsBearing: p.getNode(),
legTrack: p.getNode(),
groundTrack: p.getNode(),
cdiDeviationNm: p.getNode(),
};
},
_setActivePage: func(pg)
{
me._page = pg;
if (pg == nil) return;
# update line colors
for (var l=0; l<4; l+=1) {
me._pageAreaLines[l].setColor(0, 1, l < pg.numberOfCyanLines() ? 1 : 0);
}
# hide or show the CDI area as appropriate
me._cdiGroup.setVisible(pg.showsCDI());
},
_updateNavData : func
{
me._navDataLines[0].setText(sprintf('%4dnm', me._props.distanceToActiveNm.getValue()));
if (me._page.hasActiveIdent()) {
me._navDataLines[1].setText(sprintf('%4dkt', me._props.groundspeedKt.getValue()));
} else {
me._navDataLines[1].setText(me._props.activeIdent.getValue());
}
if (me._obsMode) {
me._navDataLines[2].setText(sprintf('OBS%03d*', me._props.obsBearing.getValue()));
} else {
me._navDataLines[2].setText(sprintf('DTK%03d*', me._props.legTrack.getValue()));
}
me._navDataLines[3].setText(sprintf(' TK%03d*', me._props.groundTrack.getValue()));
},
_updateAnnunciationArea : func
{
if (size(me._messages) > 0) {
# show 'M' symbol
}
if (me._enterAction != nil) {
# show 'ENT' symbol
}
},
_updatePageBar : func
{
# hide in NAV-4 mode
if (me.inNav4Mode()) {
me._pageBarGroup.setVisible(0);
return;
}
if (me._cursorActive) {
me._pageBarText.setText('');
var t = ' * CRSR * ' ~ me.pageNames[activePage] ~ ' * CRSR *';
me._pageBarInverseText.setText(t);
return;
}
# assemble the string
var barString = '';
var inverseBarString = '';
var activePage = me.pageIndex[0];
for (var i=0; i < 10; i += 1) {
if (activePage == i) {
var sep = me.isMultiPage() ? '+' : ' ';
inverseBarString ~= me.pageNames[i] ~ sep ~ me.pageIndex[1];
barString ~= ' '; # 5 spaces
} else {
barString ~= ' ' ~ me.pageNames[i];
if (i < activePage)
inverseBarString ~= ' '; # 4 spaces
}
}
me._pageBarText.setText(barString);
me._pageBarInverseText.setText(inverseBarString);
},
_setInverted: func(line, firstcol, numcols=1)
{
var t = me._pageAreaInverted;
var cellW = 20.0;
var lineH = (KLN94.canvas_settings.view[1] - KLN94.PAGE_BAR_HEIGHT) / 5;
t.setTranslation(firstcol * cellW, (line + 0.5) * lineH);
t.setText(substr(me._pageAreaLines[line].getText(), firstcol, numcols));
t.setVisible(1);
},
_setBlink: func(line, firstcol, numcols=1)
{
},
isPageActive: func(nm, idx)
{
if (me._page == nil) return 0;
return (me._page.section == nm) and (me._page.index == idx);
},
isMultiPage: func { return me._page.isMulti(); },
toggleCursor: func
{
me._cursorActive = !me._cursorActive;
if (me._cursorActive) {
me._cursorField = 0;
}
me._updatePageBar();
},
_buildMessageScreen: func
{
},
# Nav4 mode is special
inNav4Mode: func { return me.isPageActive(NAV, 4); },
formatDuration: func(timeInSeconds)
{
if (timeInSeconds > 60) {
return sprintf("0:%02d", timeInSeconds);
}
if (timeInSeconds > 3600) {
var mins = int(timeInSeconds / 60);
var secs = timeInSeconds - (mins * 60);
return sprintf("%d:%02d", mins, secs);
}
var hours = int(timeInSeconds / 3600);
timeInSeconds -= (hours * 3600);
var mins = int(timeInSeconds / 60);
var secs = timeInSeconds - (mins * 60);
return sprintf("%d:%02d:%02d", hours, mins, secs);
},
formatLatitude: func(lat)
{
var north = (lat >= 0.0);
var latDeg = int(lat);
var latMinutes = math.abs(lat - latDeg) * 60;
return sprintf('%s%02d*%04.1f', north ? "N" : "S", abs(latDeg), latMinutes);
},
formatLongitude: func(lon)
{
var east = (lon >= 0.0);
var lonDeg = int(lon);
var lonMinutes = math.abs(lon - lonDeg) * 60;
sprintf("%s%03d*%04.1f", east ? 'E' : 'W', abs(lonDeg), lonMinutes);
},
## Input Handling
enter: func{
# Enter Button Functionality
},
Page: {
new : func(owner, s, idx)
{
m = {
parents:[KLN94.Page],
section: s,
index: idx
};
return m;
},
# encode various behavioural flags as predicates
# real Pages can over-ride these defaults as needed
hasActiveIdent: func { return 0; },
numberOfCyanLines: func { return 0; },
showsCDI: func { return 0; },
isMulti: func { return 0; },
# cursor stuff
display: func(gps)
{
},
refresh: func(gps)
{
},
},
toggleCursorMode: func{
# Cursor Button Functionality
},
pageNames : ['APT', 'VOR', 'NDB', 'INT', 'USR', 'ACT', 'NAV', 'FPL', 'SET', 'AUX'],
PAGE_APT: 0,
PAGE_VOR: 1,
PAGE_NDB: 2,
PAGE_INT: 3,
PAGE_USR: 4,
PAGE_ACT: 5,
PAGE_NAV: 6,
PAGE_FPL: 7,
PAGE_SET: 8,
PAGE_AUX: 9,
PAGE_BAR_HEIGHT: 20,
NAV_DATA_WIDTH: 128,
canvas_settings: {
"name": "KLN94",
"size": [512, 256],
"view": [480, 160],
"mipmapping": 1,
},
new : func(prop1, placement)
{
m = { parents : [KLN94]};
nearestButton: func{
# Nearest Button Functionality
},
m.rootNode = props.globals.initNode(prop1);
m._setupCanvas(placement);
m._page = nil;
m._messageScreenActive = 0;
m._messages = [];
m._cursorActive = 0;
m._cursorField = 0;
m._enterAction = nil;
m._setupProps();
return m;
},
_setupCanvas: func(placement)
{
me._canvas = canvas.new(KLN94.canvas_settings);
var text_style = {
'font': "LiberationFonts/LiberationMono-Bold.ttf",
'character-size': 34,
'character-aspect-ratio': 1.2
};
me.rootNode.initNode('brightness-norm', 0.5, 'DOUBLE');
me._canvas.setColorBackground(1.0, 0.0, 0.0);
me._canvas.addPlacement(placement);
me._navDataArea = me._canvas.createGroup();
me._navDataArea.setTranslation(0, 0);
me._navDataLines = [];
var navAreaH = (KLN94.canvas_settings.view[1] - KLN94.PAGE_BAR_HEIGHT) / 2;
var r1 = me._navDataArea.rect(0, 0, KLN94.NAV_DATA_WIDTH, navAreaH);
var r2 = me._navDataArea.rect(0, navAreaH, KLN94.NAV_DATA_WIDTH, navAreaH);
r1.setColor(0,1,1); # cyan
r2.setColor(0,1,1);
var lineH = (KLN94.canvas_settings.view[1] - KLN94.PAGE_BAR_HEIGHT) / 5;
for (var i=0; i<4; i +=1) {
var t = me._navDataArea.createChild("text");
t.setColor(1, 1, 1);
t._node.setValues(text_style);
t.setAlignment("left-center");
t.setTranslation(0.0, (i + 0.5) * lineH);
append(me._navDataLines, t);
}
me._pageBarArea = me._canvas.createGroup();
me._pageBarArea.setTranslation(0, KLN94.canvas_settings.view[1] - KLN94.PAGE_BAR_HEIGHT);
var ln = me._pageBarArea.createChild('path');
ln.setColor(0,1,1); # cyan
me._pageBarText = me._pageBarArea.createChild("text");
me._pageBarText._node.setValues(text_style);
me._pageBarText.setAlignment("left-center");
me._pageBarText.setColor(0, 0, 1);
me._pageBarInverseText = me._pageBarArea.createChild("text");
me._pageBarInverseText._node.setValues(text_style);
me._pageBarInverseText.setAlignment("left-center");
me._pageBarInverseText.setColor(1, 1, 1);
me._pageBarInverseText.setColorFill(0, 0, 1);
me._pageArea = me._canvas.createGroup();
me._pageBarArea.setTranslation(100, 0);
me._pageAreaLines = [];
for (var i=0; i<5; i +=1) {
var t = me._pageArea.createChild("text");
t.setColor(0, 1, 0);
t._node.setValues(text_style);
t.setAlignment("left-center");
t.setTranslation(0.0, (i + 0.5) * lineH);
append(me._pageAreaLines, t);
}
# inverted text block
me._pageAreaInverted = me._pageArea.createChild("text");
me._pageAreaInverted.setColor(0, 0, 0);
me._pageAreaInverted.setColorFill(0, 1, 0);
me._pageAreaInverted._node.setValues(text_style);
me._pageAreaInverted.setAlignment("left-center");
me._cdiGroup = me._pageArea.createChild("group");
canvas.parsesvg(me._cdiGroup, resolvepath('Aircraft/Instruments-3d/kln94/cdi.svg'));
me._cdiGroup.setTranslation(0, lineH);
},
_setupProps: func
{
var p = me.rootNode;
me.props = {
distanceToActiveNm: p.getNode(),
groundspeedKt: p.getNode(),
activeIdent: p.getNode(),
previousIdent: p.getNode(),
obsBearing: p.getNode(),
legTrack: p.getNode(),
groundTrack: p.getNode(),
cdiDeviationNm: p.getNode(),
};
},
_setActivePage: func(pg)
{
me._page = pg;
if (pg == nil) return;
# update line colors
for (var l=0; l<4; l+=1) {
me._pageAreaLines[l].setColor(0, 1, l < pg.numberOfCyanLines() ? 1 : 0);
}
# hide or show the CDI area as appropriate
me._cdiGroup.setVisible(pg.showsCDI());
},
_updateNavData : func
{
me._navDataLines[0].setText(sprintf('%4dnm', me._props.distanceToActiveNm.getValue()));
if (me._page.hasActiveIdent()) {
me._navDataLines[1].setText(sprintf('%4dkt', me._props.groundspeedKt.getValue()));
} else {
me._navDataLines[1].setText(me._props.activeIdent.getValue());
}
if (me._obsMode) {
me._navDataLines[2].setText(sprintf('OBS%03d*', me._props.obsBearing.getValue()));
} else {
me._navDataLines[2].setText(sprintf('DTK%03d*', me._props.legTrack.getValue()));
}
me._navDataLines[3].setText(sprintf(' TK%03d*', me._props.groundTrack.getValue()));
},
_updateAnnunciationArea : func
{
if (size(me._messages) > 0) {
# show 'M' symbol
}
if (me._enterAction != nil) {
# show 'ENT' symbol
}
},
_updatePageBar : func
{
# hide in NAV-4 mode
if (me.inNav4Mode()) {
me._pageBarGroup.setVisible(0);
return;
}
if (me._cursorActive) {
me._pageBarText.setText('');
var t = ' * CRSR * ' ~ me.pageNames[activePage] ~ ' * CRSR *';
me._pageBarInverseText.setText(t);
return;
}
# assemble the string
var barString = '';
var inverseBarString = '';
var activePage = me.pageIndex[0];
for (var i=0; i < 10; i += 1) {
if (activePage == i) {
var sep = me.isMultiPage() ? '+' : ' ';
inverseBarString ~= me.pageNames[i] ~ sep ~ me.pageIndex[1];
barString ~= ' '; # 5 spaces
} else {
barString ~= ' ' ~ me.pageNames[i];
if (i < activePage)
inverseBarString ~= ' '; # 4 spaces
}
}
me._pageBarText.setText(barString);
me._pageBarInverseText.setText(inverseBarString);
},
_setInverted: func(line, firstcol, numcols=1)
{
var t = me._pageAreaInverted;
var cellW = 20.0;
var lineH = (KLN94.canvas_settings.view[1] - KLN94.PAGE_BAR_HEIGHT) / 5;
t.setTranslation(firstcol * cellW, (line + 0.5) * lineH);
t.setText(substr(me._pageAreaLines[line].getText(), firstcol, numcols));
t.setVisible(1);
},
_setBlink: func(line, firstcol, numcols=1)
{
},
isPageActive: func(nm, idx)
{
if (me._page == nil) return 0;
return (me._page.section == nm) and (me._page.index == idx);
},
isMultiPage: func { return me._page.isMulti(); },
toggleCursor: func
{
me._cursorActive = !me._cursorActive;
if (me._cursorActive) {
me._cursorField = 0;
}
me._updatePageBar();
},
messageButton: func
{
if (me._messageScreenActive) {
me._messages = me._messages[1:]; # pop front
if (size(me._messages) == 0) {
me._messageScreenActive = 0;
# refresh normal screen
return;
}
me._buildMessageScreen();
return;
}
if (size(me._messages) == 0) {
debug.dump('no messages to show');
return;
}
me._messageScreenActive = 1;
me._buildMessageScreen();
},
_buildMessageScreen: func
{
},
# Nav4 mode is special
inNav4Mode: func { return me.isPageActive(NAV, 4); },
formatDuration: func(timeInSeconds)
{
if (timeInSeconds > 60) {
return sprintf("0:%02d", timeInSeconds);
}
if (timeInSeconds > 3600) {
var mins = int(timeInSeconds / 60);
var secs = timeInSeconds - (mins * 60);
return sprintf("%d:%02d", mins, secs);
}
var hours = int(timeInSeconds / 3600);
timeInSeconds -= (hours * 3600);
var mins = int(timeInSeconds / 60);
var secs = timeInSeconds - (mins * 60);
return sprintf("%d:%02d:%02d", hours, mins, secs);
},
formatLatitude: func(lat)
{
var north = (lat >= 0.0);
var latDeg = int(lat);
var latMinutes = math.abs(lat - latDeg) * 60;
return sprintf('%s%02d*%04.1f', north ? "N" : "S", abs(latDeg), latMinutes);
},
formatLongitude: func(lon)
{
var east = (lon >= 0.0);
var lonDeg = int(lon);
var lonMinutes = math.abs(lon - lonDeg) * 60;
sprintf("%s%03d*%04.1f", east ? 'E' : 'W', abs(lonDeg), lonMinutes);
},
directTo: func{
# Direct To (DTO) Button Functionality
},
obsButton: func{
# OBS Button Functionality
},
messageButton: func{
# Messages Button Functionality
if (me._messageScreenActive) {
me._messages = me._messages[1:]; # pop front
if (size(me._messages) == 0) {
me._messageScreenActive = 0;
# refresh normal screen
return;
}
me._buildMessageScreen();
return;
}
if (size(me._messages) == 0) {
debug.dump('no messages to show');
return;
}
me._messageScreenActive = 1;
me._buildMessageScreen();
},
procedureButton: func{
# Procedure Button Functionality
},
altitudeButton: func{
# Altitude Button Functionality
},
clearButton: func{
# Clear Button Functionality
},
menuButton: func{
# Menu Button Functionality
},
rangeButton: func( dir ){
# Range Button Functionality
# variable dir:
# -1 = down (decrease)
# 0 = not pressed
# 1 = up (increase)
},
innerKnob: func( offset ){
# Inner Knob Functionality
},
outerKnob: func( offset ){
# Outer Knob Functionality
},
powerButton: func{
# Power Button Functionality
# Power Button equals to pushing in the brightness knob
},
};
reload_gps = func
{
kln94._setActivePage(nil); # force existing page to be undisplayed cleanly
# make the cdu instance available inside the module namespace
# we are going to load into.
# for a reload this also wipes the existing namespace, which we want
globals['kln94_NS'] = { gps: kln94, KLN94:KLN94 };
var pages = ['navPages.nas', 'infoPages.nas', 'flightplanPages.nas', 'settingPages.nas', 'auxPages.nas'];
#var settings = props.globals.getNode('/instrumentation/cdu/settings');
foreach (var path; pages) {
# resolve the path in FG_ROOT, and --fg-aircraft dir, etc
var abspath = resolvepath('Aircraft/Instruments-3d/kln94/' ~ path);
if (io.stat(abspath) == nil) {
debug.dump('KN94 page not found:', path, abspath);
continue;
}
# load pages code into a seperate namespace which we defined above
# also means we can clean out that namespace later
io.load_nasal(abspath, 'kln94_NS');
}
# cdu.displayPageByTag(getprop('/instrumentation/cdu/settings/boot-page'));
kln94._setActivePage(nil); # force existing page to be undisplayed cleanly
# make the cdu instance available inside the module namespace
# we are going to load into.
# for a reload this also wipes the existing namespace, which we want
globals['kln94_NS'] = { gps: kln94, KLN94:KLN94 };
var pages = ['navPages.nas', 'flightplanPages.nas', 'settingPages.nas', 'auxPages.nas'];
# , 'infoPages.nas'
#var settings = props.globals.getNode('/instrumentation/cdu/settings');
foreach (var path; pages) {
# resolve the path in FG_ROOT, and --fg-aircraft dir, etc
var abspath = resolvepath('Aircraft/Instruments-3d/kln94/' ~ path);
if (io.stat(abspath) == nil) {
debug.dump('KLN94 page not found:', path, abspath);
continue;
}
# load pages code into a seperate namespace which we defined above
# also means we can clean out that namespace later
io.load_nasal(abspath, 'kln94_NS');
}
# cdu.displayPageByTag(getprop('/instrumentation/cdu/settings/boot-page'));
};
setlistener("/nasal/canvas/loaded", func
{
# create base PGS
kln94 = KLN94.new('/instrumentation/gps', {"node": "screen"});
reload_gps();
# create base PGS
kln94 = KLN94.new('/instrumentation/gps', {"node": "screen"});
reload_gps();
}, 1);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 78 KiB

View file

@ -0,0 +1,788 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="1024"
height="512"
viewBox="0 0 1024 512.00002"
version="1.1"
id="svg1"
inkscape:version="1.3 (1:1.3+202307231459+0e150ed6c4)"
sodipodi:docname="kln94.svg"
xml:space="preserve"
inkscape:export-filename="kln94.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#757575"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="1.8872648"
inkscape:cx="103.0592"
inkscape:cy="411.44199"
inkscape:window-width="1680"
inkscape:window-height="977"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1"
inkscape:export-bgcolor="#000000ff" /><defs
id="defs1"><linearGradient
id="linearGradient47"
inkscape:collect="always"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop47" /><stop
style="stop-color:#e5e5e5;stop-opacity:1;"
offset="1"
id="stop48" /></linearGradient><linearGradient
id="linearGradient41"
inkscape:collect="always"><stop
style="stop-color:#000000;stop-opacity:0.5;"
offset="0"
id="stop41" /><stop
style="stop-color:#000000;stop-opacity:0.30000001;"
offset="0.25"
id="stop44" /><stop
style="stop-color:#000000;stop-opacity:0.1;"
offset="0.40000001"
id="stop46" /><stop
style="stop-color:#000000;stop-opacity:0.1;"
offset="0.60000002"
id="stop45" /><stop
style="stop-color:#000000;stop-opacity:0.30000001;"
offset="0.75"
id="stop43" /><stop
style="stop-color:#000000;stop-opacity:0.5;"
offset="1"
id="stop42" /></linearGradient><linearGradient
id="linearGradient37"
inkscape:collect="always"><stop
style="stop-color:#555559;stop-opacity:1;"
offset="0.1"
id="stop37" /><stop
style="stop-color:#000000;stop-opacity:1;"
offset="0.89999998"
id="stop38" /></linearGradient><linearGradient
id="linearGradient23"
inkscape:collect="always"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop23" /><stop
style="stop-color:#f2f2f2;stop-opacity:1;"
offset="1"
id="stop24" /></linearGradient><marker
style="overflow:visible"
id="Triangle"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="1.20000005"
markerHeight="0.89999998"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="none"><path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135" /></marker><linearGradient
id="linearGradient10"
inkscape:collect="always"><stop
style="stop-color:#000000;stop-opacity:1;"
offset="0.00357637"
id="stop10" /><stop
style="stop-color:#212121;stop-opacity:1;"
offset="0.45044389"
id="stop14" /><stop
style="stop-color:#9b9b9b;stop-opacity:1;"
offset="0.62822884"
id="stop13" /><stop
style="stop-color:#cfcfcf;stop-opacity:1;"
offset="0.72696996"
id="stop18" /><stop
style="stop-color:#d0d0d0;stop-opacity:1;"
offset="0.82252026"
id="stop12" /><stop
style="stop-color:#ededed;stop-opacity:1;"
offset="0.88386118"
id="stop16" /><stop
style="stop-color:#afafaf;stop-opacity:1;"
offset="0.93145448"
id="stop15" /><stop
style="stop-color:#cecece;stop-opacity:1;"
offset="0.96410459"
id="stop17" /><stop
style="stop-color:#b5b5b5;stop-opacity:1;"
offset="1"
id="stop11" /></linearGradient><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient10"
id="radialGradient11"
cx="130.78629"
cy="44.993439"
fx="130.78629"
fy="44.993439"
r="16.786892"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.8174278,0,0,1.8174278,-203.26463,279.34555)" /><filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter19"
x="-0.38212442"
y="-0.19577836"
width="1.7642488"
height="1.3915567"><feGaussianBlur
inkscape:collect="always"
stdDeviation="8.6749521"
id="feGaussianBlur19" /></filter><filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter22"
x="-0.57421333"
y="-0.57421333"
width="2.1484267"
height="2.1484267"><feGaussianBlur
inkscape:collect="always"
stdDeviation="7.0695823"
id="feGaussianBlur22" /></filter><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient23"
id="radialGradient24"
cx="236.14624"
cy="1009.7609"
fx="236.14624"
fy="1009.7609"
r="33.028423"
gradientTransform="matrix(1,0,0,0.54026014,0,464.22735)"
gradientUnits="userSpaceOnUse" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient23"
id="radialGradient25"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.54026014,66.056847,464.22735)"
cx="236.14624"
cy="1009.7609"
fx="236.14624"
fy="1009.7609"
r="33.028423" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient23"
id="radialGradient27"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.54026014,198.17054,464.22735)"
cx="236.14624"
cy="1009.7609"
fx="236.14624"
fy="1009.7609"
r="33.028423" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient23"
id="radialGradient28"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.54026014,132.11369,464.22735)"
cx="236.14624"
cy="1009.7609"
fx="236.14624"
fy="1009.7609"
r="33.028423" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient23"
id="radialGradient31"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.54026014,462.39793,464.22735)"
cx="236.14624"
cy="1009.7609"
fx="236.14624"
fy="1009.7609"
r="33.028423" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient23"
id="radialGradient32"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.54026014,396.34108,464.22735)"
cx="236.14624"
cy="1009.7609"
fx="236.14624"
fy="1009.7609"
r="33.028423" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient23"
id="radialGradient33"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.54026014,330.28424,464.22735)"
cx="236.14624"
cy="1009.7609"
fx="236.14624"
fy="1009.7609"
r="33.028423" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient23"
id="radialGradient34"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.54026014,264.22739,464.22735)"
cx="236.14624"
cy="1009.7609"
fx="236.14624"
fy="1009.7609"
r="33.028423" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient23"
id="radialGradient35"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.54026014,-66.056839,464.22735)"
cx="236.14624"
cy="1009.7609"
fx="236.14624"
fy="1009.7609"
r="33.028423" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient37"
id="linearGradient38"
x1="864.81"
y1="448.01194"
x2="1024"
y2="448.01194"
gradientUnits="userSpaceOnUse" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient23"
id="radialGradient40"
cx="593.52612"
cy="1165.3798"
fx="593.52612"
fy="1165.3798"
r="9.5591116"
gradientTransform="matrix(1,0,0,2.6572999,0,-1931.3839)"
gradientUnits="userSpaceOnUse" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient41"
id="linearGradient42"
x1="593.52612"
y1="1169.8085"
x2="593.52612"
y2="1160.9512"
gradientUnits="userSpaceOnUse" /><filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter46"
x="-0.0036989802"
y="-0.0079841331"
width="1.007398"
height="1.0159683"><feGaussianBlur
inkscape:collect="always"
stdDeviation="0.029465803"
id="feGaussianBlur46" /></filter><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient47"
id="radialGradient48"
cx="593.62998"
cy="1213.0676"
fx="593.62998"
fy="1213.0676"
r="9.531229"
gradientUnits="userSpaceOnUse" /></defs><g
inkscape:groupmode="layer"
id="layer1"><g
id="data_loader_jack"><rect
style="fill:#c6c6c6;fill-opacity:1;stroke:none;stroke-width:2.2;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1"
id="rect36"
width="68.859962"
height="68.85997"
x="0"
y="326.6879" /><circle
style="fill:url(#radialGradient11);stroke-width:2.72615;stroke-linecap:round"
id="path10"
cx="34.429981"
cy="361.11789"
r="30.508963" /></g><g
id="buttons"
transform="matrix(1.6065961,0,0,1.6065961,-151.34166,-1266.9221)"><g
id="crsr_btn"><rect
style="fill:url(#radialGradient24);fill-opacity:1;stroke-width:1.5203;stroke-linecap:round"
id="rect2-6"
width="66.056847"
height="35.687881"
x="203.11781"
y="991.91699"
rx="0"
ry="0" /><text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:17.294px;line-height:105%;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;letter-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.30659;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1"
x="259.88785"
y="923.52979"
id="text23"
transform="scale(0.90847249,1.1007488)"><tspan
sodipodi:role="line"
id="tspan23"
x="259.88785"
y="923.52979"
style="stroke-width:2.30659">CRSR</tspan></text></g><g
id="msg_btn"><rect
style="fill:url(#radialGradient25);fill-opacity:1;stroke-width:1.5203;stroke-linecap:round"
id="rect24"
width="66.056847"
height="35.687881"
x="269.17465"
y="991.91699"
rx="0"
ry="0" /><text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.2295px;line-height:105%;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;letter-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.43136;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1"
x="315.47238"
y="973.4859"
id="text24"
transform="scale(0.9576141,1.044262)"><tspan
sodipodi:role="line"
id="tspan24"
x="315.47238"
y="973.4859"
style="stroke-width:2.43136">MSG</tspan></text></g><g
id="obs_btn"><rect
style="fill:url(#radialGradient28);fill-opacity:1;stroke-width:1.5203;stroke-linecap:round"
id="rect25"
width="66.056847"
height="35.687881"
x="335.23151"
y="991.91699"
rx="0"
ry="0" /><text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.2295px;line-height:105%;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;letter-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.43136;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1"
x="384.43723"
y="973.48541"
id="text25"
transform="scale(0.9576141,1.044262)"><tspan
sodipodi:role="line"
id="tspan25"
x="384.43723"
y="973.48541"
style="stroke-width:2.43136">OBS</tspan></text></g><g
id="alt_btn"><rect
style="fill:url(#radialGradient27);fill-opacity:1;stroke-width:1.5203;stroke-linecap:round"
id="rect26"
width="66.056847"
height="35.687881"
x="401.28836"
y="991.91699"
rx="0"
ry="0" /><text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.2295px;line-height:105%;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;letter-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.43136;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1"
x="453.40005"
y="973.4859"
id="text26"
transform="scale(0.9576141,1.044262)"><tspan
sodipodi:role="line"
id="tspan26"
x="453.40005"
y="973.4859"
style="stroke-width:2.43136">ALT</tspan></text></g><g
id="nrst_btn"><rect
style="fill:url(#radialGradient34);fill-opacity:1;stroke-width:1.5203;stroke-linecap:round"
id="rect28"
width="66.056847"
height="35.687881"
x="467.34521"
y="991.91699"
rx="0"
ry="0" /><text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.2295px;line-height:105%;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;letter-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.43136;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1"
x="522.45935"
y="973.4859"
id="text28"
transform="scale(0.9576141,1.044262)"><tspan
sodipodi:role="line"
id="tspan28"
x="522.45935"
y="973.4859"
style="stroke-width:2.43136">NRST</tspan></text></g><g
id="clr_btn"><rect
style="fill:url(#radialGradient32);fill-opacity:1;stroke-width:1.5203;stroke-linecap:round"
id="rect30"
width="66.056847"
height="35.687881"
x="599.45892"
y="991.91699"
rx="0"
ry="0" /><text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.2295px;line-height:105%;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;letter-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.43136;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1"
x="660.40137"
y="973.4859"
id="text30"
transform="scale(0.9576141,1.044262)"><tspan
sodipodi:role="line"
id="tspan30"
x="660.40137"
y="973.4859"
style="stroke-width:2.43136">CLR</tspan></text></g><g
id="ent_btn"><rect
style="fill:url(#radialGradient31);fill-opacity:1;stroke-width:1.5203;stroke-linecap:round"
id="rect31"
width="66.056847"
height="35.687881"
x="665.51575"
y="991.91699"
rx="0"
ry="0" /><text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.2295px;line-height:105%;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;letter-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.43136;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1"
x="729.40424"
y="973.4859"
id="text31"
transform="scale(0.9576141,1.044262)"><tspan
sodipodi:role="line"
id="tspan31"
x="729.40424"
y="973.4859"
style="stroke-width:2.43136">ENT</tspan></text></g><g
id="proc_btn"><rect
style="fill:url(#radialGradient35);fill-opacity:1;stroke-width:1.5203;stroke-linecap:round"
id="rect34"
width="66.056847"
height="35.687881"
x="137.06097"
y="991.91699"
rx="0"
ry="0" /><text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:17.294px;line-height:105%;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;letter-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.30659;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1"
x="187.17685"
y="923.5293"
id="text34"
transform="scale(0.90847249,1.1007488)"><tspan
sodipodi:role="line"
id="tspan34"
x="187.17685"
y="923.5293"
style="stroke-width:2.30659">PROC</tspan></text></g><g
id="dct_btn"><rect
style="fill:url(#radialGradient33);fill-opacity:1;stroke-width:1.5203;stroke-linecap:round"
id="rect29"
width="66.056847"
height="35.687881"
x="533.40204"
y="991.91699"
rx="0"
ry="0" /><g
id="g35"
transform="matrix(0.9,0,0,0.9,57.060975,100.9761)"><text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20.255px;line-height:105%;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;letter-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.70151;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1"
x="591.38312"
y="974.21082"
id="text29"
transform="scale(0.95761411,1.044262)"><tspan
sodipodi:role="line"
id="tspan29"
x="591.38312"
y="974.21082"
style="stroke-width:2.70151">D</tspan></text><path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.2;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Triangle)"
d="M 551.95046,1009.7609 H 579.8942"
id="path35" /></g></g><g
id="rng_btn"
transform="matrix(1.5679571,0,0,1.5679571,-313.20852,-759.8324)"><rect
style="fill:url(#radialGradient40);fill-opacity:1;stroke:none;stroke-width:1.36935;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1"
id="rect38"
width="19.118223"
height="50.802853"
x="583.96704"
y="1139.9784" /><path
sodipodi:type="star"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.36935;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1"
id="path40"
inkscape:flatsided="true"
sodipodi:sides="3"
sodipodi:cx="802.21515"
sodipodi:cy="586.65814"
sodipodi:r1="9.0928698"
sodipodi:r2="4.5464349"
sodipodi:arg1="0.52359878"
sodipodi:arg2="1.5707963"
inkscape:rounded="0"
inkscape:randomized="0"
d="m 810.08981,591.20458 -15.74932,0 7.87466,-13.63931 z"
transform="matrix(0.58248765,0,0,0.58248765,126.24574,812.19181)"
inkscape:transform-center-y="-2.1273322" /><path
sodipodi:type="star"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.36935;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1"
id="path41"
inkscape:flatsided="true"
sodipodi:sides="3"
sodipodi:cx="802.21515"
sodipodi:cy="586.65814"
sodipodi:r1="9.0928698"
sodipodi:r2="4.5464349"
sodipodi:arg1="0.52359878"
sodipodi:arg2="1.5707963"
inkscape:rounded="0"
inkscape:randomized="0"
d="m 810.08981,591.20458 -15.74932,0 7.87466,-13.63931 z"
transform="matrix(-0.58248765,0,0,-0.58248765,1060.8066,1518.2937)"
inkscape:transform-center-y="2.1272992"
inkscape:transform-center-x="-4.2155407e-05" /><rect
style="opacity:0.37464232;fill:url(#linearGradient42);fill-opacity:1;stroke:none;stroke-width:1.36935;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter46)"
id="rect41"
width="19.118223"
height="8.8573084"
x="583.96704"
y="1160.9512" /><text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.89858px;line-height:105%;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;letter-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.811052;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1"
x="593.47864"
y="1167.491"
id="text41"><tspan
sodipodi:role="line"
id="tspan41"
style="stroke-width:0.811052"
x="593.47864"
y="1167.491">RNG</tspan></text></g><g
id="mnu_btn"
transform="matrix(2.1317959,0,0,2.1317959,-683.38982,-1538.0891)"><rect
style="opacity:1;fill:url(#radialGradient48);fill-opacity:1;stroke:none;stroke-width:1.36935;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1"
id="rect47"
width="19.062458"
height="19.062458"
x="584.09875"
y="1203.5364" /><text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.86638px;line-height:105%;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;letter-spacing:0px;text-anchor:middle;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.806625;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1"
x="593.64862"
y="1215.1313"
id="text47"><tspan
sodipodi:role="line"
id="tspan47"
style="stroke-width:0.806625"
x="593.64862"
y="1215.1313">MNU</tspan></text></g></g><rect
style="fill:url(#linearGradient38);fill-opacity:1;stroke:none;stroke-width:2.2;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1"
id="gradient"
width="159.18997"
height="127.97614"
x="864.81"
y="384.02386" /><g
id="bezel"><rect
style="fill:#555559;fill-opacity:1;stroke:none;stroke-width:2.134;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1"
id="background"
width="1024"
height="326.6879"
x="0"
y="0"
rx="0"
ry="0" /><g
id="element_shadows"><rect
style="fill:#010101;fill-opacity:1;stroke-width:1.5203;stroke-linecap:round;filter:url(#filter22)"
id="rect1"
width="66.056847"
height="35.687881"
x="100.03304"
y="79.98143"
rx="5.5493536"
ry="5.5493536" /><rect
style="fill:#010101;fill-opacity:1;stroke-width:1.5203;stroke-linecap:round;filter:url(#filter22)"
id="rect2"
width="66.056847"
height="35.687881"
x="202.00568"
y="274.73492"
rx="5.5493536"
ry="5.5493536" /><rect
style="fill:#010101;fill-opacity:1;stroke-width:1.5203;stroke-linecap:round;filter:url(#filter22)"
id="rect3"
width="66.056847"
height="35.687881"
x="295.33902"
y="274.73492"
rx="5.5493536"
ry="5.5493536" /><rect
style="fill:#010101;fill-opacity:1;stroke-width:1.5203;stroke-linecap:round;filter:url(#filter22)"
id="rect4"
width="66.056847"
height="35.687881"
x="388.67236"
y="274.73492"
rx="5.5493536"
ry="5.5493536" /><rect
style="fill:#010101;fill-opacity:1;stroke-width:1.5203;stroke-linecap:round;filter:url(#filter22)"
id="rect5"
width="66.056847"
height="35.687881"
x="482.00571"
y="274.73492"
rx="5.5493536"
ry="5.5493536" /><rect
style="fill:#010101;fill-opacity:1;stroke-width:1.5203;stroke-linecap:round;filter:url(#filter22)"
id="rect6"
width="66.056847"
height="35.687881"
x="575.33905"
y="274.73492"
rx="5.5493536"
ry="5.5493536" /><rect
style="fill:#010101;fill-opacity:1;stroke-width:1.5203;stroke-linecap:round;filter:url(#filter22)"
id="rect7"
width="66.056847"
height="35.687881"
x="668.67236"
y="274.73492"
rx="5.5493536"
ry="5.5493536" /><rect
style="fill:#010101;fill-opacity:1;stroke-width:1.5203;stroke-linecap:round;filter:url(#filter22)"
id="rect8"
width="66.056847"
height="35.687881"
x="762.00568"
y="274.73492"
rx="5.5493536"
ry="5.5493536" /><circle
style="fill:#010101;fill-opacity:1;stroke-width:1.5;stroke-linecap:round;filter:url(#filter22)"
id="path8"
cx="125.76662"
cy="253.27666"
r="27.143105" /><circle
style="fill:#010101;fill-opacity:1;stroke-width:3.1984;stroke-linecap:round;filter:url(#filter22)"
id="circle8"
cx="913.21527"
cy="220.13216"
r="57.876289" /><circle
style="fill:#010101;fill-opacity:1;stroke-width:0.816458;stroke-linecap:round;filter:url(#filter22)"
id="circle9"
cx="802.0899"
cy="169.88144"
r="14.774124" /><rect
style="fill:#010101;fill-opacity:1;stroke-width:1.5;stroke-linecap:round;filter:url(#filter22)"
id="rect9"
width="29.548248"
height="81.530716"
x="787.3158"
y="52.900757"
rx="14.774124"
ry="14.774124" /><rect
style="fill:#010101;fill-opacity:1;stroke-width:1.5203;stroke-linecap:round;filter:url(#filter22)"
id="rect21"
width="66.056847"
height="35.687881"
x="885.07422"
y="79.98143"
rx="5.5493536"
ry="5.5493536" /><rect
style="mix-blend-mode:normal;fill:#000000;fill-opacity:0.42438552;stroke-width:1.17777;stroke-linecap:round;filter:url(#filter19)"
id="rect18"
width="54.484573"
height="106.34416"
x="20.913731"
y="138.94962"
rx="24.394333"
ry="24.394333"
transform="matrix(0.89957285,0,0,1,4.8361718,0)" /></g><g
id="markings"><text
xml:space="preserve"
style="font-size:16.2498px;line-height:105%;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;letter-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke-width:1.52341;stroke-linecap:round"
x="1007.6089"
y="28.643665"
id="text9"
transform="scale(0.91116257,1.097499)"><tspan
sodipodi:role="line"
id="tspan9"
x="1007.6089"
y="28.643665"
style="fill:#ffffff;fill-opacity:1;stroke-width:1.52341">KLN 94 TSO</tspan></text><text
xml:space="preserve"
style="font-size:19.6141px;line-height:105%;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;letter-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke-width:1.83881;stroke-linecap:round"
x="1007.6072"
y="51.702934"
id="text10"
transform="scale(0.91116257,1.097499)"><tspan
sodipodi:role="line"
id="tspan10"
x="1007.6072"
y="51.702934"
style="fill:#ffffff;fill-opacity:1;stroke-width:1.83881">GPS</tspan></text><text
xml:space="preserve"
style="font-size:16.5292px;line-height:105%;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;letter-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke-width:1.54961;stroke-linecap:round"
x="136.55606"
y="180.87639"
id="text19"
transform="scale(0.91561743,1.0921592)"><tspan
sodipodi:role="line"
id="tspan19"
x="136.55606"
y="180.87639"
style="stroke-width:1.54961">PUSH ON</tspan></text><text
xml:space="preserve"
style="font-size:16.5292px;line-height:105%;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;letter-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke-width:1.54961;stroke-linecap:round"
x="136.07584"
y="202.25269"
id="text20"
transform="scale(0.91561743,1.0921592)"><tspan
sodipodi:role="line"
id="tspan20"
x="136.07584"
y="202.25269"
style="stroke-width:1.54961">BRT</tspan></text><path
style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2.134;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Triangle)"
id="circle20"
sodipodi:type="arc"
sodipodi:cx="125.76662"
sodipodi:cy="253.27666"
sodipodi:rx="38.613586"
sodipodi:ry="38.613586"
sodipodi:start="5.0614548"
sodipodi:end="5.5850536"
sodipodi:arc-type="arc"
d="m 138.97324,216.99175 a 38.613586,38.613586 0 0 1 16.3731,11.46457"
sodipodi:open="true" /><path
style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2.134;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1"
id="path20"
sodipodi:type="arc"
sodipodi:cx="125.76662"
sodipodi:cy="253.27666"
sodipodi:rx="38.613586"
sodipodi:ry="38.613586"
sodipodi:start="3.7524579"
sodipodi:end="4.2760567"
sodipodi:arc-type="arc"
d="M 94.136219,231.12881 A 38.613586,38.613586 0 0 1 109.44781,218.28086"
sodipodi:open="true" /><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.6541px;line-height:105%;font-family:Arial;-inkscape-font-specification:'Arial Bold Italic';text-align:center;letter-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.82112;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1"
x="148.72911"
y="261.17526"
id="text21"
transform="scale(0.85338233,1.1718077)"><tspan
sodipodi:role="line"
id="tspan21"
x="148.72911"
y="261.17526"
style="stroke-width:1.82112">BENDIX/KING</tspan></text><text
xml:space="preserve"
style="font-size:16.5292px;line-height:105%;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;letter-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke-width:1.54961;stroke-linecap:round"
x="997.41681"
y="276.62503"
id="text19-2"
transform="scale(0.91561743,1.0921592)"><tspan
sodipodi:role="line"
id="tspan19-7"
x="997.41681"
y="276.62503"
style="stroke-width:1.54961">PULL SCAN</tspan></text></g></g><rect
style="opacity:1;fill:#f7f7f7;fill-opacity:1;stroke:none;stroke-width:1.36935;stroke-linecap:butt;stroke-dasharray:none;stroke-opacity:1"
id="white"
width="42.860779"
height="72.483772"
x="94.200188"
y="1034.7778"
transform="matrix(1.6065961,0,0,1.6065961,-151.34166,-1266.9221)" /></g></svg>

After

Width:  |  Height:  |  Size: 33 KiB

View file

@ -1,164 +1,580 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- This simulates a Bendix/King KLN94 GPS
Nasal and XML 2013 James Turner
Model, Texture and Animations 2023 Benedikt Wolf
-->
<PropertyList>
<path>kln94.ac</path>
<!--
<animation>
<type>material</type>
<texture alias="../../texture"/>
</animation>
<effect>
<inherits-from>Effects/lightmap</inherits-from>
<parameters>
<texture n="1">
<image>Aircraft/Instruments-3d/cdu2/boeing_lightmap.png</image>
</texture>
<condition><use>/instrumentation/cdu/serviceable</use></condition>
<factor><use>/instrumentation/cdu/brightness-norm</use></factor>
</parameters>
<object-name>CDU</object-name>
<object-name>Btn.side.r.1</object-name>
<object-name>Btn.side.r.2</object-name>
<object-name>Btn.side.r.3</object-name>
<object-name>Btn.side.r.4</object-name>
<object-name>Btn.side.r.5</object-name>
<object-name>Btn.side.r.6</object-name>
</effect> -->
<animation>
<type>pick</type>
<object-name>ent-btn</object-name>
<action>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.enter();</script>
</binding>
</action>
</animation>
<animation>
<type>pick</type>
<object-name>crsr-btn</object-name>
<action>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.toggleCursorMode();</script>
</binding>
</action>
</animation>
<animation>
<type>pick</type>
<object-name>nrst-btn</object-name>
<action>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.nearestButton();</script>
</binding>
</action>
</animation>
<animation>
<type>pick</type>
<object-name>dto-btn</object-name>
<action>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.directTo();</script>
</binding>
</action>
</animation>
<animation>
<type>pick</type>
<object-name>obs-btn</object-name>
<action>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.obsButton();</script>
</binding>
</action>
</animation>
<animation>
<type>pick</type>
<object-name>msg-btn</object-name>
<action>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.messageButton();</script>
</binding>
</action>
</animation>
<animation>
<type>pick</type>
<object-name>alt-btn</object-name>
<action>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.altitudeButton();</script>
</binding>
</action>
</animation>
<animation>
<type>pick</type>
<object-name>clr-btn</object-name>
<action>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.clearButton();</script>
</binding>
</action>
</animation>
<animation>
<type>knob</type>
<object-name>knob-inner</object-name>
<action>
<binding>
<command>nasal</command>
<script>KLN94.innerKnob(cmdarg().getNode('offset').getValue());</script>
</binding>
</action>
</animation>
<animation>
<type>knob</type>
<object-name>knob-outer</object-name>
<action>
<binding>
<command>nasal</command>
<script>KLN94.outerKnob(cmdarg().getNode('offset').getValue());</script>
</binding>
</action>
</animation>
<animation>
<type>knob</type>
<object-name>knob-brightness</object-name>
<action>
<binding>
<command>property-adjust</command>
<property>/instrumentation/kln94/brightness-norm</property>
<step>0.05</step>
<min>0</min>
<max>1</max>
<wrap>false</wrap>
</binding>
</action>
</animation>
</PropertyList>
<path>kln94.ac</path>
<animation>
<type>pick</type>
<object-name>ent-btn</object-name>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.kln94.enter();</script>
</binding>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/enter-btn</property>
<value>1</value>
</binding>
<mod-up>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/enter-btn</property>
<value>0</value>
</binding>
</mod-up>
</action>
</animation>
<animation>
<type>translate</type>
<object-name>ent-btn</object-name>
<property>instrumentation/kln94[0]/enter-btn</property>
<factor>-0.001</factor>
<axis>
<x>1</x>
</axis>
</animation>
<animation>
<type>pick</type>
<object-name>crsr-btn</object-name>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.kln94.toggleCursorMode();</script>
</binding>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/cursor-btn</property>
<value>1</value>
</binding>
<mod-up>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/cursor-btn</property>
<value>0</value>
</binding>
</mod-up>
</action>
</animation>
<animation>
<type>translate</type>
<object-name>crsr-btn</object-name>
<property>instrumentation/kln94[0]/cursor-btn</property>
<factor>-0.001</factor>
<axis>
<x>1</x>
</axis>
</animation>
<animation>
<type>pick</type>
<object-name>nrst-btn</object-name>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.kln94.nearestButton();</script>
</binding>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/nearest-btn</property>
<value>1</value>
</binding>
<mod-up>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/nearest-btn</property>
<value>0</value>
</binding>
</mod-up>
</action>
</animation>
<animation>
<type>translate</type>
<object-name>nrst-btn</object-name>
<property>instrumentation/kln94[0]/nearest-btn</property>
<factor>-0.001</factor>
<axis>
<x>1</x>
</axis>
</animation>
<animation>
<type>pick</type>
<object-name>dto-btn</object-name>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.kln94.directTo();</script>
</binding>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/direct-to-btn</property>
<value>1</value>
</binding>
<mod-up>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/direct-to-btn</property>
<value>0</value>
</binding>
</mod-up>
</action>
</animation>
<animation>
<type>translate</type>
<object-name>dto-btn</object-name>
<property>instrumentation/kln94[0]/direct-to-btn</property>
<factor>-0.001</factor>
<axis>
<x>1</x>
</axis>
</animation>
<animation>
<type>pick</type>
<object-name>obs-btn</object-name>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.kln94.obsButton();</script>
</binding>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/obs-btn</property>
<value>1</value>
</binding>
<mod-up>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/obs-btn</property>
<value>0</value>
</binding>
</mod-up>
</action>
</animation>
<animation>
<type>translate</type>
<object-name>obs-btn</object-name>
<property>instrumentation/kln94[0]/obs-btn</property>
<factor>-0.001</factor>
<axis>
<x>1</x>
</axis>
</animation>
<animation>
<type>pick</type>
<object-name>msg-btn</object-name>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.kln94.messageButton();</script>
</binding>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/message-btn</property>
<value>1</value>
</binding>
<mod-up>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/message-btn</property>
<value>0</value>
</binding>
</mod-up>
</action>
</animation>
<animation>
<type>translate</type>
<object-name>msg-btn</object-name>
<property>instrumentation/kln94[0]/message-btn</property>
<factor>-0.001</factor>
<axis>
<x>1</x>
</axis>
</animation>
<animation>
<type>pick</type>
<object-name>proc-btn</object-name>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.kln94.procedureButton();</script>
</binding>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/procedure-btn</property>
<value>1</value>
</binding>
<mod-up>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/procedure-btn</property>
<value>0</value>
</binding>
</mod-up>
</action>
</animation>
<animation>
<type>translate</type>
<object-name>proc-btn</object-name>
<property>instrumentation/kln94[0]/procedure-btn</property>
<factor>-0.001</factor>
<axis>
<x>1</x>
</axis>
</animation>
<animation>
<type>pick</type>
<object-name>alt-btn</object-name>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.kln94.altitudeButton();</script>
</binding>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/altitude-btn</property>
<value>1</value>
</binding>
<mod-up>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/altitude-btn</property>
<value>0</value>
</binding>
</mod-up>
</action>
</animation>
<animation>
<type>translate</type>
<object-name>alt-btn</object-name>
<property>instrumentation/kln94[0]/altitude-btn</property>
<factor>-0.001</factor>
<axis>
<x>1</x>
</axis>
</animation>
<animation>
<type>pick</type>
<object-name>clr-btn</object-name>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.kln94.clearButton();</script>
</binding>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/clear-btn</property>
<value>1</value>
</binding>
<mod-up>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/clear-btn</property>
<value>0</value>
</binding>
</mod-up>
</action>
</animation>
<animation>
<type>translate</type>
<object-name>clr-btn</object-name>
<property>instrumentation/kln94[0]/clear-btn</property>
<factor>-0.001</factor>
<axis>
<x>1</x>
</axis>
</animation>
<animation>
<type>pick</type>
<object-name>mnu-btn</object-name>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.kln94.menuButton();</script>
</binding>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/menu-btn</property>
<value>1</value>
</binding>
<mod-up>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/menu-btn</property>
<value>0</value>
</binding>
</mod-up>
</action>
</animation>
<animation>
<type>translate</type>
<object-name>mnu-btn</object-name>
<property>instrumentation/kln94[0]/menu-btn</property>
<factor>-0.001</factor>
<axis>
<x> 0.966</x> <!-- cos(15 deg) -->
<y>-0.259</y> <!-- -sin(15 deg) -->
</axis>
</animation>
<animation>
<type>pick</type>
<object-name>rng-btn</object-name>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.kln94.rangeButton( 1 );</script>
</binding>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/range-btn</property>
<value>1</value>
</binding>
<mod-up>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/range-btn</property>
<value>0</value>
</binding>
</mod-up>
</action>
<action>
<button>1</button>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.kln94.rangeButton( -1 );</script>
</binding>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/range-btn</property>
<value>-1</value>
</binding>
<mod-up>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/range-btn</property>
<value>0</value>
</binding>
</mod-up>
</action>
</animation>
<animation>
<type>pick</type>
<object-name>rng-btn-up</object-name>
<visible>0</visible>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.kln94.rangeButton( 1 );</script>
</binding>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/range-btn</property>
<value>1</value>
</binding>
<mod-up>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/range-btn</property>
<value>0</value>
</binding>
</mod-up>
</action>
</animation>
<animation>
<type>pick</type>
<object-name>rng-btn-down</object-name>
<visible>0</visible>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.kln94.rangeButton( -1 );</script>
</binding>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/range-btn</property>
<value>-1</value>
</binding>
<mod-up>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/range-btn</property>
<value>0</value>
</binding>
</mod-up>
</action>
</animation>
<animation>
<type>rotate</type>
<object-name>rng-btn</object-name>
<property>instrumentation/kln94[0]/range-btn</property>
<factor>-10</factor>
<center>
<x-m>0.0142</x-m>
<y-m>0.046</y-m>
<z-m>0.0108</z-m>
</center>
<axis>
<x>0.259</x> <!-- sin(15 deg) -->
<y>0.966</y> <!-- cos(15 deg) -->
</axis>
</animation>
<animation>
<type>knob</type>
<object-name>knob-inner</object-name>
<property>instrumentation/kln94[0]/inner-knob</property>
<factor>1</factor>
<center>
<y-m> 0.063 </y-m>
<z-m> -0.009 </z-m>
</center>
<axis>
<x>1</x>
</axis>
<action>
<binding>
<command>nasal</command>
<script>KLN94.kln94.innerKnob(cmdarg().getNode('offset').getValue());</script>
</binding>
<binding>
<command>property-adjust</command>
<property>instrumentation/kln94[0]/inner-knob</property>
<factor>5</factor>
<min>0</min>
<max>359</max>
<wrap>1</wrap>
</binding>
</action>
</animation>
<animation>
<type>knob</type>
<object-name>knob-outer</object-name>
<property>instrumentation/kln94[0]/outer-knob</property>
<factor>1</factor>
<center>
<y-m> 0.063 </y-m>
<z-m> -0.009 </z-m>
</center>
<axis>
<x>1</x>
</axis>
<action>
<binding>
<command>nasal</command>
<script>KLN94.kln94.outerKnob(cmdarg().getNode('offset').getValue());</script>
</binding>
<binding>
<command>property-adjust</command>
<property>instrumentation/kln94[0]/outer-knob</property>
<factor>5</factor>
<min>0</min>
<max>359</max>
<wrap>1</wrap>
</binding>
</action>
</animation>
<animation>
<type>knob</type>
<object-name>knob-brightness</object-name>
<property>/instrumentation/kln94/brightness-norm</property>
<factor>270</factor>
<center>
<y-m> -0.0605 </y-m>
<z-m> -0.014 </z-m>
</center>
<axis>
<x>1</x>
</axis>
<action>
<binding>
<command>property-adjust</command>
<property>instrumentation/kln94/brightness-norm</property>
<factor>0.05</factor>
<min>0</min>
<max>1</max>
<wrap>false</wrap>
</binding>
</action>
</animation>
<animation>
<type>pick</type>
<object-name>knob-brightness-push</object-name>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>KLN94.kln94.powerButton();</script>
</binding>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/power-brightness-knob</property>
<value>1</value>
</binding>
<mod-up>
<binding>
<command>property-assign</command>
<property>instrumentation/kln94[0]/power-brightness-knob</property>
<value>0</value>
</binding>
</mod-up>
</action>
</animation>
<animation>
<type>translate</type>
<object-name>knob-brightness</object-name>
<object-name>knob-brightness-push</object-name>
<property>instrumentation/kln94[0]/power-brightness-knob</property>
<factor>-0.001</factor>
<axis>
<x>1</x>
</axis>
</animation>
</PropertyList>

View file

@ -2,79 +2,81 @@
var Nav1Page =
{
a:2,
new: func()
{
m = {parents: [Nav1Page, KLN94.Page.new(KLN94.PAGE_NAV, 0)]};
return m;
},
hasActiveIdent: func { 1 },
showsCDI: func { 1 },
display: func(gps)
{
if (gps.isDirectToActive()) {
} else {
# leg mode
gps.setLine(0, sprintf('%6s->%6s',
gps.props.previousIdent.getStringValue(),
gps.props.activeIdent.getStringValue())
);
}
gps.setLine(3, ' VNV Off');
var toFrom = gps.isTo() ? 'To' : 'Fr';
var eteToWp1 = gps.formatDuration(gps.props.timeToWaypoint.getIntValue());
gps.setLine(4, sprintf('%03d*%s ', bearingToWp1, toFrom) ~ eteToWp1);
},
refresh: func(gps)
{
}
a:2,
new: func()
{
m = {parents: [Nav1Page, KLN94.Page.new(KLN94.PAGE_NAV, 0, 0)]};
return m;
},
hasActiveIdent: func { 1 },
showsCDI: func { 1 },
display: func(gps)
{
if (gps.isDirectToActive()) {
} else {
# leg mode
gps.setLine(0, sprintf('%6s->%6s',
gps.props.previousIdent.getStringValue(),
gps.props.activeIdent.getStringValue())
);
}
gps.setLine(3, ' VNV Off');
var toFrom = gps.isTo() ? 'To' : 'Fr';
var eteToWp1 = gps.formatDuration(gps.props.timeToWaypoint.getIntValue());
gps.setLine(4, sprintf('%03d*%s ', bearingToWp1, toFrom) ~ eteToWp1);
},
refresh: func(gps)
{
}
};
var Nav2Page =
{
new: func()
{
m = {parents: [Nav2Page, KLN94.Page.new(KLN94.PAGE_NAV, 1)]};
return m;
},
display: func(gps)
{
# select refnavaid!
gps.setLine(0, ' PRESENT POSN'),
gps.setLine(1, ' Ref:%s', gps.refNavaid.id);
gps.setLine(3, ' ' + gps.formatLatitude(gps.props.indicatedLat.getDoubleValue()));
gps.setLine(4, ' ' + gps.formatLongitude(gps.props.indicatedLon.getDoubleValue()));
}
new: func()
{
m = {parents: [Nav2Page, KLN94.Page.new(KLN94.PAGE_NAV, 0, 1)]};
return m;
},
display: func(gps)
{
# select refnavaid!
gps.setLine(0, ' PRESENT POSN');
gps.setLine(1, ' Ref:%s', gps.refNavaid.id);
gps.setLine(3, ' ' + gps.formatLatitude(gps.props.indicatedLat.getDoubleValue()));
gps.setLine(4, ' ' + gps.formatLongitude(gps.props.indicatedLon.getDoubleValue()));
}
};
var Nav3Page =
{
new: func()
{
m = {parents: [Nav3Page, KLN94.Page.new(KLN94.PAGE_NAV, 2)]};
return m;
},
new: func()
{
m = {parents: [Nav3Page, KLN94.Page.new(KLN94.PAGE_NAV, 0, 2)]};
return m;
},
};
var nav1 = Nav1Page.new();
gps.addPage(nav1);
gps.addPage(Nav2Page.new());
gps.addPage(Nav3Page.new());
# FIXME gps.addPage causes a "No such member" error
# I don't yet know how to fix this, thus it's commented out for now
# (Benedikt Wolf 2023)
#gps.addPage(nav1);
#gps.addPage(Nav2Page.new());
#gps.addPage(Nav3Page.new());