From fa842a42b6e0b312049fff5c653675ad4ae69753 Mon Sep 17 00:00:00 2001 From: Durk Talsma Date: Fri, 15 Apr 2011 19:32:21 +0200 Subject: [PATCH] Added a small and simple dialogbox that allows the user to issue ATC commands. --- src/ATC/atc_mgr.hxx | 1 + src/ATC/atcdialog.cxx | 23 +++--- src/ATC/atcdialog.hxx | 6 +- src/ATC/trafficcontrol.cxx | 123 ++++++++------------------------- src/ATC/trafficcontrol.hxx | 2 +- src/Airports/groundnetwork.cxx | 14 ++-- 6 files changed, 58 insertions(+), 111 deletions(-) diff --git a/src/ATC/atc_mgr.hxx b/src/ATC/atc_mgr.hxx index ad919a697..33fa5c40a 100644 --- a/src/ATC/atc_mgr.hxx +++ b/src/ATC/atc_mgr.hxx @@ -58,6 +58,7 @@ public: void init(); void addController(FGATCController *controller); void update(double time); + FGATCDialogNew * getATCDialog() { return currentATCDialog; }; }; #endif // _ATC_MRG_HXX_ \ No newline at end of file diff --git a/src/ATC/atcdialog.cxx b/src/ATC/atcdialog.cxx index 5feb94dd0..a4c75a611 100644 --- a/src/ATC/atcdialog.cxx +++ b/src/ATC/atcdialog.cxx @@ -86,6 +86,11 @@ static SGPropertyNode *getNamedNode(SGPropertyNode *prop, const char *name) { return 0; } +void FGATCDialogNew::addEntry(int nr, string txt) { + commands.clear(); + commands.push_back(txt); +} + void FGATCDialogNew::PopupDialog() { double onBoardRadioFreq0 = @@ -105,22 +110,24 @@ void FGATCDialogNew::PopupDialog() { 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 (int i = 0; i < 10; i++) { - snprintf(buf, bufsize, "/sim/atc/opt[%d]", i); + 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", i, true); + 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' + i); - if (i == 0) + entry->setIntValue("keynum", '1' + commandNr); + if (commandNr == 0) entry->setBoolValue("default", true); - snprintf(buf, bufsize, "%d", i + 1); - string legend = string(buf) + ". test"; // + current->menuentry; + snprintf(buf, bufsize, "%d", 1 + commandNr); + string legend = string(buf) + (*i); //"; // + current->menuentry; entry->setStringValue("legend", legend.c_str()); - entry->setIntValue("binding/value", i); + entry->setIntValue("binding/value", commandNr); + commandNr++; //current++; } diff --git a/src/ATC/atcdialog.hxx b/src/ATC/atcdialog.hxx index 2e0aa2f74..f667b87dc 100644 --- a/src/ATC/atcdialog.hxx +++ b/src/ATC/atcdialog.hxx @@ -40,13 +40,16 @@ #include // mkDialog #include +typedef vector StringVec; +typedef vector:: iterator StringVecIterator; static bool doATCDialog(const SGPropertyNode* arg); class FGATCDialogNew { private: NewGUI *_gui; - bool dialogVisible; + bool dialogVisible; + StringVec commands; public: FGATCDialogNew(); @@ -56,6 +59,7 @@ public: void update(double dt); void PopupDialog(); + void addEntry(int, string); }; extern FGATCDialogNew *currentATCDialog; diff --git a/src/ATC/trafficcontrol.cxx b/src/ATC/trafficcontrol.cxx index 5dad818ae..b0adba541 100644 --- a/src/ATC/trafficcontrol.cxx +++ b/src/ATC/trafficcontrol.cxx @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -471,7 +472,7 @@ bool FGATCController::isUserAircraft(FGAIAircraft* ac) }; void FGATCController::transmit(FGTrafficRecord * rec, AtcMsgId msgId, - AtcMsgDir msgDir) + AtcMsgDir msgDir, bool audible) { string sender, receiver; int stationFreq = 0; @@ -636,22 +637,28 @@ void FGATCController::transmit(FGTrafficRecord * rec, AtcMsgId msgId, text = text + sender + ". Transmitting unknown Message"; break; } - double onBoardRadioFreq0 = - fgGetDouble("/instrumentation/comm[0]/frequencies/selected-mhz"); - double onBoardRadioFreq1 = - fgGetDouble("/instrumentation/comm[1]/frequencies/selected-mhz"); - int onBoardRadioFreqI0 = (int) floor(onBoardRadioFreq0 * 100 + 0.5); - int onBoardRadioFreqI1 = (int) floor(onBoardRadioFreq1 * 100 + 0.5); - //cerr << "Using " << onBoardRadioFreq0 << ", " << onBoardRadioFreq1 << " and " << stationFreq << " for " << text << endl; + if (audible) { + double onBoardRadioFreq0 = + fgGetDouble("/instrumentation/comm[0]/frequencies/selected-mhz"); + double onBoardRadioFreq1 = + fgGetDouble("/instrumentation/comm[1]/frequencies/selected-mhz"); + int onBoardRadioFreqI0 = (int) floor(onBoardRadioFreq0 * 100 + 0.5); + int onBoardRadioFreqI1 = (int) floor(onBoardRadioFreq1 * 100 + 0.5); + //cerr << "Using " << onBoardRadioFreq0 << ", " << onBoardRadioFreq1 << " and " << stationFreq << " for " << text << endl; - // Display ATC message only when one of the radios is tuned - // the relevant frequency. - // Note that distance attenuation is currently not yet implemented - if ((onBoardRadioFreqI0 == stationFreq) - || (onBoardRadioFreqI1 == stationFreq)) { - if (rec->allowTransmissions()) { - fgSetString("/sim/messages/atc", text.c_str()); + // Display ATC message only when one of the radios is tuned + // the relevant frequency. + // Note that distance attenuation is currently not yet implemented + if ((onBoardRadioFreqI0 == stationFreq) + || (onBoardRadioFreqI1 == stationFreq)) { + if (rec->allowTransmissions()) { + fgSetString("/sim/messages/atc", text.c_str()); + } } + } else { + FGATCManager *atc = (FGATCManager*) globals->get_subsystem("atc"); + atc->getATCDialog()->addEntry(1, text); + } } @@ -1008,6 +1015,7 @@ bool FGStartupController::checkTransmissionState(int st, time_t now, time_t star int state = i->getState(); if ((state == st) && available) { if ((msgDir == ATC_AIR_TO_GROUND) && isUserAircraft(i->getAircraft())) { + cerr << "Checking state " << st << " for " << i->getAircraft()->getCallSign() << endl; static SGPropertyNode_ptr trans_num = globals->get_props()->getNode("/sim/atc/transmission-num", true); int n = trans_num->getIntValue(); @@ -1016,12 +1024,14 @@ bool FGStartupController::checkTransmissionState(int st, time_t now, time_t star // PopupCallback(n); cerr << "Selected transmission message" << n << endl; } else { + cerr << "creading message for " << i->getAircraft()->getCallSign() << endl; + transmit(&(*i), msgId, msgDir, false); return false; } } if (now > startTime) { //cerr << "Transmitting startup msg" << endl; - transmit(&(*i), msgId, msgDir); + transmit(&(*i), msgId, msgDir, true); i->updateState(); lastTransmission = now; available = false; @@ -1084,92 +1094,17 @@ void FGStartupController::updateAircraftInformation(int id, double lat, double l checkTransmissionState(6, now, (startTime + 150), i, MSG_ACKNOWLEDGE_INITIATE_CONTACT, ATC_GROUND_TO_AIR); - /* - if ((state == 0) && available) { - if (now > startTime) { - //cerr << "Transmitting startup msg" << endl; - transmit(&(*i), MSG_ANNOUNCE_ENGINE_START, ATC_AIR_TO_GROUND); - i->updateState(); - lastTransmission = now; - available = false; - } - } - if ((state == 1) && available) { - if (now > startTime + 60) { - transmit(&(*i), MSG_REQUEST_ENGINE_START, ATC_AIR_TO_GROUND); - i->updateState(); - lastTransmission = now; - available = false; - } - } - if ((state == 2) && available) { - if (now > startTime + 80) { - transmit(&(*i), MSG_PERMIT_ENGINE_START, ATC_GROUND_TO_AIR); - i->updateState(); - lastTransmission = now; - available = false; - } - } - if ((state == 3) && available) { - if (now > startTime + 100) { - transmit(&(*i), MSG_ACKNOWLEDGE_ENGINE_START, - ATC_AIR_TO_GROUND); - i->updateState(); - lastTransmission = now; - available = false; - } - } - // Note: The next four stages are only necessesary when Startup control is - // on a different frequency, compared to ground control - if ((state == 4) && available) { - if (now > startTime + 130) { - transmit(&(*i), MSG_ACKNOWLEDGE_SWITCH_GROUND_FREQUENCY, - ATC_AIR_TO_GROUND); - i->updateState(); - i->nextFrequency(); - lastTransmission = now; - available = false; - } - } - if ((state == 5) && available) { - if (now > startTime + 140) { - transmit(&(*i), MSG_INITIATE_CONTACT, ATC_AIR_TO_GROUND); - i->updateState(); - lastTransmission = now; - available = false; - } - } - if ((state == 6) && available) { - if (now > startTime + 150) { - transmit(&(*i), MSG_ACKNOWLEDGE_INITIATE_CONTACT, - ATC_GROUND_TO_AIR); - i->updateState(); - lastTransmission = now; - available = false; - } - } - - // TODO: Switch to APRON control and request pushback Clearance. - // Get Push back clearance - if ((state == 7) && available) { - if (now > startTime + 180) { - transmit(&(*i), MSG_REQUEST_PUSHBACK_CLEARANCE, - ATC_AIR_TO_GROUND); - i->updateState(); - lastTransmission = now; - available = false; - } - } */ + if ((state == 8) && available) { if (now > startTime + 200) { if (i->pushBackAllowed()) { i->allowRepeatedTransmissions(); transmit(&(*i), MSG_PERMIT_PUSHBACK_CLEARANCE, - ATC_GROUND_TO_AIR); + ATC_GROUND_TO_AIR, true); i->updateState(); } else { transmit(&(*i), MSG_HOLD_PUSHBACK_CLEARANCE, - ATC_GROUND_TO_AIR); + ATC_GROUND_TO_AIR, true); i->suppressRepeatedTransmissions(); } lastTransmission = now; diff --git a/src/ATC/trafficcontrol.hxx b/src/ATC/trafficcontrol.hxx index 8de329ba9..66381af52 100644 --- a/src/ATC/trafficcontrol.hxx +++ b/src/ATC/trafficcontrol.hxx @@ -276,7 +276,7 @@ public: double getDt() { return dt_count; }; void setDt(double dt) { dt_count = dt;}; - void transmit(FGTrafficRecord *rec, AtcMsgId msgId, AtcMsgDir msgDir); + void transmit(FGTrafficRecord *rec, AtcMsgId msgId, AtcMsgDir msgDir, bool audible); string getGateName(FGAIAircraft *aircraft); private: diff --git a/src/Airports/groundnetwork.cxx b/src/Airports/groundnetwork.cxx index 0470e4af9..37e9946bf 100644 --- a/src/Airports/groundnetwork.cxx +++ b/src/Airports/groundnetwork.cxx @@ -569,19 +569,19 @@ void FGGroundNetwork::updateAircraftInformation(int id, double lat, double lon, available = true; } if ((state < 3) && available) { - transmit(&(*current), MSG_REQUEST_TAXI_CLEARANCE, ATC_AIR_TO_GROUND); + transmit(&(*current), MSG_REQUEST_TAXI_CLEARANCE, ATC_AIR_TO_GROUND, true); current->setState(3); lastTransmission = now; available = false; } if ((state == 3) && available) { - transmit(&(*current), MSG_ISSUE_TAXI_CLEARANCE, ATC_GROUND_TO_AIR); + transmit(&(*current), MSG_ISSUE_TAXI_CLEARANCE, ATC_GROUND_TO_AIR, true); current->setState(4); lastTransmission = now; available = false; } if ((state == 4) && available) { - transmit(&(*current), MSG_ACKNOWLEDGE_TAXI_CLEARANCE, ATC_AIR_TO_GROUND); + transmit(&(*current), MSG_ACKNOWLEDGE_TAXI_CLEARANCE, ATC_AIR_TO_GROUND, true); current->setState(5); lastTransmission = now; available = false; @@ -846,11 +846,11 @@ void FGGroundNetwork::checkHoldPosition(int id, double lat, if ((origStatus != currStatus) && available) { //cerr << "Issueing hold short instrudtion " << currStatus << " " << available << endl; if (currStatus == true) { // No has a hold short instruction - transmit(&(*current), MSG_HOLD_POSITION, ATC_GROUND_TO_AIR); + transmit(&(*current), MSG_HOLD_POSITION, ATC_GROUND_TO_AIR, true); //cerr << "Transmittin hold short instrudtion " << currStatus << " " << available << endl; current->setState(1); } else { - transmit(&(*current), MSG_RESUME_TAXI, ATC_GROUND_TO_AIR); + transmit(&(*current), MSG_RESUME_TAXI, ATC_GROUND_TO_AIR, true); //cerr << "Transmittig resume instrudtion " << currStatus << " " << available << endl; current->setState(2); } @@ -865,7 +865,7 @@ void FGGroundNetwork::checkHoldPosition(int id, double lat, int state = current->getState(); if ((state == 1) && (available)) { //cerr << "ACKNOWLEDGE HOLD" << endl; - transmit(&(*current), MSG_ACKNOWLEDGE_HOLD_POSITION, ATC_AIR_TO_GROUND); + transmit(&(*current), MSG_ACKNOWLEDGE_HOLD_POSITION, ATC_AIR_TO_GROUND, true); current->setState(0); current->setHoldPosition(true); lastTransmission = now; @@ -874,7 +874,7 @@ void FGGroundNetwork::checkHoldPosition(int id, double lat, } if ((state == 2) && (available)) { //cerr << "ACKNOWLEDGE RESUME" << endl; - transmit(&(*current), MSG_ACKNOWLEDGE_RESUME_TAXI, ATC_AIR_TO_GROUND); + transmit(&(*current), MSG_ACKNOWLEDGE_RESUME_TAXI, ATC_AIR_TO_GROUND, true); current->setState(0); current->setHoldPosition(false); lastTransmission = now;