X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FATC%2FATCDialog.cxx;h=42d8bf7be7f5b873d618145900c0569d2afaad84;hb=68f248879cb15562c7b026445f83caf8f2842ae9;hp=1e4617d569ffe046ac7bbe4c51d18767a41f19f4;hpb=d43b6fd508b4e7f6e749cfc78442c5445fcd2dcb;p=flightgear.git diff --git a/src/ATC/ATCDialog.cxx b/src/ATC/ATCDialog.cxx index 1e4617d56..42d8bf7be 100644 --- a/src/ATC/ATCDialog.cxx +++ b/src/ATC/ATCDialog.cxx @@ -18,6 +18,8 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +#include + #include #include
@@ -26,15 +28,20 @@ #include "ATCDialog.hxx" #include "ATC.hxx" #include "ATCmgr.hxx" +#include "ATCdisplay.hxx" #include "commlist.hxx" #include "ATCutils.hxx" #include +#include + +SG_USING_STD(ostringstream); + FGATCDialog *current_atcdialog; // For the command manager - maybe eventually this should go in the built in command list static bool do_ATC_dialog(const SGPropertyNode* arg) { - globals->get_ATC_mgr()->doPopupDialog(); + current_atcdialog->PopupDialog(); return(true); } @@ -45,249 +52,252 @@ static bool do_ATC_freq_search(const SGPropertyNode* arg) { ATCMenuEntry::ATCMenuEntry() { stationid = ""; - stationfr = 0; + //stationfr = 0; transmission = ""; menuentry = ""; + callback_code = 0; } ATCMenuEntry::~ATCMenuEntry() { } -static char* t0 = "No communication currently available"; -//static char* t1 = "Request departure clearance"; -//static char* t2 = "Report Runway vacated"; -static char** towerOptions = new char*[2]; - -// ----------------------- DCL ------------------------------------------ -// For the ATC dialog - copied from the Autopilot new heading dialog code! -static puDialogBox* atcDialog; -static puFrame* atcDialogFrame; -static puText* atcDialogMessage; -//static puInput* atcDialogInput; -static puOneShot* atcDialogOkButton; -static puOneShot* atcDialogCancelButton; -static puButtonBox* atcDialogCommunicationOptions; -// ---------------------------------------------------------------------- - -// ------------------------ AK ------------------------------------------ -static puDialogBox *ATCMenuBox = 0; -static puFrame *ATCMenuFrame = 0; -static puText *ATCMenuBoxMessage = 0; -static puButtonBox *ATCOptionsList = 0; -// ---------------------------------------------------------------------- - -// AK -static void AKATCDialogOK(puObject *) -{ - switch(ATCOptionsList->getValue()) { - case 0: - //cout << "Option 0 chosen\n"; - fgSetBool("/sim/atc/opt0",true); - break; - case 1: - //cout << "Option 1 chosen\n"; - fgSetBool("/sim/atc/opt1",true); - break; - case 2: - //cout << "Option 2 chosen\n"; - fgSetBool("/sim/atc/opt2",true); - break; - case 3: - //cout << "Option 2 chosen\n"; - fgSetBool("/sim/atc/opt3",true); - break; - default: - break; +static void atcUppercase(string &s) { + for(unsigned int i=0; iPopupCallback(); + FG_POP_PUI_DIALOG( atcDialog ); } -// DCL -static void ATCDialogCancel(puObject *) -{ - //ATCDialogInput->rejectInput(); +static void ATCDialogCancel(puObject*) { FG_POP_PUI_DIALOG( atcDialog ); } +////////////////////////////////////////////////// -// DCL -static void ATCDialogOK (puObject *me) -{ - // Note that currently the dialog is hardwired to comm1 only here. - switch(globals->get_ATC_mgr()->GetComm1ATCType()) { - case INVALID: - break; - case ATIS: - break; - case TOWER: { - /* - FGTower* twr = (FGTower*)globals->get_ATC_mgr()->GetComm1ATCPointer(); - switch(atcDialogCommunicationOptions->getValue()) { - case 0: - //cout << "Option 0 chosen\n"; - twr->RequestLandingClearance("charlie foxtrot sierra"); - break; - case 1: - //cout << "Option 1 chosen\n"; - twr->RequestDepartureClearance("charlie foxtrot sierra"); - break; - case 2: - //cout << "Option 2 chosen\n"; - twr->ReportRunwayVacated("charlie foxtrot sierra"); - break; - default: - break; - } - */ - break; - } - case GROUND: - break; - case APPROACH: - break; - default: - break; - } - ATCDialogCancel(me); - //if(error) mkDialog(s.c_str()); +///////////////// Freq search callbacks /////////// +static void FreqDialogCancel(puObject*) { + FG_POP_PUI_DIALOG(atcFreqDialog); +} + +static void FreqDialogOK(puObject*) { + string tmp = atcFreqDialogInput->getStringValue(); + FG_POP_PUI_DIALOG(atcFreqDialog); + current_atcdialog->FreqDisplay(tmp); +} + +static void FreqDisplayOK(puObject*) { + FG_POP_PUI_DIALOG(atcFreqDisplay); } +////////////////////////////////////////////////// + -// DCL -static void ATCDialog(puObject *cb) -{ - //ApHeadingDialogInput -> setValue ( heading ); - //ApHeadingDialogInput -> acceptInput(); - FG_PUSH_PUI_DIALOG(atcDialog); +FGATCDialog::FGATCDialog() { + _callbackPending = false; + _callbackTimer = 0.0; + _callbackWait = 0.0; + _callbackPtr = NULL; + _callbackCode = 0; } -// DCL -void ATCDialogInit() -{ - char defaultATCLabel[] = "Enter desired option to communicate with ATC:"; - char *s; +FGATCDialog::~FGATCDialog() { + if(atcDialog) puDeleteObject(atcDialog); + if(atcFreqDialog) puDeleteObject(atcFreqDialog); + if(atcFreqDisplay) puDeleteObject(atcFreqDisplay); +} - // Option lists hardwired per ATC type - towerOptions[0] = new char[strlen(t0)+1]; - strcpy(towerOptions[0], t0); - //towerOptions[1] = new char[strlen(t1)+1]; - //strcpy(towerOptions[1], t1); - //towerOptions[2] = new char[strlen(t2)+1]; - //strcpy(towerOptions[2], t2); - towerOptions[1] = NULL; +void FGATCDialog::Init() { + // Add ATC-dialog to the command list + globals->get_commands()->addCommand("ATC-dialog", do_ATC_dialog); + // Add ATC-freq-search to the command list + globals->get_commands()->addCommand("ATC-freq-search", do_ATC_freq_search); + + int w; + int h; + int x; + int y; - atcDialog = new puDialogBox (150, 50); + // Init the freq-search dialog + w = 300; + h = 150; + x = (fgGetInt("/sim/startup/xsize") / 2) - (w / 2); + y = 50; + char *s; + atcFreqDialog = new puDialogBox (x, y); { - atcDialogFrame = new puFrame (0, 0, 500, 250); + atcFreqDialogFrame = new puFrame (0, 0, w, h); + atcFreqDialogMessage = new puText (40, (h - 30)); + atcFreqDialogMessage->setDefaultValue ("Enter airport identifier:"); + atcFreqDialogMessage->getDefaultValue (&s); + atcFreqDialogMessage->setLabel(s); + + atcFreqDialogInput = new puInput (50, (h - 75), 150, (h - 45)); + + atcFreqDialogOkButton = new puOneShot (50, 10, 110, 50); + atcFreqDialogOkButton -> setLegend (gui_msg_OK); + atcFreqDialogOkButton -> makeReturnDefault (TRUE); + atcFreqDialogOkButton -> setCallback (FreqDialogOK); + + atcFreqDialogCancelButton = new puOneShot (140, 10, 210, 50); + atcFreqDialogCancelButton -> setLegend (gui_msg_CANCEL); + atcFreqDialogCancelButton -> setCallback (FreqDialogCancel); - atcDialogMessage = new puText (250, 220); - atcDialogMessage -> setDefaultValue (defaultATCLabel); - atcDialogMessage -> getDefaultValue (&s); - atcDialogMessage -> setLabel (s); - atcDialogMessage -> setLabelPlace (PUPLACE_TOP_CENTERED); - - atcDialogCommunicationOptions = new puButtonBox (50, 50, 450, 210, NULL, true); + atcFreqDialogInput->acceptInput(); + } + + FG_FINALIZE_PUI_DIALOG(atcFreqDialog); + + // Init the freq-display dialog + w = 400; + h = 100; + x = (fgGetInt("/sim/startup/xsize") / 2) - (w / 2); + y = 50; + atcFreqDisplay = new puDialogBox (x, y); + { + atcFreqDisplayFrame = new puFrame (0, 0, w, h); - atcDialogOkButton = new puOneShot (50, 10, 110, 50); + atcFreqDisplayMessage = new puText (40, (h - 30)); + atcFreqDisplayMessage -> setDefaultValue ("No freqencies found"); + atcFreqDisplayMessage -> getDefaultValue (&s); + atcFreqDisplayMessage -> setLabel (s); + + for(int i=0; isetDefaultValue(""); + atcFreqDisplayText[i]-> getDefaultValue (&s); + atcFreqDisplayText[i]-> setLabel (s); + atcFreqDisplayText[i]->hide(); + } + + atcFreqDisplayOkButton = new puOneShot (50, 10, 110, 50); + atcFreqDisplayOkButton -> setLegend (gui_msg_OK); + atcFreqDisplayOkButton -> makeReturnDefault (TRUE); + atcFreqDisplayOkButton -> setCallback (FreqDisplayOK); + } + FG_FINALIZE_PUI_DIALOG(atcFreqDisplay); + + // Init AK's interactive ATC menus + w = 500; + h = 110; + x = (fgGetInt("/sim/startup/xsize") / 2) - (w / 2); + //y = (fgGetInt("/sim/startup/ysize") / 2) - (h / 2); + y = 50; + atcDialog = new puDialogBox (x, y); + { + atcDialogFrame = new puFrame (0,0,w,h); + atcDialogMessage = new puText (w / 2, h - 30); + atcDialogMessage -> setLabel( "No transmission available" ); + atcDialogMessage -> setLabelPlace(PUPLACE_TOP_CENTERED); + atcDialogCommunicationOptions = new puButtonBox (50, 60, 450, 50, NULL, true); + atcDialogCommunicationOptions -> hide(); + atcDialogOkButton = new puOneShot ((w/2)-85, 10, (w/2)-25, 50); atcDialogOkButton -> setLegend (gui_msg_OK); atcDialogOkButton -> makeReturnDefault (TRUE); atcDialogOkButton -> setCallback (ATCDialogOK); - atcDialogCancelButton = new puOneShot (140, 10, 210, 50); + atcDialogCancelButton = new puOneShot ((w/2)+25, 10, (w/2)+85, 50); atcDialogCancelButton -> setLegend (gui_msg_CANCEL); atcDialogCancelButton -> setCallback (ATCDialogCancel); - } FG_FINALIZE_PUI_DIALOG(atcDialog); - - // Add ATC-dialog to the command list - globals->get_commands()->addCommand("ATC-dialog", do_ATC_dialog); } -/////////////////////////////////////////////////////////////////////// -// -// ATCDoDialog is in a state of flux at the moment -// Stations other than approach are handled by DCL's simple code -// Approach is handled by AK's fancy dynamic-list code -// Hopefully all interactive stations should go to AK's code eventually -// -/////////////////////////////////////////////////////////////////////// -void ATCDoDialog(atc_type type) { - switch(type) { - case INVALID: - atcDialogCommunicationOptions->newList(NULL); - atcDialogMessage->setLabel("Not tuned in to any ATC service."); - break; - case ATIS: - atcDialogCommunicationOptions->newList(NULL); - atcDialogMessage->setLabel("Tuned in to ATIS: no communication possible."); - break; - case TOWER: - atcDialogCommunicationOptions->newList(towerOptions); - atcDialogMessage->setLabel("Tuned in to Tower - select communication to transmit:"); - break; - case GROUND: - atcDialogCommunicationOptions->newList(NULL); - atcDialogMessage->setLabel("Tuned in to Ground - select communication to transmit:"); - break; - case APPROACH: - current_atcdialog->DoDialog(); - break; - default: - atcDialogCommunicationOptions->newList(NULL); - atcDialogMessage->setLabel("Tuned in to unknown ATC service - enter transmission:"); - break; - } - - // Third - display the dialog without pausing sim. - if(type != APPROACH) { - ATCDialog(NULL); +void FGATCDialog::Update(double dt) { + if(_callbackPending) { + if(_callbackTimer > _callbackWait) { + _callbackPtr->ReceiveUserCallback(_callbackCode); + _callbackPtr->NotifyTransmissionFinished(fgGetString("/sim/user/callsign")); + _callbackPending = false; + } else { + _callbackTimer += dt; + } } } -void FGATCDialog::Init() { - // Add ATC-freq-search to the command list - globals->get_commands()->addCommand("ATC-freq-search", do_ATC_freq_search); -} - -// AK // Add an entry -void FGATCDialog::add_entry(string station, string transmission, string menutext ) { - +void FGATCDialog::add_entry(string station, string transmission, string menutext, atc_type type, int code) { + ATCMenuEntry a; a.stationid = station; a.transmission = transmission; a.menuentry = menutext; + a.callback_code = code; - atcmentrylist_station[station.c_str()].push_back(a); + (available_dialog[type])[station.c_str()].push_back(a); } -// AK -// query the database whether the transmission is already registered; -bool FGATCDialog::trans_reg( const string &station, const string &trans ) { +void FGATCDialog::remove_entry( const string &station, const string &trans, atc_type type ) { + atcmentry_vec_type* p = &((available_dialog[type])[station]); + atcmentry_vec_iterator current = p->begin(); + while(current != p->end()) { + if(current->transmission == trans) current = p->erase(current); + else ++current; + } +} + +void FGATCDialog::remove_entry( const string &station, int code, atc_type type ) { + atcmentry_vec_type* p = &((available_dialog[type])[station]); + atcmentry_vec_iterator current = p->begin(); + while(current != p->end()) { + if(current->callback_code == code) current = p->erase(current); + else ++current; + } +} - atcmentry_list_type atcmlist = atcmentrylist_station[station]; - atcmentry_list_iterator current = atcmlist.begin(); - atcmentry_list_iterator last = atcmlist.end(); - - for ( ; current != last ; ++current ) { +// query the database whether the transmission is already registered; +bool FGATCDialog::trans_reg( const string &station, const string &trans, atc_type type ) { + atcmentry_vec_type* p = &((available_dialog[type])[station]); + atcmentry_vec_iterator current = p->begin(); + for ( ; current != p->end() ; ++current ) { if ( current->transmission == trans ) return true; } return false; } -// AK -// =================================================== -// === Update ATC menue and look for keys pressed === -// =================================================== -void FGATCDialog::DoDialog() { +// query the database whether the transmission is already registered; +bool FGATCDialog::trans_reg( const string &station, int code, atc_type type ) { + atcmentry_vec_type* p = &((available_dialog[type])[station]); + atcmentry_vec_iterator current = p->begin(); + for ( ; current != p->end() ; ++current ) { + if ( current->callback_code == code ) return true; + } + return false; +} + +// Display the ATC popup dialog box with options relevant to the users current situation. +void FGATCDialog::PopupDialog() { static string mentry[10]; static string mtrans[10]; @@ -295,143 +305,118 @@ void FGATCDialog::DoDialog() { TransPar TPar; FGATC* atcptr = globals->get_ATC_mgr()->GetComm1ATCPointer(); // Hardwired to comm1 at the moment - if(atcptr != NULL) { - - atcmentry_list_type atcmlist = atcmentrylist_station[atcptr->get_ident()]; - //atcmentry_list_type atcmlist = atcmentrylist_station["EGNX"]; - atcmentry_list_iterator current = atcmlist.begin(); - atcmentry_list_iterator last = atcmlist.end(); - - // Set all opt flags to false before displaying box - fgSetBool("/sim/atc/opt0",false); - fgSetBool("/sim/atc/opt1",false); - fgSetBool("/sim/atc/opt2",false); - fgSetBool("/sim/atc/opt3",false); - fgSetBool("/sim/atc/opt4",false); - fgSetBool("/sim/atc/opt5",false); - fgSetBool("/sim/atc/opt6",false); - fgSetBool("/sim/atc/opt7",false); - fgSetBool("/sim/atc/opt8",false); - fgSetBool("/sim/atc/opt9",false); - - //int yc = 10; - int yc = 70; - int xsize = 600; - - if ( atcmlist.size() != 0 ){ - int k=atcmlist.size(); - //int k = 3; - //cout << "k = " << k << endl; - int y = (fgGetInt("/sim/startup/ysize") - 200 - 20 - k*20); - ATCMenuBox = new puDialogBox (100, y); - ATCMenuFrame = new puFrame (0,0,xsize,yc+40); - // loop over all entries in atcmentrylist - ATCOptionsList = new puButtonBox (50, 50, 450, 50+(k*25), NULL, true); - char** optList = new char*[k+1]; - int kk = 0; - for ( ; current != last ; ++current ) { - string dum; - sprintf( buf, "%i", kk+1 ); - buf[1] = '\0'; - dum = (string)(buf); - mentry[kk] = dum + ". " + current->menuentry; - optList[kk] = new char[strlen(mentry[kk].c_str()) + 1]; - strcpy(optList[kk], mentry[kk].c_str()); - //cout << "optList[" << kk << "] = " << optList[kk] << endl; - mtrans[kk] = current->transmission; - //ATCMenuBoxMessage = new puText (10, yc); - //ATCMenuBoxMessage -> setLabel( mentry[kk].c_str() ); - yc += 20; - ++kk; - } - yc += 2*20; - optList[k] = NULL; - ATCOptionsList->newList(optList); + int w = 500; + int h = 100; + if(atcptr) { + if(atcptr->GetType() == ATIS) { + atcDialogCommunicationOptions->hide(); + atcDialogMessage -> setLabel( "Tuned to ATIS - no communication possible" ); + atcDialogFrame->setSize(w, h); + atcDialogMessage -> setPosition(w / 2, h - 30); } else { - int y = (fgGetInt("/sim/startup/ysize") - 100 - 20 ); - ATCMenuBox = new puDialogBox (10, y); - ATCMenuFrame = new puFrame (0,0,xsize,yc+40); - ATCMenuBoxMessage = new puText (10, yc-10); - ATCMenuBoxMessage -> setLabel( "No transmission available" ); - } - - ATCMenuBoxMessage = new puText (10, yc+10); - ATCMenuBoxMessage -> setLabel( "ATC Menu" ); - atcDialogOkButton = new puOneShot ((xsize/2)-85, 10, (xsize/2)-25, 50); - atcDialogOkButton -> setLegend (gui_msg_OK); - atcDialogOkButton -> makeReturnDefault (TRUE); - atcDialogOkButton -> setCallback (AKATCDialogOK); - - atcDialogCancelButton = new puOneShot ((xsize/2)+25, 10, (xsize/2)+85, 50); - atcDialogCancelButton -> setLegend (gui_msg_CANCEL); - atcDialogCancelButton -> setCallback (AKATCDialogCancel); - FG_FINALIZE_PUI_DIALOG( ATCMenuBox ); - FG_PUSH_PUI_DIALOG( ATCMenuBox ); - - - /* - if ( atckey != -1 && TransDisplayed && mtrans[atckey-1].c_str() != "" ) { - cout << mtrans[atckey-1].c_str() << endl; - TPar = current_transmissionlist->extract_transpar( mtrans[atckey-1].c_str() ); - current_atcmentrylist->reset = true; - current_transparlist->add_entry( TPar ); - // transpar_list_type test = current_transparlist; - // transpar_list_iterator current = test.begin(); - //for ( ; current != test.end(); ++current ) { - // current->tpar.intention; - //} - } - - if ( current_atcmentrylist->freq != (int)(comm1_freq*100.0 + 0.5) ) { - current_atcmentrylist->reset = true; - } - - // reset (delete) ATCmenue list if reset is true - if ( current_atcmentrylist->reset == true ) { - delete ( current_atcmentrylist ); - current_atcmentrylist = new FGatcmentryList; - current_atcmentrylist->init( (int)(comm1_freq*100.0 + 0.5) ); - if ( TransDisplayed ) { - FG_POP_PUI_DIALOG( ATCMenuBox ); - TransDisplayed = false; + atcmentry_vec_type atcmlist = (available_dialog[atcptr->GetType()])[atcptr->get_ident()]; + atcmentry_vec_iterator current = atcmlist.begin(); + atcmentry_vec_iterator last = atcmlist.end(); + + // Set all opt flags to false before displaying box + fgSetBool("/sim/atc/opt0",false); + fgSetBool("/sim/atc/opt1",false); + fgSetBool("/sim/atc/opt2",false); + fgSetBool("/sim/atc/opt3",false); + fgSetBool("/sim/atc/opt4",false); + fgSetBool("/sim/atc/opt5",false); + fgSetBool("/sim/atc/opt6",false); + fgSetBool("/sim/atc/opt7",false); + fgSetBool("/sim/atc/opt8",false); + fgSetBool("/sim/atc/opt9",false); + + int k = atcmlist.size(); + h += k * 25; + //cout << "k = " << k << '\n'; + + atcDialogFrame->setSize(w, h); + + if(k) { + // loop over all entries in atcmentrylist + char** optList = new char*[k+1]; + int kk = 0; + for ( ; current != last ; ++current ) { + string dum; + sprintf( buf, "%i", kk+1 ); + buf[1] = '\0'; + dum = buf; + mentry[kk] = dum + ". " + current->menuentry; + optList[kk] = new char[strlen(mentry[kk].c_str()) + 1]; + strcpy(optList[kk], mentry[kk].c_str()); + //cout << "optList[" << kk << "] = " << optList[kk] << endl; + mtrans[kk] = current->transmission; + ++kk; + } + optList[k] = NULL; + atcDialogCommunicationOptions->newList(optList); + atcDialogCommunicationOptions->setSize(w-100, h-90); + atcDialogCommunicationOptions->reveal(); + atcDialogMessage -> setLabel( "ATC Menu" ); + atcDialogMessage -> setPosition(w / 2, h - 30); + } else { + atcDialogCommunicationOptions->hide(); + atcDialogMessage -> setLabel( "No transmission available" ); + atcDialogMessage -> setPosition(w / 2, h - 30); } } - */ + } else { + atcDialogCommunicationOptions->hide(); + atcDialogMessage -> setLabel( "Not currently tuned to any ATC service" ); + atcDialogFrame->setSize(w, h); + atcDialogMessage -> setPosition(w / 2, h - 30); } + + FG_PUSH_PUI_DIALOG(atcDialog); } -////////////////////////////////////////////////////// -// -// STUFF FOR THE FREQUENCY SEARCH DIALOG -// -////////////////////////////////////////////////////// - -static puDialogBox* atcFreqDialog; -static puFrame* atcFreqDialogFrame; -static puText* atcFreqDialogMessage; -static puInput* atcFreqDialogInput; -static puOneShot* atcFreqDialogOkButton; -static puOneShot* atcFreqDialogCancelButton; -//static puButtonBox* atcFreqDialogCommunicationOptions; - -static puText* atcFreqDisplayText[20]; - -static void FreqDialogCancel(puObject*) { - FG_POP_PUI_DIALOG(atcFreqDialog); - delete atcFreqDialog; -} - -static void FreqDialogOK(puObject*) { - string tmp = atcFreqDialogInput->getStringValue(); - FG_POP_PUI_DIALOG(atcFreqDialog); - delete atcFreqDialog; - current_atcdialog->FreqDisplay(tmp); -} - -static void FreqDisplayOK(puObject*) { - FG_POP_PUI_DIALOG(atcFreqDialog); - delete atcFreqDialog; +void FGATCDialog::PopupCallback() { + FGATC* atcptr = globals->get_ATC_mgr()->GetComm1ATCPointer(); // FIXME - Hardwired to comm1 at the moment + + if(atcptr) { + if(atcptr->GetType() == APPROACH) { + switch(atcDialogCommunicationOptions->getValue()) { + case 0: + fgSetBool("/sim/atc/opt0",true); + break; + case 1: + fgSetBool("/sim/atc/opt1",true); + break; + case 2: + fgSetBool("/sim/atc/opt2",true); + break; + case 3: + fgSetBool("/sim/atc/opt3",true); + break; + default: + break; + } + } else if(atcptr->GetType() == TOWER) { + //cout << "TOWER " << endl; + //cout << "ident is " << atcptr->get_ident() << endl; + atcmentry_vec_type atcmlist = (available_dialog[TOWER])[atcptr->get_ident()]; + if(atcmlist.size()) { + //cout << "Doing callback...\n"; + ATCMenuEntry a = atcmlist[atcDialogCommunicationOptions->getValue()]; + atcptr->SetFreqInUse(); + // This is the user's speech getting displayed. + globals->get_ATC_display()->RegisterSingleMessage(atcptr->GenText(a.transmission, a.callback_code)); + _callbackPending = true; + _callbackTimer = 0.0; + _callbackWait = 5.0; + _callbackPtr = atcptr; + _callbackCode = a.callback_code; + } else { + //cout << "No options available...\n"; + } + //cout << "Donded" << endl; + } + } } void FGATCDialog::FreqDialog() { @@ -453,196 +438,85 @@ void FGATCDialog::FreqDialog() { } */ - //char defaultATCLabel[] = "Enter desired option to communicate with ATC:"; - char *s; - - int hsize = 150; - atcFreqDialog = new puDialogBox (150, 50); - { - atcFreqDialogFrame = new puFrame (0, 0, 300, hsize); - - atcFreqDialogMessage = new puText (40, (hsize - 30)); - atcFreqDialogMessage -> setDefaultValue ("Enter airport identifier:"); - atcFreqDialogMessage -> getDefaultValue (&s); - atcFreqDialogMessage -> setLabel (s); - //atcFreqDialogMessage -> setLabelPlace (PUPLACE_TOP_CENTERED); - //atcFreqDialogMessage -> setLabelPlace (0); - - atcFreqDialogInput = new puInput (50, (hsize - 75), 150, (hsize - 45)); - atcFreqDialogInput->acceptInput(); - - atcFreqDialogOkButton = new puOneShot (50, 10, 110, 50); - atcFreqDialogOkButton -> setLegend (gui_msg_OK); - atcFreqDialogOkButton -> makeReturnDefault (TRUE); - atcFreqDialogOkButton -> setCallback (FreqDialogOK); - - atcFreqDialogCancelButton = new puOneShot (140, 10, 210, 50); - atcFreqDialogCancelButton -> setLegend (gui_msg_CANCEL); - atcFreqDialogCancelButton -> setCallback (FreqDialogCancel); - - } - FG_FINALIZE_PUI_DIALOG(atcFreqDialog); + // TODO - it would be nice to display a drop-down list of airports within the general vicinity of the user + // in addition to the general input box (started above). + atcFreqDialogInput->setValue(""); + atcFreqDialogInput->acceptInput(); FG_PUSH_PUI_DIALOG(atcFreqDialog); - -} - -static void atcUppercase(string &s) -{ - for(unsigned int i=0; iFindByPos(lon, lat, elev, 40.0, &atc_stations); - if (num_stat != 0) { - } else { - // Make up a message saying no things in range - } - */ - atcUppercase(ident); - //char defaultATCLabel[] = "Enter desired option to communicate with ATC:"; - string label = "Frequencies for airport "; - label += ident; - label += ":"; + string label; char *s; int n = 0; // Number of ATC frequencies at this airport - string freqs[20]; + string freqs[ATC_MAX_FREQ_DISPLAY]; char buf[8]; FGAirport a; if ( dclFindAirportID( ident, &a ) ) { comm_list_type stations; - int found = current_commlist->FindByPos(a.longitude, a.latitude, a.elevation, 20.0, &stations); + int found = current_commlist->FindByPos(a.getLongitude(), a.getLatitude(), a.getElevation(), 20.0, &stations); if(found) { + ostringstream ostr; comm_list_iterator itr = stations.begin(); while(itr != stations.end()) { if((*itr).ident == ident) { - switch((*itr).type) { - case ATIS: - freqs[n] = "ATIS - "; + if((*itr).type != INVALID) { + ostr << (*itr).type; + freqs[n] = ostr.str(); + freqs[n].append(" - "); sprintf(buf, "%.2f", ((*itr).freq / 100.0)); // Convert from KHz to MHz // Hack alert! if(buf[5] == '3') buf[5] = '2'; if(buf[5] == '8') buf[5] = '7'; freqs[n] += buf; + ostr.seekp(0); n++; - //cout << "ATIS\n"; - break; - case TOWER: - freqs[n] = "TOWER - "; - sprintf(buf, "%.2f", ((*itr).freq / 100.0)); // Convert from KHz to MHz - // Hack alert! - if(buf[5] == '3') buf[5] = '2'; - if(buf[5] == '8') buf[5] = '7'; - freqs[n] += buf; - n++; - //cout << "TOWER\n"; - break; - case GROUND: - freqs[n] = "GROUND - "; - sprintf(buf, "%.2f", ((*itr).freq / 100.0)); // Convert from KHz to MHz - // Hack alert! - if(buf[5] == '3') buf[5] = '2'; - if(buf[5] == '8') buf[5] = '7'; - freqs[n] += buf; - n++; - //cout << "GROUND\n"; - break; - case APPROACH: - freqs[n] = "APPROACH - "; - sprintf(buf, "%.2f", ((*itr).freq / 100.0)); // Convert from KHz to MHz - // Hack alert! - if(buf[5] == '3') buf[5] = '2'; - if(buf[5] == '8') buf[5] = '7'; - freqs[n] += buf; - n++; - //cout << "APPROACH\n"; - break; - case DEPARTURE: - freqs[n] = "DEPARTURE - "; - sprintf(buf, "%.2f", ((*itr).freq / 100.0)); // Convert from KHz to MHz - // Hack alert! - if(buf[5] == '3') buf[5] = '2'; - if(buf[5] == '8') buf[5] = '7'; - freqs[n] += buf; - n++; - //cout << "DEPARTURE\n"; - break; - case ENROUTE: // not really associated with an airport possibly. - freqs[n] = "ENROUTE - "; - sprintf(buf, "%.2f", ((*itr).freq / 100.0)); // Convert from KHz to MHz - // Hack alert! - if(buf[5] == '3') buf[5] = '2'; - if(buf[5] == '8') buf[5] = '7'; - freqs[n] += buf; - n++; - //cout << "ENROUTE\n"; - break; - case INVALID: // need to include this to stop the compiler complaining. - break; } } ++itr; } } + if(n == 0) { + label = "No frequencies found for airport "; + label += ident; + } else { + label = "Frequencies for airport "; + label += ident; + label += ":"; + } } else { label = "Airport "; label += ident; label += " not found in database."; - n = -1; } + + int hsize = 105 + (n * 30); - if(n == 0) { - label = "No frequencies found for airport "; - label += ident; + atcFreqDisplayFrame->setSize(400, hsize); + + atcFreqDisplayMessage -> setPosition (40, (hsize - 30)); + atcFreqDisplayMessage -> setValue (label.c_str()); + atcFreqDisplayMessage -> getValue (&s); + atcFreqDisplayMessage -> setLabel (s); + + for(int i=0; i setPosition(40, hsize - 65 - (30 * i)); + atcFreqDisplayText[i] -> setValue(freqs[i].c_str()); + atcFreqDisplayText[i] -> getValue (&s); + atcFreqDisplayText[i] -> setLabel (s); + atcFreqDisplayText[i] -> reveal(); } - - int hsize = (n < 0 ? 100 : 105 + (n * 30)); - atcFreqDialog = new puDialogBox (250, 50); - { - atcFreqDialogFrame = new puFrame (0, 0, 400, hsize); - - atcFreqDialogMessage = new puText (40, (hsize - 30)); - atcFreqDialogMessage -> setDefaultValue (label.c_str()); - atcFreqDialogMessage -> getDefaultValue (&s); - atcFreqDialogMessage -> setLabel (s); - - for(int i=0; isetDefaultValue(freqs[i].c_str()); - atcFreqDisplayText[i]-> getDefaultValue (&s); - atcFreqDisplayText[i]-> setLabel (s); - } - - atcFreqDialogOkButton = new puOneShot (50, 10, 110, 50); - atcFreqDialogOkButton -> setLegend (gui_msg_OK); - atcFreqDialogOkButton -> makeReturnDefault (TRUE); - atcFreqDialogOkButton -> setCallback (FreqDisplayOK); - - atcFreqDialogCancelButton = new puOneShot (140, 10, 210, 50); - atcFreqDialogCancelButton -> setLegend (gui_msg_CANCEL); - atcFreqDialogCancelButton -> setCallback (FreqDialogCancel); - + for(int j=n; j hide(); } - FG_FINALIZE_PUI_DIALOG(atcFreqDialog); - FG_PUSH_PUI_DIALOG(atcFreqDialog); + FG_PUSH_PUI_DIALOG(atcFreqDisplay); }