Examplecode for GPS functionality on the QW-GPS-DEVKIT.
Fork of HelloWorld - QW Development kit by
Firmware
This program starts the GPS on the TD1204 in continuous navigating mode using the following AT-command:
AT$GPS=1,16,0,65535,1,1
A timer sends the latests gps fix every 30 seconds or 10 minutes to the SIGFOX backend using the following command:
AT$GSND
LED3 burns if a 30 second interval is set. LED4 burns if a 10 minute interval is set. Switching between intervals can be done using button 1.
Button 2 instantly sends the latests fix to the SIGFOX cloud.
Settings in the SIGFOX backend
Create a new device-type and set display typte to Geolocation > Telecom Design.
Assign your development kit to this device-type and the decoding will happen automatically:
Data if no GPS fix was found!
Note: The data looks like this if your device didn't get a valid fix before the transmission of a SIGFOX packet.
You can follow the NMEA messages of the GPS if you open up a terminal and connect to the virtual com-port of the QW shield. More info about NMEA messages can be found HERE.
GPS data is displayed in different message formats over a serial interface. There are standard and non-standard (proprietary) message formats. Nearly all GPS receivers output NMEA data. The NMEA standard is formatted in lines of data called sentences. Each sentence contains various bits of data organized in comma delimited format (i.e. data separated by commas). Here’s example NMEA sentences from a GPS receiver with satellite lock (4+ satellites, accurate position):
$GPRMC,235316.000,A,4003.9040,N,10512.5792,W,0.09,144.75,141112,,*19 $GPGGA,235317.000,4003.9039,N,10512.5793,W,1,08,1.6,1577.9,M,-20.7,M,,0000*5F $GPGSA,A,3,22,18,21,06,03,09,24,15,,,,,2.5,1.6,1.9*3E
For example, the GPGGA sentence above contains the following:
- Time: 235317.000 is 23:53 and 17.000 seconds in Greenwich mean time
- Longitude: 4003.9040,N is latitude in degrees.decimal minutes, north
- Latitude: 10512.5792,W is longitude in degrees.decimal minutes, west
- Number of satellites seen: 08
- Altitude: 1577 meters
Note, every 30 seconds an "OK" will appear after sending the SIGFOX message.
More information about the NMEA sentences coming from the TD1204 can be found in the following datasheet of the u-blox 7 series: Link.
You can even open up a track of your device:
Revision 1:18afd4c75c6e, committed 2016-03-02
- Comitter:
- quicksand
- Date:
- Wed Mar 02 12:14:48 2016 +0000
- Parent:
- 0:49858c4c3500
- Commit message:
- First version of a GPS example
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 49858c4c3500 -r 18afd4c75c6e main.cpp --- a/main.cpp Fri Oct 30 14:10:26 2015 +0000 +++ b/main.cpp Wed Mar 02 12:14:48 2016 +0000 @@ -8,77 +8,107 @@ InterruptIn SW2(PA_8); Ticker hartbeat; - -typedef struct{ - bool busy; - char button; -} TX_BUTTON; +Ticker position_update; -TX_BUTTON Button_tx; - -void beat() { - LED_0 = !LED_0; -} - //Virtual serial port over USB Serial pc(USBTX, USBRX); Serial modem(PA_9, PA_10); -void sw1interrupt(){ - pc.printf("Button 1 pressed, sending sigfox message (command is AT$SF=42 55 54 54 4f 4e 20 31 00 00 00 00,2,0)\n"); - modem.printf("AT$SF=42 55 54 54 4f 4e 20 31 00 00 00 00,2,0\n"); - LED_1 = 0; - wait(0.25); - // Flush the echo of the command: - while(modem.readable()) modem.getc(); - Button_tx.busy = true; - Button_tx.button = 1; -} +char * response = "OK"; +char * responsePtr; +bool commandogiven = false; +bool commandofailed = true; +int updateinterval_s = 30; + +// Send command and check if ok +void command(char * commando) +{ + LED_1=0; + modem.printf(commando); + commandogiven = true; + commandofailed = true; +} + +// Blinking LED Ticker +void beat() +{ + LED_0 = !LED_0; +} + +// Position transmission ticker +void txpos() +{ + command("AT$GSND\n"); +} -void sw2interrupt(){ - pc.printf("Button 2 pressed, sending sigfox message (command is AT$SF=42 55 54 54 4f 4e 20 32 00 00 00 00,2,0)\n"); - modem.printf("AT$SF=42 55 54 54 4f 4e 20 32 00 00 00 00,2,0\n"); +void sw1interrupt() +{ + //command("AT$GPS=1,16,0,65535,1,1\n"); + if(updateinterval_s == 30) + { + position_update.detach(); + updateinterval_s = 600; // Updateinterval = 10 minutes + LED_3 = 1; LED_2 = 0; - wait(0.25); - // Flush the echo of the command: - while(modem.readable()) modem.getc(); - Button_tx.busy = true; - Button_tx.button = 2; -} + position_update.attach(&txpos, updateinterval_s); + } + else + { + position_update.detach(); + updateinterval_s = 30; // Updateinterval = 30 seconds + LED_3 = 0; + LED_2 = 1; + position_update.attach(&txpos, updateinterval_s); + } +} -int main() { - +void sw2interrupt() +{ + command("AT$GSND\n"); +} + +int main() +{ + wait(3); LED_0 = 1; LED_1 = 1; LED_2 = 1; - LED_3 = 1; + LED_3 = 0; hartbeat.attach(&beat, 0.5); - Button_tx.busy = false; - Button_tx.button = 0; + position_update.attach(&txpos, updateinterval_s); SW2.fall(&sw1interrupt); SW1.fall(&sw2interrupt); - char responsebuffer[2]; - char c; - while(1) { - if(pc.readable()) { - modem.putc(pc.getc()); - } - - if(modem.readable()) { - c = modem.getc(); - responsebuffer[0] = responsebuffer[1]; - responsebuffer[1] = c; - if(Button_tx.busy) - { - if(responsebuffer[0] == 'O' && responsebuffer[1] == 'K' ) - { - // Everything went fine, turn off the LED - Button_tx.busy = false; - if(Button_tx.button == 1) LED_1 = 1; - if(Button_tx.button == 2) LED_2 = 1; - } - } - pc.putc(c); + command("AT$GPS=1,16,0,65535,1,1\n"); + while(1) { + if(!commandogiven) { + if(pc.readable()) { + modem.putc(pc.getc()); + } + + if(modem.readable()) { + pc.putc(modem.getc()); + } + } else { + int c, i; + while ((c = modem.getc()) >= 0 && commandogiven && i < 10000) { + if ((char) c == *responsePtr) + responsePtr++; + else + responsePtr = response; + if (*responsePtr == 0) { + LED_1=1; + commandogiven = false; + } + i++; + } + if(commandogiven == true) { + commandogiven = false; + commandofailed = true; + LED_1=1; + } else { + commandofailed = false; + } + } } }