1# Copyright 2018 Stuart Buchanan
2# This file is part of FlightGear.
3#
4# FlightGear is free software: you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by
6# the Free Software Foundation, either version 2 of the License, or
7# (at your option) any later version.
8#
9# FlightGear is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with FlightGear.  If not, see <http://www.gnu.org/licenses/>.
16#
17# FG1000 PFD
18
19var PFDDisplay =
20{
21  new : func (fg1000instance, EIS_Class, EIS_SVG, SVG_Path, myCanvas, device_id=1)
22  {
23    var obj = {
24      parents : [ PFDDisplay ],
25      EIS : nil,
26      PFDInstruments : nil,
27      Surround : nil,
28      NearestAirports : nil,
29      _pageList : {},
30      _fg1000 : fg1000instance,
31      _canvas : myCanvas,
32    };
33
34    var nasal_dir = getprop("/sim/fg-root") ~ "/Aircraft/Instruments-3d/FG1000/Nasal/";
35    io.load_nasal(nasal_dir ~ "MFDPages/PFDInstruments/PFDInstruments.nas", "fg1000");
36    io.load_nasal(nasal_dir ~ "MFDPages/PFDInstruments/PFDInstrumentsStyles.nas", "fg1000");
37    io.load_nasal(nasal_dir ~ "MFDPages/PFDInstruments/PFDInstrumentsOptions.nas", "fg1000");
38    io.load_nasal(nasal_dir ~ "MFDPages/PFDInstruments/PFDInstrumentsController.nas", "fg1000");
39
40    io.load_nasal(nasal_dir ~ "MFDPages/DirectTo/DirectTo.nas", "fg1000");
41    io.load_nasal(nasal_dir ~ "MFDPages/DirectTo/DirectToController.nas", "fg1000");
42
43    io.load_nasal(nasal_dir ~ "MFDPages/NearestAirportsPFD/NearestAirportsPFD.nas", "fg1000");
44    io.load_nasal(nasal_dir ~ "MFDPages/NearestAirportsPFD/NearestAirportsPFDStyles.nas", "fg1000");
45    io.load_nasal(nasal_dir ~ "MFDPages/NearestAirportsPFD/NearestAirportsPFDOptions.nas", "fg1000");
46    io.load_nasal(nasal_dir ~ "MFDPages/NearestAirportsPFD/NearestAirportsPFDController.nas", "fg1000");
47
48    obj.ConfigStore = obj._fg1000.getConfigStore();
49
50    obj._svg = myCanvas.createGroup("softkeys");
51    obj._svg.set("clip-frame", canvas.Element.LOCAL);
52    obj._svg.set("clip", "rect(0px, 1024px, 768px, 0px)");
53
54    var fontmapper = func (family, weight) {
55      #if( family == "Liberation Sans" and weight == "narrow" ) {
56        return "LiberationFonts/LiberationSansNarrow-Regular.ttf";
57      #}
58      # If we don't return anything the default font is used
59    };
60
61    canvas.parsesvg(obj._svg,
62                    EIS_SVG,
63                    {'font-mapper': fontmapper});
64
65
66    canvas.parsesvg(obj._svg,
67                    SVG_Path ~ '/PFDInstruments.svg',
68                    {'font-mapper': fontmapper});
69
70    canvas.parsesvg(obj._svg,
71                    SVG_Path ~ '/FlightPlanPFD.svg',
72                    {'font-mapper': fontmapper});
73
74
75    canvas.parsesvg(obj._svg,
76                    SVG_Path ~ '/DirectToPFD.svg',
77                    {'font-mapper': fontmapper});
78
79    canvas.parsesvg(obj._svg,
80                    SVG_Path ~ '/NearestAirportsPFD.svg',
81                    {'font-mapper': fontmapper});
82
83    canvas.parsesvg(obj._svg,
84                    SVG_Path ~ '/NearestAirportsInfoPFD.svg',
85                    {'font-mapper': fontmapper});
86
87    canvas.parsesvg(obj._svg,
88                    SVG_Path ~ '/SurroundPFD.svg',
89                    {'font-mapper': fontmapper});
90
91
92    obj._MFDDevice = canvas.PFD_Device.new(obj._svg, 12, "SoftKey", myCanvas, "PFD");
93    obj._MFDDevice.device_id = device_id;
94
95    # DirectTo "Page" loaded first so that it receives any Emesary notifications
96    # _before_ the actual page.
97    obj._DTO = fg1000.DirectTo.new(obj, myCanvas, obj._MFDDevice, obj._svg);
98    obj._DTO.getController().RegisterWithEmesary();
99
100    obj.NearestAirports = fg1000.NearestAirportsPFD.new(obj, myCanvas, obj._MFDDevice, obj._svg);
101
102    obj._MFDDevice.RegisterWithEmesary();
103
104    # Surround dynamic elements
105    obj._pageTitle = obj._svg.getElementById("PageTitle");
106
107    # Controller for the header and display on the bottom left which allows selection
108    # of page groups and individual pages using the FMS controller.
109    obj.Surround = fg1000.Surround.new(obj, myCanvas, obj._MFDDevice, obj._svg, 1);
110    obj.SurroundController = obj.Surround.getController();
111
112    obj.PFDInstruments = fg1000.PFDInstruments.new(obj, myCanvas, obj._MFDDevice, obj._svg);
113    obj.addPage("PFDInstruments", obj.PFDInstruments);
114    obj.PFDInstruments.topMenu(obj._MFDDevice, obj.PFDInstruments, nil);
115
116    # Display the Surround, and PFD Instruments
117    obj.Surround.setVisible(1);
118    obj._MFDDevice.selectPage(obj.PFDInstruments);
119
120    return obj;
121  },
122  getDevice : func () {
123    return me._MFDDevice;
124  },
125  del: func()
126  {
127    me._MFDDevice.current_page.offdisplay();
128    me._MFDDevice.DeRegisterWithEmesary();
129    me.SurroundController.del();
130  },
131  setPageTitle: func(title)
132  {
133    me._pageTitle.setText(title);
134  },
135  addPage : func(name, page)
136  {
137    me._pageList[name] = page;
138  },
139
140  getPage : func(name)
141  {
142    return me._pageList[name];
143  },
144
145  getDeviceID : func() {
146    return me._MFDDevice.device_id;
147  },
148
149  getCanvas : func() {
150    return me._canvas;
151  }
152};
153