- if ( loc_dist < effective_range * SG_NM_TO_METER ) {
- inrange = true;
- } else if ( loc_dist < 2 * effective_range * SG_NM_TO_METER ) {
- inrange = sg_random() < ( 2 * effective_range * SG_NM_TO_METER
- - loc_dist )
- / (effective_range * SG_NM_TO_METER);
- } else {
- inrange = false;
- }
+ //////////////////////////////////////////////////////////
+ // compute signal quality
+ // 100% within effective_range
+ // decreases 1/x^2 further out
+ //////////////////////////////////////////////////////////
+ {
+ double last_signal_quality_norm = signal_quality_norm;
+
+ if ( loc_dist < effective_range_m ) {
+ signal_quality_norm = 1.0;
+ } else {
+ double range_exceed_norm = loc_dist/effective_range_m;
+ signal_quality_norm = 1/(range_exceed_norm*range_exceed_norm);
+ }
+
+ signal_quality_norm = fgGetLowPass( last_signal_quality_norm,
+ signal_quality_norm, dt );
+ }
+ signal_quality_norm_node->setDoubleValue( signal_quality_norm );
+ inrange = signal_quality_norm > 0.2;