# HG changeset patch # User ethanzonca@CL-ENS241-08.cedarville.edu # Date 2013-01-12 13:24:09 # Node ID 4e5c6467cd0199a032b08fe75a858b64aae1cb8a # Parent 0062f8daffe7ce8ba9103465e0f6f7b3f68c6a28 GPS parsing and APRS tracking now functional! diff --git a/master/master/config.h b/master/master/config.h --- a/master/master/config.h +++ b/master/master/config.h @@ -115,10 +115,10 @@ // APRS comment: this goes in the comment portion of the APRS message. You // might want to keep this short. The longer the packet, the more vulnerable // it is to noise. -#define APRS_COMMENT "CedarvilleUniversity HAB" +#define APRS_COMMENT "CU HAB TEST" // Transmit the APRS sentence every X milliseconds -#define APRS_TRANSMIT_PERIOD 5000 +#define APRS_TRANSMIT_PERIOD 10000 // -------------------------------------------------------------------------- diff --git a/master/master/lib/aprs.c b/master/master/lib/aprs.c --- a/master/master/lib/aprs.c +++ b/master/master/lib/aprs.c @@ -48,10 +48,12 @@ void aprs_send() ax25_send_byte('/'); // Report w/ timestamp, no APRS messaging. $ = NMEA raw data // ax25_send_string("021709z"); // 021709z = 2nd day of the month, 17:09 zulu (UTC/GMT) ax25_send_string(get_timestamp()); // 170915 = 17h:09m:15s zulu (not allowed in Status Reports) - ax25_send_byte('h'); + ax25_send_byte('z'); // zulu time. h for nonzulu ax25_send_string(get_latitude()); // Lat: 38deg and 22.20 min (.20 are NOT seconds, but 1/100th of minutes) + ax25_send_byte('N'); ax25_send_byte('/'); // Symbol table ax25_send_string(get_longitude()); // Lon: 000deg and 25.80 min + ax25_send_byte('W'); ax25_send_byte('O'); // Symbol: O=balloon, -=QTH snprintf(temp, 4, "%03d", (int)(gps_course + 0.5)); ax25_send_string(temp); // Course (degrees) @@ -75,6 +77,9 @@ void aprs_send() */ ax25_send_byte(' '); + ax25_send_string("SV:"); + ax25_send_string(getNumSatelites()); + ax25_send_byte(' '); ax25_send_string(APRS_COMMENT); // Comment ax25_send_footer(); diff --git a/master/master/lib/logger.c b/master/master/lib/logger.c --- a/master/master/lib/logger.c +++ b/master/master/lib/logger.c @@ -38,7 +38,7 @@ void logger_setup() if(!sd_raw_init()) { // Initializing SD card failed! - serial0_sendString("SD: Error initializing.\r\n"); + serial0_sendString("SD> Error initializing.\r\n"); led_errorcode(ERROR_SD_INIT); return; } @@ -52,7 +52,7 @@ void logger_setup() // Check that partition was created correctly if(!partition) { - serial0_sendString("SD: Error opening partition.\r\n"); + serial0_sendString("SD> Error opening partition.\r\n"); // Error opening partition. MBR might be screwed up. led_errorcode(ERROR_SD_PARTITION); return; diff --git a/master/master/lib/looptime.c b/master/master/lib/looptime.c --- a/master/master/lib/looptime.c +++ b/master/master/lib/looptime.c @@ -22,8 +22,10 @@ void time_setup() { // Generic microcontroller config options OCR0A = 173; // Approx 172.7969 ticks per ms with 64 prescaler + OCR0B = 15; - TCCR0A |= (1 << WGM01) | (1 << WGM00); // Count until OCR0A, then overflow (wgm02 in the next line specifies this as well) + TCCR0A |= (1 << WGM01) | (1 << WGM00) | // Count until OCR0A, then overflow (wgm02 in the next line specifies this as well) + (1<< COM0B1); // Non-inverting PWM on OC0B TCCR0B |= (1 << CS01) | (1 << CS00) | (1 << WGM02); // clock div by 64 TIFR0 |= ( 1 << TOV0 ); // clear pending interrupts TIMSK0 |= (1 << TOIE0); // enable overflow interrupt diff --git a/master/master/lib/trackuinoGPS/gpsMKa.c b/master/master/lib/trackuinoGPS/gpsMKa.c --- a/master/master/lib/trackuinoGPS/gpsMKa.c +++ b/master/master/lib/trackuinoGPS/gpsMKa.c @@ -11,6 +11,7 @@ #include "gpsMKa.h" #include "../serial.h" #include "../../config.h" +#include "../led.h" @@ -65,19 +66,32 @@ char* get_longitude() { char quality; //quality for GGA and validity for RMC -char numSatellites[3]; +char numSatellites[4]; +char* getNumSatelites() { + return numSatellites; +} + char hdop[6]; //xx.x +char* get_hdop() { + return hdop; +} + char altitude[10]; //xxxxxx.x char wgs84Height[8]; //sxxx.x char lastUpdated[8]; //blank - included for testing char stationID[8]; //blank - included for testing char checksum[3]; //xx + char knots[8]; //xxx.xx char* get_speedKnots() { return knots; } char course[8]; //xxx.x +char* get_course() { + return course; +} + char datestamp[9]; //ddmmyy char variation[9]; //xxx.xb int calculatedChecksum; @@ -152,7 +166,10 @@ void parse_gps_transmission(void){ // Pull byte off of the buffer char byte; + + while(nmeaBufferDataPosition != nmeaBufferParsePosition) { + led_on(LED_ACTIVITY); byte = nmeaBuffer[nmeaBufferParsePosition]; @@ -225,16 +242,15 @@ void parse_gps_transmission(void){ if (byte == ',') //end of this data type { timestamp[6] = 0x00; // Cut off at 6 for APRS - serial0_sendString("time byte DONE\r\n"); setParserState(GGA_LATITUDE); skipBytes = 0; //prep for next phase of parse numBytes = 0; } else //store data { - //#ifdef DEBUG_NMEA + #ifdef DEBUG_NMEA serial0_sendString("found GGA time byte\r\n"); - //#endif + #endif setParserState(GGA_TIME); timestamp[numBytes] = byte; //byte; //adjust number of bytes to fit array @@ -257,7 +273,7 @@ void parse_gps_transmission(void){ else if (byte == ',') //end of this data type { - latitude[numBytes] = 0x00; // null terminate + latitude[7] = 0x00; // null terminate // First 2 bytes @@ -298,7 +314,7 @@ void parse_gps_transmission(void){ } else if (byte == ',') //end of this data type { - longitude[numBytes] = 0x00; + longitude[8] = 0x00; setParserState(GGA_QUALITY); numBytes = 0; //prep for next phase of parse skipBytes = 0; @@ -645,9 +661,7 @@ void parse_gps_transmission(void){ #ifdef DEBUG_NMEA serial0_sendString("OMG GOT TO CHECKSUM!\r\n"); #endif - - snprintf(debugBuff, 128, "\r\n\r\ntype: %s tstamp: %s lat: %s lon: %s speed: %s hdop: %s course: %s \r\n\r\n", - tramsmissionType,timestamp,latitude,longitude,knots,hdop, course); + serial0_sendString((debugBuff)); setParserState(INITIALIZE); numBytes = 0; //prep for next phase of parse @@ -668,7 +682,9 @@ void parse_gps_transmission(void){ //input byte into running checksum XORbyteWithChecksum(byte); } + led_off(LED_ACTIVITY); } + } /// MKa GPS transmission parser END diff --git a/master/master/lib/trackuinoGPS/gpsMKa.h b/master/master/lib/trackuinoGPS/gpsMKa.h --- a/master/master/lib/trackuinoGPS/gpsMKa.h +++ b/master/master/lib/trackuinoGPS/gpsMKa.h @@ -16,5 +16,8 @@ char* get_longitude(); char* get_latitude(); char* get_timestamp(); char* get_speedKnots(); +char* get_course(); +char* get_hdop(); +char* getNumSatelites(); #endif /* GPSMKA_H_ */ \ No newline at end of file diff --git a/master/master/master.c b/master/master/master.c --- a/master/master/master.c +++ b/master/master/master.c @@ -37,47 +37,33 @@ #include "lib/serparser.h" #include "lib/sensordata.h" -void micro_setup() -{ - -} - int main(void) { _delay_ms(1500); // warmup + // Initialize libraries time_setup(); - - micro_setup(); - watchdog_setup(); // enables interrupts - - led_setup(); - + led_setup(); serial0_setup(); - _delay_ms(10); - serial1_setup(); - - i2c_init(); // for board temp - + i2c_init(); sensordata_setup(); // must happen before sensors/logger/afsk slavesensors_setup(); logger_setup(); - afsk_setup(); - - serial0_sendString("\r\n\r\n---------------------------------\r\n"); + //\f + serial0_sendString("\r\n---------------------------------\r\n"); serial0_sendString("HAB Controller 1.0 - Initialized!\r\n"); - serial0_sendString("---------------------------------\r\n\r\n"); - serial0_sendString("\f\r\n\rHello.\r\n\r\n"); + serial0_sendString("---------------------------------\r\n"); + serial0_sendString("\r\nHello.\r\n\r\n"); led_on(LED_POWER); led_off(LED_SIDEBOARD); - // Buffer for string operations - char logbuf[32]; + char logbuf[128]; + char debugBuf[128]; // Software timers uint32_t lastAprsBroadcast = 0; @@ -122,24 +108,32 @@ int main(void) while(1) { + // Periodic: LED execution indicator if(time_millis() - lastLedCycle > LEDCYCLE_RATE) { spin(); - lastLedCycle = time_millis(); } // Periodic: Logging if(time_millis() - lastLog > LOGGER_RATE) { + led_on(LED_CYCLE); - led_on(LED_STATUS); + // Print out GPS debug + snprintf(debugBuf, 128, "GPS> time: %s lat: %s lon: %s speed: %s hdop: %s course: %s\r\n", + get_timestamp(),get_latitude(),get_longitude(),get_speedKnots(),get_hdop(), get_course()); + serial0_sendString(debugBuf); + + sensors_readBoardTemp(); // i2c read, 400k - snprintf(logbuf, 32, "%lu,%d,%uF\r\n", time_millis(), sensordata_get(HUMIDITY), sensors_getBoardTemp()); + snprintf(logbuf, 128, "%lu,%d,%uF,%s,%s,%s,%s,%s\r\n", time_millis(), sensors_getBoardTemp(),get_timestamp(),get_latitude(),get_longitude(),get_speedKnots(),get_hdop(), get_course()); logger_log(logbuf); - //serial0_sendString("Logging: "); - //serial0_sendString(logbuf); - led_off(LED_STATUS); + // Print out logger debug + serial0_sendString("LOG> "); + serial0_sendString(logbuf); + + led_off(LED_CYCLE); lastLog = time_millis(); } @@ -147,10 +141,6 @@ int main(void) // Periodic: APRS transmission if(time_millis() - lastAprsBroadcast > APRS_TRANSMIT_PERIOD) { - - - serial0_sendString(":: APRS Periodic\r\n"); - while(afsk_busy()); aprs_send(); // non-blocking