Quicksand micro-electronics / Mbed 2 deprecated QW-TEMP_GPS-NMEA

Dependencies:   QW_NMEA QW_Sensors mbed

Committer:
quicksand
Date:
Wed May 18 18:57:09 2016 +0000
Revision:
1:5fc0fcda6aae
Parent:
0:56230ba3cdeb
Changed default timing to 15 minutes between packets.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
quicksand 0:56230ba3cdeb 1 #include "mbed.h"
quicksand 0:56230ba3cdeb 2 #include "GPS.h"
quicksand 0:56230ba3cdeb 3 #include "LinearTempSensor.h"
quicksand 1:5fc0fcda6aae 4 #define updateinterval 900
quicksand 0:56230ba3cdeb 5
quicksand 0:56230ba3cdeb 6 DigitalOut LED_0 (PB_6);
quicksand 0:56230ba3cdeb 7 DigitalOut LED_1 (PA_7);
quicksand 0:56230ba3cdeb 8 DigitalOut LED_2 (PA_6);
quicksand 0:56230ba3cdeb 9 DigitalOut LED_3 (PA_5);
quicksand 0:56230ba3cdeb 10 InterruptIn SW1(PB_10);
quicksand 0:56230ba3cdeb 11 InterruptIn SW2(PA_8);
quicksand 0:56230ba3cdeb 12
quicksand 0:56230ba3cdeb 13 Ticker hartbeat;
quicksand 0:56230ba3cdeb 14 Ticker position_update;
quicksand 0:56230ba3cdeb 15
quicksand 0:56230ba3cdeb 16 //Virtual serial port over USB
quicksand 0:56230ba3cdeb 17 Serial pc(USBTX, USBRX);
quicksand 0:56230ba3cdeb 18 Serial modem(PA_9, PA_10);
quicksand 0:56230ba3cdeb 19 GPS gps(PA_9, PA_10);
quicksand 0:56230ba3cdeb 20
quicksand 0:56230ba3cdeb 21 /*Temperature sensor */
quicksand 0:56230ba3cdeb 22 LinearTempSensor sensor(PA_0, 10);
quicksand 0:56230ba3cdeb 23 signed char temperature; // Temperature in signed char.
quicksand 0:56230ba3cdeb 24
quicksand 0:56230ba3cdeb 25
quicksand 0:56230ba3cdeb 26 void sertmout();
quicksand 0:56230ba3cdeb 27 bool modem_command_check_ok(char * command);
quicksand 0:56230ba3cdeb 28 void modem_setup();
quicksand 0:56230ba3cdeb 29
quicksand 0:56230ba3cdeb 30 uint32_t txtimeout = 0;
quicksand 0:56230ba3cdeb 31
quicksand 0:56230ba3cdeb 32 bool ser_timeout = false;
quicksand 0:56230ba3cdeb 33
quicksand 0:56230ba3cdeb 34
quicksand 0:56230ba3cdeb 35 // Blinking LED Ticker
quicksand 0:56230ba3cdeb 36 void beat()
quicksand 0:56230ba3cdeb 37 {
quicksand 0:56230ba3cdeb 38 LED_0 = !LED_0;
quicksand 0:56230ba3cdeb 39 txtimeout++;
quicksand 0:56230ba3cdeb 40 }
quicksand 0:56230ba3cdeb 41
quicksand 0:56230ba3cdeb 42 void sw1interrupt()
quicksand 0:56230ba3cdeb 43 {
quicksand 0:56230ba3cdeb 44 txtimeout = updateinterval+1; // instantly send
quicksand 0:56230ba3cdeb 45 }
quicksand 0:56230ba3cdeb 46
quicksand 0:56230ba3cdeb 47 void sw2interrupt()
quicksand 0:56230ba3cdeb 48 {
quicksand 0:56230ba3cdeb 49 txtimeout = updateinterval+1; // instantly send
quicksand 0:56230ba3cdeb 50 }
quicksand 0:56230ba3cdeb 51
quicksand 0:56230ba3cdeb 52 int main()
quicksand 0:56230ba3cdeb 53 {
quicksand 0:56230ba3cdeb 54 wait(3);
quicksand 0:56230ba3cdeb 55 modem_setup();
quicksand 0:56230ba3cdeb 56 float vOut = sensor.Sense();
quicksand 0:56230ba3cdeb 57 pc.printf("\n\rMCP9700 reading: Vout: %.2f mV\n\r", vOut);
quicksand 0:56230ba3cdeb 58 LED_0 = 1;
quicksand 0:56230ba3cdeb 59 LED_1 = 1;
quicksand 0:56230ba3cdeb 60 LED_2 = 1;
quicksand 0:56230ba3cdeb 61 LED_3 = 1;
quicksand 0:56230ba3cdeb 62 hartbeat.attach(&beat, 1);
quicksand 0:56230ba3cdeb 63 SW2.fall(&sw1interrupt);
quicksand 0:56230ba3cdeb 64 SW1.fall(&sw2interrupt);
quicksand 0:56230ba3cdeb 65 while(!modem_command_check_ok("AT$GPS=1,16,0,65535,1,1\n")) pc.printf("Trying to start GPS...\r\n");
quicksand 0:56230ba3cdeb 66 pc.printf("GPS started!\r\n");
quicksand 0:56230ba3cdeb 67 while(1) {
quicksand 0:56230ba3cdeb 68 if(pc.readable()) {
quicksand 0:56230ba3cdeb 69 if (pc.getc() == 'a')
quicksand 0:56230ba3cdeb 70 modem_command_check_ok("AT$GSND\n");
quicksand 0:56230ba3cdeb 71 }
quicksand 0:56230ba3cdeb 72 int result = gps.sample();
quicksand 0:56230ba3cdeb 73 if(result != NO_LOCK) {
quicksand 0:56230ba3cdeb 74 if((result == RMC && gps.gprmc_status == 'A')) {
quicksand 0:56230ba3cdeb 75 if(txtimeout > updateinterval) {
quicksand 0:56230ba3cdeb 76 LED_3 = 0;
quicksand 0:56230ba3cdeb 77 hartbeat.detach();
quicksand 0:56230ba3cdeb 78 sensor.Sense();
quicksand 0:56230ba3cdeb 79 temperature = (signed char)rint(sensor.GetAverageTemp());
quicksand 0:56230ba3cdeb 80 pc.printf("\r\nGPRMC Fix: latitude: %f, longitude: %f Temperature: %d\r\n",gps.get_dec_latitude(),gps.get_dec_longitude(),temperature);
quicksand 0:56230ba3cdeb 81 char sfcommand[128];
quicksand 0:56230ba3cdeb 82 sprintf(sfcommand, "AT$SF=%02x%s,2,0\n", temperature & 0xff,gps.get_nmea_to_td()); // Remark & 0xff needed to limit the value to two bytes!
quicksand 0:56230ba3cdeb 83 modem_command_check_ok(sfcommand);
quicksand 0:56230ba3cdeb 84 txtimeout = 0;
quicksand 0:56230ba3cdeb 85 LED_3 = 1;
quicksand 0:56230ba3cdeb 86 hartbeat.attach(&beat, 1);
quicksand 0:56230ba3cdeb 87 }
quicksand 0:56230ba3cdeb 88 } else if(txtimeout > updateinterval+5) { // 5 seconds extra in case of no fix (why? -> we're only waiting for GPRMC messages and we may have just skipped one)
quicksand 0:56230ba3cdeb 89 LED_2 = 0;
quicksand 0:56230ba3cdeb 90 hartbeat.detach();
quicksand 0:56230ba3cdeb 91 sensor.Sense();
quicksand 0:56230ba3cdeb 92 temperature = (signed char)rint(sensor.GetAverageTemp());
quicksand 0:56230ba3cdeb 93 pc.printf("\r\nNo GPRMC Fix! (sending 0xffff... as position data) Temperature: %d\r\n",temperature);
quicksand 0:56230ba3cdeb 94 char sfcommand[128];
quicksand 0:56230ba3cdeb 95 sprintf(sfcommand, "AT$SF=%02x01010fffffffffffffffff,2,0\n", temperature & 0xff); // Remark & 0xff needed to limit the value to two bytes!
quicksand 0:56230ba3cdeb 96 modem_command_check_ok(sfcommand);
quicksand 0:56230ba3cdeb 97 txtimeout = 0;
quicksand 0:56230ba3cdeb 98 LED_2 = 1;
quicksand 0:56230ba3cdeb 99 hartbeat.attach(&beat, 1);
quicksand 0:56230ba3cdeb 100 }
quicksand 0:56230ba3cdeb 101 } else if(txtimeout > updateinterval+5) { // 5 seconds extra in case of no fix (why? -> we're only waiting for GPRMC messages and we may have just skipped one)
quicksand 0:56230ba3cdeb 102 LED_2 = 0;
quicksand 0:56230ba3cdeb 103 hartbeat.detach();
quicksand 0:56230ba3cdeb 104 sensor.Sense();
quicksand 0:56230ba3cdeb 105 temperature = (signed char)rint(sensor.GetAverageTemp());
quicksand 0:56230ba3cdeb 106 pc.printf("\r\nNo GPRMC Fix! (sending 0xffff... as position data) Temperature: %d\r\n",temperature);
quicksand 0:56230ba3cdeb 107 char sfcommand[128];
quicksand 0:56230ba3cdeb 108 sprintf(sfcommand, "AT$SF=%02x01010fffffffffffffffff,2,0\n", temperature & 0xff); // Remark & 0xff needed to limit the value to two bytes!
quicksand 0:56230ba3cdeb 109 modem_command_check_ok(sfcommand);
quicksand 0:56230ba3cdeb 110 txtimeout = 0;
quicksand 0:56230ba3cdeb 111 LED_2 = 1;
quicksand 0:56230ba3cdeb 112 hartbeat.attach(&beat, 1);
quicksand 0:56230ba3cdeb 113 }
quicksand 0:56230ba3cdeb 114 }
quicksand 0:56230ba3cdeb 115 }
quicksand 0:56230ba3cdeb 116
quicksand 0:56230ba3cdeb 117 void modem_setup()
quicksand 0:56230ba3cdeb 118 {
quicksand 0:56230ba3cdeb 119 /* Reset to factory defaults */
quicksand 0:56230ba3cdeb 120 if(modem_command_check_ok("AT&F")) {
quicksand 0:56230ba3cdeb 121 pc.printf("Factory reset succesfull\r\n");
quicksand 0:56230ba3cdeb 122 } else {
quicksand 0:56230ba3cdeb 123 pc.printf("Factory reset TD120x failed\r\n");
quicksand 0:56230ba3cdeb 124 }
quicksand 0:56230ba3cdeb 125 /* Disable local echo */
quicksand 0:56230ba3cdeb 126 modem.printf("ATE0\n");
quicksand 0:56230ba3cdeb 127 if(modem_command_check_ok("ATE0")) {
quicksand 0:56230ba3cdeb 128 pc.printf("Local echo disabled\r\n");
quicksand 0:56230ba3cdeb 129 }
quicksand 0:56230ba3cdeb 130 /* Write to mem */
quicksand 0:56230ba3cdeb 131 if(modem_command_check_ok("AT&W")) {
quicksand 0:56230ba3cdeb 132 pc.printf("Settings saved!\r\n");
quicksand 0:56230ba3cdeb 133 }
quicksand 0:56230ba3cdeb 134 }
quicksand 0:56230ba3cdeb 135
quicksand 0:56230ba3cdeb 136 /* ISR for serial timeout */
quicksand 0:56230ba3cdeb 137 void sertmout()
quicksand 0:56230ba3cdeb 138 {
quicksand 0:56230ba3cdeb 139 ser_timeout = true;
quicksand 0:56230ba3cdeb 140 }
quicksand 0:56230ba3cdeb 141
quicksand 0:56230ba3cdeb 142 bool modem_command_check_ok(char * command)
quicksand 0:56230ba3cdeb 143 {
quicksand 0:56230ba3cdeb 144 /* first clear serial data buffers */
quicksand 0:56230ba3cdeb 145 while(modem.readable()) modem.getc();
quicksand 0:56230ba3cdeb 146 /* Timeout for response of the modem */
quicksand 0:56230ba3cdeb 147 Timeout tmout;
quicksand 0:56230ba3cdeb 148 ser_timeout = false;
quicksand 0:56230ba3cdeb 149 /* Buffer for incoming data */
quicksand 0:56230ba3cdeb 150 char responsebuffer[6];
quicksand 0:56230ba3cdeb 151 /* Flag to set when we get 'OK' response */
quicksand 0:56230ba3cdeb 152 bool ok = false;
quicksand 0:56230ba3cdeb 153 bool error = false;
quicksand 0:56230ba3cdeb 154 /* Print command to TD120x */
quicksand 0:56230ba3cdeb 155 modem.printf(command);
quicksand 0:56230ba3cdeb 156 /* Newline to activate command */
quicksand 0:56230ba3cdeb 157 modem.printf("\n");
quicksand 0:56230ba3cdeb 158 /* Wait untill serial feedback, max 3 seconds before timeout */
quicksand 0:56230ba3cdeb 159 tmout.attach(&sertmout, 3.0);
quicksand 0:56230ba3cdeb 160 while(!modem.readable()&& ser_timeout == false);
quicksand 0:56230ba3cdeb 161 while(!ok && !ser_timeout && !error) {
quicksand 0:56230ba3cdeb 162 if(modem.readable()) {
quicksand 0:56230ba3cdeb 163 for(int i = 0; i < 5; i++) {
quicksand 0:56230ba3cdeb 164 responsebuffer[i] = responsebuffer[i+1];
quicksand 0:56230ba3cdeb 165 }
quicksand 0:56230ba3cdeb 166 responsebuffer[5] = modem.getc();
quicksand 0:56230ba3cdeb 167 if(responsebuffer[0] == '\r' && responsebuffer[1] == '\n' && responsebuffer[2] == 'O' && responsebuffer[3] == 'K' && responsebuffer[4] == '\r' && responsebuffer[5] == '\n' ) {
quicksand 0:56230ba3cdeb 168 ok = true;
quicksand 0:56230ba3cdeb 169 } else if(responsebuffer[0] == '\r' && responsebuffer[1] == '\n' && responsebuffer[2] == 'E' && responsebuffer[3] == 'R' && responsebuffer[4] == 'R' && responsebuffer[5] == 'O' ) {
quicksand 0:56230ba3cdeb 170 error = true;
quicksand 0:56230ba3cdeb 171 }
quicksand 0:56230ba3cdeb 172 }
quicksand 0:56230ba3cdeb 173 }
quicksand 0:56230ba3cdeb 174 tmout.detach();
quicksand 0:56230ba3cdeb 175 return ok;
quicksand 0:56230ba3cdeb 176 }