From a3890d1253d9dcd3de9a9bf39ead0d3ae7939b0b Mon Sep 17 00:00:00 2001 From: daveluff <daveluff> Date: Wed, 30 Nov 2005 01:21:45 +0000 Subject: [PATCH] Add support for a special-instrument xml attribute, which triggers loading of a know c++ hard-coded instrument. This has some ugliness that will need removing at some point. In particular, panel reload is broken for panels that include a special-instrument, since this triggers subsystem reload which is a fatal error. Note that this *only* affects panels that use a special-instrument - all other panels are unaffected --- src/Cockpit/panel_io.cxx | 53 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/src/Cockpit/panel_io.cxx b/src/Cockpit/panel_io.cxx index 978aac540..375630652 100644 --- a/src/Cockpit/panel_io.cxx +++ b/src/Cockpit/panel_io.cxx @@ -45,6 +45,7 @@ // #include "panel.hxx" #include "panel_io.hxx" +#include <Instrumentation/KLN89/kln89.hxx> //built-in layers #include "built_in/FGMagRibbon.hxx" @@ -749,12 +750,54 @@ readPanel (const SGPropertyNode * root) for (int i = 0; i < nInstruments; i++) { const SGPropertyNode * node = instrument_group->getChild(i); if (!strcmp(node->getName(), "instrument")) { - FGPanelInstrument * instrument = readInstrument(node); - if (instrument != 0) - panel->addInstrument(instrument); + FGPanelInstrument * instrument = readInstrument(node); + if (instrument != 0) + panel->addInstrument(instrument); + } else if(!strcmp(node->getName(), "special-instrument")) { + //cout << "Special instrument found in instruments section!\n"; + const string name = node->getStringValue("name"); + if(name == "KLN89 GPS") { + //cout << "Special instrument is KLN89\n"; + + int x = node->getIntValue("x", -1); + int y = node->getIntValue("y", -1); + int real_w = node->getIntValue("w", -1); + int real_h = node->getIntValue("h", -1); + int w = node->getIntValue("w-base", -1); + int h = node->getIntValue("h-base", -1); + + if (x == -1 || y == -1) { + SG_LOG( SG_COCKPIT, SG_ALERT, + "x and y positions must be specified and > 0" ); + return 0; + } + + float w_scale = 1.0; + float h_scale = 1.0; + if (real_w != -1) { + w_scale = float(real_w) / float(w); + w = real_w; + } + if (real_h != -1) { + h_scale = float(real_h) / float(h); + h = real_h; + } + + SG_LOG( SG_COCKPIT, SG_DEBUG, "Reading instrument " << name ); + + // Warning - hardwired size!!! + RenderArea2D* instrument = new RenderArea2D(158, 40, 158, 40, x, y); + // FIXME: shift-F3 (panel reload) kill's us here due to duplicate subsystem! + KLN89* gps = new KLN89(instrument); + panel->addInstrument(gps); + globals->add_subsystem("kln89", gps); + //gps->init(); // init seems to get called automagically. + } else { + SG_LOG( SG_COCKPIT, SG_WARN, "Unknown special instrument found" ); + } } else { - SG_LOG( SG_COCKPIT, SG_INFO, "Skipping " << node->getName() - << " in instruments section" ); + SG_LOG( SG_COCKPIT, SG_INFO, "Skipping " << node->getName() + << " in instruments section" ); } } }