33adjust_range (
double transmitter_elevation_ft,
double aircraft_altitude_ft,
36 double delta_elevation_ft =
37 fabs(aircraft_altitude_ft - transmitter_elevation_ft);
38 double range_nm = 1.23 * sqrt(delta_elevation_ft);
39 if (range_nm > max_range_nm)
40 range_nm = max_range_nm;
41 else if (range_nm < 20.0)
43 double rand = sg_random();
44 return range_nm + (range_nm * rand * rand);
97 SGPropertyNode *node =
fgGetNode(branch,
true );
100 SGPropertyNode *fnode = node->getChild(
"frequencies", 0,
true);
101 _source_node = fnode->getChild(
"source", 0,
true);
102 _frequency_node = fnode->getChild(
"selected-mhz", 0,
true);
103 _in_range_node = node->getChild(
"in-range", 0,
true);
104 _distance_node = node->getChild(
"indicated-distance-nm", 0,
true);
105 _speed_node = node->getChild(
"indicated-ground-speed-kt", 0,
true);
106 _time_node = node->getChild(
"indicated-time-min", 0,
true);
108 double d = node->getDoubleValue(
"volume", 1.0 );
109 _volume_node = node->getChild(
"volume", 0,
true);
110 _volume_node->setDoubleValue( d );
112 bool b = node->getBoolValue(
"ident",
false );
113 _ident_btn_node = node->getChild(
"ident", 0,
true);
114 _ident_btn_node->setBoolValue( b );
116 SGPropertyNode *subnode = node->getChild(
"KDI572-574", 0,
true);
118 _distance_string = subnode->getChild(
"nm",0,
true);
119 _distance_string->setStringValue(
"---");
120 _speed_string = subnode->getChild(
"kt", 0,
true);
121 _speed_string->setStringValue(
"---");
122 _time_string = subnode->getChild(
"min",0,
true);
123 _time_string->setStringValue(
"--");
125 std::ostringstream temp;
127 if( NULL == _audioIdent )
144 if( delta_time_sec < SGLimitsd::min() )
149 std::string source = _source_node->getStringValue();
150 if (source.empty()) {
152 branch =
"/instrumentation/" +
name() +
"/frequencies/selected-mhz";
153 _source_node->setStringValue(branch);
154 source = _source_node->getStringValue();
159 if (frequency_mhz != _last_frequency_mhz) {
160 _time_before_search_sec = 0;
161 _last_frequency_mhz = frequency_mhz;
163 _frequency_node->setDoubleValue(frequency_mhz);
167 _time_before_search_sec -= delta_time_sec;
168 if (_time_before_search_sec < 0) {
169 _time_before_search_sec = 1.0;
171 SGGeod pos(
globals->get_aircraft_position());
183 if (
nullptr == _navrecord) {
189 double distance_nm = dist(_navrecord->cart(),
190 globals->get_aircraft_position_cart()) * SG_METER_TO_NM;
192 double range_nm =
adjust_range(_navrecord->get_elev_ft(),
193 globals->get_aircraft_position().getElevationFt(),
194 _navrecord->get_range());
196 if (distance_nm <= range_nm) {
197 double volume = _volume_node->getDoubleValue();
198 if( !_ident_btn_node->getBoolValue() )
201 _audioIdent->setIdent(_navrecord->ident(), volume );
203 double speed_kt = (fabs(distance_nm - _last_distance_nm) *
204 ((1 / delta_time_sec) * 3600.0));
205 _last_distance_nm = distance_nm;
207 _in_range_node->setBoolValue(
true);
208 double tmp_dist = distance_nm - _navrecord->get_multiuse();
209 if ( tmp_dist < 0.0 ) {
212 _distance_node->setDoubleValue( tmp_dist );
213 if ( tmp_dist >389 ) tmp_dist = 389;
214 if ( tmp_dist >= 100.0) {
215 snprintf ( tmp,16,
"%3.0f",tmp_dist);
217 snprintf ( tmp,16,
"%2.1f",tmp_dist);
219 _distance_string->setStringValue(tmp);
221 _speed_node->setDoubleValue(speed_kt);
222 double spd = speed_kt;
224 snprintf ( tmp,16,
"%3.0f",spd);
225 _speed_string->setStringValue(tmp);
228 if (SGLimitsd::min() < fabs(speed_kt)){
229 double tm = distance_nm/speed_kt*60.0;
230 _time_node->setDoubleValue(tm);
232 snprintf ( tmp,16,
"%2.0f",tm);
233 _time_string->setStringValue(tmp);
240 _audioIdent->update( delta_time_sec );
static double adjust_range(double transmitter_elevation_ft, double aircraft_altitude_ft, double max_range_nm)
Fiddle with the reception range a bit.
static FGNavRecordRef findByFreq(double freq, const SGGeod &position, TypeFilter *filter=nullptr)
Query the database for the specified station.