KLN94: Improve 3D Model, Fix/Hack some Nasal parts so that the script loads without errors (still not working), add animations to bezel
This commit is contained in:
parent
65ceeb64b9
commit
f645f6a195
9 changed files with 33332 additions and 1449 deletions
File diff suppressed because it is too large
Load diff
Binary file not shown.
BIN
Aircraft/Instruments-3d/kln94/kln94.blend1
Normal file
BIN
Aircraft/Instruments-3d/kln94/kln94.blend1
Normal file
Binary file not shown.
|
@ -1,385 +1,446 @@
|
||||||
var kln94 = nil;
|
var kln94 = nil;
|
||||||
|
|
||||||
var KLN94 = {
|
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: {
|
toggleCursorMode: func{
|
||||||
new : func(owner, s, idx)
|
# Cursor Button Functionality
|
||||||
{
|
},
|
||||||
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'],
|
nearestButton: func{
|
||||||
|
# Nearest Button Functionality
|
||||||
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);
|
directTo: func{
|
||||||
m._setupCanvas(placement);
|
# Direct To (DTO) Button Functionality
|
||||||
m._page = nil;
|
},
|
||||||
|
|
||||||
m._messageScreenActive = 0;
|
obsButton: func{
|
||||||
m._messages = [];
|
# OBS Button Functionality
|
||||||
|
},
|
||||||
m._cursorActive = 0;
|
|
||||||
m._cursorField = 0;
|
messageButton: func{
|
||||||
m._enterAction = nil;
|
# Messages Button Functionality
|
||||||
|
if (me._messageScreenActive) {
|
||||||
|
me._messages = me._messages[1:]; # pop front
|
||||||
m._setupProps();
|
if (size(me._messages) == 0) {
|
||||||
|
me._messageScreenActive = 0;
|
||||||
return m;
|
# refresh normal screen
|
||||||
},
|
return;
|
||||||
|
}
|
||||||
_setupCanvas: func(placement)
|
|
||||||
{
|
me._buildMessageScreen();
|
||||||
me._canvas = canvas.new(KLN94.canvas_settings);
|
return;
|
||||||
var text_style = {
|
}
|
||||||
'font': "LiberationFonts/LiberationMono-Bold.ttf",
|
|
||||||
'character-size': 34,
|
if (size(me._messages) == 0) {
|
||||||
'character-aspect-ratio': 1.2
|
debug.dump('no messages to show');
|
||||||
};
|
return;
|
||||||
|
}
|
||||||
me.rootNode.initNode('brightness-norm', 0.5, 'DOUBLE');
|
|
||||||
|
me._messageScreenActive = 1;
|
||||||
me._canvas.setColorBackground(1.0, 0.0, 0.0);
|
me._buildMessageScreen();
|
||||||
me._canvas.addPlacement(placement);
|
},
|
||||||
|
|
||||||
me._navDataArea = me._canvas.createGroup();
|
procedureButton: func{
|
||||||
me._navDataArea.setTranslation(0, 0);
|
# Procedure Button Functionality
|
||||||
me._navDataLines = [];
|
},
|
||||||
|
|
||||||
var navAreaH = (KLN94.canvas_settings.view[1] - KLN94.PAGE_BAR_HEIGHT) / 2;
|
altitudeButton: func{
|
||||||
var r1 = me._navDataArea.rect(0, 0, KLN94.NAV_DATA_WIDTH, navAreaH);
|
# Altitude Button Functionality
|
||||||
var r2 = me._navDataArea.rect(0, navAreaH, KLN94.NAV_DATA_WIDTH, navAreaH);
|
},
|
||||||
r1.setColor(0,1,1); # cyan
|
|
||||||
r2.setColor(0,1,1);
|
clearButton: func{
|
||||||
|
# Clear Button Functionality
|
||||||
var lineH = (KLN94.canvas_settings.view[1] - KLN94.PAGE_BAR_HEIGHT) / 5;
|
},
|
||||||
|
|
||||||
for (var i=0; i<4; i +=1) {
|
menuButton: func{
|
||||||
var t = me._navDataArea.createChild("text");
|
# Menu Button Functionality
|
||||||
t.setColor(1, 1, 1);
|
},
|
||||||
t._node.setValues(text_style);
|
|
||||||
t.setAlignment("left-center");
|
rangeButton: func( dir ){
|
||||||
t.setTranslation(0.0, (i + 0.5) * lineH);
|
# Range Button Functionality
|
||||||
append(me._navDataLines, t);
|
# variable dir:
|
||||||
}
|
# -1 = down (decrease)
|
||||||
|
# 0 = not pressed
|
||||||
me._pageBarArea = me._canvas.createGroup();
|
# 1 = up (increase)
|
||||||
me._pageBarArea.setTranslation(0, KLN94.canvas_settings.view[1] - KLN94.PAGE_BAR_HEIGHT);
|
},
|
||||||
|
|
||||||
var ln = me._pageBarArea.createChild('path');
|
innerKnob: func( offset ){
|
||||||
ln.setColor(0,1,1); # cyan
|
# Inner Knob Functionality
|
||||||
|
},
|
||||||
me._pageBarText = me._pageBarArea.createChild("text");
|
|
||||||
me._pageBarText._node.setValues(text_style);
|
outerKnob: func( offset ){
|
||||||
me._pageBarText.setAlignment("left-center");
|
# Outer Knob Functionality
|
||||||
me._pageBarText.setColor(0, 0, 1);
|
},
|
||||||
|
|
||||||
me._pageBarInverseText = me._pageBarArea.createChild("text");
|
powerButton: func{
|
||||||
me._pageBarInverseText._node.setValues(text_style);
|
# Power Button Functionality
|
||||||
me._pageBarInverseText.setAlignment("left-center");
|
# Power Button equals to pushing in the brightness knob
|
||||||
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);
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
reload_gps = func
|
reload_gps = func
|
||||||
{
|
{
|
||||||
kln94._setActivePage(nil); # force existing page to be undisplayed cleanly
|
kln94._setActivePage(nil); # force existing page to be undisplayed cleanly
|
||||||
|
|
||||||
# make the cdu instance available inside the module namespace
|
# make the cdu instance available inside the module namespace
|
||||||
# we are going to load into.
|
# we are going to load into.
|
||||||
# for a reload this also wipes the existing namespace, which we want
|
# for a reload this also wipes the existing namespace, which we want
|
||||||
globals['kln94_NS'] = { gps: kln94, KLN94:KLN94 };
|
globals['kln94_NS'] = { gps: kln94, KLN94:KLN94 };
|
||||||
|
|
||||||
var pages = ['navPages.nas', 'infoPages.nas', 'flightplanPages.nas', 'settingPages.nas', 'auxPages.nas'];
|
var pages = ['navPages.nas', 'flightplanPages.nas', 'settingPages.nas', 'auxPages.nas'];
|
||||||
|
# , 'infoPages.nas'
|
||||||
#var settings = props.globals.getNode('/instrumentation/cdu/settings');
|
|
||||||
foreach (var path; pages) {
|
#var settings = props.globals.getNode('/instrumentation/cdu/settings');
|
||||||
# resolve the path in FG_ROOT, and --fg-aircraft dir, etc
|
foreach (var path; pages) {
|
||||||
var abspath = resolvepath('Aircraft/Instruments-3d/kln94/' ~ path);
|
# resolve the path in FG_ROOT, and --fg-aircraft dir, etc
|
||||||
if (io.stat(abspath) == nil) {
|
var abspath = resolvepath('Aircraft/Instruments-3d/kln94/' ~ path);
|
||||||
debug.dump('KN94 page not found:', path, abspath);
|
if (io.stat(abspath) == nil) {
|
||||||
continue;
|
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
|
# load pages code into a seperate namespace which we defined above
|
||||||
io.load_nasal(abspath, 'kln94_NS');
|
# also means we can clean out that namespace later
|
||||||
}
|
io.load_nasal(abspath, 'kln94_NS');
|
||||||
# cdu.displayPageByTag(getprop('/instrumentation/cdu/settings/boot-page'));
|
}
|
||||||
|
# cdu.displayPageByTag(getprop('/instrumentation/cdu/settings/boot-page'));
|
||||||
};
|
};
|
||||||
|
|
||||||
setlistener("/nasal/canvas/loaded", func
|
setlistener("/nasal/canvas/loaded", func
|
||||||
{
|
{
|
||||||
# create base PGS
|
# create base PGS
|
||||||
kln94 = KLN94.new('/instrumentation/gps', {"node": "screen"});
|
kln94 = KLN94.new('/instrumentation/gps', {"node": "screen"});
|
||||||
reload_gps();
|
reload_gps();
|
||||||
}, 1);
|
}, 1);
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 78 KiB |
788
Aircraft/Instruments-3d/kln94/kln94.svg
Normal file
788
Aircraft/Instruments-3d/kln94/kln94.svg
Normal 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 |
|
@ -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>
|
<PropertyList>
|
||||||
|
|
||||||
<path>kln94.ac</path>
|
<path>kln94.ac</path>
|
||||||
|
|
||||||
<!--
|
<animation>
|
||||||
<animation>
|
<type>pick</type>
|
||||||
<type>material</type>
|
<object-name>ent-btn</object-name>
|
||||||
<texture alias="../../texture"/>
|
<action>
|
||||||
</animation>
|
<button>0</button>
|
||||||
|
<repeatable>false</repeatable>
|
||||||
<effect>
|
<binding>
|
||||||
<inherits-from>Effects/lightmap</inherits-from>
|
<command>nasal</command>
|
||||||
<parameters>
|
<script>KLN94.kln94.enter();</script>
|
||||||
<texture n="1">
|
</binding>
|
||||||
<image>Aircraft/Instruments-3d/cdu2/boeing_lightmap.png</image>
|
<binding>
|
||||||
</texture>
|
<command>property-assign</command>
|
||||||
<condition><use>/instrumentation/cdu/serviceable</use></condition>
|
<property>instrumentation/kln94[0]/enter-btn</property>
|
||||||
|
<value>1</value>
|
||||||
<factor><use>/instrumentation/cdu/brightness-norm</use></factor>
|
</binding>
|
||||||
</parameters>
|
<mod-up>
|
||||||
<object-name>CDU</object-name>
|
<binding>
|
||||||
<object-name>Btn.side.r.1</object-name>
|
<command>property-assign</command>
|
||||||
<object-name>Btn.side.r.2</object-name>
|
<property>instrumentation/kln94[0]/enter-btn</property>
|
||||||
<object-name>Btn.side.r.3</object-name>
|
<value>0</value>
|
||||||
<object-name>Btn.side.r.4</object-name>
|
</binding>
|
||||||
<object-name>Btn.side.r.5</object-name>
|
</mod-up>
|
||||||
<object-name>Btn.side.r.6</object-name>
|
</action>
|
||||||
</effect> -->
|
</animation>
|
||||||
|
<animation>
|
||||||
<animation>
|
<type>translate</type>
|
||||||
<type>pick</type>
|
<object-name>ent-btn</object-name>
|
||||||
<object-name>ent-btn</object-name>
|
<property>instrumentation/kln94[0]/enter-btn</property>
|
||||||
<action>
|
<factor>-0.001</factor>
|
||||||
<repeatable>false</repeatable>
|
<axis>
|
||||||
<binding>
|
<x>1</x>
|
||||||
<command>nasal</command>
|
</axis>
|
||||||
<script>KLN94.enter();</script>
|
</animation>
|
||||||
</binding>
|
|
||||||
</action>
|
<animation>
|
||||||
</animation>
|
<type>pick</type>
|
||||||
|
<object-name>crsr-btn</object-name>
|
||||||
<animation>
|
<action>
|
||||||
<type>pick</type>
|
<button>0</button>
|
||||||
<object-name>crsr-btn</object-name>
|
<repeatable>false</repeatable>
|
||||||
<action>
|
<binding>
|
||||||
<repeatable>false</repeatable>
|
<command>nasal</command>
|
||||||
<binding>
|
<script>KLN94.kln94.toggleCursorMode();</script>
|
||||||
<command>nasal</command>
|
</binding>
|
||||||
<script>KLN94.toggleCursorMode();</script>
|
<binding>
|
||||||
</binding>
|
<command>property-assign</command>
|
||||||
</action>
|
<property>instrumentation/kln94[0]/cursor-btn</property>
|
||||||
</animation>
|
<value>1</value>
|
||||||
|
</binding>
|
||||||
<animation>
|
<mod-up>
|
||||||
<type>pick</type>
|
<binding>
|
||||||
<object-name>nrst-btn</object-name>
|
<command>property-assign</command>
|
||||||
<action>
|
<property>instrumentation/kln94[0]/cursor-btn</property>
|
||||||
<repeatable>false</repeatable>
|
<value>0</value>
|
||||||
<binding>
|
</binding>
|
||||||
<command>nasal</command>
|
</mod-up>
|
||||||
<script>KLN94.nearestButton();</script>
|
</action>
|
||||||
</binding>
|
</animation>
|
||||||
</action>
|
<animation>
|
||||||
</animation>
|
<type>translate</type>
|
||||||
|
<object-name>crsr-btn</object-name>
|
||||||
<animation>
|
<property>instrumentation/kln94[0]/cursor-btn</property>
|
||||||
<type>pick</type>
|
<factor>-0.001</factor>
|
||||||
<object-name>dto-btn</object-name>
|
<axis>
|
||||||
<action>
|
<x>1</x>
|
||||||
<repeatable>false</repeatable>
|
</axis>
|
||||||
<binding>
|
</animation>
|
||||||
<command>nasal</command>
|
|
||||||
<script>KLN94.directTo();</script>
|
<animation>
|
||||||
</binding>
|
<type>pick</type>
|
||||||
</action>
|
<object-name>nrst-btn</object-name>
|
||||||
</animation>
|
<action>
|
||||||
|
<button>0</button>
|
||||||
<animation>
|
<repeatable>false</repeatable>
|
||||||
<type>pick</type>
|
<binding>
|
||||||
<object-name>obs-btn</object-name>
|
<command>nasal</command>
|
||||||
<action>
|
<script>KLN94.kln94.nearestButton();</script>
|
||||||
<repeatable>false</repeatable>
|
</binding>
|
||||||
<binding>
|
<binding>
|
||||||
<command>nasal</command>
|
<command>property-assign</command>
|
||||||
<script>KLN94.obsButton();</script>
|
<property>instrumentation/kln94[0]/nearest-btn</property>
|
||||||
</binding>
|
<value>1</value>
|
||||||
</action>
|
</binding>
|
||||||
</animation>
|
<mod-up>
|
||||||
|
<binding>
|
||||||
<animation>
|
<command>property-assign</command>
|
||||||
<type>pick</type>
|
<property>instrumentation/kln94[0]/nearest-btn</property>
|
||||||
<object-name>msg-btn</object-name>
|
<value>0</value>
|
||||||
<action>
|
</binding>
|
||||||
<repeatable>false</repeatable>
|
</mod-up>
|
||||||
<binding>
|
</action>
|
||||||
<command>nasal</command>
|
</animation>
|
||||||
<script>KLN94.messageButton();</script>
|
<animation>
|
||||||
</binding>
|
<type>translate</type>
|
||||||
</action>
|
<object-name>nrst-btn</object-name>
|
||||||
</animation>
|
<property>instrumentation/kln94[0]/nearest-btn</property>
|
||||||
|
<factor>-0.001</factor>
|
||||||
<animation>
|
<axis>
|
||||||
<type>pick</type>
|
<x>1</x>
|
||||||
<object-name>alt-btn</object-name>
|
</axis>
|
||||||
<action>
|
</animation>
|
||||||
<repeatable>false</repeatable>
|
|
||||||
<binding>
|
<animation>
|
||||||
<command>nasal</command>
|
<type>pick</type>
|
||||||
<script>KLN94.altitudeButton();</script>
|
<object-name>dto-btn</object-name>
|
||||||
</binding>
|
<action>
|
||||||
</action>
|
<button>0</button>
|
||||||
</animation>
|
<repeatable>false</repeatable>
|
||||||
|
<binding>
|
||||||
<animation>
|
<command>nasal</command>
|
||||||
<type>pick</type>
|
<script>KLN94.kln94.directTo();</script>
|
||||||
<object-name>clr-btn</object-name>
|
</binding>
|
||||||
<action>
|
<binding>
|
||||||
<repeatable>false</repeatable>
|
<command>property-assign</command>
|
||||||
<binding>
|
<property>instrumentation/kln94[0]/direct-to-btn</property>
|
||||||
<command>nasal</command>
|
<value>1</value>
|
||||||
<script>KLN94.clearButton();</script>
|
</binding>
|
||||||
</binding>
|
<mod-up>
|
||||||
</action>
|
<binding>
|
||||||
</animation>
|
<command>property-assign</command>
|
||||||
|
<property>instrumentation/kln94[0]/direct-to-btn</property>
|
||||||
<animation>
|
<value>0</value>
|
||||||
<type>knob</type>
|
</binding>
|
||||||
<object-name>knob-inner</object-name>
|
</mod-up>
|
||||||
<action>
|
</action>
|
||||||
<binding>
|
</animation>
|
||||||
<command>nasal</command>
|
<animation>
|
||||||
<script>KLN94.innerKnob(cmdarg().getNode('offset').getValue());</script>
|
<type>translate</type>
|
||||||
</binding>
|
<object-name>dto-btn</object-name>
|
||||||
</action>
|
<property>instrumentation/kln94[0]/direct-to-btn</property>
|
||||||
</animation>
|
<factor>-0.001</factor>
|
||||||
|
<axis>
|
||||||
<animation>
|
<x>1</x>
|
||||||
<type>knob</type>
|
</axis>
|
||||||
<object-name>knob-outer</object-name>
|
</animation>
|
||||||
<action>
|
|
||||||
<binding>
|
<animation>
|
||||||
<command>nasal</command>
|
<type>pick</type>
|
||||||
<script>KLN94.outerKnob(cmdarg().getNode('offset').getValue());</script>
|
<object-name>obs-btn</object-name>
|
||||||
</binding>
|
<action>
|
||||||
</action>
|
<button>0</button>
|
||||||
</animation>
|
<repeatable>false</repeatable>
|
||||||
|
<binding>
|
||||||
|
<command>nasal</command>
|
||||||
<animation>
|
<script>KLN94.kln94.obsButton();</script>
|
||||||
<type>knob</type>
|
</binding>
|
||||||
<object-name>knob-brightness</object-name>
|
<binding>
|
||||||
<action>
|
<command>property-assign</command>
|
||||||
<binding>
|
<property>instrumentation/kln94[0]/obs-btn</property>
|
||||||
<command>property-adjust</command>
|
<value>1</value>
|
||||||
<property>/instrumentation/kln94/brightness-norm</property>
|
</binding>
|
||||||
<step>0.05</step>
|
<mod-up>
|
||||||
<min>0</min>
|
<binding>
|
||||||
<max>1</max>
|
<command>property-assign</command>
|
||||||
<wrap>false</wrap>
|
<property>instrumentation/kln94[0]/obs-btn</property>
|
||||||
</binding>
|
<value>0</value>
|
||||||
</action>
|
</binding>
|
||||||
</animation>
|
</mod-up>
|
||||||
|
</action>
|
||||||
</PropertyList>
|
</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>
|
||||||
|
|
Binary file not shown.
|
@ -2,79 +2,81 @@
|
||||||
|
|
||||||
var Nav1Page =
|
var Nav1Page =
|
||||||
{
|
{
|
||||||
a:2,
|
a:2,
|
||||||
|
|
||||||
|
|
||||||
new: func()
|
new: func()
|
||||||
{
|
{
|
||||||
m = {parents: [Nav1Page, KLN94.Page.new(KLN94.PAGE_NAV, 0)]};
|
m = {parents: [Nav1Page, KLN94.Page.new(KLN94.PAGE_NAV, 0, 0)]};
|
||||||
return m;
|
return m;
|
||||||
},
|
},
|
||||||
|
|
||||||
hasActiveIdent: func { 1 },
|
hasActiveIdent: func { 1 },
|
||||||
showsCDI: func { 1 },
|
showsCDI: func { 1 },
|
||||||
|
|
||||||
display: func(gps)
|
display: func(gps)
|
||||||
{
|
{
|
||||||
if (gps.isDirectToActive()) {
|
if (gps.isDirectToActive()) {
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
# leg mode
|
# leg mode
|
||||||
gps.setLine(0, sprintf('%6s->%6s',
|
gps.setLine(0, sprintf('%6s->%6s',
|
||||||
gps.props.previousIdent.getStringValue(),
|
gps.props.previousIdent.getStringValue(),
|
||||||
gps.props.activeIdent.getStringValue())
|
gps.props.activeIdent.getStringValue())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
gps.setLine(3, ' VNV Off');
|
gps.setLine(3, ' VNV Off');
|
||||||
|
|
||||||
var toFrom = gps.isTo() ? 'To' : 'Fr';
|
var toFrom = gps.isTo() ? 'To' : 'Fr';
|
||||||
var eteToWp1 = gps.formatDuration(gps.props.timeToWaypoint.getIntValue());
|
var eteToWp1 = gps.formatDuration(gps.props.timeToWaypoint.getIntValue());
|
||||||
gps.setLine(4, sprintf('%03d*%s ', bearingToWp1, toFrom) ~ eteToWp1);
|
gps.setLine(4, sprintf('%03d*%s ', bearingToWp1, toFrom) ~ eteToWp1);
|
||||||
},
|
},
|
||||||
|
|
||||||
refresh: func(gps)
|
refresh: func(gps)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var Nav2Page =
|
var Nav2Page =
|
||||||
{
|
{
|
||||||
new: func()
|
new: func()
|
||||||
{
|
{
|
||||||
m = {parents: [Nav2Page, KLN94.Page.new(KLN94.PAGE_NAV, 1)]};
|
m = {parents: [Nav2Page, KLN94.Page.new(KLN94.PAGE_NAV, 0, 1)]};
|
||||||
return m;
|
return m;
|
||||||
},
|
},
|
||||||
|
|
||||||
display: func(gps)
|
display: func(gps)
|
||||||
{
|
{
|
||||||
# select refnavaid!
|
# select refnavaid!
|
||||||
|
|
||||||
gps.setLine(0, ' PRESENT POSN'),
|
gps.setLine(0, ' PRESENT POSN');
|
||||||
gps.setLine(1, ' Ref:%s', gps.refNavaid.id);
|
gps.setLine(1, ' Ref:%s', gps.refNavaid.id);
|
||||||
|
|
||||||
gps.setLine(3, ' ' + gps.formatLatitude(gps.props.indicatedLat.getDoubleValue()));
|
gps.setLine(3, ' ' + gps.formatLatitude(gps.props.indicatedLat.getDoubleValue()));
|
||||||
gps.setLine(4, ' ' + gps.formatLongitude(gps.props.indicatedLon.getDoubleValue()));
|
gps.setLine(4, ' ' + gps.formatLongitude(gps.props.indicatedLon.getDoubleValue()));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var Nav3Page =
|
var Nav3Page =
|
||||||
{
|
{
|
||||||
new: func()
|
new: func()
|
||||||
{
|
{
|
||||||
m = {parents: [Nav3Page, KLN94.Page.new(KLN94.PAGE_NAV, 2)]};
|
m = {parents: [Nav3Page, KLN94.Page.new(KLN94.PAGE_NAV, 0, 2)]};
|
||||||
return m;
|
return m;
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
var nav1 = Nav1Page.new();
|
var nav1 = Nav1Page.new();
|
||||||
gps.addPage(nav1);
|
|
||||||
|
# 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
|
||||||
gps.addPage(Nav2Page.new());
|
# (Benedikt Wolf 2023)
|
||||||
gps.addPage(Nav3Page.new());
|
|
||||||
|
#gps.addPage(nav1);
|
||||||
|
|
||||||
|
|
||||||
|
#gps.addPage(Nav2Page.new());
|
||||||
|
#gps.addPage(Nav3Page.new());
|
||||||
|
|
Loading…
Add table
Reference in a new issue