altos: Make APRS SSID configurable
authorKeith Packard <keithp@keithp.com>
Mon, 23 Jun 2014 04:05:05 +0000 (21:05 -0700)
committerKeith Packard <keithp@keithp.com>
Mon, 23 Jun 2014 04:05:05 +0000 (21:05 -0700)
This uses the low-digit from the serial number by default, but lets
the user change it if desired.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/drivers/ao_aprs.c
src/kernel/ao_config.c
src/kernel/ao_config.h

index c33016f0534e8841122744ff0b83e7d2cfd0ee8b..a9047149d981c3c0af7343bbaeab018fe14f80c7 100644 (file)
@@ -1,11 +1,11 @@
-/** 
+/**
  * http://ad7zj.net/kd7lmo/aprsbeacon_code.html
  *
  * @mainpage Pico Beacon
  *
  * @section overview_sec Overview
  *
- * The Pico Beacon is an APRS based tracking beacon that operates in the UHF 420-450MHz band.  The device utilizes a 
+ * The Pico Beacon is an APRS based tracking beacon that operates in the UHF 420-450MHz band.  The device utilizes a
  * Microchip PIC 18F2525 embedded controller, Motorola M12+ GPS engine, and Analog Devices AD9954 DDS.  The device is capable
  * of generating a 1200bps A-FSK and 9600 bps FSK AX.25 compliant APRS (Automatic Position Reporting System) message.
 
@@ -24,7 +24,7 @@
  *                                     (4) corrected size of LOG_COORD block when searching for end of log.
  *
  * @subsection v303 V3.03
- * 15 Sep 2005, Change include; (1) removed AD9954 setting SDIO as input pin, 
+ * 15 Sep 2005, Change include; (1) removed AD9954 setting SDIO as input pin,
  *                                     (2) additional comments and Doxygen tags,
  *                                     (3) integration and test code calculates DDS FTW,
  *                                     (4) swapped bus and reference analog input ports (hardware change),
@@ -38,7 +38,7 @@
  *                                    (2) Doxygen documentation clean up and additions, and
  *                                    (3) added integration and test code to baseline.
  *
- * 
+ *
  * @subsection v301 V3.01
  * 13 Jan 2005, Renamed project and files to Pico Beacon.
  *
  *                                     (8) added flight data recorder, and
  *                                     (9) added diagnostics terminal mode.
  *
- * 
+ *
  * @subsection v201 V2.01
- * 30 Jan 2004, Change include; (1) General clean up of in-line documentation, and 
+ * 30 Jan 2004, Change include; (1) General clean up of in-line documentation, and
  *                                     (2) changed temperature resolution to 0.1 degrees F.
  *
- * 
+ *
  * @subsection v200 V2.00
  * 26 Oct 2002, Change include; (1) Micro Beacon II hardware changes including PIC18F252 processor,
- *                                     (2) serial EEPROM, 
- *                                     (3) GPS power control, 
- *                                     (4) additional ADC input, and 
- *                                     (5) LM60 temperature sensor.                            
+ *                                     (2) serial EEPROM,
+ *                                     (3) GPS power control,
+ *                                     (4) additional ADC input, and
+ *                                     (5) LM60 temperature sensor.
  *
  *
  * @subsection v101 V1.01
- * 5 Dec 2001, Change include; (1) Changed startup message, and 
+ * 5 Dec 2001, Change include; (1) Changed startup message, and
  *                                    (2) applied SEPARATE pragma to several methods for memory usage.
  *
  *
  * @subsection v100 V1.00
  * 25 Sep 2001, Initial release.  Flew ANSR-3 and ANSR-4.
- * 
+ *
 
 
  *
  *  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
- *  
+ *
 
 
- * 
- * 
+ *
+ *
  * @section design Design Details
  *
  * Provides design details on a variety of the components that make up the Pico Beacon.
  *  @page power Power Consumption
  *
  *  Measured DC power consumption.
- * 
- *  3VDC prime power current 
+ *
+ *  3VDC prime power current
 
  *
- *    7mA Held in reset 
+ *    7mA Held in reset
 
- *   18mA Processor running, all I/O off 
+ *   18mA Processor running, all I/O off
 
- *  110mA GPS running 
+ *  110mA GPS running
 
- *  120mA GPS running w/antenna 
+ *  120mA GPS running w/antenna
 
- *  250mA DDS running and GPS w/antenna 
+ *  250mA DDS running and GPS w/antenna
 
- *  420mA DDS running, GPS w/antenna, and PA chain on with no RF 
+ *  420mA DDS running, GPS w/antenna, and PA chain on with no RF
 
- *  900mA Transmit 
+ *  900mA Transmit
 
  *
  */
 
 #ifndef AO_APRS_TEST
 #include <ao.h>
+
+#if !HAS_APRS
+#error HAS_APRS not set
+#endif
 #endif
 
 #include <ao_aprs.h>
