diff options
| author | Keith Packard <keithp@keithp.com> | 2014-06-22 21:05:05 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2014-06-22 21:05:05 -0700 | 
| commit | 3f3382126bf1122b1a78abe8458af5ec112a1f95 (patch) | |
| tree | 1a187ac3838ca13506cd16a0e328de162287156f | |
| parent | ca1c62ca3ea016a1a5baa4520e484c102280c3e3 (diff) | |
altos: Make APRS SSID configurable
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>
| -rw-r--r-- | src/drivers/ao_aprs.c | 100 | ||||
| -rw-r--r-- | src/kernel/ao_config.c | 34 | ||||
| -rw-r--r-- | src/kernel/ao_config.h | 5 | 
3 files changed, 91 insertions, 48 deletions
diff --git a/src/drivers/ao_aprs.c b/src/drivers/ao_aprs.c index c33016f0..a9047149 100644 --- a/src/drivers/ao_aprs.c +++ b/src/drivers/ao_aprs.c @@ -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.   * @@ -54,28 +54,28 @@   *                                     (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. - *  + *   * @@ -102,11 +102,11 @@   *  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. @@ -118,29 +118,33 @@   *  @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.   * diff --git a/src/kernel/ao_config.c b/src/kernel/ao_config.c index 71445335..58fa7354 100644 --- a/src/kernel/ao_config.c +++ b/src/kernel/ao_config.c @@ -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 @@ -192,6 +193,10 @@ _ao_config_get(void)  		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; @@ -817,6 +847,10 @@ __code struct ao_config_var ao_config_vars[] = {  	{ "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 },  #if HAS_EEPROM diff --git a/src/kernel/ao_config.h b/src/kernel/ao_config.h index 2b5cd352..70f9f33b 100644 --- a/src/kernel/ao_config.h +++ b/src/kernel/ao_config.h @@ -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  | 
