]> git.mxchange.org Git - flightgear.git/commitdiff
Push some of the ATIS logic into AirportDynamics, in preparation for ATIS being owned...
authorJames Turner <zakalawe@mac.com>
Thu, 2 Jun 2011 22:28:40 +0000 (23:28 +0100)
committerJames Turner <zakalawe@mac.com>
Thu, 2 Jun 2011 22:28:40 +0000 (23:28 +0100)
src/ATC/trafficcontrol.cxx
src/ATCDCL/atis.cxx
src/ATCDCL/atis.hxx
src/Airports/dynamics.cxx
src/Airports/dynamics.hxx
src/Airports/simple.cxx

index 8079933b167d45a6542518ec292049c112a9f594..f2ccd33ee7dc106e44926e9b0e86297313daa05b 100644 (file)
@@ -494,7 +494,7 @@ void FGATCController::transmit(FGTrafficRecord * rec, AtcMsgId msgId,
             getName() + "-Ground";
         atisInformation =
             rec->getAircraft()->getTrafficRef()->getDepartureAirport()->
-            getDynamics()->getAtisInformation();
+            getDynamics()->getAtisSequence();
         break;
     case 4:
         receiver =
index b2f35862022349091cacd02cc7aac5ea4a249e75..460cc31a8acbd482ba1f38eb687139c11840e6ed 100644 (file)
@@ -53,6 +53,7 @@
 #include <Main/fg_props.hxx>
 #include <Main/globals.hxx>
 #include <Airports/runways.hxx>
+#include <Airports/dynamics.hxx>
 
 
 #include "ATCutils.hxx"
@@ -228,47 +229,6 @@ int Apt_US_CA(const string id) {
   return 0;
 }
 
-// Add structure and map for storing a log of atis transmissions
-// made in this session of FlightGear.  This allows the callsign
-// to be allocated correctly wrt time.
-typedef struct {
-        double tstamp;
-    int sequence;
-} atis_transmission_type;
-
-typedef std::map < std::string, atis_transmission_type > atis_log_type;
-typedef atis_log_type::iterator atis_log_iterator;
-typedef atis_log_type::const_iterator atis_log_const_iterator;
-
-static atis_log_type atislog;
-
-int FGATIS::GetAtisSequence( const string& apt_id, 
-        const double tstamp, const int interval, const int special)
-{
-    atis_transmission_type tran;
-    
-    if(atislog.find(apt_id) == atislog.end()) { // New station
-      tran.tstamp = tstamp - interval;
-// Random number between 0 and 25 inclusive, i.e. 26 equiprobable outcomes:
-      tran.sequence = int(sg_random() * LTRS);
-      atislog[apt_id] = tran;
-      //cout << "New ATIS station: " << apt_id << " seq-1: "
-      //      << tran.sequence << endl;
-    } 
-
-// calculate the appropriate identifier and update the log
-    tran = atislog[apt_id];
-
-    int delta = int((tstamp - tran.tstamp) / interval);
-    tran.tstamp += delta * interval;
-    if (special && !delta) delta++;     // a "special" ATIS update is required
-    tran.sequence = (tran.sequence + delta) % LTRS;
-    atislog[apt_id] = tran;
-    //if (delta) cout << "New ATIS sequence: " << tran.sequence
-    //      << "  Delta: " << delta << endl;
-    return(tran.sequence + (delta ? 0 : LTRS*1000));
-}
-
 // Generate the actual broadcast ATIS transmission.
 // Regen means regenerate the /current/ transmission.
 // Special means generate a new transmission, with a new sequence.
@@ -280,12 +240,12 @@ int FGATIS::GenTransmission(const int regen, const int special) {
   string BRK = ".\n";
   string PAUSE = " / ";
 
-  double tstamp = atof(fgGetString("sim/time/elapsed-sec"));
   int interval = _type == ATIS ?
         ATIS_interval   // ATIS updated hourly
       : 2*minute;      // AWOS updated more frequently
-  
-  int sequence = GetAtisSequence(ident, tstamp, interval, special);
+
+  FGAirport* apt = FGAirport::findByIdent(ident);
+  int sequence = apt->getDynamics()->updateAtisSequence(interval, special);
   if (!regen && sequence > LTRS) {
 //xx      if (msg_OK) cout << "ATIS:  no change: " << sequence << endl;
 //xx      msg_time = cur_time;
index 189b11106a567b722ae5d32cd344022c5a8f9989..0c6124b8d6be6ea9627d83d3daae4057769a0feb 100644 (file)
@@ -95,9 +95,7 @@ class FGATIS : public FGATC {
        void TreeOut(int msgOK);
 
        friend std::istream& operator>> ( std::istream&, FGATIS& );
-       
-       int GetAtisSequence( const std::string& apt_id, 
-        const double tstamp, const int interval, const int special);
+
 };
 
 typedef int (FGATIS::*int_getter)() const;
index 11cb454b97c5f8bdf851e6aa3ac81308d78b78d7..69f8c051ddfc9152b440a4eb73df930d63416abd 100644 (file)
@@ -36,6 +36,7 @@
 #include <Main/globals.hxx>
 #include <Main/fg_props.hxx>
 #include <Airports/runways.hxx>
+#include <ATCDCL/ATCutils.hxx>
 
 #include <string>
 #include <vector>
@@ -49,33 +50,11 @@ using std::random_shuffle;
 #include "dynamics.hxx"
 
 FGAirportDynamics::FGAirportDynamics(FGAirport * ap):
-_ap(ap), rwyPrefs(ap), SIDs(ap)
+_ap(ap), rwyPrefs(ap), SIDs(ap),
+    atisSequenceIndex(-1),
+    atisSequenceTimeStamp(0.0)
 {
     lastUpdate = 0;
-
-    // For testing only. This needs to be refined when we move ATIS functionality over.
-    atisInformation = "Sierra";
-}
-
-// Note that the ground network should also be copied
-FGAirportDynamics::
-FGAirportDynamics(const FGAirportDynamics & other):rwyPrefs(other.
-                                                            rwyPrefs),
-SIDs(other.SIDs)
-{
-    for (FGParkingVecConstIterator ip = other.parkings.begin();
-         ip != other.parkings.end(); ip++)
-        parkings.push_back(*(ip));
-    // rwyPrefs = other.rwyPrefs;
-    lastUpdate = other.lastUpdate;
-
-    stringVecConstIterator il;
-    for (il = other.landing.begin(); il != other.landing.end(); il++)
-        landing.push_back(*il);
-    for (il = other.takeoff.begin(); il != other.takeoff.end(); il++)
-        takeoff.push_back(*il);
-    lastUpdate = other.lastUpdate;
-    atisInformation = other.atisInformation;
 }
 
 // Destructor
@@ -540,3 +519,33 @@ FGAIFlightPlan *FGAirportDynamics::getSID(string activeRunway,
 {
     return SIDs.getBest(activeRunway, heading);
 }
+
+const std::string FGAirportDynamics::getAtisSequence()
+{
+   if (atisSequenceIndex == -1) {
+       updateAtisSequence(1, false);
+   }
+   
+   return GetPhoneticLetter(atisSequenceIndex);
+}
+
+int FGAirportDynamics::updateAtisSequence(int interval, bool forceUpdate)
+{
+    double now = globals->get_sim_time_sec();
+    if (atisSequenceIndex == -1) {
+        // first computation
+        atisSequenceTimeStamp = now;
+        atisSequenceIndex = rand() % LTRS; // random initial sequence letters
+        return atisSequenceIndex;
+    }
+
+    int steps = static_cast<int>((now - atisSequenceTimeStamp) / interval);
+    atisSequenceTimeStamp += (interval * steps);
+    if (forceUpdate && (steps == 0)) {
+        ++steps; // a "special" ATIS update is required
+    } 
+    
+    atisSequenceIndex = (atisSequenceIndex + steps) % LTRS;
+    // return a huge value if no update occurred
+    return (atisSequenceIndex + (steps ? 0 : LTRS*1000));
+}
index 60921821863438f422f2ad51e4c32d441d9dede3..cf862054e26e00a6266ba5604204b231981accdc 100644 (file)
 #ifndef _AIRPORT_DYNAMICS_HXX_
 #define _AIRPORT_DYNAMICS_HXX_
 
-
-#ifndef __cplusplus
-# error This library requires C++
-#endif
-
-#include <simgear/xml/easyxml.hxx>
-
 #include <ATC/trafficcontrol.hxx>
 #include "parking.hxx"
 #include "groundnetwork.hxx"
 #include "runwayprefs.hxx"
 #include "sidstar.hxx"
 
-//typedef vector<float> DoubleVec;
-//typedef vector<float>::iterator DoubleVecIterator;
-
+// forward decls
 class FGAirport;
-
+class FGEnvironment;
 
 class FGAirportDynamics {
 
@@ -55,7 +46,7 @@ private:
   FGApproachController approachController;
 
   time_t lastUpdate;
-  string prevTrafficType;
+  std::string prevTrafficType;
   stringVec landing;
   stringVec takeoff;
   stringVec milActive, comActive, genActive, ulActive;
@@ -67,14 +58,14 @@ private:
   intVec freqTower;    // </TOWER>
   intVec freqApproach; // </APPROACH>
 
-  string atisInformation;
-
-  string chooseRunwayFallback();
-  bool innerGetActiveRunway(const string &trafficType, int action, string &runway, double heading);
-  string chooseRwyByHeading(stringVec rwys, double heading);
+  int atisSequenceIndex;
+  double atisSequenceTimeStamp;
+  
+  std::string chooseRunwayFallback();
+  bool innerGetActiveRunway(const std::string &trafficType, int action, std::string &runway, double heading);
+  std::string chooseRwyByHeading(stringVec rwys, double heading);
 public:
   FGAirportDynamics(FGAirport* ap);
-  FGAirportDynamics(const FGAirportDynamics &other);
   ~FGAirportDynamics();
 
   void addAwosFreq     (int val) { freqAwos.push_back(val);      };
@@ -118,8 +109,13 @@ public:
   FGTowerController      *getTowerController()      { return &towerController; };
   FGApproachController   *getApproachController()   { return &approachController; };
 
-  const string& getAtisInformation() { return atisInformation; };
-  int getGroundFrequency(unsigned leg); //{ return freqGround.size() ? freqGround[0] : 0; };
+  int getGroundFrequency(unsigned leg);
+  
+  /// get current ATIS sequence letter
+  const std::string getAtisSequence();
+
+  /// get the current ATIS sequence number, updating it if necessary
+  int updateAtisSequence(int interval, bool forceUpdate);
 
   void setRwyUse(const FGRunwayPreference& ref);
 };
index f4f3d1adbfd87538eded3dcdf35fba315934378a..9df1cb254723f3ffd530f9430b6f2ead28caded5 100644 (file)
@@ -96,20 +96,18 @@ bool FGAirport::isHeliport() const
 
 FGAirportDynamics * FGAirport::getDynamics()
 {
-    if (_dynamics != 0) {
+    if (_dynamics) {
         return _dynamics;
-    } else {
-        //cerr << "Trying to load dynamics for " << _id << endl;
-        _dynamics = new FGAirportDynamics(this);
-        XMLLoader::load(_dynamics);
-
-        FGRunwayPreference rwyPrefs(this);
-        XMLLoader::load(&rwyPrefs);
-        _dynamics->setRwyUse(rwyPrefs);
+    }
+    
+    _dynamics = new FGAirportDynamics(this);
+    XMLLoader::load(_dynamics);
 
-        //FGSidStar SIDs(this);
-        XMLLoader::load(_dynamics->getSIDs());
-   }
+    FGRunwayPreference rwyPrefs(this);
+    XMLLoader::load(&rwyPrefs);
+    _dynamics->setRwyUse(rwyPrefs);
+    XMLLoader::load(_dynamics->getSIDs());
+    
     return _dynamics;
 }