Signed-off-by: Keith Packard <keithp@keithp.com>
[fw/altos] / src / drivers / ao_aprs.c
index df68278c3d71b057af82c2ea7610736f77fadb30..cea802bb9b9578e01736474503df82bc6ccfc7ff 100644 (file)
@@ -395,7 +395,7 @@ const uint32_t freqTable[256] =
 void ddsSetFTW (uint32_t ftw)
 {
     int        x = ftw - freqTable[0];
-    putchar (x > 0 ? 0xff : 0x0);
+    putchar (x > 0 ? 0xc0 : 0x40);
 }
 
 /**
@@ -1243,6 +1243,10 @@ tncPrintf(char *fmt, ...)
 
     va_start(ap, fmt);
     c = vsprintf((char *) tncBufferPnt, fmt, ap);
+    if (*fmt == '\015')
+       fprintf (stderr, "\n");
+    else
+       vfprintf(stderr, fmt, ap);
     va_end(ap);
     tncBufferPnt += c;
     tncLength += c;
@@ -1366,6 +1370,58 @@ void tncGPRMCPacket()
     tncPrintf ("*%02X", gpsNMEAChecksum(tncBuffer + 1, tncLength - 1));
 }
 
+/**
+ *   Generate the plain text position packet. Data is written through the tncTxByte
+ *   callback function
+ */
+void tncPositionPacket(void)
+{
+    int32_t    latitude = 45.4694766 * 10000000;
+    int32_t    longitude = -122.7376250 * 10000000;
+    uint32_t   altitude = 10000;
+    uint16_t   lat_deg;
+    uint16_t   lon_deg;
+    uint16_t   lat_min;
+    uint16_t   lat_frac;
+    uint16_t   lon_min;
+    uint16_t   lon_frac;
+
+    char       lat_sign = 'N', lon_sign = 'E';
+
+//    tncPrintf (">ANSR ");
+    if (latitude < 0) {
+       lat_sign = 'S';
+       latitude = -latitude;
+    }
+
+    if (longitude < 0) {
+       lon_sign = 'W';
+       longitude = -longitude;
+    }
+
+    lat_deg = latitude / 10000000;
+    latitude -= lat_deg * 10000000;
+    latitude *= 60;
+    lat_min = latitude / 10000000;
+    latitude -= lat_min * 10000000;
+    lat_frac = (latitude + 50000) / 100000;
+
+    lon_deg = longitude / 10000000;
+    longitude -= lon_deg * 10000000;
+    longitude *= 60;
+    lon_min = longitude / 10000000;
+    longitude -= lon_min * 10000000;
+    lon_frac = (longitude + 50000) / 100000;
+
+    tncPrintf ("=%02u%02u.%02u%c\\%03u%02u.%02u%cO",
+              lat_deg, lat_min, lat_frac, lat_sign,
+              lon_deg, lon_min, lon_frac, lon_sign);
+
+    tncPrintf (" /A=%06u", altitude * 100 / 3048);
+}
+
+
+
 /**
  *   Generate the plain text status packet.  Data is written through the tncTxByte
  *   callback function.
@@ -1378,7 +1434,7 @@ void tncStatusPacket(int16_t temperature)
     tncPrintf (">ANSR ");
     
     // Display the flight time.
-    tncPrintf ("%02U:%02U:%02U ", timeHours, timeMinutes, timeSeconds);
+    tncPrintf ("%02u:%02u:%02u ", timeHours, timeMinutes, timeSeconds);
     
     // Altitude in feet.
     tncPrintf ("%ld' ", gpsPosition.altitudeFeet);
@@ -1462,7 +1518,8 @@ void tncTxPacket(TNC_DATA_MODE dataMode)
             break;
 
         case TNC_GGA:
-            tncGPGGAPacket();
+           tncPositionPacket();
+//            tncGPGGAPacket();
 
             // Select the next packet we will generate.
             tncPacketType = TNC_RMC;