X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FATC%2FATCDialog.cxx;h=42d8bf7be7f5b873d618145900c0569d2afaad84;hb=68f248879cb15562c7b026445f83caf8f2842ae9;hp=1a4aefa3fe3d9ff67be42fa5feb4096e20a0e27b;hpb=980012e1682fdb27c9b9ec27edea0b549d603f9d;p=flightgear.git diff --git a/src/ATC/ATCDialog.cxx b/src/ATC/ATCDialog.cxx index 1a4aefa3f..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,256 +28,276 @@ #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); +} + +static bool do_ATC_freq_search(const SGPropertyNode* arg) { + current_atcdialog->FreqDialog(); return(true); } ATCMenuEntry::ATCMenuEntry() { stationid = ""; - stationfr = 0; + //stationfr = 0; transmission = ""; menuentry = ""; + callback_code = 0; } ATCMenuEntry::~ATCMenuEntry() { } -static char* t0 = "Contact tower for landing"; -static char* t1 = "Request departure clearance"; -static char* t2 = "Report Runway vacated"; -static char** towerOptions = new char*[4]; - -// ----------------------- 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); } -// DCL -static void ATCDialog(puObject *cb) -{ - //ApHeadingDialogInput -> setValue ( heading ); - //ApHeadingDialogInput -> acceptInput(); - FG_PUSH_PUI_DIALOG(atcDialog); +static void FreqDialogOK(puObject*) { + string tmp = atcFreqDialogInput->getStringValue(); + FG_POP_PUI_DIALOG(atcFreqDialog); + current_atcdialog->FreqDisplay(tmp); } -// DCL -void ATCDialogInit() -{ - char defaultATCLabel[] = "Enter desired option to communicate with ATC:"; - char *s; +static void FreqDisplayOK(puObject*) { + FG_POP_PUI_DIALOG(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[3] = NULL; + +FGATCDialog::FGATCDialog() { + _callbackPending = false; + _callbackTimer = 0.0; + _callbackWait = 0.0; + _callbackPtr = NULL; + _callbackCode = 0; +} + +FGATCDialog::~FGATCDialog() { + if(atcDialog) puDeleteObject(atcDialog); + if(atcFreqDialog) puDeleteObject(atcFreqDialog); + if(atcFreqDisplay) puDeleteObject(atcFreqDisplay); +} + +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() { -} - -// 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; + } +} - atcmentry_list_type atcmlist = atcmentrylist_station[station]; - atcmentry_list_iterator current = atcmlist.begin(); - atcmentry_list_iterator last = atcmlist.end(); - - for ( ; current != last ; ++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; + } +} + +// 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]; @@ -283,109 +305,218 @@ 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; - //} + 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); + } - if ( current_atcmentrylist->freq != (int)(comm1_freq*100.0 + 0.5) ) { - current_atcmentrylist->reset = true; + FG_PUSH_PUI_DIALOG(atcDialog); +} + +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; } - - // 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; + } +} + +void FGATCDialog::FreqDialog() { + + // Find the ATC stations within a reasonable range (about 40 miles?) + //comm_list_type atc_stations; + //comm_list_iterator atc_stat_itr; + + //double lon = fgGetDouble("/position/longitude-deg"); + //double lat = fgGetDouble("/position/latitude-deg"); + //double elev = fgGetDouble("/position/altitude-ft"); + + /* + // search stations in range + int num_stat = current_commlist->FindByPos(lon, lat, elev, 40.0, &atc_stations); + if (num_stat != 0) { + } else { + // Make up a message saying no things in range + } + */ + + // 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); +} + +void FGATCDialog::FreqDisplay(string ident) { + + atcUppercase(ident); + + string label; + char *s; + + int n = 0; // Number of ATC frequencies at this airport + 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.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) { + 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++; + } + } + ++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."; + } + + int hsize = 105 + (n * 30); + + 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(); } + for(int j=n; j hide(); + } + + FG_PUSH_PUI_DIALOG(atcFreqDisplay); + }