diff --git a/Aircraft/Instruments-3d/FG1000/MFDPages/DirectTo.svg b/Aircraft/Instruments-3d/FG1000/MFDPages/DirectTo.svg index ba818c841..adb06fb55 100644 --- a/Aircraft/Instruments-3d/FG1000/MFDPages/DirectTo.svg +++ b/Aircraft/Instruments-3d/FG1000/MFDPages/DirectTo.svg @@ -23,9 +23,9 @@ borderopacity="0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="2.2962556" - inkscape:cx="778.1918" - inkscape:cy="230.23655" + inkscape:zoom="3.2473958" + inkscape:cx="817.98224" + inkscape:cy="351.10971" inkscape:document-units="px" inkscape:current-layer="DirectToGroup" showgrid="true" @@ -68,6 +68,18 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + KSFO + SAN FRANCISCO INTERNATIONAL + CITY + REGION + K + S + F + O + DIRECT TO + 00000 + 0 + 0 + 0 + 0 + 0 + ft + - + 00 + 0 + 0 + BRG + 189 + 12.3 + DIS + 000 + + ACTIVATE? + 0 + 0 + 0 + nm + CRS + OFFSET + ALT + + + + + + + REGION + + + + REGION + REGION + REGION + REGION + + + + + + diff --git a/Aircraft/Instruments-3d/FG1000/MFDPages/NavigationMap.svg b/Aircraft/Instruments-3d/FG1000/MFDPages/NavigationMap.svg index 580ff2caf..596fe1256 100644 --- a/Aircraft/Instruments-3d/FG1000/MFDPages/NavigationMap.svg +++ b/Aircraft/Instruments-3d/FG1000/MFDPages/NavigationMap.svg @@ -23,9 +23,9 @@ borderopacity="0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="2.8284271" - inkscape:cx="723.45322" - inkscape:cy="612.12112" + inkscape:zoom="1.4142136" + inkscape:cx="851.72535" + inkscape:cy="412.85117" inkscape:document-units="px" inkscape:current-layer="NavigationMapGroup" showgrid="true" @@ -69,103 +69,64 @@ - - - + + + + + Zoom nm - - NORTH UP - - - - - Zoom nm - - NORTH UP + id="NavigationMapRangeDisplay" + transform="scale(0.93580798,1.0685953)" + inkscape:label="RangeDisplay" + sodipodi:linespacing="0%">Zoom nm + + NORTH UP + diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/ConfigStore.nas b/Aircraft/Instruments-3d/FG1000/Nasal/ConfigStore.nas index 1de52c81f..5f2fbf1a7 100644 --- a/Aircraft/Instruments-3d/FG1000/Nasal/ConfigStore.nas +++ b/Aircraft/Instruments-3d/FG1000/Nasal/ConfigStore.nas @@ -27,29 +27,32 @@ var ConfigStore = { # declutter - the maximum declutter level (0-3) that this layer is visible in # range - the maximum range this layer is visible (configured by user) # max_range - the maximum range value that a user can configure for this layer. + # static - whether this layer should be displayed on static maps (as opposed to the moving maps) + # factory - name of the factory to use for creating the layer + # priority - layer priority layerRanges : { - DTO : { enabled: 0, declutter: 3, range: 2000, max_range: 2000 }, + DTO : { enabled: 0, declutter: 3, range: 2000, max_range: 2000, static : 0, factory : canvas.SymbolLayer, priority : 4 }, - GRID : { enabled: 0, declutter: 1, range: 20, max_range: 2000 }, - DME : { enabled: 1, declutter: 1, range: 150, max_range: 300 }, - VOR_FG1000 : { enabled: 1, declutter: 1, range: 150, max_range: 300 }, - NDB : { enabled: 1, declutter: 1, range: 15, max_range: 30 }, - FIX : { enabled: 1, declutter: 1, range: 15, max_range: 30 }, - RTE : { enabled: 1, declutter: 3, range: 2000, max_range: 2000 }, - WPT : { enabled: 1, declutter: 3, range: 2000, max_range: 2000 }, + GRID : { enabled: 0, declutter: 1, range: 20, max_range: 2000, static : 1, factory : canvas.SymbolLayer, priority : 4 }, + DME : { enabled: 1, declutter: 1, range: 150, max_range: 300, static : 1, factory : canvas.SymbolLayer, priority : 4 }, + VOR_FG1000 : { enabled: 1, declutter: 1, range: 150, max_range: 300, static : 1, factory : canvas.SymbolLayer, priority : 4 }, + NDB : { enabled: 1, declutter: 1, range: 15, max_range: 30, static : 1, factory : canvas.SymbolLayer, priority : 4 }, + FIX : { enabled: 1, declutter: 1, range: 15, max_range: 30, static : 1, factory : canvas.SymbolLayer, priority : 4 }, + RTE : { enabled: 1, declutter: 3, range: 2000, max_range: 2000, static : 0, factory : canvas.SymbolLayer, priority : 4 }, + WPT : { enabled: 1, declutter: 3, range: 2000, max_range: 2000, static : 0, factory : canvas.SymbolLayer, priority : 4 }, - APS : { enabled: 1, declutter: 3, range: 2000, max_range: 2000 }, - FLT : { enabled: 1, declutter: 3, range: 2000, max_range: 2000 }, + FLT : { enabled: 1, declutter: 3, range: 2000, max_range: 2000, static : 1, factory : canvas.SymbolLayer, priority : 4 }, - WXR : { enabled: 1, declutter: 2, range: 2000, max_range: 2000 }, + WXR : { enabled: 1, declutter: 2, range: 2000, max_range: 2000, static : 1, factory : canvas.SymbolLayer, priority : 4 }, - APT : { enabled: 1, declutter: 2, range: 150, max_range: 300 }, + APT : { enabled: 1, declutter: 2, range: 150, max_range: 300, static : 1, factory : canvas.SymbolLayer, priority : 4 }, - TFC : { enabled: 0, declutter: 3, range: 150, max_range: 2000}, + TFC : { enabled: 0, declutter: 3, range: 150, max_range: 2000, static : 1, factory : canvas.SymbolLayer, priority : 4 }, + APS : { enabled: 1, declutter: 3, range: 2000, max_range: 2000, static : 1, factory : canvas.SymbolLayer, priority : 4 }, - OpenAIP : { enabled: 1, declutter: 1, range: 150, max_range: 300 }, - STAMEN : { enabled: 1, declutter: 3, range: 500, max_range: 2000 }, - STAMEN_terrain : { enabled: 1, declutter: 3, range: 500, max_range: 2000 }, + STAMEN_terrain : { enabled: 1, declutter: 3, range: 500, max_range: 2000, static : 1, factory : canvas.OverlayLayer, priority : 1 }, + OpenAIP : { enabled: 1, declutter: 1, range: 150, max_range: 300, static : 1, factory : canvas.OverlayLayer, priority : 1 }, + STAMEN : { enabled: 1, declutter: 3, range: 500, max_range: 2000, static : 1, factory : canvas.OverlayLayer, priority : 1 }, }, configValues : { diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/MFD.nas b/Aircraft/Instruments-3d/FG1000/Nasal/MFD.nas index 3df92bb9e..d0d6c319a 100644 --- a/Aircraft/Instruments-3d/FG1000/Nasal/MFD.nas +++ b/Aircraft/Instruments-3d/FG1000/Nasal/MFD.nas @@ -94,9 +94,6 @@ var MFDDisplay = # If we don't return anything the default font is used }; - canvas.parsesvg(obj._svg, - EIS_SVG, - {'font-mapper': fontmapper}); foreach (var page; MFDPages) { var svg_file ='/Aircraft/Instruments-3d/FG1000/MFDPages/' ~ page ~ '.svg'; @@ -108,6 +105,10 @@ var MFDDisplay = } } + canvas.parsesvg(obj._svg, + EIS_SVG, + {'font-mapper': fontmapper}); + obj._MFDDevice = canvas.PFD_Device.new(obj._svg, 12, "SoftKey", myCanvas, "MFD"); obj._MFDDevice.device_id = device_id; obj._MFDDevice.RegisterWithEmesary(); diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/DirectTo/DirectTo.nas b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/DirectTo/DirectTo.nas index 234cae5c4..3deb9f9d0 100644 --- a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/DirectTo/DirectTo.nas +++ b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/DirectTo/DirectTo.nas @@ -44,7 +44,6 @@ var DirectTo = "Region", "LocationBRG", "LocationDIS", - "RangeDisplay" ]; obj.addTextElements(textelements); @@ -74,40 +73,7 @@ var DirectTo = obj.WaypointSubmenuScroll = PFD.GroupElement.new(obj.pageName, svg, [ "WaypointSubmenuScroll" ] , 4, "WaypointSubmenuScroll", 0, "WaypointSubmenuScrollTrough" , "WaypointSubmenuScrollThumb", 60); # The Airport Chart - obj.DirectToChart = obj._group.createChild("map"); - obj.DirectToChart.setInt("z-index", 100); - - obj.DirectToChart.setController("Static position", "main"); - - - # Initialize a range and screen resolution. Setting a range - # to 15nm means we pick up a good set of surrounding fixes - # We will use the screen range for zooming. - obj.DirectToChart.setRange(8.0); - obj.DirectToChart.setScreenRange(300/2.0); - obj.DirectToChart.setTranslation(860, 440); - obj.DirectToChart.set("clip-frame", canvas.Element.LOCAL); - obj.DirectToChart.set("clip", "rect(-160px, 160px, 160px, -160px)"); - - var r = func(name,vis=1,zindex=nil) return caller(0)[0]; - foreach(var type; [r('APT'),r('DME'),r('VOR'),r('NDB'),r('FIX')] ) { - obj.DirectToChart.addLayer(canvas.SymbolLayer, - type.name, - 10, - obj.Styles.getStyle(type.name), - obj.Options.getOption(type.name), - type.vis ); - } - - foreach(var type; [ r('STAMEN')]) { - obj.DirectToChart.addLayer(factory: canvas.OverlayLayer, type_arg: type.name, - priority: 9, - style: obj.Styles.getStyle(type.name), - options: obj.Options.getOption(type.name), - visible: 1); - } - - + obj.DirectToChart = fg1000.NavMap.new(obj, obj.getElement("Map"), [860,440], "rect(-160px, 160px, 160px, -160px)", 0, 2, 1); obj.setController(fg1000.DirectToController.new(obj, svg)); return obj; @@ -123,13 +89,13 @@ var DirectTo = me.setTextElement("Name", string.uc(destination.name)); me.setTextElement("City", "CITY"); me.setTextElement("Region", "REGION"); - me.setTextElement("LocationBRG", "" ~ sprintf("%03d", destination.course)); + me.setTextElement("LocationBRG", "" ~ sprintf("%03d°", destination.course)); me.setTextElement("LocationDIS", sprintf("%d", destination.range_nm) ~ "nm"); me.IDEntry.setValue(destination.id); me.VNVAltEntry.setValue("00000"); me.VNVOffsetEntry.setValue("00"); - me.CourseEntry.setValue("" ~ sprintf("%03d", destination.course)); + me.CourseEntry.setValue("" ~ sprintf("%03d°", destination.course)); } else { me.DirectToChart.setVisible(1); me.setTextElement("Name", ""); @@ -145,12 +111,6 @@ var DirectTo = } }, - setRange : func(range, label) { - me.DirectToChart.setRange(range); - me.DirectToChart.update(); - me.setTextElement("RangeDisplay", label); - }, - offdisplay : func() { me._group.setVisible(0); me.getController().offdisplay(); @@ -160,6 +120,9 @@ var DirectTo = me._group.setVisible(1); # Display a false title, as underneath we're showing the navigation map. me.mfd.setPageTitle("MAP - NAVIGATION MAP"); + me.getElement("Map").setVisible(1); + me.getElement("Map-bg").setVisible(1); + me.DirectToChart.setVisible(1); me.getController().ondisplay(); # The DirectTo pages displays over the NavigationMap. This is a hack diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/DirectTo/DirectToController.nas b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/DirectTo/DirectToController.nas index cd60c6118..d0008bf0c 100644 --- a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/DirectTo/DirectToController.nas +++ b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/DirectTo/DirectToController.nas @@ -17,49 +17,11 @@ # DirectTo Controller var DirectToController = { - # Vertical ranges, and labels. - # Unlike some other map displays, we keep the range constant at 4nm an change - # the ScreenRange to zoom in. Otherwise as we zoom in, the center of the - # runways moves out of the range of the display and they are not drawn. - # Ranges are scaled to the display height with range 1 displaying 4nm vertically. - # 2000nm = 12,152,000ft. - RANGES : [{range: 500/6076.12, label: "500ft"}, - {range: 750/6076.12, label: "750ft"}, - {range: 1000/6076.12, label: "1000ft"}, - {range: 1500/6076.12, label: "1500ft"}, - {range: 2000/6076.12, label: "2000ft"}, - {range: 0.5, label: "0.5nm"}, - {range: 0.75, label: "0.75nm"}, - {range: 1, label: "1nm"}, - {range: 2, label: "2nm"}, - {range: 3, label: "3nm"}, - {range: 4, label: "4nm"}, - {range: 6, label: "6nm"}, - {range: 8, label: "8nm"}, - {range: 10, label: "10nm"}, - {range: 12, label: "12nm"}, - {range: 15, label: "15nm"}, - {range: 20, label: "20nm"}, - {range: 25, label: "25nm"}, - {range: 30, label: "30nm"}, - {range: 40, label: "40nm"}, - {range: 50, label: "50nm"}, - {range: 75, label: "75nm"}, - {range: 100, label: "100nm"}, - {range: 200, label: "200nm"}, - {range: 500, label: "500nm"}, - {range: 1000, label: "1000nm"}, - {range: 1500, label: "1500nm"}, - {range: 2000, label: "2000nm"}, ], - new : func (page, svg) { var obj = { parents : [ DirectToController, MFDPageController.new(page)] }; obj.id = ""; obj.page = page; - obj.current_zoom = 13; - - obj.setZoom(obj.current_zoom); obj._cursorElements = [ obj.page.IDEntry, @@ -96,23 +58,6 @@ var DirectToController = me.setCursorElement(me._selectedElement + incr_or_decr); }, - # Control functions for Input - zoomIn : func() { - me.setZoom(me.current_zoom -1); - }, - zoomOut : func() { - me.setZoom(me.current_zoom +1); - }, - handleRange : func(val) - { - var incr_or_decr = (val > 0) ? 1 : -1; - me.setZoom(me.current_zoom + incr_or_decr); - }, - setZoom : func(zoom) { - if ((zoom < 0) or (zoom > (size(me.RANGES) - 1))) return; - me.current_zoom = zoom; - me.page.setRange(me.RANGES[zoom].range, me.RANGES[zoom].label); - }, handleCRSR : func() { # No effect, but shouldn't be passed to underlying page? return emesary.Transmitter.ReceiptStatus_Finished; diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NavigationMap/NavigationMap.nas b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NavigationMap/NavigationMap.nas index d37b2ab54..8706d3a8e 100644 --- a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NavigationMap/NavigationMap.nas +++ b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NavigationMap/NavigationMap.nas @@ -26,97 +26,22 @@ var NavigationMap = ], }; - # Center the map's origin, modified to take into account the surround. - obj._group.setTranslation( - fg1000.MAP_FULL.CENTER.X - (1024/2), - fg1000.MAP_FULL.CENTER.Y - (768/2) - ); - - obj.MFDMap = obj._group.createChild("map"); - - obj.MFDMap.setScreenRange(689/2.0); - - # Labels for map range and orientation. Two sets - one for the full display - # and another for the partial display. - obj.addTextElements(["RangeDisplay", "Orientation"]); - obj.addTextElements(["RangeDisplayPartial", "OrientationPartial"]); - - obj._labelsFull = svg.getElementById("NavigationMapGroup"); - assert(obj._labelsFull != nil, "Unable to find NavigationMapGroup"); - - obj._labelsPartial = svg.getElementById("NavigationMapGroupPartial"); - assert(obj._labelsPartial != nil, "Unable to find NavigationMapGroupPartial"); - - # Initialize the controllers: - var ctrl_ns = canvas.Map.Controller.get("Aircraft position"); - var source = ctrl_ns.SOURCES["current-pos"]; - if (source == nil) { - # TODO: amend - var source = ctrl_ns.SOURCES["current-pos"] = { - getPosition: func subvec(geo.aircraft_position().latlon(), 0, 2), - getAltitude: func getprop('/position/altitude-ft'), - getHeading: func { - if (me.aircraft_heading) - getprop('/orientation/heading-deg') - else 0 - }, - aircraft_heading: 1, - }; - } - setlistener("/sim/gui/dialogs/map-canvas/aircraft-heading-up", func(n) { - source.aircraft_heading = n.getBoolValue(); - }, 1); - # Make it move with our aircraft: - obj.MFDMap.setController("Aircraft position", "current-pos"); # from aircraftpos.controller - - var r = func(name,vis=1,zindex=nil) return caller(0)[0]; - # TODO: we'll need some z-indexing here, right now it's just random - foreach(var type; [r('GRID'),r('DTO',0),r('TFC',0),r('APT'),r('DME'),r('VOR_FG1000'),r('NDB'),r('FIX',0),r('GPS'),r('RTE'),r('WPT'),r('FLT'),r('WXR',0),r('APS')] ) { - obj.MFDMap.addLayer( - factory: canvas.SymbolLayer, - type_arg: type.name, - priority: 4, - style: obj.Styles.getStyle(type.name), - options: obj.Options.getOption(type.name), - visible: type.vis); - } - - foreach(var type; [ r('STAMEN_terrain'),r('STAMEN'), r('OpenAIP') ]) { - obj.MFDMap.addLayer( - factory: canvas.OverlayLayer, - type_arg: type.name, - priority: 1, - style: obj.Styles.getStyle(type.name), - options: obj.Options.getOption(type.name), - visible: 0); - } - - #obj.topMenu(device, obj, nil); - + obj.MFDMap = fg1000.NavMap.new( + obj, + obj.getElement("NavMap"), + [fg1000.MAP_FULL.CENTER.X, fg1000.MAP_FULL.CENTER.Y], + "", + zindex=-10); obj.setController(fg1000.NavigationMapController.new(obj, svg)); return obj; }, - toggleLayerVisible : func(name) { - (var l = me.MFDMap.getLayer(name)).setVisible(l.getVisible()); - }, - setLayerVisible : func(name,n=1) { - me.MFDMap.getLayer(name).setVisible(n); - }, - setRange : func(range, label) { - me.MFDMap.setRange(range); - me.setTextElement("RangeDisplay", label); - me.setTextElement("RangeDisplayPartial", label); - }, - setOrientation : func(orientation) { - me.setTextElement("Orientation", orientation); - me.setTextElement("OrientationPartial", orientation); - }, - setScreenRange : func(range) { - me.MFDMap.setScreenRange(range); - }, + offdisplay : func(controller=1) { me._group.setVisible(0); + me.getElement("NavMap").setVisible(0); + me.getElement("NavMap-bg").setVisible(0); + me.MFDMap.setVisible(0); # Reset the menu colours. Shouldn't have to do this here, but # there's not currently an obvious other location to do so. @@ -129,15 +54,19 @@ var NavigationMap = }, ondisplay : func(controller=1) { me._group.setVisible(1); + me.getElement("Group").setVisible(1); + me.getElement("NavMap").setVisible(1); + me.getElement("NavMap-bg").setVisible(1); + me.getElement("Legend").setVisible(1); + me.MFDMap.setVisible(1); # Center the map's origin, modified to take into account the surround. - me.MFDMap.setTranslation( + me.getElement("NavMap").setTranslation( fg1000.MAP_FULL.CENTER.X, fg1000.MAP_FULL.CENTER.Y ); - me._labelsFull.setVisible(1); - me._labelsPartial.setVisible(0); + me.getElement("Legend").setTranslation(0,0); me.mfd.setPageTitle(me.title); if (controller == 1) me.getController().ondisplay(); @@ -147,18 +76,27 @@ var NavigationMap = # page - e.g. NearestAirports. ondisplayPartial : func() { me._group.setVisible(1); - me.MFDMap.setTranslation( + me.getElement("Group").setVisible(1); + me.getElement("NavMap").setVisible(1); + me.getElement("NavMap-bg").setVisible(1); + me.getElement("Legend").setVisible(1); + me.MFDMap.setVisible(1); + + # Center the map's origin, modified to take into account the surround. + me.getElement("NavMap").setTranslation( fg1000.MAP_PARTIAL.CENTER.X, fg1000.MAP_PARTIAL.CENTER.Y ); - me._labelsFull.setVisible(0); - me._labelsPartial.setVisible(1); - - #me.getController().ondisplayPartial(); + me.getElement("Legend").setTranslation(-300,0); }, offdisplayPartial : func() { me._group.setVisible(0); + me.getElement("Group").setVisible(0); + me.getElement("NavMap").setVisible(0); + me.getElement("NavMap-bg").setVisible(0); + me.getElement("Legend").setVisible(0); + me.MFDMap.setVisible(0); #me.getController().offdisplayPartial(); }, @@ -172,7 +110,7 @@ var NavigationMap = pg.resetMenuColors(); pg.addMenuItem(0, "ENGINE", pg, pg.mfd.EIS.engineMenu); pg.addMenuItem(2, "MAP", pg, pg.mfd.NavigationMap.mapMenu); - pg.addMenuItem(8, "DCLTR", pg, func(dev, pg, mi) { pg.getController().incrDCLTR(dev, mi); } ); + pg.addMenuItem(8, "DCLTR", pg, func(dev, pg, mi) { pg.mfd.NavigationMap.MFDMap.incrDCLTR(dev, mi); } ); #pg.addMenuItem(9, "SHW CHRT", pg); # Optional #pg.addMenuItem(10, "CHKLIST", pg); # Optional device.updateMenus(); @@ -182,22 +120,22 @@ var NavigationMap = pg.clearMenu(); pg.resetMenuColors(); pg.addMenuItem(0, "TRAFFIC", pg, - func(dev, pg, mi) { pg.mfd.NavigationMap.getController().toggleLayer("TFC"); device.updateMenus(); }, # callback + func(dev, pg, mi) { pg.mfd.NavigationMap.MFDMap.toggleLayer("TFC"); device.updateMenus(); }, # callback func(svg, mi) { pg.mfd.NavigationMap.display_toggle(device, svg, mi, "TFC"); } ); pg.addMenuItem(1, "PROFILE", pg); pg.addMenuItem(2, "TOPO", pg, - func(dev, pg, mi) { pg.mfd.NavigationMap.getController().toggleLayer("STAMEN"); device.updateMenus(); }, # callback + func(dev, pg, mi) { pg.mfd.NavigationMap.MFDMap.toggleLayer("STAMEN"); device.updateMenus(); }, # callback func(svg, mi) { pg.mfd.NavigationMap.display_toggle(device, svg, mi, "STAMEN"); } ); pg.addMenuItem(3, "TERRAIN", pg, - func(dev, pg, mi) { pg.mfd.NavigationMap.getController().toggleLayer("STAMEN_terrain"); device.updateMenus(); }, # callback + func(dev, pg, mi) { pg.mfd.NavigationMap.MFDMap.toggleLayer("STAMEN_terrain"); device.updateMenus(); }, # callback func(svg, mi) { pg.mfd.NavigationMap.display_toggle(device, svg, mi, "STAMEN_terrain"); } ); - pg.addMenuItem(4, "AIRWAYS", pg, func(dev, pg, mi) { pg.mfd.NavigationMap.getController().incrAIRWAYS(dev, mi); } ); + pg.addMenuItem(4, "AIRWAYS", pg, func(dev, pg, mi) { pg.mfd.NavigationMap.MFDMap.incrAIRWAYS(dev, mi); } ); #pg.addMenuItem(5, "STRMSCP", pg); Optional #pg.addMenuItem(6, "PRECIP", pg); Optional, or NEXRAD #pg.addMenuItem(7, "XM LTNG", pg); Optional, or DL LTNG @@ -211,7 +149,7 @@ var NavigationMap = # on whether a particular layer is enabled or not. display_toggle : func(device, svg, mi, layer) { var bg_name = sprintf("SoftKey%d-bg",mi.menu_id); - if (me.getController().isEnabled(layer)) { + if (me.MFDMap.isEnabled(layer)) { device.svg.getElementById(bg_name).setColorFill(0.5,0.5,0.5); svg.setColor(0.0,0.0,0.0); } else { diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NavigationMap/NavigationMapController.nas b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NavigationMap/NavigationMapController.nas index 4a9e34493..52f21345f 100644 --- a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NavigationMap/NavigationMapController.nas +++ b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NavigationMap/NavigationMapController.nas @@ -17,8 +17,6 @@ # Navigation Map Controller var NavigationMapController = { - - # TODO: Add STAMEN topo layer, which is visible on all levels as opposed to # roads, railways, boundaries, cities which are only visible on declutter 0. @@ -31,94 +29,21 @@ var NavigationMapController = new : func (page, svg) { var obj = { parents : [ NavigationMapController, MFDPageController.new(page) ] }; - obj.current_zoom = 13; - obj.declutter = 0; - obj.airways = 0; obj.page = page; - obj.setZoom(obj.current_zoom); - obj.setOrientation(fg1000.ORIENTATIONS[0]); - return obj; }, - zoomIn : func() { - me.setZoom(me.current_zoom -1); - }, - zoomOut : func() { - me.setZoom(me.current_zoom +1); - }, - setZoom : func(zoom) { - if ((zoom < 0) or (zoom > (size(fg1000.RANGES) - 1))) return; - me.current_zoom = zoom; - # Ranges above represent vertical ranges, but the display is a rectangle, so - # we need to use the diagonal range of the 1024 x 689, which is 617px. - # 617px is 1.8 x 689/2, so we need to increase the range values by x1.8 - me.page.setRange(fg1000.RANGES[zoom].range, fg1000.RANGES[zoom].label); - me.updateVisibility(); - }, - setOrientation : func(orientation) { - me.page.setOrientation(orientation.label); - }, - updateVisibility : func() { - # Determine which layers should be visible. - foreach (var layer_name; me.page.mfd.ConfigStore.getLayerNames()) { - var layer = me.page.mfd.ConfigStore.getLayer(layer_name); - if (layer.enabled and - (fg1000.RANGES[me.current_zoom].range <= layer.range) and - (me.declutter <= layer.declutter) ) - { - me.page.MFDMap.getLayer(layer_name).setVisible(1); - } else { - me.page.MFDMap.getLayer(layer_name).setVisible(0); - } - } - }, - isEnabled : func(layer) { - return me.page.mfd.ConfigStore.isLayerEnabled(layer); - }, - toggleLayer : func(layer) { - me.page.mfd.ConfigStore.toggleLayerEnabled(layer); - me.updateVisibility(); - }, - - # Increment through the de-clutter levels, which impact what layers are - # displayed. We also need to update the declutter menu item. - incrDCLTR : func(device, menuItem) { - me.declutter = math.mod(me.declutter +1, 4); - menuItem.title = me.DCLTR[me.declutter]; - device.updateMenus(); - me.updateVisibility(); - }, - - getDCLTRTitle : func() { - return me.DCLTR[me.declutter]; - }, - - # Increment through the AIRWAYS levels. At present this doesn't do anything - # except change the label. It should enable/disable different airways - # information. - incrAIRWAYS : func(device, menuItem) { - me.airways = math.mod(me.airways +1, 4); - menuItem.title = me.AIRWAYS[me.airways]; - device.updateMenus(); - me.updateVisibility(); - }, - getAIRWAYSTitle : func() { - return me.AIRWAYS[me.airways]; - }, # Set the DTO line target setDTOLineTarget : func(lat, lon) { - me.page.MFDMap.getLayer("DTO").controller.setTarget(lat,lon); + me.page.MFDMap.setDTOLineTarget(lat, lon); }, enableDTO : func(enable) { - me.page.mfd.ConfigStore.setLayerEnabled("DTO", enable); - me.updateVisibility(); + me.page.MFDMap.enableDTO(enable) }, handleRange : func(val) { - var incr_or_decr = (val > 0) ? 1 : -1; - me.setZoom(me.current_zoom + incr_or_decr); + me.page.MFDMap.handleRange(val); }, # Reset controller if required when the page is displayed or hidden @@ -128,5 +53,4 @@ var NavigationMapController = offdisplay : func() { me.DeRegisterWithEmesary(); }, - }; diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NearestAirports/NearestAirports.nas b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NearestAirports/NearestAirports.nas index 0831321d7..c9f16e979 100644 --- a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NearestAirports/NearestAirports.nas +++ b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NearestAirports/NearestAirports.nas @@ -144,8 +144,7 @@ var NearestAirports = var crsAndDst = courseAndDistance(apt); # Display the course and distance in NM . - # 248 is the extended ASCII code for the degree symbol - var crs = sprintf("%i%c", crsAndDst[0], 248); + var crs = sprintf("%i°", crsAndDst[0]); var dst = sprintf("%.1fnm", crsAndDst[1]); # Convert into something we can pass straight to the UIGroup. diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NearestAirports/NearestAirportsController.nas b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NearestAirports/NearestAirportsController.nas index ea56e680a..0241ec74d 100644 --- a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NearestAirports/NearestAirportsController.nas +++ b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NearestAirports/NearestAirportsController.nas @@ -173,7 +173,7 @@ var NearestAirportsController = handleRange : func(val) { # Pass any range entries to the NavMapController - me.page.mfd.NavigationMap.controller.handleZoom(val); + me.page.mfd.NavigationMap.getController().handleRange(val); }, diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/PFDInstruments/PFDInstruments.nas b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/PFDInstruments/PFDInstruments.nas index 6b12fd28d..510a47b7a 100644 --- a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/PFDInstruments/PFDInstruments.nas +++ b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/PFDInstruments/PFDInstruments.nas @@ -78,10 +78,7 @@ var PFDInstruments = obj.device.svg.getElementById("PFDInstruments" ~ id).set("clip", clip); } - #obj.insetMap = fg1000.NavMap.new(obj, [130,170], "rect(-160px, 160px, 160px, -160px)", -100, 2); obj._SVGGroup.setInt("z-index", 10); - #obj._SVGGroup.setVisible(0); - #obj.insetMap = fg1000.NavMap.new(obj, [119,601], "rect(-109px, 109px, 109px, -109px)", 50, 2); obj.insetMap = fg1000.NavMap.new(obj, obj.getElement("PFD-Map-Display"), [119,601], "rect(-109px, 109px, 109px, -109px)", 0, 2); #obj.topMenu(device, obj, nil); @@ -247,7 +244,7 @@ var PFDInstruments = me.getController().offdisplay(); }, ondisplay : func() { - me._group.setVisible(1); + me._group.setVisible(1); me.getController().ondisplay(); }, diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/Surround/Surround.nas b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/Surround/Surround.nas index 5119664c3..c4f2b78e3 100644 --- a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/Surround/Surround.nas +++ b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/Surround/Surround.nas @@ -57,10 +57,10 @@ var PAGE_GROUPS = [ # Mapping for header labels to specific FMS or ADC messages, and sprintf formatting # to use var HEADER_MAPPING = { - "BRG" : { message : "FMSLegBearingMagDeg", format : "%d"}, + "BRG" : { message : "FMSLegBearingMagDeg", format : "%d°"}, "XTK" : { message : "FMSLegCourseError", format : "%.1fnm"}, "DIS" : { message : "FMSDistance", format : "%.1fnm"}, - "DTK" : { message : "FMSLegDesiredTrack", format : "%d"}, + "DTK" : { message : "FMSLegDesiredTrack", format : "%d°"}, "END" : { message : "EnduranceHrs", format : "%.1fhrs"}, "ESA" : { message : "EnRouteSafeAltitude", format : "%dft"}, # TODO "ETA" : { message : "FMSEstimatedTimeArrival", format : ""}, # TODO @@ -70,8 +70,8 @@ var HEADER_MAPPING = { "GS" : { message : "FMSGroundspeed", format : "%dkts"}, "MSA" : { message : "MinimumSafeAltitude", format : "%dft"}, # TODO "TAS" : { message : "ADCTrueAirspeed", format : "%dkts"}, - "TKE" : { message : "FMSLegTrackErrorAngle", format : "%d"}, - "TRK" : { message : "FMSLegTrack", format : "%d"}, + "TKE" : { message : "FMSLegTrackErrorAngle", format : "%d°"}, + "TRK" : { message : "FMSLegTrack", format : "%d°"}, "VSR" : { message : "FMSLegVerticalSpeedRequired", format : "%dfpm"}, # TODO }; diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/NavMap.nas b/Aircraft/Instruments-3d/FG1000/Nasal/NavMap.nas index db515c61a..b2d8b5493 100644 --- a/Aircraft/Instruments-3d/FG1000/Nasal/NavMap.nas +++ b/Aircraft/Instruments-3d/FG1000/Nasal/NavMap.nas @@ -23,7 +23,7 @@ var NavMap = { # Airways levels. AIRWAYS : [ "AIRWAYS", "AIRWY ON", "AIRWY LO", "AIRWY HI"], - new : func(page, element, center, clip="", zindex=0, vis_shift=0 ) + new : func(page, element, center, clip="", zindex=0, vis_shift=0, static=0 ) { var obj = { parents : [ NavMap ], @@ -52,26 +52,30 @@ var NavMap = { if (obj._orientationDisplay == nil) die("Unable to find element " ~ obj._pageName ~ "OrientationDisplay"); # Initialize the controllers: - var ctrl_ns = canvas.Map.Controller.get("Aircraft position"); - var source = ctrl_ns.SOURCES["current-pos"]; - if (source == nil) { - # TODO: amend - var source = ctrl_ns.SOURCES["current-pos"] = { - getPosition: func subvec(geo.aircraft_position().latlon(), 0, 2), - getAltitude: func getprop('/position/altitude-ft'), - getHeading: func { - if (me.aircraft_heading) - getprop('/orientation/heading-deg') - else 0 - }, - aircraft_heading: 1, - }; + if (static) { + obj.Map.setController("Static position", "main"); + } else { + var ctrl_ns = canvas.Map.Controller.get("Aircraft position"); + var source = ctrl_ns.SOURCES["current-pos"]; + if (source == nil) { + # TODO: amend + var source = ctrl_ns.SOURCES["current-pos"] = { + getPosition: func subvec(geo.aircraft_position().latlon(), 0, 2), + getAltitude: func getprop('/position/altitude-ft'), + getHeading: func { + if (me.aircraft_heading) + getprop('/orientation/heading-deg') + else 0 + }, + aircraft_heading: 1, + }; + } + setlistener("/sim/gui/dialogs/map-canvas/aircraft-heading-up", func(n) { + source.aircraft_heading = n.getBoolValue(); + }, 1); + # Make it move with our aircraft: + obj.Map.setController("Aircraft position", "current-pos"); # from aircraftpos.controller } - setlistener("/sim/gui/dialogs/map-canvas/aircraft-heading-up", func(n) { - source.aircraft_heading = n.getBoolValue(); - }, 1); - # Make it move with our aircraft: - obj.Map.setController("Aircraft position", "current-pos"); # from aircraftpos.controller if (clip != "") { obj.Map.set("clip-frame", canvas.Element.LOCAL); @@ -82,26 +86,22 @@ var NavMap = { element.setInt("z-index", zindex); } - var r = func(name,vis=1,zindex=nil) return caller(0)[0]; + var r = func(name,on_static=1, vis=1,zindex=nil) return caller(0)[0]; # TODO: we'll need some z-indexing here, right now it's just random - foreach(var type; [r('GRID'),r('DTO',0),r('TFC',0),r('APT'),r('DME'),r('VOR_FG1000'),r('NDB'),r('FIX',0),r('GPS'),r('RTE'),r('WPT'),r('FLT'),r('WXR',0),r('APS')] ) { - obj.Map.addLayer( - factory: canvas.SymbolLayer, - type_arg: type.name, - priority: 4, - style: obj.Styles.getStyle(type.name), - options: obj.Options.getOption(type.name), - visible: type.vis); - } + foreach (var layer_name; obj._page.mfd.ConfigStore.getLayerNames()) { + var layer = obj._page.mfd.ConfigStore.getLayer(layer_name); - foreach(var type; [ r('STAMEN_terrain'),r('STAMEN'), r('OpenAIP') ]) { + if ((static == 0) or (layer.static == 1)) { + # Not all layers are displayed for all map types. Specifically, + # some layers are not displayed on static maps - e.g. DirectTo obj.Map.addLayer( - factory: canvas.OverlayLayer, - type_arg: type.name, - priority: 1, - style: obj.Styles.getStyle(type.name), - options: obj.Options.getOption(type.name), + factory: layer.factory, + type_arg: layer_name, + priority: layer.priority, + style: obj.Styles.getStyle(layer_name), + options: obj.Options.getOption(layer_name), visible: 0); + } } obj.setZoom(obj.current_zoom); @@ -110,6 +110,14 @@ var NavMap = { return obj; }, + setController : func(type, controller ) { + me.Map.setController(type, controller); + }, + + getController : func() { + return me.Map.getController(); + }, + toggleLayerVisible : func(name) { (var l = me.Map.getLayer(name)).setVisible(l.getVisible()); }, @@ -155,6 +163,8 @@ var NavMap = { foreach (var layer_name; me._page.mfd.ConfigStore.getLayerNames()) { var layer = me._page.mfd.ConfigStore.getLayer(layer_name); + if (me.Map.getLayer(layer_name) == nil) continue; + # Layers are only displayed if: # 1) the user has enabled them. # 2) The current zoom level is _less_ than the maximum range for the layer @@ -165,7 +175,7 @@ var NavMap = { var effective_range = fg1000.RANGES[effective_zoom].range; if (layer.enabled and (effective_range <= layer.range) and - (me.declutter <= layer.declutter) ) + (me.declutter <= layer.declutter) ) { me.Map.getLayer(layer_name).setVisible(1); } else {