@@ -176,11 +180,11 @@ static uint16_t sysCRC16(const uint8_t *buffer, uint8_t length, uint16_t crc)
 {
     uint8_t i, bit, value;
 
-    for (i = 0; i < length; ++i) 
+    for (i = 0; i < length; ++i)
     {
         value = buffer[i];
 
-        for (bit = 0; bit < 8; ++bit) 
+        for (bit = 0; bit < 8; ++bit)
         {
             crc ^= (value & 0x01);
             crc = ( crc & 0x01 ) ? ( crc >> 1 ) ^ 0x8408 : ( crc >> 1 );
@@ -253,7 +257,7 @@ typedef enum
 
 /// AX.25 compliant packet header that contains destination, station call sign, and path.
 /// 0x76 for SSID-11, 0x78 for SSID-12
-static uint8_t TNC_AX25_HEADER[] = { 
+static uint8_t TNC_AX25_HEADER[] = {
     'A' << 1, 'P' << 1, 'A' << 1, 'M' << 1, ' ' << 1, ' ' << 1, 0x60,
     'N' << 1, '0' << 1, 'C' << 1, 'A' << 1, 'L' << 1, 'L' << 1, 0x78,
     'W' << 1, 'I' << 1, 'D' << 1, 'E' << 1, '2' << 1, ' ' << 1, 0x65,
@@ -276,7 +280,9 @@ tncSetCallsign(void)
        }
        for (; i < TNC_CALLSIGN_LEN; i++)
                TNC_AX25_HEADER[TNC_CALLSIGN_OFF + i] = ' ' << 1;
-       TNC_AX25_HEADER[TNC_SSID_OFF] = 0x60 | ((ao_serial_number % 10) << 1);
+
+       /* Fill in the SSID with the low digit of the serial number */
+       TNC_AX25_HEADER[TNC_SSID_OFF] = 0x60 | ((ao_config.aprs_ssid & 0xf) << 1);
 #endif
 }
 
@@ -304,7 +310,7 @@ static uint8_t tncBitStuff;
 /// Buffer to hold the message portion of the AX.25 packet as we prepare it.
 static uint8_t tncBuffer[TNC_BUFFER_SIZE];
 
-/** 
+/**
  *   Initialize the TNC internal variables.
  */
 static void tncInit()
@@ -325,7 +331,7 @@ static void tnc1200TimerTick()
     else
         timeNCOFreq = 0x3aab;
 
-    switch (tncMode) 
+    switch (tncMode)
     {
         case TNC_TX_READY:
             // Generate a test signal alteranting between high and low tones.
@@ -341,16 +347,16 @@ static void tnc1200TimerTick()
                 else
                     tncTxBit = 0;
            }
-                    
+
             // When the flag is done, determine if we need to send more or data.
-            if (++tncBitCount == 8) 
+            if (++tncBitCount == 8)
             {
                 tncBitCount = 0;
                 tncShift = 0x7e;
 
                 // Once we transmit x mS of flags, send the data.
                 // txDelay bytes * 8 bits/byte * 833uS/bit = x mS
-                if (++tncIndex == TNC_TX_DELAY) 
+                if (++tncIndex == TNC_TX_DELAY)
                 {
                     tncIndex = 0;
                     tncShift = TNC_AX25_HEADER[0];
@@ -363,7 +369,7 @@ static void tnc1200TimerTick()
 
         case TNC_TX_HEADER:
             // Determine if we have sent 5 ones in a row, if we have send a zero.
-            if (tncBitStuff == 0x1f) 
+            if (tncBitStuff == 0x1f)
             {
                 if (tncTxBit == 0)
                     tncTxBit = 1;
@@ -383,17 +389,17 @@ static void tnc1200TimerTick()
                     tncTxBit = 0;
            }
 
-            // Save the data stream so we can determine if bit stuffing is 
+            // Save the data stream so we can determine if bit stuffing is
             // required on the next bit time.
             tncBitStuff = ((tncBitStuff << 1) | (tncShift & 0x01)) & 0x1f;
 
             // If all the bits were shifted, get the next byte.
-            if (++tncBitCount == 8) 
+            if (++tncBitCount == 8)
             {
                 tncBitCount = 0;
 
                 // After the header is sent, then send the data.
-                if (++tncIndex == sizeof(TNC_AX25_HEADER)) 
+                if (++tncIndex == sizeof(TNC_AX25_HEADER))
                 {
                     tncIndex = 0;
                     tncShift = tncBuffer[0];
@@ -408,7 +414,7 @@ static void tnc1200TimerTick()
 
         case TNC_TX_DATA:
             // Determine if we have sent 5 ones in a row, if we have send a zero.
-            if (tncBitStuff == 0x1f) 
+            if (tncBitStuff == 0x1f)
             {
                 if (tncTxBit == 0)
                     tncTxBit = 1;
@@ -428,17 +434,17 @@ static void tnc1200TimerTick()
                     tncTxBit = 0;
            }
 
-            // Save the data stream so we can determine if bit stuffing is 
+            // Save the data stream so we can determine if bit stuffing is
             // required on the next bit time.
             tncBitStuff = ((tncBitStuff << 1) | (tncShift & 0x01)) & 0x1f;
 
             // If all the bits were shifted, get the next byte.
-            if (++tncBitCount == 8) 
+            if (++tncBitCount == 8)
             {
                 tncBitCount = 0;
 
                 // If everything was sent, transmit closing flags.
-                if (++tncIndex == tncLength) 
+                if (++tncIndex == tncLength)
                 {
                     tncIndex = 0;
                     tncShift = 0x7e;
@@ -453,7 +459,7 @@ static void tnc1200TimerTick()
 
         case TNC_TX_END:
             // The variable tncShift contains the lastest data byte.
-            // NRZI enocde the data stream. 
+            // NRZI enocde the data stream.
             if ((tncShift & 0x01) == 0x00) {
                 if (tncTxBit == 0)
                     tncTxBit = 1;
@@ -462,13 +468,13 @@ static void tnc1200TimerTick()
            }
 
             // If all the bits were shifted, get the next one.
-            if (++tncBitCount == 8) 
+            if (++tncBitCount == 8)
             {
                 tncBitCount = 0;
                 tncShift = 0x7e;
-    
+
                 // Transmit two closing flags.
-                if (++tncIndex == 2) 
+                if (++tncIndex == 2)
                 {
                     tncMode = TNC_TX_READY;
 
@@ -763,7 +769,7 @@ tncFill(uint8_t *buf, int16_t len)
     return l;
 }
 
-/** 
+/**
  *    Prepare an AX.25 data packet.  Each time this method is called, it automatically
  *    rotates through 1 of 3 messages.
  *
index 71445335a7a39901c98b91c4346f1cbd1e6686e1..58fa735438c31439b25558369dd6e62c84f6cdd3 100644 (file)
@@ -61,6 +61,7 @@ __xdata uint8_t ao_config_mutex;
 #define AO_CONFIG_DEFAULT_RADIO_POWER          0x60
 #endif
 #define AO_CONFIG_DEFAULT_RADIO_AMP            0
+#define AO_CONFIG_DEFAULT_APRS_SSID            (ao_serial_number % 10)
 
 #if HAS_EEPROM
 static void
@@ -191,6 +192,10 @@ _ao_config_get(void)
 #if AO_PYRO_NUM
                if (minor < 18)
                        ao_config.pyro_time = AO_CONFIG_DEFAULT_PYRO_TIME;
+#endif
+#if HAS_APRS
+               if (minor < 19)
+                       ao_config.aprs_ssid = AO_CONFIG_DEFAULT_APRS_SSID;
 #endif
                ao_config.minor = AO_CONFIG_MINOR;
                ao_config_dirty = 1;
@@ -283,6 +288,7 @@ ao_config_frequency_set(void) __reentrant
        ao_radio_recv_abort();
 #endif
 }
+
 #endif
 
 #if HAS_FLIGHT
@@ -737,6 +743,30 @@ ao_config_pyro_time_set(void)
 }
 #endif
 
+#if HAS_APRS
+void
+ao_config_aprs_ssid_show(void)
+{
+       printf ("APRS SSID: %d\n",
+               ao_config.aprs_ssid);
+}
+
+void
+ao_config_aprs_ssid_set(void)
+{
+       ao_cmd_decimal();
+       if (ao_cmd_status != ao_cmd_success)
+               return;
+       if (15 < ao_cmd_lex_i) {
+               ao_cmd_status = ao_cmd_lex_error;
+               return;
+       }
+       _ao_config_edit_start();
+       ao_config.aprs_ssid = ao_cmd_lex_i;
+       _ao_config_edit_finish();
+}
+#endif /* HAS_APRS */
+
 struct ao_config_var {
        __code char     *str;
        void            (*set)(void) __reentrant;
@@ -816,6 +846,10 @@ __code struct ao_config_var ao_config_vars[] = {
 #if HAS_TRACKER
        { "t <motion> <interval>\0Tracker configuration",
          ao_config_tracker_set, ao_config_tracker_show },
+#endif
+#if HAS_APRS
+       { "S <ssid>\0Set APRS SSID (0-15)",
+         ao_config_aprs_ssid_set, ao_config_aprs_ssid_show },
 #endif
        { "s\0Show",
          ao_config_show,               0 },
index 2b5cd352300fed22d9c89ceb7fb0b4dbdeb73aee..70f9f33bdbc6104e60e95a4470ecf35d1f509927 100644 (file)
@@ -53,7 +53,7 @@
 #endif
 
 #define AO_CONFIG_MAJOR        1
-#define AO_CONFIG_MINOR        18
+#define AO_CONFIG_MINOR        19
 
 #define AO_AES_LEN 16
 
@@ -102,6 +102,9 @@ struct ao_config {
 #if AO_PYRO_NUM
        uint16_t        pyro_time;              /* minor version 18 */
 #endif
+#if HAS_APRS
+       uint8_t         aprs_ssid;              /* minor version 19 */
+#endif
 };
 
 #define AO_IGNITE_MODE_DUAL            0