X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FATC%2Fatcdialog.cxx;h=00c3e2c05e50354a4d44fc6aaadb724659b72de3;hb=831f75a0309fd8ef729f7f2407c17e13cccf0bd9;hp=c59bf959b6b40a07e0764cbd1ba1e83230fa6763;hpb=960f6881c993a32613e542d1475ad0d1ae97b927;p=flightgear.git diff --git a/src/ATC/atcdialog.cxx b/src/ATC/atcdialog.cxx index c59bf959b..00c3e2c05 100644 --- a/src/ATC/atcdialog.cxx +++ b/src/ATC/atcdialog.cxx @@ -18,8 +18,13 @@ // // $Id$ -#include
-#include
+#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "atcdialog.hxx" + +#include #include #include @@ -31,19 +36,160 @@ #include #include -#include "atcdialog.hxx" +#include
+#include
+#include
+#include // mkDialog +#include +#include +#include -FGATCDialogNew *currentATCDialog; +using std::string; -static bool doATCDialog(const SGPropertyNode* arg) { - cerr << "Running doATCDialog" << endl; - currentATCDialog->PopupDialog(); - return(true); +static SGPropertyNode *getNamedNode(SGPropertyNode *prop, const char *name) +{ + SGPropertyNode* p; + + for (int i = 0; i < prop->nChildren(); i++) + if ((p = getNamedNode(prop->getChild(i), name))) + return p; + + if (!strcmp(prop->getStringValue("name"), name)) + return prop; + return 0; +} + +static void atcUppercase(string &s) { + for(unsigned int i=0; icommStations().empty()); + } +}; + +void FGATCDialogNew::frequencySearch() +{ + const char *dialog_name = "atc-freq-search"; + SGPropertyNode_ptr dlg = _gui->getDialogProperties(dialog_name); + if (!dlg) + return; + + _gui->closeDialog(dialog_name); + + SGPropertyNode_ptr button_group = getNamedNode(dlg, "quick-buttons"); + // remove all dynamic airport/ATC buttons + button_group->removeChildren("button", false); + + AirportsWithATC filt; + FGPositionedList results = FGPositioned::findWithinRange(globals->get_aircraft_position(), 50.0, &filt); + FGPositioned::sortByRange(results, globals->get_aircraft_position()); + for (unsigned int r=0; (rgetNode("button", r, true); + copyProperties(button_group->getNode("button-template", true), entry); + entry->removeChildren("enabled", true); + entry->setStringValue("legend", results[r]->ident()); + entry->setStringValue("binding[0]/icao", results[r]->ident()); + } + + // (un)hide message saying no things in range + SGPropertyNode_ptr range_error = getNamedNode(dlg, "no-atc-in-range"); + range_error->setBoolValue("visible", !results.empty()); + + _gui->showDialog(dialog_name); } +void FGATCDialogNew::frequencyDisplay(const std::string& ident) +{ + const char *dialog_name = "atc-freq-display"; + SGPropertyNode_ptr dlg = _gui->getDialogProperties(dialog_name); + if (!dlg) + return; + + _gui->closeDialog(dialog_name); + + SGPropertyNode_ptr freq_group = getNamedNode(dlg, "frequency-list"); + // remove all frequency entries + freq_group->removeChildren("group", false); + + std::string uident(ident); + atcUppercase(uident); + string label; + + const FGAirport *a = fgFindAirportID(uident); + if (!a) { + label = "Airport " + ident + " not found in database."; + mkDialog(label.c_str()); + return; + } + + // set title + label = uident + " Frequencies"; + dlg->setStringValue("text/label", label.c_str()); + + const flightgear::CommStationList& comms(a->commStations()); + if (comms.empty()) { + label = "No frequencies found for airport " + uident; + mkDialog(label.c_str()); + return; + } + + for (unsigned int c=0; c < comms.size(); ++c) { + flightgear::CommStation* comm = comms[c]; + + // add frequency line (modified copy of ) + SGPropertyNode *entry = freq_group->getNode("group", c, true); + copyProperties(freq_group->getNode("group-template", true), entry); + entry->removeChildren("enabled", true); + + entry->setStringValue("text[0]/label", comm->ident()); + + char buf[8]; + snprintf(buf, 8, "%.2f", comm->freqMHz()); + if(buf[5] == '3') buf[5] = '2'; + if(buf[5] == '8') buf[5] = '7'; + buf[7] = '\0'; + + entry->setStringValue("text[1]/label", buf); + } + + _gui->showDialog(dialog_name); +} + +static bool doFrequencySearch( const SGPropertyNode* ) +{ + FGATCDialogNew::instance()->frequencySearch(); + return true; +} + +static bool doFrequencyDisplay( const SGPropertyNode* args ) +{ + std::string icao = args->getStringValue("icao"); + if (icao.empty()) { + icao = fgGetString("/sim/atc/freq-airport"); + } + + FGATCDialogNew::instance()->frequencyDisplay(icao); + return true; +} + +FGATCDialogNew * FGATCDialogNew::_instance = NULL; + FGATCDialogNew::FGATCDialogNew() +: _gui(NULL), + dialogVisible(true) { - dialogVisible = false; } FGATCDialogNew::~FGATCDialogNew() @@ -53,14 +199,15 @@ FGATCDialogNew::~FGATCDialogNew() void FGATCDialogNew::init() { - // Add ATC-dialog to the command list - globals->get_commands()->addCommand("ATC-dialog", doATCDialog); - // Add ATC-freq-search to the command list - //globals->get_commands()->addCommand("ATC-freq-search", do_ATC_freq_search); - - // initialize properties polled in Update() - //globals->get_props()->setStringValue("/sim/atc/freq-airport", ""); - globals->get_props()->setIntValue("/sim/atc/transmission-num", -1); + // Add ATC-dialog to the command list + globals->get_commands()->addCommand("ATC-dialog", FGATCDialogNew::popup ); + // Add ATC-freq-search to the command list + globals->get_commands()->addCommand("ATC-freq-search", doFrequencySearch); + globals->get_commands()->addCommand("ATC-freq-display", doFrequencyDisplay); + + // initialize properties polled in Update() + //globals->get_props()->setStringValue("/sim/atc/freq-airport", ""); + globals->get_props()->setIntValue("/sim/atc/transmission-num", -1); } @@ -74,21 +221,11 @@ void FGATCDialogNew::init() { // Okay, let's see, according to my interpretation of David Luff's original code, // his ATC subsystem wrote properties to a named node, called "transmission-choice" -static SGPropertyNode *getNamedNode(SGPropertyNode *prop, const char *name) { - SGPropertyNode* p; - - for (int i = 0; i < prop->nChildren(); i++) - if ((p = getNamedNode(prop->getChild(i), name))) - return p; - - if (!strcmp(prop->getStringValue("name"), name)) - return prop; - return 0; -} -void FGATCDialogNew::addEntry(int nr, string txt) { +void FGATCDialogNew::addEntry(int nr, const std::string& txt) { commands.clear(); commands.push_back(txt); + commands.push_back(string("Toggle ground network visibility")); } void FGATCDialogNew::removeEntry(int nr) { @@ -98,61 +235,22 @@ void FGATCDialogNew::removeEntry(int nr) { void FGATCDialogNew::PopupDialog() { - /*double onBoardRadioFreq0 = - fgGetDouble("/instrumentation/comm[0]/frequencies/selected-mhz"); - double onBoardRadioFreq1 = - fgGetDouble("/instrumentation/comm[1]/frequencies/selected-mhz"); - - const char *dialog_name = "atc-dialog"; - _gui = (NewGUI *)globals->get_subsystem("gui"); - SGPropertyNode_ptr dlg = _gui->getDialogProperties(dialog_name); - if (!dlg) - return; - - _gui->closeDialog(dialog_name); - SGPropertyNode_ptr button_group = getNamedNode(dlg, "transmission-choice"); - button_group->removeChildren("button", false); - - const int bufsize = 32; - char buf[bufsize]; - int commandNr = 0; - // loop over all entries that should fill up the dialog; use 10 items for now... - for (StringVecIterator i = commands.begin(); i != commands.end(); i++) { - snprintf(buf, bufsize, "/sim/atc/opt[%d]", commandNr); - fgSetBool(buf, false); - SGPropertyNode *entry = button_group->getNode("button", commandNr, true); - copyProperties(button_group->getNode("button-template", true), entry); - entry->removeChildren("enabled", true); - entry->setStringValue("property", buf); - entry->setIntValue("keynum", '1' + commandNr); - if (commandNr == 0) - entry->setBoolValue("default", true); - - snprintf(buf, bufsize, "%d", 1 + commandNr); - string legend = string(buf) + (*i); //"; // + current->menuentry; - entry->setStringValue("legend", legend.c_str()); - entry->setIntValue("binding/value", commandNr); - commandNr++; - //current++; - } -*/ - //if (dialogVisible) { - // _gui->closeDialog(dialog_name); - //} else { - // _gui->showDialog(dialog_name); - //} dialogVisible = !dialogVisible; return; } void FGATCDialogNew::update(double dt) { - double onBoardRadioFreq0 = - fgGetDouble("/instrumentation/comm[0]/frequencies/selected-mhz"); - double onBoardRadioFreq1 = - fgGetDouble("/instrumentation/comm[1]/frequencies/selected-mhz"); +// double onBoardRadioFreq0 = +// fgGetDouble("/instrumentation/comm[0]/frequencies/selected-mhz"); +// double onBoardRadioFreq1 = +// fgGetDouble("/instrumentation/comm[1]/frequencies/selected-mhz"); const char *dialog_name = "atc-dialog"; _gui = (NewGUI *)globals->get_subsystem("gui"); + if (!_gui) { + return; + } + SGPropertyNode_ptr dlg = _gui->getDialogProperties(dialog_name); if (!dlg) return; @@ -165,7 +263,7 @@ void FGATCDialogNew::update(double dt) { char buf[bufsize]; int commandNr = 0; // loop over all entries that should fill up the dialog; use 10 items for now... - for (StringVecIterator i = commands.begin(); i != commands.end(); i++) { + BOOST_FOREACH(const std::string& i, commands) { snprintf(buf, bufsize, "/sim/atc/opt[%d]", commandNr); fgSetBool(buf, false); SGPropertyNode *entry = button_group->getNode("button", commandNr, true); @@ -177,7 +275,7 @@ void FGATCDialogNew::update(double dt) { entry->setBoolValue("default", true); snprintf(buf, bufsize, "%d", 1 + commandNr); - string legend = string(buf) + (*i); //"; // + current->menuentry; + string legend = string(buf) + i; //"; // + current->menuentry; entry->setStringValue("legend", legend.c_str()); entry->setIntValue("binding/value", commandNr); commandNr++; @@ -189,14 +287,4 @@ void FGATCDialogNew::update(double dt) { } else { _gui->showDialog(dialog_name); } - //dialogVisible = !dialogVisible; - return; - /* - static SGPropertyNode_ptr trans_num = globals->get_props()->getNode("/sim/atc/transmission-num", true); - int n = trans_num->getIntValue(); - if (n >= 0) { - trans_num->setIntValue(-1); - // PopupCallback(n); - cerr << "Selected transmission message" << n << endl; - } */ -} \ No newline at end of file +}