]> git.mxchange.org Git - flightgear.git/commitdiff
Added a small and simple dialogbox that allows the user to issue ATC commands.
authorDurk Talsma <durk@localhost.(none)>
Fri, 15 Apr 2011 17:32:21 +0000 (19:32 +0200)
committerDurk Talsma <durk@localhost.(none)>
Fri, 15 Apr 2011 17:32:21 +0000 (19:32 +0200)
src/ATC/atc_mgr.hxx
src/ATC/atcdialog.cxx
src/ATC/atcdialog.hxx
src/ATC/trafficcontrol.cxx
src/ATC/trafficcontrol.hxx
src/Airports/groundnetwork.cxx

index ad919a6974898fa4cdc2e8eb0e8eb1fdb9af2c95..33fa5c40a970376c04e1d1d0ffa550dfbedba5e2 100644 (file)
@@ -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
index 5feb94dd0a73aab6bdda1976d32daaec589b1d64..a4c75a6113ebd89323af00ac7c7308447e6d84e7 100644 (file)
@@ -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++;
     }
 
index 2e0aa2f74ab6dc93025b07f2dfca446ecea1ee1a..f667b87dc3f5f640f451117ebe6a15cf23d23c95 100644 (file)
 #include <GUI/gui.h>           // mkDialog
 #include <GUI/new_gui.hxx>
 
+typedef vector<string> StringVec;
+typedef vector<string>:: 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;
index 5dad818ae45224729ed2bb4d1ae045373de64fc8..b0adba5412816aae54071083d07e4361272bd393 100644 (file)
@@ -32,6 +32,7 @@
 #include <AIModel/AIFlightPlan.hxx>
 #include <AIModel/performancedata.hxx>
 #include <AIModel/performancedb.hxx>
+#include <ATC/atc_mgr.hxx>
 #include <Traffic/TrafficMgr.hxx>
 #include <Airports/groundnetwork.hxx>
 #include <Airports/dynamics.hxx>
@@ -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;
-
-    // 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());
+    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());
+            }
         }
+    } 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;
index 8de329ba9026b7fd6dc5db8e0001ce9de430827d..66381af52f140e930c307c33a790b13e7546340c 100644 (file)
@@ -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:
index 0470e4af92ef9a28663887cd57e42fc90d404924..37e9946bfc912f18a437fb17ef4a63b2bd5f3264 100644 (file)
@@ -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;