/** * This function creates some simulated traffic for FLARM debugging * @param GPS_INFO Pointer to the NMEA_INFO struct */ void NMEAParser::TestRoutine(NMEA_INFO *GPS_INFO) { static int i = 90; i++; if (i > 255) i = 0; if (i > 80) return; const Angle angle = Angle::degrees(fixed((i * 360) / 255)).as_bearing(); // PFLAU,<RX>,<TX>,<GPS>,<Power>,<AlarmLevel>,<RelativeBearing>,<AlarmType>, // <RelativeVertical>,<RelativeDistance>(,<ID>) int h1; int n1; int e1; int t1; unsigned l; h1 = (angle.ifastsine()) / 7; n1 = (angle.ifastsine()) / 2 - 200; e1 = (angle.ifastcosine()) / 1.5; t1 = -angle.as_bearing().value_degrees(); l = (i % 30 > 13 ? 0 : (i % 30 > 5 ? 2 : 1)); int h2; int n2; int e2; int t2; Angle dangle = (angle + Angle::degrees(fixed(120))).as_bearing(); Angle hangle = dangle; hangle.flip(); hangle = hangle.as_bearing(); h2 = (angle.ifastcosine()) / 10; n2 = (dangle.ifastsine()) / 1.20 + 300; e2 = (dangle.ifastcosine()) + 500; t2 = hangle.value_degrees(); // PFLAA,<AlarmLevel>,<RelativeNorth>,<RelativeEast>,<RelativeVertical>, // <IDType>,<ID>,<Track>,<TurnRate>,<GroundSpeed>,<ClimbRate>,<AcftType> char t_laa1[50]; sprintf(t_laa1, "%d,%d,%d,%d,2,DDA85C,%d,0,0,0,1", l, n1, e1, h1, t1); char t_laa2[50]; sprintf(t_laa2, "0,%d,%d,%d,2,AA9146,%d,0,0,0,1", n2, e2, h2, t2); char t_lau[50]; sprintf(t_lau, "2,1,2,1,%d", l); GPS_INFO->flarm.FLARM_Available = true; NMEAInputLine line(t_lau); PFLAU(line, GPS_INFO->flarm); line = NMEAInputLine(t_laa1); PFLAA(line, GPS_INFO); line = NMEAInputLine(t_laa2); PFLAA(line, GPS_INFO); }
// TODO TB: find explanations/links for this and following Angle SunEphemeris::GetHourAngle(Angle lat, Angle declin) { Angle dfo = Angle::degrees(SUN_DIAMETER / 2 + AIR_REFRACTION); // Correction: different sign at southern hemisphere if (negative(lat.value_degrees())) dfo.flip(); fixed fo = (declin + dfo).tan() * lat.tan(); fo = asin(fo) + fixed_half_pi; return Angle::radians(fo); }