Peter Foden
/
GPS_Logger_01
main.cpp@0:2f1a2ad434d7, 2009-09-30 (annotated)
- Committer:
- prf
- Date:
- Wed Sep 30 09:32:22 2009 +0000
- Revision:
- 0:2f1a2ad434d7
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
prf | 0:2f1a2ad434d7 | 1 | // GPS synchronised data logger |
prf | 0:2f1a2ad434d7 | 2 | // Uses the $GPRMC string for time and date |
prf | 0:2f1a2ad434d7 | 3 | // synchronisation |
prf | 0:2f1a2ad434d7 | 4 | // Code derived from Arduino GPS examples |
prf | 0:2f1a2ad434d7 | 5 | // and the MBED GPS library |
prf | 0:2f1a2ad434d7 | 6 | // http://www.arduino.cc/ |
prf | 0:2f1a2ad434d7 | 7 | // Thanks Lady Ada and others! |
prf | 0:2f1a2ad434d7 | 8 | |
prf | 0:2f1a2ad434d7 | 9 | #include "mbed.h" |
prf | 0:2f1a2ad434d7 | 10 | // Commands for Globalsat EM-406A GPS |
prf | 0:2f1a2ad434d7 | 11 | // to turn on or off data strings |
prf | 0:2f1a2ad434d7 | 12 | #define RMC_ON "$PSRF103,4,0,1,1*21\r\n" |
prf | 0:2f1a2ad434d7 | 13 | #define RMC_OFF "$PSRF103,4,0,0,1*20\r\n" |
prf | 0:2f1a2ad434d7 | 14 | #define GGA_ON "$PSRF103,0,0,1,1*25\r\n" |
prf | 0:2f1a2ad434d7 | 15 | #define GGA_OFF "$PSRF103,0,0,0,1*24\r\n" |
prf | 0:2f1a2ad434d7 | 16 | #define GSA_ON "$PSRF103,2,0,1,1*27\r\n" |
prf | 0:2f1a2ad434d7 | 17 | #define GSA_OFF "$PSRF103,2,0,0,1*26\r\n" |
prf | 0:2f1a2ad434d7 | 18 | #define GSV_ON "$PSRF103,3,0,1,1*26\r\n" |
prf | 0:2f1a2ad434d7 | 19 | #define GSV_OFF "$PSRF103,3,0,0,1*27\r\n" |
prf | 0:2f1a2ad434d7 | 20 | #define WAAS_ON "$PSRF151,1*3F\r\n" |
prf | 0:2f1a2ad434d7 | 21 | #define WAAS_OFF "$PSRF151,0*3E\r\n" |
prf | 0:2f1a2ad434d7 | 22 | |
prf | 0:2f1a2ad434d7 | 23 | // Set up serial ports and LEDs |
prf | 0:2f1a2ad434d7 | 24 | // MBED USB port used for console debug messages |
prf | 0:2f1a2ad434d7 | 25 | // EM-406A GPS on Pin9 and Pin10 |
prf | 0:2f1a2ad434d7 | 26 | Serial pc(USBTX, USBRX); // tx, rx - Default 9600 baud |
prf | 0:2f1a2ad434d7 | 27 | Serial gps(p9, p10); // tx, rx - 4800 baud required |
prf | 0:2f1a2ad434d7 | 28 | DigitalOut led1(LED1); // Seconds LED |
prf | 0:2f1a2ad434d7 | 29 | DigitalOut led4(LED4); // Data sent LED |
prf | 0:2f1a2ad434d7 | 30 | |
prf | 0:2f1a2ad434d7 | 31 | //char buffidx; |
prf | 0:2f1a2ad434d7 | 32 | char msg[256]; // GPS data buffer |
prf | 0:2f1a2ad434d7 | 33 | char status; // GPS status 'V' = Not locked; 'A' = Locked |
prf | 0:2f1a2ad434d7 | 34 | char *parseptr; // Pointer for parsing GPS message |
prf | 0:2f1a2ad434d7 | 35 | char time_buff[7] = "000000"; |
prf | 0:2f1a2ad434d7 | 36 | char date_buff[7] = "000000"; |
prf | 0:2f1a2ad434d7 | 37 | char sens_buff[7] = "123456"; |
prf | 0:2f1a2ad434d7 | 38 | |
prf | 0:2f1a2ad434d7 | 39 | // Switch off all but $GPRMC string |
prf | 0:2f1a2ad434d7 | 40 | void setgps() { |
prf | 0:2f1a2ad434d7 | 41 | gps.printf(RMC_ON); |
prf | 0:2f1a2ad434d7 | 42 | gps.printf(GGA_OFF); |
prf | 0:2f1a2ad434d7 | 43 | gps.printf(GSA_OFF); |
prf | 0:2f1a2ad434d7 | 44 | gps.printf(GSV_OFF); |
prf | 0:2f1a2ad434d7 | 45 | gps.printf(WAAS_OFF); |
prf | 0:2f1a2ad434d7 | 46 | return; |
prf | 0:2f1a2ad434d7 | 47 | } |
prf | 0:2f1a2ad434d7 | 48 | // Get line of data from GPS |
prf | 0:2f1a2ad434d7 | 49 | void getline() { |
prf | 0:2f1a2ad434d7 | 50 | while (gps.getc() != '$'); // Wait for start of line |
prf | 0:2f1a2ad434d7 | 51 | for (int i=0; i<256; i++) { |
prf | 0:2f1a2ad434d7 | 52 | msg[i] = gps.getc(); |
prf | 0:2f1a2ad434d7 | 53 | // pc.putc(msg[i]); |
prf | 0:2f1a2ad434d7 | 54 | if (msg[i] == '\r') { |
prf | 0:2f1a2ad434d7 | 55 | msg[i] = 0; |
prf | 0:2f1a2ad434d7 | 56 | return; |
prf | 0:2f1a2ad434d7 | 57 | } |
prf | 0:2f1a2ad434d7 | 58 | } |
prf | 0:2f1a2ad434d7 | 59 | } |
prf | 0:2f1a2ad434d7 | 60 | // Flash LED 1 |
prf | 0:2f1a2ad434d7 | 61 | void flashled1(void) { |
prf | 0:2f1a2ad434d7 | 62 | led1 = 1; |
prf | 0:2f1a2ad434d7 | 63 | wait(0.05); |
prf | 0:2f1a2ad434d7 | 64 | led1 = 0; |
prf | 0:2f1a2ad434d7 | 65 | wait(0.05); |
prf | 0:2f1a2ad434d7 | 66 | } |
prf | 0:2f1a2ad434d7 | 67 | // Flash LED4 |
prf | 0:2f1a2ad434d7 | 68 | void flashled4(void) { |
prf | 0:2f1a2ad434d7 | 69 | led4 = 1; |
prf | 0:2f1a2ad434d7 | 70 | wait(0.1); |
prf | 0:2f1a2ad434d7 | 71 | led4 = 0; |
prf | 0:2f1a2ad434d7 | 72 | wait(0.1); |
prf | 0:2f1a2ad434d7 | 73 | } |
prf | 0:2f1a2ad434d7 | 74 | void read_sensor() { |
prf | 0:2f1a2ad434d7 | 75 | // Insert code here to read sensor |
prf | 0:2f1a2ad434d7 | 76 | // and store data in sens_buff[] |
prf | 0:2f1a2ad434d7 | 77 | } |
prf | 0:2f1a2ad434d7 | 78 | void send_data() { |
prf | 0:2f1a2ad434d7 | 79 | // Insert code to send data |
prf | 0:2f1a2ad434d7 | 80 | pc.printf(sens_buff); |
prf | 0:2f1a2ad434d7 | 81 | pc.printf("\r\n"); |
prf | 0:2f1a2ad434d7 | 82 | } |
prf | 0:2f1a2ad434d7 | 83 | |
prf | 0:2f1a2ad434d7 | 84 | int main(void) { |
prf | 0:2f1a2ad434d7 | 85 | gps.baud(4800); // NB GPS baud rate 4800 |
prf | 0:2f1a2ad434d7 | 86 | pc.printf("\n\rGPS Logger Running!...\n\r"); |
prf | 0:2f1a2ad434d7 | 87 | setgps(); |
prf | 0:2f1a2ad434d7 | 88 | while (1) { |
prf | 0:2f1a2ad434d7 | 89 | getline(); |
prf | 0:2f1a2ad434d7 | 90 | if (strncmp(msg, "GPRMC",5) == 0) { |
prf | 0:2f1a2ad434d7 | 91 | // Put the time into the time array |
prf | 0:2f1a2ad434d7 | 92 | parseptr = msg+6; |
prf | 0:2f1a2ad434d7 | 93 | for (int i = 0; i < 6; i++) { |
prf | 0:2f1a2ad434d7 | 94 | time_buff[i] = parseptr[i]; |
prf | 0:2f1a2ad434d7 | 95 | } |
prf | 0:2f1a2ad434d7 | 96 | // Skip through commas in the data string |
prf | 0:2f1a2ad434d7 | 97 | // Firstly to get to the status flag and |
prf | 0:2f1a2ad434d7 | 98 | // then to pick up the date |
prf | 0:2f1a2ad434d7 | 99 | parseptr = strchr(parseptr, ',')+1; |
prf | 0:2f1a2ad434d7 | 100 | status = parseptr[0]; |
prf | 0:2f1a2ad434d7 | 101 | parseptr = strchr(parseptr, ',')+1; |
prf | 0:2f1a2ad434d7 | 102 | parseptr = strchr(parseptr, ',')+1; |
prf | 0:2f1a2ad434d7 | 103 | parseptr = strchr(parseptr, ',')+1; |
prf | 0:2f1a2ad434d7 | 104 | parseptr = strchr(parseptr, ',')+1; |
prf | 0:2f1a2ad434d7 | 105 | parseptr = strchr(parseptr, ',')+1; |
prf | 0:2f1a2ad434d7 | 106 | parseptr = strchr(parseptr, ',')+1; |
prf | 0:2f1a2ad434d7 | 107 | parseptr = strchr(parseptr, ',')+1; |
prf | 0:2f1a2ad434d7 | 108 | // Put the date into the date array |
prf | 0:2f1a2ad434d7 | 109 | for (int i = 0; i < 6; i++) { |
prf | 0:2f1a2ad434d7 | 110 | date_buff[i] = parseptr[i]; |
prf | 0:2f1a2ad434d7 | 111 | } |
prf | 0:2f1a2ad434d7 | 112 | // Every second output time, date and lock status |
prf | 0:2f1a2ad434d7 | 113 | // to the console and flash LED1 |
prf | 0:2f1a2ad434d7 | 114 | pc.printf(time_buff); |
prf | 0:2f1a2ad434d7 | 115 | pc.printf(","); |
prf | 0:2f1a2ad434d7 | 116 | pc.printf(date_buff); |
prf | 0:2f1a2ad434d7 | 117 | pc.printf(","); |
prf | 0:2f1a2ad434d7 | 118 | pc.putc(status); |
prf | 0:2f1a2ad434d7 | 119 | pc.printf("\r\n"); |
prf | 0:2f1a2ad434d7 | 120 | flashled1(); |
prf | 0:2f1a2ad434d7 | 121 | // Take a sensor reading every minute |
prf | 0:2f1a2ad434d7 | 122 | // ie is the time hh:mm:00 |
prf | 0:2f1a2ad434d7 | 123 | if (time_buff[4] == 0x30 && time_buff[5] == 0x30) { |
prf | 0:2f1a2ad434d7 | 124 | pc.printf("\r\nSensor Reading!\r\n"); |
prf | 0:2f1a2ad434d7 | 125 | read_sensor(); |
prf | 0:2f1a2ad434d7 | 126 | pc.printf("Sending: "); |
prf | 0:2f1a2ad434d7 | 127 | send_data(); |
prf | 0:2f1a2ad434d7 | 128 | pc.printf("\r\n"); |
prf | 0:2f1a2ad434d7 | 129 | flashled4(); |
prf | 0:2f1a2ad434d7 | 130 | |
prf | 0:2f1a2ad434d7 | 131 | } |
prf | 0:2f1a2ad434d7 | 132 | } |
prf | 0:2f1a2ad434d7 | 133 | } |
prf | 0:2f1a2ad434d7 | 134 | } |
prf | 0:2f1a2ad434d7 | 135 |