![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
:)
Diff: main.cpp
- Revision:
- 0:447ddbf579d9
- Child:
- 1:cfbdc934e8c6
diff -r 000000000000 -r 447ddbf579d9 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Mar 10 21:41:16 2017 +0000 @@ -0,0 +1,109 @@ +#include "mbed.h" + +#define MESS_LEN 100 // maximum message length +#define MAX_STR 20 +#define STR_LEN 40 + +Serial _gps(A0, A1); //tx,rx +Serial pc(SERIAL_TX,SERIAL_RX); +DigitalOut myled(LED1); + +char nmea[MESS_LEN] = {0xA0}; +char gp[MAX_STR][STR_LEN]; + + +void read_nmea(void); // read nmea message from gps module +int chop_message(void); // chop the nmea messeage +void present_array(void); // send a part of the available info to the laptop +void setNmeaMessages(const bool , const bool , const bool , const bool , const bool , const bool ); +void setUpdateRate(const uint8_t ); + +int main() { + printf("HERE!\n"); + _gps.baud(9600); + setUpdateRate(10); + setNmeaMessages(true,true,true,true,true,true); + + while (1) { + + read_nmea(); + chop_message(); + present_array(); + wait(1); + + } + +} + +//--------------------read nmea from GPS unit-------------------- +void read_nmea(void) { + _gps.scanf("%s,",nmea); + pc.printf("Raw message %s \n\r",nmea); // just for testing +} + +//---------------- chop the nmea message separated by comma's----------- +int chop_message(void) { + for (int k=0; k<MAX_STR; k++) { // just to make sure thet the char array is set to 0x00 + for (int l=0; l<STR_LEN; l++) { + gp[k][l]= 0x00; + }; + } + int strcnt=0; // string counter + int strpos=0; // position inside the string + for (int k=0; k < MESS_LEN; k++) { + if (nmea[k] == '*') { // detect end of message is found + gp[strcnt][strpos]= 0x00; // close the string with 0x00 + return 0; // the work is done, end of this function + } + if (nmea[k] == 0x2c) { // detect the comma + if (strpos == 0) { + gp[strcnt][0]= 'E'; // comma at position zero, string must be empty + gp[strcnt][1]= 'm'; // comma at position zero, string must be empty + gp[strcnt][2]= 'p'; // comma at position zero, string must be empty + gp[strcnt][3]= 't'; // comma at position zero, string must be empty + gp[strcnt][4]= 'y'; // comma at position zero, string must be empty + gp[strcnt][5]= 0x00; // comma at position zero, string must be empty + } else { + gp[strcnt][strpos]= 0x00; // end the previous string + } + strcnt += 1; // increment to the next string + strpos =0; // start at position zero + } else { + gp[strcnt][strpos]= nmea[k]; // add char to string + strpos += 1; + } + } + return 0; +} + +// --------------- Dump only $GPGGA on the screen------------------ +void present_array(void) { + if ((gp[0][2]=='P') and (gp[0][3]=='G') and (gp[0][4]=='G') and (gp[0][5]=='A')) { + pc.printf("Chop results "); + for (int k=0; k<MAX_STR; k++) { + pc.printf("r%d=%s ",k, gp[k]); + } + pc.printf("\n\r"); + } +} +//----------------Set Msg Command----------------------------- +void setNmeaMessages(const bool gga, const bool gsa, const bool gsv, const bool gll, const bool rmc, const bool vtg) { + char cmd[16] = { + 0xA0, 0xA1, 0x00, 0x09, + 0x08, gga, gsa, gsv, gll, rmc, vtg, 0x00, 0x01, + 0x00, 0x0D, 0x0A + }; + for(int i = 4; i < 13; i++) cmd[13] ^= cmd[i]; + for(int i = 0; i < 16; i++) _gps.putc(cmd[i]); +} + +//----------------Set Update Rate----------------------------- +void setUpdateRate(const uint8_t rate) { + char cmd[10] = { + 0xA0, 0xA1, 0x00, 0x03, + 0x0E, rate, 0x01, + 0x00, 0x0D, 0x0A + }; + for(int i = 4; i < 7; i++) cmd[7] ^= cmd[i]; + for(int i = 0; i < 10; i++) _gps.putc(cmd[i]); +} \ No newline at end of file