]> git.mxchange.org Git - flightgear.git/blobdiff - src/ATC/atis.cxx
More efficient rotation matrix calc from Norm Vine.
[flightgear.git] / src / ATC / atis.cxx
index 9a07ea52f2feef25350c208dfa1bec496949a71a..d2225410e4f1e04b4a7e350a5f98b830cfa2c117 100644 (file)
@@ -1,4 +1,5 @@
 // atis.cxx - routines to generate the ATIS info string
+// This is the implementation of the FGATIS class
 //
 // Written by David Luff, started October 2001.
 //
@@ -39,18 +40,20 @@ SG_USING_STD(cout);
 //#include <simgear/misc/sgstream.hxx>
 #include <simgear/misc/sg_path.hxx>
 
-//#ifndef FG_OLD_WEATHER
-//sorry, that works only with the new weather system
-#include <WeatherCM/FGLocalWeatherDatabase.h>
-//#else
-//#  include <Weather/weather.hxx>
-//#endif
+#ifdef FG_WEATHERCM
+# include <WeatherCM/FGLocalWeatherDatabase.h>
+#else
+# include <Environment/environment_mgr.hxx>
+# include <Environment/environment.hxx>
+#endif
 
 #include <Main/fg_props.hxx>
+#include <Main/globals.hxx>
 #include <Airports/runways.hxx>
 
 #include "atis.hxx"
 #include "atislist.hxx"
