altos: Add test scaffolding for APRS
authorKeith Packard <keithp@keithp.com>
Thu, 6 Dec 2012 03:44:09 +0000 (19:44 -0800)
committerKeith Packard <keithp@keithp.com>
Thu, 6 Dec 2012 03:44:09 +0000 (19:44 -0800)
This moves some test code out of ao_aprs.c and into ao_aprs_test.c,
and then adds Makefile fragments to compile and run the resulting
program, creating a wav file as output

Signed-off-by: Keith Packard <keithp@keithp.com>
src/drivers/ao_aprs.c
src/test/Makefile
src/test/ao_aprs_test.c [new file with mode: 0644]

index be7abaf554ba82e38271419965fef1fc8ffb3d28..df68278c3d71b057af82c2ea7610736f77fadb30 100644 (file)
  *
  */
 
  *
  */
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdint.h>
-#include <stdarg.h>
+#ifndef AO_APRS_TEST
+#include <ao.h>
+#endif
+
 #include <ao_aprs.h>
 
 typedef int bool_t;
 #include <ao_aprs.h>
 
 typedef int bool_t;
@@ -395,10 +394,8 @@ const uint32_t freqTable[256] =
  */
 void ddsSetFTW (uint32_t ftw)
 {
  */
 void ddsSetFTW (uint32_t ftw)
 {
-    static int id;
     int        x = ftw - freqTable[0];
     putchar (x > 0 ? 0xff : 0x0);
     int        x = ftw - freqTable[0];
     putchar (x > 0 ? 0xff : 0x0);
-//    printf ("%d %d\n", id++, x > 0 ? 1 : 0);
 }
 
 /**
 }
 
 /**
@@ -1003,6 +1000,8 @@ void tncSetMode(TNC_DATA_MODE dataMode)
             // FSK tones at 445.947 and 445.953 MHz
             ddsSetFSKFreq (955382980, 955453621);
             break;
             // FSK tones at 445.947 and 445.953 MHz
             ddsSetFSKFreq (955382980, 955453621);
             break;
+       case TNC_MODE_STANDBY:
+           break;
     } // END switch
 
     tncDataMode = dataMode; 
     } // END switch
 
     tncDataMode = dataMode; 
@@ -1061,11 +1060,12 @@ void tnc1200TimerTick()
         case TNC_TX_SYNC:
             // The variable tncShift contains the lastest data byte.
             // NRZI enocde the data stream.
         case TNC_TX_SYNC:
             // The variable tncShift contains the lastest data byte.
             // NRZI enocde the data stream.
-            if ((tncShift & 0x01) == 0x00)
+            if ((tncShift & 0x01) == 0x00) {
                 if (tncTxBit == 0)
                     tncTxBit = 1;
                 else
                     tncTxBit = 0;
                 if (tncTxBit == 0)
                     tncTxBit = 1;
                 else
                     tncTxBit = 0;
+           }
                     
             // When the flag is done, determine if we need to send more or data.
             if (++tncBitCount == 8) 
                     
             // When the flag is done, determine if we need to send more or data.
             if (++tncBitCount == 8) 
@@ -1101,11 +1101,12 @@ void tnc1200TimerTick()
 
             // The variable tncShift contains the lastest data byte.
             // NRZI enocde the data stream.
 
             // The variable tncShift contains the lastest data byte.
             // NRZI enocde the data stream.
-            if ((tncShift & 0x01) == 0x00)
+            if ((tncShift & 0x01) == 0x00) {
                 if (tncTxBit == 0)
                     tncTxBit = 1;
                 else
                     tncTxBit = 0;
                 if (tncTxBit == 0)
                     tncTxBit = 1;
                 else
                     tncTxBit = 0;
+           }
 
             // Save the data stream so we can determine if bit stuffing is 
             // required on the next bit time.
 
             // Save the data stream so we can determine if bit stuffing is 
             // required on the next bit time.
@@ -1145,11 +1146,12 @@ void tnc1200TimerTick()
 
             // The variable tncShift contains the lastest data byte.
             // NRZI enocde the data stream.
 
             // The variable tncShift contains the lastest data byte.
             // NRZI enocde the data stream.
-            if ((tncShift & 0x01) == 0x00)
+            if ((tncShift & 0x01) == 0x00) {
                 if (tncTxBit == 0)
                     tncTxBit = 1;
                 else
                     tncTxBit = 0;
                 if (tncTxBit == 0)
                     tncTxBit = 1;
                 else
                     tncTxBit = 0;
+           }
 
             // Save the data stream so we can determine if bit stuffing is 
             // required on the next bit time.
 
             // Save the data stream so we can determine if bit stuffing is 
             // required on the next bit time.
@@ -1177,11 +1179,12 @@ void tnc1200TimerTick()
         case TNC_TX_END:
             // The variable tncShift contains the lastest data byte.
             // NRZI enocde the data stream. 
         case TNC_TX_END:
             // The variable tncShift contains the lastest data byte.
             // NRZI enocde the data stream. 
-            if ((tncShift & 0x01) == 0x00)
+            if ((tncShift & 0x01) == 0x00) {
                 if (tncTxBit == 0)
                     tncTxBit = 1;
                 else
                     tncTxBit = 0;
                 if (tncTxBit == 0)
                     tncTxBit = 1;
                 else
                     tncTxBit = 0;
+           }
 
             // If all the bits were shifted, get the next one.
             if (++tncBitCount == 8) 
 
             // If all the bits were shifted, get the next one.
             if (++tncBitCount == 8) 
@@ -1239,7 +1242,7 @@ tncPrintf(char *fmt, ...)
     int                c;
 
     va_start(ap, fmt);
     int                c;
 
     va_start(ap, fmt);
-    c = vsprintf(tncBufferPnt, fmt, ap);
+    c = vsprintf((char *) tncBufferPnt, fmt, ap);
     va_end(ap);
     tncBufferPnt += c;
     tncLength += c;
     va_end(ap);
     tncBufferPnt += c;
     tncLength += c;
@@ -1369,7 +1372,7 @@ void tncGPRMCPacket()
  */
 void tncStatusPacket(int16_t temperature)
 {
  */
 void tncStatusPacket(int16_t temperature)
 {
-    uint16_t voltage;
+//    uint16_t voltage;
 
     // Plain text telemetry.
     tncPrintf (">ANSR ");
 
     // Plain text telemetry.
     tncPrintf (">ANSR ");
@@ -1425,7 +1428,7 @@ void tncStatusPacket(int16_t temperature)
  */
 void tncTxPacket(TNC_DATA_MODE dataMode)
 {
  */
 void tncTxPacket(TNC_DATA_MODE dataMode)
 {
-    int16_t temperature;
+    int16_t temperature = 20;
     uint16_t crc;
 
     // Only transmit if there is not another message in progress.
     uint16_t crc;
 
     // Only transmit if there is not another message in progress.
@@ -1510,135 +1513,3 @@ void tncTxPacket(TNC_DATA_MODE dataMode)
 }
 
 /** @} */
 }
 
 /** @} */
-
-#if 0
-uint32_t counter;
-
-uint8_t bitIndex;
-uint8_t streamIndex;
-uint8_t value;
-
-uint8_t bitStream[] = { 0x10, 0x20, 0x30 };
-
-void init()
-{
-    counter = 0;
-    bitIndex = 0;
-    streamIndex = 0;
-    value = bitStream[0];
-}
-
-void test()
-{
-    counter += 0x10622d;
-
-//    CCP_1 = (uint16_t) ((counter >> 16) & 0xffff);
-
-    if ((value & 0x80) == 0x80)
-        setup_ccp1 (CCP_COMPARE_SET_ON_MATCH);
-    else
-        setup_ccp1 (CCP_COMPARE_CLR_ON_MATCH);
-
-    if (++bitIndex == 8)
-    {
-        bitIndex = 0;
-        
-        if (++streamIndex == sizeof(bitStream))
-        {
-            streamIndex = 0;
-        }
-
-        value = bitStream[streamIndex];
-    } else
-        value = value << 1;
-}
-#endif
-
-// This is where we go after reset.
-int main(int argc, char **argv)
-{
-    uint8_t i, utcSeconds, lockLostCounter;
-
-//test();
-
-    // Configure the basic systems.
-//    sysInit();
-
-    // Wait for the power converter chains to stabilize.
-//    delay_ms (100);
-
-    // Setup the subsystems.
-//    adcInit();
-//    flashInit();
-    gpsInit();
-//    logInit();
-//    timeInit();
-//    serialInit();
-    tncInit();
-
-    // Program the DDS.
-//    ddsInit();
-
-    // Transmit software version packet on start up.
-    tncTxPacket(TNC_MODE_1200_AFSK);
-
-    exit(0);
-    // Counters to send packets if the GPS time stamp is not available.
-    lockLostCounter = 5;
-    utcSeconds = 55;
-  
-    // This is the main loop that process GPS data and waits for the once per second timer tick.
-    for (;;) 
-    {
-        // Read the GPS engine serial port FIFO and process the GPS data.
-//        gpsUpdate();
-
-        if (gpsIsReady()) 
-        {
-            // Start the flight timer when we get a valid 3D fix.
-            if (gpsGetFixType() == GPS_3D_FIX)
-                timeSetRunFlag();
-
-            // Generate our packets based on the GPS time.
-            if (tncIsTimeSlot(gpsPosition.seconds))
-                 tncTxPacket(TNC_MODE_1200_AFSK);
-
-            // Sync the internal clock to GPS UTC time.
-            utcSeconds = gpsPosition.seconds;
-
-            // This counter is reset every time we receive the GPS message.
-            lockLostCounter = 0;
-
-            // Log the data to flash.
-//            sysLogGPSData();            
-        } // END if gpsIsReady   
-
-        // Processing that occurs once a second.
-        if (timeIsUpdate()) 
-        {
-            // We maintain the UTC time in seconds if we shut off the GPS engine or it fails.
-            if (++utcSeconds == 60)
-                utcSeconds = 0;
-
-            // If we loose information for more than 5 seconds, 
-            // we will determine when to send a packet based on internal time.
-            if (lockLostCounter == 5) 
-            {
-                if (tncIsTimeSlot(utcSeconds))
-                    tncTxPacket(TNC_MODE_1200_AFSK);
-            } else
-                ++lockLostCounter;
-
-            // Update the ADC filters.
-//            adcUpdate();
-
-            if (timeHours == 5 && timeMinutes == 0 && timeSeconds == 0)
-                gpsPowerOff();
-
-        } // END if timeIsUpdate
-
-    } // END for
-}
-
-
-
index 0dcdc949318e54b0b50a3879815339efbb69e4cc..092bf3603b7eaf2e2aa4ba388966089a99f3938a 100644 (file)
@@ -1,7 +1,8 @@
 vpath % ..:../core:../drivers:../util
 
 PROGS=ao_flight_test ao_flight_test_baro ao_flight_test_accel ao_flight_test_noisy_accel ao_flight_test_mm \
 vpath % ..:../core:../drivers:../util
 
 PROGS=ao_flight_test ao_flight_test_baro ao_flight_test_accel ao_flight_test_noisy_accel ao_flight_test_mm \
-       ao_gps_test ao_gps_test_skytraq ao_convert_test ao_convert_pa_test ao_fec_test
+       ao_gps_test ao_gps_test_skytraq ao_convert_test ao_convert_pa_test ao_fec_test \
+       ao_aprs_test
 
 INCS=ao_kalman.h ao_ms5607.h ao_log.h ao_data.h altitude-pa.h altitude.h
 
 
 INCS=ao_kalman.h ao_ms5607.h ao_log.h ao_data.h altitude-pa.h altitude.h
 
@@ -9,7 +10,7 @@ KALMAN=make-kalman
 
 CFLAGS=-I.. -I. -I../core -I../drivers -O0 -g -Wall
 
 
 CFLAGS=-I.. -I. -I../core -I../drivers -O0 -g -Wall
 
-all: $(PROGS)
+all: $(PROGS) ao_aprs_data.wav
 
 clean:
        rm -f $(PROGS) run-out.baro run-out.full
 
 clean:
        rm -f $(PROGS) run-out.baro run-out.full
@@ -49,5 +50,14 @@ ao_kalman.h: $(KALMAN)
 ao_fec_test: ao_fec_test.c ao_fec_tx.c ao_fec_rx.c
        cc $(CFLAGS) -DAO_FEC_DEBUG=1 -o $@ ao_fec_test.c ../core/ao_fec_tx.c ../core/ao_fec_rx.c -lm
 
 ao_fec_test: ao_fec_test.c ao_fec_tx.c ao_fec_rx.c
        cc $(CFLAGS) -DAO_FEC_DEBUG=1 -o $@ ao_fec_test.c ../core/ao_fec_tx.c ../core/ao_fec_rx.c -lm
 
+ao_aprs_test: ao_aprs_test.c ao_aprs.c
+       cc $(CFLAGS) -o $@ ao_aprs_test.c
+
+SOX_INPUT_ARGS=--type raw --encoding unsigned-integer -b 8 -c 1 -r 9600
+SOX_OUTPUT_ARGS=--type wav
+
+ao_aprs_data.wav: ao_aprs_test
+       ./ao_aprs_test | sox $(SOX_INPUT_ARGS) - $(SOX_OUTPUT_ARGS) $@
+
 check: ao_fec_test ao_flight_test ao_flight_test_baro run-tests
        ./ao_fec_test && ./run-tests
\ No newline at end of file
 check: ao_fec_test ao_flight_test ao_flight_test_baro run-tests
        ./ao_fec_test && ./run-tests
\ No newline at end of file
diff --git a/src/test/ao_aprs_test.c b/src/test/ao_aprs_test.c
new file mode 100644 (file)
index 0000000..d791e93
--- /dev/null
@@ -0,0 +1,145 @@
+/*
+ * Copyright © 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+#include <stdarg.h>
+
+#include <ao_telemetry.h>
+
+#define AO_APRS_TEST
+
+#include <ao_aprs.c>
+
+/*
+ * @section copyright_sec Copyright
+ *
+ * Copyright (c) 2001-2009 Michael Gray, KD7LMO
+
+
+ *
+ *
+ * @section gpl_sec GNU General Public License
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *  
+
+ */
+
+// This is where we go after reset.
+int main(int argc, char **argv)
+{
+    uint8_t utcSeconds, lockLostCounter;
+
+//test();
+
+    // Configure the basic systems.
+//    sysInit();
+
+    // Wait for the power converter chains to stabilize.
+//    delay_ms (100);
+
+    // Setup the subsystems.
+//    adcInit();
+//    flashInit();
+    gpsInit();
+//    logInit();
+//    timeInit();
+//    serialInit();
+    tncInit();
+
+    // Program the DDS.
+//    ddsInit();
+
+    // Transmit software version packet on start up.
+    tncTxPacket(TNC_MODE_1200_AFSK);
+
+    exit(0);
+    // Counters to send packets if the GPS time stamp is not available.
+    lockLostCounter = 5;
+    utcSeconds = 55;
+  
+    // This is the main loop that process GPS data and waits for the once per second timer tick.
+    for (;;) 
+    {
+        // Read the GPS engine serial port FIFO and process the GPS data.
+//        gpsUpdate();
+
+        if (gpsIsReady()) 
+        {
+            // Start the flight timer when we get a valid 3D fix.
+            if (gpsGetFixType() == GPS_3D_FIX)
+                timeSetRunFlag();
+
+            // Generate our packets based on the GPS time.
+            if (tncIsTimeSlot(gpsPosition.seconds))
+                 tncTxPacket(TNC_MODE_1200_AFSK);
+
+            // Sync the internal clock to GPS UTC time.
+            utcSeconds = gpsPosition.seconds;
+
+            // This counter is reset every time we receive the GPS message.
+            lockLostCounter = 0;
+
+            // Log the data to flash.
+//            sysLogGPSData();            
+        } // END if gpsIsReady   
+
+        // Processing that occurs once a second.
+        if (timeIsUpdate()) 
+        {
+            // We maintain the UTC time in seconds if we shut off the GPS engine or it fails.
+            if (++utcSeconds == 60)
+                utcSeconds = 0;
+
+            // If we loose information for more than 5 seconds, 
+            // we will determine when to send a packet based on internal time.
+            if (lockLostCounter == 5) 
+            {
+                if (tncIsTimeSlot(utcSeconds))
+                    tncTxPacket(TNC_MODE_1200_AFSK);
+            } else
+                ++lockLostCounter;
+
+            // Update the ADC filters.
+//            adcUpdate();
+
+            if (timeHours == 5 && timeMinutes == 0 && timeSeconds == 0)
+                gpsPowerOff();
+
+        } // END if timeIsUpdate
+
+    } // END for
+}
+
+
+
+