]> git.mxchange.org Git - flightgear.git/commitdiff
commradio subsystem part deux
authoradrian <adrian@localhost.com>
Fri, 16 Sep 2011 13:28:16 +0000 (16:28 +0300)
committeradrian <adrian@localhost.com>
Fri, 16 Sep 2011 13:28:16 +0000 (16:28 +0300)
src/Instrumentation/commradio.cxx
src/Instrumentation/commradio.hxx

index cbdfda0aed504f5501e172861711af13e77d2572..6ee5e44d4d5c219bdd0d6927ad95798d4b27cf07 100644 (file)
@@ -45,7 +45,7 @@ FGCommRadio::FGCommRadio(SGPropertyNode *node) {
        //pilot plane's antenna gain + AI aircraft antenna gain
        //real-life gain for conventional monopole/dipole antenna
        _antenna_gain = 2.0;
-       _propagation_model = 2; // in the future choose between models via option: realistic radio on/off
+       _propagation_model = 2; //  choose between models via option: realistic radio on/off
        
 }
 
@@ -65,6 +65,9 @@ void FGCommRadio::bind ()
 
 void FGCommRadio::update ()
 {
+       if (dt <= 0.0) {
+               return; // paused
+    }
 }
 
 double FGCommRadio::getFrequency(int radio) {
@@ -86,7 +89,7 @@ double FGCommRadio::getFrequency(int radio) {
 
 
 
-void FGCommRadio::receive(SGGeod tx_pos, double freq, string text,
+void FGCommRadio::receive_text(SGGeod tx_pos, double freq, string text,
        int ground_to_air) {
 
        comm1 = getFrequency(1);
@@ -105,6 +108,7 @@ void FGCommRadio::receive(SGGeod tx_pos, double freq, string text,
                        //and the signal, due to being amplitude modulated, decreases volume after demodulation
                        //the implementation below is more akin to what would happen on a FM transmission
                        //therefore the correct way would be to work on the volume
+                       /*
                        string hash_noise = " ";
                        int reps = fabs((int)signal - 11);
                        int t_size = text.size();
@@ -112,6 +116,7 @@ void FGCommRadio::receive(SGGeod tx_pos, double freq, string text,
                                int pos = rand() % t_size -1;
                                text.replace(pos,1, hash_noise);
                        }
+                       */
                        
                }
                fgSetString("/sim/messages/atc", text.c_str());
@@ -120,7 +125,7 @@ void FGCommRadio::receive(SGGeod tx_pos, double freq, string text,
 }
 
 double FGCommRadio::ITM_calculate_attenuation(SGGeod pos, double freq,
-                               int ground_to_air) {
+                               int transmission_type) {
 
        ///  Implement radio attenuation                
        ///  based on the Longley-Rice propagation model
@@ -146,10 +151,10 @@ double FGCommRadio::ITM_calculate_attenuation(SGGeod pos, double freq,
        double tx_pow,ant_gain;
        double signal = 0.0;
        
-       if(ground_to_air)
+       if(transmission_type == 1)
                tx_pow = _transmitter_power + 6.0;
 
-       if(ground_to_air)
+       if((transmission_type == 1) || (transmission_type == 3))
                ant_gain = _antenna_gain + 3.0; //pilot plane's antenna gain + ground station antenna gain
        
        double link_budget = tx_pow - _receiver_sensitivity + ant_gain; 
@@ -215,7 +220,7 @@ double FGCommRadio::ITM_calculate_attenuation(SGGeod pos, double freq,
                transmitter_height = sender_alt;
        }
        
-       if(ground_to_air
+       if(transmission_type == 1
                transmitter_height += ATC_HAAT;
        else
                transmitter_height += Aircraft_HAAT;
@@ -231,15 +236,31 @@ double FGCommRadio::ITM_calculate_attenuation(SGGeod pos, double freq,
                double elevation_m = 0.0;
        
                if (scenery->get_elevation_m( probe, elevation_m, NULL )) {
-                        _elevations.push_front(elevation_m);
-                        //cerr << "ITM:: Probe elev: " << elevation_m << endl;
+                       if((transmission_type == 3) || (transmission_type == 4)) {
+                               _elevations.push_back(elevation_m);
+                       }
+                       else {
+                                _elevations.push_front(elevation_m);
+                       }
                }
                else {
+                       if((transmission_type == 3) || (transmission_type == 4)) {
+                               _elevations.push_back(elevation_m);
+                       }
+                       else {
                        _elevations.push_front(0.0);
+                       }
                }
        }
-       _elevations.push_back(elevation_under_pilot);
-       _elevations.push_front(elevation_under_sender);
+       if((transmission_type == 3) || (transmission_type == 4)) {
+               _elevations.push_front(elevation_under_pilot);
+               _elevations.push_back(elevation_under_sender);
+       }
+       else {
+               _elevations.push_back(elevation_under_pilot);
+               _elevations.push_front(elevation_under_sender);
+       }
+       
        
        double max_alt_between=0.0;
        for( deque<double>::size_type i = 0; i < _elevations.size(); i++ ) {
@@ -267,10 +288,19 @@ double FGCommRadio::ITM_calculate_attenuation(SGGeod pos, double freq,
        // TODO: If we clear the first Fresnel zone, we are into line of sight teritory
 
        // else we need to calculate point to point link loss
+       if((transmission_type == 3) || (transmission_type == 4)) {
+               // the sender and receiver roles are switched
+               point_to_point(itm_elev, receiver_height, transmitter_height,
+                       eps_dielect, sgm_conductivity, eno, frq_mhz, radio_climate,
+                       pol, conf, rel, dbloss, strmode, errnum);
+               
+       }
+       else {
 
-       point_to_point(itm_elev, transmitter_height, receiver_height,
-               eps_dielect, sgm_conductivity, eno, frq_mhz, radio_climate,
-               pol, conf, rel, dbloss, strmode, errnum);
+               point_to_point(itm_elev, transmitter_height, receiver_height,
+                       eps_dielect, sgm_conductivity, eno, frq_mhz, radio_climate,
+                       pol, conf, rel, dbloss, strmode, errnum);
+       }
 
        cerr << "ITM:: Link budget: " << link_budget << ", Attenuation: " << dbloss << " dBm, " << strmode << ", Error: " << errnum << endl;
        
index 8cd1041ac1b160b9d5c8d2977e11fa7b0390a693..0ba3266c8bfad2438da8f1f884822dd252dca879 100644 (file)
@@ -61,7 +61,8 @@ public:
     void setFrequency(double freq, int radio);
     double getFrequency(int radio);
     void setTxPower(double txpower) { _transmitter_power = txpower; };
-    void receive_text(SGGeod tx_pos, double freq, string text, int ground_to_air);
+    // transmission_type: 1 for ground to air, 2 for air to air, 3 for pilot to ground, 4 for pilot to air
+    void receive_text(SGGeod tx_pos, double freq, string text, int transmission_type);
     void setPropagationModel(int model) { _propagation_model = model; };
     
 };