+#include "ATCdisplay.hxx"
 
 string GetPhoneticIdent(int i) {
 // TODO - Check i is between 1 and 26 and wrap if necessary
@@ -87,18 +90,51 @@ string GetPhoneticIdent(int i) {
 }
 
 // Constructor
-FGATIS::FGATIS() {
+FGATIS::FGATIS()
+  : type(0),
+    lon(0.0), lat(0.0),
+    elev(0.0),
+    x(0.0), y(0.0), z(0.0),
+    freq(0),
+    range(0),
+    display(false),
+    displaying(false),
+    ident(""),
+    name(""),
+    transmission(""),
+    trans_ident(""),
+    atis_failed(false)
+{
 }
 
 // Destructor
 FGATIS::~FGATIS() {
 }
 
-string FGATIS::get_transmission() {
-//void FGATIS::get_transmission() {
-#if !defined(FG_OLD_WEATHER)
+// Main update function - checks whether we are displaying or not the correct message.
+void FGATIS::Update() {
+    if(display) {
+       if(displaying) {
+           // Check if we need to update the message
+           // - basically every hour and if the weather changes significantly at the station
+           //globals->get_ATC_display()->ChangeRepeatingMessage(transmission);
+       } else {
+           // We need to get and display the message
+           UpdateTransmission();
+           globals->get_ATC_display()->RegisterRepeatingMessage(transmission);
+           displaying = true;
+       }
+    } else {
+       // We shouldn't be displaying
+       if(displaying) {
+           globals->get_ATC_display()->CancelRepeatingMessage();
+           displaying = false;
+       }
+    }
+}
 
-    string transmission = "";
+// Sets the actual broadcast ATIS transmission.
+void FGATIS::UpdateTransmission() {
     double visibility;
     char buf[10];
     int phonetic_id;
@@ -106,59 +142,70 @@ string FGATIS::get_transmission() {
     string time_str = fgGetString("sim/time/gmt-string");
     int hours;
     // int minutes;
+
+#ifdef FG_WEATHERCM
     sgVec3 position = { lat, lon, elev };
     FGPhysicalProperty stationweather = WeatherDatabase->get(position);
+#else
+    FGEnvironment stationweather =
+      globals->get_environment_mgr()->getEnvironment(lat, lon, elev);
+#endif
 
-// Only update every so-many loops - FIXME - possibly register this with the event scheduler
-// Ack this doesn't work since the static counter is shared between all instances of FGATIS
-// OK, for now the radiostack is handling only calling this every-so-often but that is not really 
-// a proper solution since the atis knows when the transmission is going to change not the radio.
-    //static int i=0;
-    //if(i == 0) {
-       transmission = "";
-
-       // Start with the transmitted station name.
-       transmission += name;
-       // Add "Information"
-       transmission += " Information";
-
-       //cout << "In atis.cxx, time_str = " << time_str << '\n';
-       // Add the recording identifier
-       // For now we will assume we only transmit every hour
-       hours = atoi((time_str.substr(1,2)).c_str());   //Warning - this is fragile if the 
-                                                       //time string format changes
-       //cout << "In atis.cxx, hours = " << hours << endl;
-       phonetic_id = current_atislist->GetCallSign(ident, hours, 0);
-       phonetic_id_string = GetPhoneticIdent(phonetic_id);
-       transmission += " ";
-       transmission += phonetic_id_string;
+    transmission = "";
 
-       // Output the recording time. - we'll just output the last whole hour for now.
-       // FIXME - this only gets GMT time but that appears to be all the clock outputs for now
-       //cout << "in atis.cxx, time = " << time_str << endl;
-       transmission = transmission + "  Weather " + time_str.substr(0,3) + "00 hours Zulu";
+    // Start with the transmitted station name.
+    transmission += name;
+    // Add "Information"
+    transmission += " Information";
 
-       // Get the temperature
-       // (Hardwire it for now since the global property returns the temperature at the current altitude
-       //temperature = fgGetDouble("/environment/weather/temperature-K");
-       sprintf(buf, "%i", int(stationweather.Temperature - 273.15));
-       transmission += "  Temperature ";
-       transmission += buf;
-       transmission += " degrees Celsius";
+    //cout << "In atis.cxx, time_str = " << time_str << '\n';
+    // Add the recording identifier
+    // For now we will assume we only transmit every hour
+    hours = atoi((time_str.substr(1,2)).c_str());      //Warning - this is fragile if the 
+                                                       //time string format changes
+    //cout << "In atis.cxx, hours = " << hours << endl;
+    phonetic_id = current_atislist->GetCallSign(ident, hours, 0);
+    phonetic_id_string = GetPhoneticIdent(phonetic_id);
+    transmission += " ";
+    transmission += phonetic_id_string;
+
+    // Output the recording time. - we'll just output the last whole hour for now.
+    // FIXME - this only gets GMT time but that appears to be all the clock outputs for now
+    //cout << "in atis.cxx, time = " << time_str << endl;
+    transmission = transmission + "  Weather " + time_str.substr(0,3) + "00 hours Zulu";
+
+    // Get the temperature
+    // (Hardwire it for now since the global property returns the temperature at the current altitude
+    //temperature = fgGetDouble("/environment/weather/temperature-K");
+#ifdef FG_WEATHERCM
+    sprintf(buf, "%i", int(stationweather.Temperature - 273.15));
+#else
+    sprintf(buf, "%i", int(stationweather.get_temperature_degc()));
+#endif
+    transmission += "  Temperature ";
+    transmission += buf;
+    transmission += " degrees Celsius";
 
        // Get the pressure / altimeter
         // pressure is: stationweather.AirPressure in Pascal
 
        // Get the visibility
+#ifdef FG_WEATHERCM
        visibility = fgGetDouble("/environment/visibility-m");
+#else
+        visibility = stationweather.get_visibility_m();
+#endif
        sprintf(buf, "%i", int(visibility/1600));
        transmission += "  Visibility ";
        transmission += buf;
        transmission += " miles";
 
        // Get the cloudbase
-       if(fgGetBool("/environment/clouds/status")) {
-           double cloudbase = fgGetDouble("/environment/clouds/altitude-ft");
+       // FIXME: kludge for now
+       if (!strcmp(fgGetString("/environment/clouds/layer[0]/type"),
+                   "clear")) {
+           double cloudbase =
+             fgGetDouble("/environment/clouds/layer[0]/elevation-ft");
            // For some reason the altitude returned doesn't seem to correspond to the actual cloud altitude.
            char buf3[10];
            // cout << "cloudbase = " << cloudbase << endl;
@@ -173,6 +220,7 @@ string FGATIS::get_transmission() {
        path.append( "runways.mk4" );
        FGRunways runways( path.c_str() );
 
+#ifdef FG_WEATHERCM
        //Set the heading to into the wind
         double wind_x = stationweather.Wind[0];
         double wind_y = stationweather.Wind[1];
@@ -197,6 +245,18 @@ string FGATIS::get_transmission() {
            sprintf(buf2, "%s %i %s %i %s", "  Winds ", int(speed), " knots from ", int(hdg), " degrees");
            transmission += buf2;
        }
+#else
+       double speed = stationweather.get_wind_speed_kt();
+       double hdg = stationweather.get_wind_from_heading_deg();
+       if (speed == 0) {
+         transmission += "  Winds light and variable";
+       } else {
+                               // FIXME: get gust factor in somehow
+           char buf2[72];
+           sprintf(buf2, "%s %i %s %i %s", "  Winds ", int(speed),
+                   " knots from ", int(hdg), " degrees");
+       }
+#endif
 
        string rwy_no = runways.search(ident, int(hdg));
        if(rwy_no != (string)"NN") {
@@ -207,19 +267,6 @@ string FGATIS::get_transmission() {
 
        // Anything else?
 
-       // TODO - unhardwire the identifier
        transmission += "  Advise controller on initial contact you have ";
        transmission += phonetic_id_string;
-
-    //}
-
-//    i++;
-//    if(i == 600) {
-//     i=0;
-//    }
-
-    return(transmission);
-#else
-    return "Station unavailable (not supported by FG_OLD_WEATHER)";
-#endif // FG_OLD_WEATHER
 }