diff options
| author | Keith Packard <keithp@keithp.com> | 2012-12-05 19:44:09 -0800 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2012-12-05 19:44:09 -0800 | 
| commit | 0c2c47dd7af2fc95de852178c4244daba02f44ed (patch) | |
| tree | f33e705836472056436be45f23101ce1508a43f4 | |
| parent | d65751fded3321b8a350e4140c44f87fec95aab2 (diff) | |
altos: Add test scaffolding for APRS
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>
| -rw-r--r-- | src/drivers/ao_aprs.c | 163 | ||||
| -rw-r--r-- | src/test/Makefile | 14 | ||||
| -rw-r--r-- | src/test/ao_aprs_test.c | 145 | 
3 files changed, 174 insertions, 148 deletions
| diff --git a/src/drivers/ao_aprs.c b/src/drivers/ao_aprs.c index be7abaf5..df68278c 100644 --- a/src/drivers/ao_aprs.c +++ b/src/drivers/ao_aprs.c @@ -139,11 +139,10 @@   *   */ -#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; @@ -395,10 +394,8 @@ const uint32_t freqTable[256] =   */  void ddsSetFTW (uint32_t ftw)  { -    static int id;      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; +    	case TNC_MODE_STANDBY: +	    break;      } // 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. -            if ((tncShift & 0x01) == 0x00) +            if ((tncShift & 0x01) == 0x00) {                  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)  @@ -1101,11 +1101,12 @@ void tnc1200TimerTick()              // 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; +	    }              // 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. -            if ((tncShift & 0x01) == 0x00) +            if ((tncShift & 0x01) == 0x00) {                  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. @@ -1177,11 +1179,12 @@ void tnc1200TimerTick()          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 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); -    c = vsprintf(tncBufferPnt, fmt, ap); +    c = vsprintf((char *) tncBufferPnt, fmt, ap);      va_end(ap);      tncBufferPnt += c;      tncLength += c; @@ -1369,7 +1372,7 @@ void tncGPRMCPacket()   */  void tncStatusPacket(int16_t temperature)  { -    uint16_t voltage; +//    uint16_t voltage;      // Plain text telemetry.      tncPrintf (">ANSR "); @@ -1425,7 +1428,7 @@ void tncStatusPacket(int16_t temperature)   */  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. @@ -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 -} - - - diff --git a/src/test/Makefile b/src/test/Makefile index 0dcdc949..092bf360 100644 --- a/src/test/Makefile +++ b/src/test/Makefile @@ -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 \ -	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 @@ -9,7 +10,7 @@ KALMAN=make-kalman  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 @@ -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_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 diff --git a/src/test/ao_aprs_test.c b/src/test/ao_aprs_test.c new file mode 100644 index 00000000..d791e930 --- /dev/null +++ b/src/test/ao_aprs_test.c @@ -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 +} + + + + | 
