This is the typical protocol used by UKHAS members to transmit GPS data balloon to ground on the unlicensed bands. Parsing is handled by habitat which can be configured to almost practically any format you can come up with, provided the string starts with $$CALLSIGN, end with a newline ('\n'), and contains printable ASCII characters. Fields are comma delimited.
$$CALLSIGN,sentence_id,time,latitude,longitude,altitude,optional speed,optional bearing,optional internal temperature*CHECKSUM\n
XOR Checksum'd string: $$A1,15254,15:36:34,52.145255,000.542061,00118,0000,03,3F4D3F2F,45*62
Example of a CRC16_CCITT'd string: $$hadie,181,10:42:10,54.422829,-6.741293,27799.3,1:10*002A
Demonstration of the fact that the custom data can be anything: $$icarus,12342,12:34:17,52.345645,-1.02342,10232,21.35,192.3,15.4,-22.34,-18.27,1232,Blah,Blah,Blah*0C
Usage example for the below two functions
#include <stdio.h> #include <stdint.h> #include <string.h> char s[100]; void make_string(struct information i) { char checksum[10]; snprintf(s, sizeof(s), "$$MYPAYLOAD,%i,%s,%s", i->num, i->gps.lat, i->gps.lon); snprintf(checksum, sizeof(checksum), "*%04X\n", gps_CRC16_checksum(s)); // or snprintf(checksum, sizeof(checksum), "*%02X\n", gps_xor_checksum(s)); // It would be much more efficient to use the return value of snprintf here, rather than strlen if (strlen(s) > sizeof(s) - 4 - 1) { // Don't overflow the buffer. You should have made it bigger. return; } // Also copy checksum's terminating \0 (hence the +1). memcpy(s + strlen(s), checksum, strlen(checksum) + 1); }
Useful code to calculate NMEA xor checksum
Please note: The use of xor checksum for payload telemetry is not advised, this code is useful for checking sentences sent by the GPS. The CCITT checksum below has much better performance and is preferred for payload telemetry
#include <stdio.h> #include <stdint.h> #include <string.h> uint8_t gps_xor_checksum(char *string) { size_t i; uint8_t XOR; uint8_t c; XOR = 0; // Calculate checksum ignoring the first two $s for (i = 2; i < strlen(string); i++) { c = string[i]; XOR ^= c; } return XOR; }
Useful code to calculate CRC16_CCITT checksum on the AVR
(Refer to this page for implementation on other microcontrollers)
#include <stdio.h> #include <stdint.h> #include <util/crc16.h> #include <string.h> uint16_t gps_CRC16_checksum (char *string) { size_t i; uint16_t crc; uint8_t c; crc = 0xFFFF; // Calculate checksum ignoring the first two $s for (i = 2; i < strlen(string); i++) { c = string[i]; crc = _crc_xmodem_update (crc, c); } return crc; }
You will need to fill out a flight document so the server can parse your telemetry strings and update the map.
Fill out the form here :Payload Document Generator the come and see us on IRC to get it added.