SVG files from Michat on the forum: Sat Jan 13, 2018 7:36 pm Me, Michat. I donate the so called garmin1000B.svg file created by me using GPL Inkscape software to FlightGear, the Free Flight Simulator as a present to the flightgear.org. Since now I derived all legal rights to FlightGear via two active developers representatives on this forum topic: Stuart and hooray. They will proceed to upload the file to the FG repository, choosing the best license in order to protect FlightGear from any scammer simulation software, if is possible. Having account the nature of the Flightgear project as public well. The 13TH of January 2018 in Madrid Spain. Michat.
219 lines
9.7 KiB
Text
219 lines
9.7 KiB
Text
|
|
io.include("constants.nas");
|
|
|
|
var MFDGUI =
|
|
{
|
|
|
|
# List of UI hotspots and their mapping to Emesary bridge notifications
|
|
WHEEL_HOT_SPOTS : [
|
|
{ notification: fg1000.FASCIA.NAV_VOL, shift: 0, top_left: [65, 45], bottom_right: [112, 90] },
|
|
{ notification: fg1000.FASCIA.NAV_INNER, shift: 0, top_left: [45, 168], bottom_right: [135, 250] },
|
|
{ notification: fg1000.FASCIA.NAV_OUTER, shift: 1, top_left: [45, 168], bottom_right: [135, 250] },
|
|
{ notification: fg1000.FASCIA.HEADING, shift: 0, top_left: [45, 338], bottom_right: [135, 411] },
|
|
{ notification: fg1000.FASCIA.ALT_INNER, shift: 0, top_left: [45, 800], bottom_right: [135, 880] },
|
|
{ notification: fg1000.FASCIA.ALT_OUTER, shift: 1, top_left: [45, 800], bottom_right: [135, 880] },
|
|
|
|
|
|
{ notification: fg1000.FASCIA.COM_VOL, shift: 0, top_left: [1290, 45], bottom_right: [1340, 90] },
|
|
{ notification: fg1000.FASCIA.COM_INNER, shift: 0, top_left: [1275, 170], bottom_right: [1355, 245] },
|
|
{ notification: fg1000.FASCIA.COM_OUTER, shift: 1, top_left: [1275, 170], bottom_right: [1355, 245] },
|
|
|
|
{ notification: fg1000.FASCIA.CRS, shift: 0, top_left: [1275, 331], bottom_right: [1355, 410] },
|
|
{ notification: fg1000.FASCIA.BARO, shift: 1, top_left: [1275, 331], bottom_right: [1355, 410] },
|
|
|
|
{ notification: fg1000.FASCIA.RANGE, shift: 0, top_left: [1275, 497], bottom_right: [1355, 554] },
|
|
|
|
{ notification: fg1000.FASCIA.FMS_INNER, shift: 0, top_left: [1275, 800], bottom_right: [1355, 880] },
|
|
{ notification: fg1000.FASCIA.FMS_OUTER, shift: 1, top_left: [1275, 800], bottom_right: [1355, 880] },
|
|
],
|
|
|
|
CLICK_HOT_SPOTS : [
|
|
{ notification: fg1000.FASCIA.NAV_ID, shift: 0, value: 1, top_left: [65, 47], bottom_right: [112, 90] },
|
|
{ notification: fg1000.FASCIA.NAV_FREQ_TRANSFER, shift: 0, value: 1, top_left: [100, 102], bottom_right: [150, 138] },
|
|
{ notification: fg1000.FASCIA.NAV_TOGGLE, shift: 0, value: 1, top_left: [45, 168], bottom_right: [135, 250] },
|
|
{ notification: fg1000.FASCIA.HEADING_PRESS, shift: 0, value: 1, top_left: [45, 338], bottom_right: [135, 411] },
|
|
|
|
{ notification: fg1000.FASCIA.COM_VOL_TOGGLE, shift: 0, value: 1, top_left: [1290, 45], bottom_right: [1340, 90] },
|
|
{ notification: fg1000.FASCIA.COM_FREQ_TRANSFER, shift: 0, value: 1, top_left: [1250, 100], bottom_right: [1300, 140] },
|
|
{ notification: fg1000.FASCIA.COM_FREQ_TRANSFER_HOLD, shift: 1, value: 1, top_left: [1250, 100], bottom_right: [1300, 140] },
|
|
{ notification: fg1000.FASCIA.CRS_CENTER, shift: 0, value: 1, top_left: [1275, 331], bottom_right: [1355, 410] },
|
|
|
|
{ notification: fg1000.FASCIA.JOYSTICK_PRESS, shift: 0, value: 1, top_left: [1295, 500], bottom_right: [1345, 550] },
|
|
|
|
{ notification: fg1000.FASCIA.JOYSTICK_HORIZONTAL, shift: 0, value: -1, top_left: [1255, 500], bottom_right: [1285, 550] },
|
|
{ notification: fg1000.FASCIA.JOYSTICK_HORIZONTAL, shift: 0, value: 1, top_left: [1345, 500], bottom_right: [1380, 550] },
|
|
|
|
{ notification: fg1000.FASCIA.JOYSTICK_VERTICAL, shift: 0, value: -1, top_left: [1295, 465], bottom_right: [1345, 500] },
|
|
{ notification: fg1000.FASCIA.JOYSTICK_VERTICAL, shift: 0, value: 1, top_left: [1295, 550], bottom_right: [1345, 585] },
|
|
|
|
{ notification: fg1000.FASCIA.DTO, shift: 0, value: 1, top_left: [1255, 620], bottom_right: [1305, 660] },
|
|
{ notification: fg1000.FASCIA.FPL, shift: 0, value: 1, top_left: [1255, 670], bottom_right: [1305, 710] },
|
|
{ notification: fg1000.FASCIA.CLR, shift: 0, value: 1, top_left: [1255, 720], bottom_right: [1305, 760] },
|
|
{ notification: fg1000.FASCIA.CLR_HOLD, shift: 1, value: 1, top_left: [1255, 720], bottom_right: [1305, 760] },
|
|
|
|
{ notification: fg1000.FASCIA.MENU, shift: 0, value: 1, top_left: [1325, 620], bottom_right: [1380, 660] },
|
|
{ notification: fg1000.FASCIA.PROC, shift: 0, value: 1, top_left: [1325, 670], bottom_right: [1380, 710] },
|
|
{ notification: fg1000.FASCIA.ENT, shift: 0, value: 1, top_left: [1325, 720], bottom_right: [1380, 760] },
|
|
|
|
{ notification: fg1000.FASCIA.FMS_CRSR, shift: 0, value: 1, top_left: [1275, 800], bottom_right: [1355, 880] },
|
|
],
|
|
|
|
SOFTKEY_HOTSPOTS : [
|
|
{ Id: 1, top_left: [205, 830], bottom_right: [265, 875] },
|
|
{ Id: 2, top_left: [290, 830], bottom_right: [350, 875] },
|
|
{ Id: 3, top_left: [375, 830], bottom_right: [435, 875] },
|
|
{ Id: 4, top_left: [460, 830], bottom_right: [520, 875] },
|
|
{ Id: 5, top_left: [545, 830], bottom_right: [605, 875] },
|
|
{ Id: 6, top_left: [630, 830], bottom_right: [690, 875] },
|
|
{ Id: 7, top_left: [715, 830], bottom_right: [775, 875] },
|
|
{ Id: 8, top_left: [800, 830], bottom_right: [860, 875] },
|
|
{ Id: 9, top_left: [885, 830], bottom_right: [945, 875] },
|
|
{ Id: 10, top_left: [970, 830], bottom_right: [1030, 875] },
|
|
{ Id: 11, top_left: [1055, 830], bottom_right: [1115, 875] },
|
|
{ Id: 12, top_left: [1145, 830], bottom_right: [1200, 875] },
|
|
],
|
|
|
|
new : func()
|
|
{
|
|
var obj = {
|
|
parents : [ MFDGUI ],
|
|
mfd : nil,
|
|
eisPublisher : nil,
|
|
navcomPublisher : nil,
|
|
navcomUpdater : nil,
|
|
navdataInterface : nil,
|
|
width : 1407,
|
|
height : 918,
|
|
};
|
|
|
|
obj.window = canvas.Window.new([obj.width,obj.height],"dialog").set('title',"FG1000 MFD");
|
|
|
|
obj.window.del = func() {
|
|
# Over-ride the window.del function so we clean up when the user closes the window
|
|
# Use call method to ensure we have the correct closure.
|
|
call(obj.cleanup, [], obj);
|
|
};
|
|
|
|
# creating the top-level/root group which will contain all other elements/group
|
|
obj.myCanvas = obj.window.createCanvas();
|
|
obj.root = obj.myCanvas.createGroup();
|
|
|
|
var nasal_dir = getprop("/sim/fg-root") ~ "/Aircraft/Instruments-3d/FG1000/Nasal/";
|
|
io.load_nasal(nasal_dir ~ 'MFD.nas', "fg1000");
|
|
io.load_nasal(nasal_dir ~ 'Interfaces/PropertyPublisher.nas', "fg1000");
|
|
io.load_nasal(nasal_dir ~ 'Interfaces/PropertyUpdater.nas', "fg1000");
|
|
io.load_nasal(nasal_dir ~ 'Interfaces/GenericEISPublisher.nas', "fg1000");
|
|
io.load_nasal(nasal_dir ~ 'Interfaces/GenericNavComPublisher.nas', "fg1000");
|
|
io.load_nasal(nasal_dir ~ 'Interfaces/GenericNavComUpdater.nas', "fg1000");
|
|
io.load_nasal(nasal_dir ~ 'Interfaces/NavDataInterface.nas', "fg1000");
|
|
|
|
# Now create the MFD itself
|
|
obj.mfd = fg1000.MFD.new(obj.myCanvas);
|
|
obj.mfd._svg.setTranslation(186,45);
|
|
obj.mfd._svg.set("z-index", 150);
|
|
|
|
# Create the surround fascia, which is just a PNG image;
|
|
var child = obj.root.createChild("image")
|
|
.setFile("Aircraft/Instruments-3d/FG1000/Models/fascia.png")
|
|
.set("z-index", 100)
|
|
.setTranslation(0, 0)
|
|
.setSize(obj.width,obj.height);
|
|
|
|
obj.eisPublisher = fg1000.GenericEISPublisher.new();
|
|
obj.eisPublisher.start();
|
|
|
|
obj.navcomPublisher = fg1000.GenericNavComPublisher.new();
|
|
obj.navcomPublisher.start();
|
|
|
|
obj.navcomUpdater = fg1000.GenericNavComUpdater.new(obj.mfd.getDevice());
|
|
obj.navcomUpdater.start();
|
|
|
|
obj.navdataInterface = fg1000.NavDataInterface.new(obj.mfd.getDevice());
|
|
obj.navdataInterface.start();
|
|
|
|
# Add a event listener for the mouse wheel, which is used for turning the
|
|
# knobs.
|
|
obj.myCanvas.addEventListener("wheel", func(e)
|
|
{
|
|
print("WHEEL: Local " ~ math.round(e.localX) ~ ", " ~ math.round(e.localY));
|
|
|
|
foreach(var hotspot; MFDGUI.WHEEL_HOT_SPOTS) {
|
|
if ((e.localX > hotspot.top_left[0]) and (e.localX < hotspot.bottom_right[0]) and
|
|
(e.localY > hotspot.top_left[1]) and (e.localY < hotspot.bottom_right[1]) and
|
|
(e.shiftKey == hotspot.shift))
|
|
{
|
|
# We've found the hotspot, so send a notification to deal with it
|
|
var notification = notifications.PFDEventNotification.new(
|
|
"MFD",
|
|
1,
|
|
notifications.PFDEventNotification.HardKeyPushed,
|
|
{ Id: hotspot.notification, Value: e.deltaY }
|
|
);
|
|
emesary.GlobalTransmitter.NotifyAll(notification);
|
|
break;
|
|
}
|
|
}
|
|
});
|
|
|
|
# Add a event listener for the mouse click, which is used for buttons
|
|
|
|
obj.myCanvas.addEventListener("click", func(e)
|
|
{
|
|
print("CLICK: Local " ~ math.round(e.localX) ~ ", " ~ math.round(e.localY));
|
|
|
|
foreach(var hotspot; MFDGUI.CLICK_HOT_SPOTS) {
|
|
if ((e.localX > hotspot.top_left[0]) and (e.localX < hotspot.bottom_right[0]) and
|
|
(e.localY > hotspot.top_left[1]) and (e.localY < hotspot.bottom_right[1]) and
|
|
(e.shiftKey == hotspot.shift))
|
|
{
|
|
# We've found the hotspot, so send a notification to deal with it
|
|
var notification = notifications.PFDEventNotification.new(
|
|
"MFD",
|
|
1,
|
|
notifications.PFDEventNotification.HardKeyPushed,
|
|
{ Id: hotspot.notification, Value: hotspot.value }
|
|
);
|
|
emesary.GlobalTransmitter.NotifyAll(notification);
|
|
break;
|
|
}
|
|
}
|
|
|
|
foreach(var hotspot; MFDGUI.SOFTKEY_HOTSPOTS) {
|
|
if ((e.localX > hotspot.top_left[0]) and (e.localX < hotspot.bottom_right[0]) and
|
|
(e.localY > hotspot.top_left[1]) and (e.localY < hotspot.bottom_right[1]))
|
|
{
|
|
# We've found the hotspot, so send a notification to deal with it
|
|
var notification = notifications.PFDEventNotification.new(
|
|
"MFD",
|
|
1,
|
|
notifications.PFDEventNotification.SoftKeyPushed,
|
|
hotspot.Id
|
|
);
|
|
emesary.GlobalTransmitter.NotifyAll(notification);
|
|
break;
|
|
}
|
|
}
|
|
});
|
|
|
|
return obj;
|
|
},
|
|
|
|
cleanup : func()
|
|
{
|
|
me.mfd.del();
|
|
me.eisPublisher.stop();
|
|
me.eisPublisher = nil;
|
|
|
|
me.navcomPublisher.stop();
|
|
me.navcomPublisher = nil;
|
|
|
|
me.navcomUpdater.stop();
|
|
me.navcomUpdater = nil;
|
|
|
|
me.navdataInterface.stop();
|
|
me.navdataInterface =nil;
|
|
|
|
# Clean up the window itself
|
|
call(canvas.Window.del, [], me.window);
|
|
},
|
|
};
|