Test software for SatChat prototype hardware Platform - MAX32630FTHR

Dependencies:   USBDevice max32630fthr

Committer:
koziniec
Date:
Mon Jul 03 16:50:59 2017 +0000
Revision:
14:8ff04e82bda2
Parent:
13:ff0b39177386
Child:
15:7d75ecaeabdb
green led if a gps fix is obtained (time is set); red led if gps times out.; blue led if waiting for gps and flashing if time but no fix obtained; ; code in main needs some proper switch input and calls to rockblock routines but so far ok.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
koziniec 0:59c04ca89ae2 1
koziniec 0:59c04ca89ae2 2 #include "mbed.h"
koziniec 0:59c04ca89ae2 3 #include "max32630fthr.h"
koziniec 1:b8cb82927f33 4 #include <stdbool.h>
koziniec 13:ff0b39177386 5 #define ON 0
koziniec 13:ff0b39177386 6 #define OFF 1
koziniec 13:ff0b39177386 7 #define EXIT_SUCCESS 0
koziniec 13:ff0b39177386 8 #define EXIT_FAILURE 1
koziniec 14:8ff04e82bda2 9 const int GPS_TIMEOUT=180; //Wait three minutes maximum for GPS.
koziniec 14:8ff04e82bda2 10
koziniec 0:59c04ca89ae2 11 Serial pc(USBTX, USBRX);
koziniec 1:b8cb82927f33 12 Serial gps(P5_3, P5_4, 9600);
koziniec 0:59c04ca89ae2 13 I2C i2c(P5_7,P6_0); // SDA, SCL
koziniec 0:59c04ca89ae2 14
koziniec 1:b8cb82927f33 15 DigitalOut red_led(LED1,1);
koziniec 1:b8cb82927f33 16 DigitalOut green_led(LED2,1);
koziniec 14:8ff04e82bda2 17 DigitalOut gps_led(LED3,1); //Blue
koziniec 9:b8a60ade343e 18 char gpsfix_last_utc_time[11] = {0};
koziniec 9:b8a60ade343e 19 char gpsfix_last_utc_date[7] = {0};
koziniec 9:b8a60ade343e 20 char gpsfix_longtitude[12] = {0};
koziniec 9:b8a60ade343e 21 char gpsfix_latitude[12] = {0};
koziniec 9:b8a60ade343e 22 char gpsfix_speed[8] = {0}; //Set but not used
koziniec 9:b8a60ade343e 23 char gpsfix_course[7] = {0}; //Set but not used
koziniec 9:b8a60ade343e 24 char gpsfix_variation[7] = {0}; //Set but not used
koziniec 9:b8a60ade343e 25 char gpsfix_mag_var_ew[1] = {0};//Set but not used
koziniec 11:a9c16968e7f6 26 char gpsfix_ns = 0;
koziniec 11:a9c16968e7f6 27 char gpsfix_ew = 0;
koziniec 13:ff0b39177386 28 bool gps_data_present = false; //If this is false we can't even use stale GPS data.
koziniec 9:b8a60ade343e 29
koziniec 1:b8cb82927f33 30 void gps_power(bool state)
koziniec 1:b8cb82927f33 31 {
koziniec 1:b8cb82927f33 32 char data[2];
koziniec 1:b8cb82927f33 33 data[0] = 0x16; //MAX14690 LDO3cfg register
koziniec 13:ff0b39177386 34 if (state == ON) {
koziniec 1:b8cb82927f33 35 data[1] = 0xE2; //Enable LDO3
koziniec 14:8ff04e82bda2 36 i2c.write( 0x50, data, 2 );
koziniec 14:8ff04e82bda2 37 gps_led=ON;
koziniec 14:8ff04e82bda2 38 } else {
koziniec 14:8ff04e82bda2 39 data[1] = 0xE0; //Disable LDO3
koziniec 14:8ff04e82bda2 40 i2c.write( 0x50, data, 2 );
koziniec 14:8ff04e82bda2 41 gps_led=OFF;
koziniec 14:8ff04e82bda2 42 while (gps.readable()) {
koziniec 14:8ff04e82bda2 43 char dummy = gps.getc(); //Empty serial buffer because overflows reveal MBED bugs :-(
koziniec 14:8ff04e82bda2 44 }
koziniec 1:b8cb82927f33 45 }
koziniec 1:b8cb82927f33 46 }
koziniec 1:b8cb82927f33 47
koziniec 13:ff0b39177386 48 int get_epoch_from_last_gps_time(void)
koziniec 12:a895e3581542 49 {
koziniec 12:a895e3581542 50 struct tm t;
koziniec 13:ff0b39177386 51 time_t epoch;
koziniec 12:a895e3581542 52 char two_char_str[3] = {0};
koziniec 12:a895e3581542 53 memcpy(two_char_str, gpsfix_last_utc_date+4, 2);
koziniec 12:a895e3581542 54 t.tm_year = atoi(two_char_str)+100; //Years since 1900
koziniec 12:a895e3581542 55 memcpy(two_char_str, gpsfix_last_utc_date+2, 2);
koziniec 12:a895e3581542 56 t.tm_mon = atoi(two_char_str)-1; // Month, 0 - jan gpsfix_last_utc_date
koziniec 12:a895e3581542 57 memcpy(two_char_str, gpsfix_last_utc_date, 2);
koziniec 12:a895e3581542 58 t.tm_mday = atoi(two_char_str); // Day of the month gpsfix_last_utc_date
koziniec 12:a895e3581542 59 memcpy(two_char_str, gpsfix_last_utc_time, 2);
koziniec 12:a895e3581542 60 t.tm_hour = atoi(two_char_str);
koziniec 12:a895e3581542 61 memcpy(two_char_str, gpsfix_last_utc_time+2, 2);
koziniec 12:a895e3581542 62 t.tm_min = atoi(two_char_str);
koziniec 13:ff0b39177386 63 memcpy(two_char_str, gpsfix_last_utc_time+4, 2);
koziniec 12:a895e3581542 64 t.tm_sec = atoi(two_char_str);
koziniec 12:a895e3581542 65 t.tm_isdst = 0; // Is DST on? 1 = yes, 0 = no, -1 = unknown
koziniec 13:ff0b39177386 66 epoch = mktime(&t);
koziniec 13:ff0b39177386 67 return epoch;
koziniec 12:a895e3581542 68 }
koziniec 12:a895e3581542 69
koziniec 13:ff0b39177386 70 int gps_update(void)
koziniec 1:b8cb82927f33 71 {
koziniec 13:ff0b39177386 72 gps_power(ON);
koziniec 13:ff0b39177386 73 time_t gps_on_time = time(NULL); //Start time for GPS timeout calculation.
koziniec 13:ff0b39177386 74 bool wait_for_fix = true; //Set this to false once a fix is obtained.
koziniec 13:ff0b39177386 75 while (wait_for_fix) { //Keep monitoring the GPS until we get a fix.
koziniec 14:8ff04e82bda2 76 if ((time(NULL) - gps_on_time) > GPS_TIMEOUT) {
koziniec 13:ff0b39177386 77 gps_power(OFF);
koziniec 13:ff0b39177386 78 return EXIT_FAILURE; //Return an error if the GPS takes too long for a fix.
koziniec 13:ff0b39177386 79 }
koziniec 7:4218bb385ca4 80 int checksum = 0;
koziniec 13:ff0b39177386 81 char nmea_sentence[83] = {0}; //NMEA length max is 82 + 1 terminator. Fill with NULL terminators to save doing it later.
koziniec 8:b4a6c632c809 82 while (gps.getc()!='$'); //wait for start of sentence
koziniec 1:b8cb82927f33 83 int nmea_index = 0;
koziniec 7:4218bb385ca4 84 nmea_sentence[nmea_index] = '$'; //Manually insert the '$' because we don't want it included in the checksum loop
koziniec 8:b4a6c632c809 85 char nmea_char = gps.getc(); //get sentence first char from GPS
koziniec 8:b4a6c632c809 86 while (nmea_char != '*') { //Loop building sentence and calc'ing CS until *
koziniec 9:b8a60ade343e 87 checksum ^= nmea_char; //Calc checksum as we read sentence
koziniec 7:4218bb385ca4 88 if ((nmea_sentence[nmea_index] == ',')&&(nmea_char == ',')) {
koziniec 8:b4a6c632c809 89 nmea_sentence[++nmea_index] = ' '; //Pad consecutive comma with a space to make it possible to use strtok with empty values
koziniec 3:1dff075c1c88 90 }
koziniec 7:4218bb385ca4 91 nmea_sentence[++nmea_index] = nmea_char; //build the sentence with the next character
koziniec 13:ff0b39177386 92 if (nmea_index > 81) {
koziniec 13:ff0b39177386 93 nmea_index=81; //Don't overflow sentence buffer
koziniec 1:b8cb82927f33 94 }
koziniec 7:4218bb385ca4 95 nmea_char = gps.getc(); //get next char from GPS
koziniec 1:b8cb82927f33 96 }
koziniec 13:ff0b39177386 97 //Last character was the '*' so next two are CS
koziniec 8:b4a6c632c809 98 char hex_checksum[3] = {0};
koziniec 8:b4a6c632c809 99 hex_checksum[0] = gps.getc();
koziniec 8:b4a6c632c809 100 hex_checksum[1] = gps.getc();
koziniec 13:ff0b39177386 101 if (checksum == (int)strtol(hex_checksum, NULL, 16) ) { //Compare calc and read checksums.
koziniec 13:ff0b39177386 102
koziniec 9:b8a60ade343e 103 //Valid sentence so check if it's a GPRMC
koziniec 9:b8a60ade343e 104 const char gprmc[7] = "$GPRMC";
koziniec 9:b8a60ade343e 105 char *token;
koziniec 9:b8a60ade343e 106 token = strtok(nmea_sentence, ",");
koziniec 9:b8a60ade343e 107 if (strcmp(token,gprmc) == 0) { //GPRMC ?
koziniec 13:ff0b39177386 108 //pc.printf( " %s\n\r", token ); //Get the time
koziniec 9:b8a60ade343e 109 if (token != NULL) {
koziniec 9:b8a60ade343e 110 token = strtok(NULL, ",");
koziniec 13:ff0b39177386 111 if (*token != 32) { //If there is a time present (anything but a space), record it.
koziniec 13:ff0b39177386 112 //pc.printf("Time: %s\n\r",token);
koziniec 14:8ff04e82bda2 113 gps_led =! gps_led; //Flash blue LED
koziniec 11:a9c16968e7f6 114 memcpy(gpsfix_last_utc_time, token, sizeof gpsfix_last_utc_time - 1);
koziniec 11:a9c16968e7f6 115 }
koziniec 9:b8a60ade343e 116 }
koziniec 9:b8a60ade343e 117 if (token != NULL) {
koziniec 9:b8a60ade343e 118 token = strtok(NULL, ",");
koziniec 13:ff0b39177386 119 /* if (*token == 'V') {
koziniec 10:349d4fa9037f 120 pc.printf("VOID");
koziniec 13:ff0b39177386 121 } */
koziniec 13:ff0b39177386 122 }
koziniec 12:a895e3581542 123 if (*token == 'A') { //Is this an 'A'ctive (valid) fix?
koziniec 10:349d4fa9037f 124 pc.printf("Got a fix\n\r");
koziniec 13:ff0b39177386 125 gps_power(OFF); //Yes - No need for GPS now
koziniec 12:a895e3581542 126 wait_for_fix = false; //Stop looping now we have a fix.
koziniec 10:349d4fa9037f 127 if (token != NULL) {
koziniec 10:349d4fa9037f 128 token = strtok(NULL, ",");
koziniec 11:a9c16968e7f6 129 //pc.printf("Latitude: %s\n\r",token);
koziniec 11:a9c16968e7f6 130 memcpy(gpsfix_latitude, token, sizeof gpsfix_latitude - 1);
koziniec 10:349d4fa9037f 131 }
koziniec 10:349d4fa9037f 132 if (token != NULL) {
koziniec 10:349d4fa9037f 133 token = strtok(NULL, ",");
koziniec 11:a9c16968e7f6 134 //pc.printf("North/South: %s\n\r",token);
koziniec 11:a9c16968e7f6 135 gpsfix_ns = *token;
koziniec 10:349d4fa9037f 136 }
koziniec 10:349d4fa9037f 137 if (token != NULL) {
koziniec 10:349d4fa9037f 138 token = strtok(NULL, ",");
koziniec 12:a895e3581542 139 //pc.printf("Longitude: %s\n\r",token);
koziniec 11:a9c16968e7f6 140 memcpy(gpsfix_longtitude, token, sizeof gpsfix_longtitude - 1);
koziniec 10:349d4fa9037f 141 }
koziniec 10:349d4fa9037f 142 if (token != NULL) {
koziniec 10:349d4fa9037f 143 token = strtok(NULL, ",");
koziniec 12:a895e3581542 144 //pc.printf("East/West: %s\n\r",token);
koziniec 11:a9c16968e7f6 145 gpsfix_ew = *token;
koziniec 10:349d4fa9037f 146 }
koziniec 10:349d4fa9037f 147 if (token != NULL) {
koziniec 10:349d4fa9037f 148 token = strtok(NULL, ",");
koziniec 13:ff0b39177386 149 pc.printf("Speed in knots: %s\n\r",token);
koziniec 10:349d4fa9037f 150 }
koziniec 10:349d4fa9037f 151 if (token != NULL) {
koziniec 10:349d4fa9037f 152 token = strtok(NULL, ",");
koziniec 11:a9c16968e7f6 153 //pc.printf("True course: %s\n\r",token);
koziniec 10:349d4fa9037f 154 }
koziniec 10:349d4fa9037f 155 if (token != NULL) {
koziniec 10:349d4fa9037f 156 token = strtok(NULL, ",");
koziniec 11:a9c16968e7f6 157 //pc.printf("Date: %s\n\r",token);
koziniec 11:a9c16968e7f6 158 memcpy(gpsfix_last_utc_date, token, sizeof gpsfix_last_utc_date - 1);
koziniec 10:349d4fa9037f 159 }
koziniec 10:349d4fa9037f 160 if (token != NULL) {
koziniec 10:349d4fa9037f 161 token = strtok(NULL, ",");
koziniec 11:a9c16968e7f6 162 //pc.printf("Variation: %s\n\r",token);
koziniec 10:349d4fa9037f 163 }
koziniec 10:349d4fa9037f 164 if (token != NULL) {
koziniec 10:349d4fa9037f 165 token = strtok(NULL, ",");
koziniec 11:a9c16968e7f6 166 //pc.printf("Variation East/West: %s\n\r",token);
koziniec 10:349d4fa9037f 167 }
koziniec 10:349d4fa9037f 168 }
koziniec 9:b8a60ade343e 169 }
koziniec 8:b4a6c632c809 170 }
koziniec 1:b8cb82927f33 171 }
koziniec 13:ff0b39177386 172 return EXIT_SUCCESS;
koziniec 12:a895e3581542 173 }
koziniec 1:b8cb82927f33 174
koziniec 13:ff0b39177386 175 main()
koziniec 1:b8cb82927f33 176 {
koziniec 1:b8cb82927f33 177 char data[2];
koziniec 1:b8cb82927f33 178 data[0] = 0x1A; //MAX14690 BootCfg register
koziniec 1:b8cb82927f33 179 data[1] = 0x30; //Always-On Mode, off state via PWR_OFF_CMD
koziniec 0:59c04ca89ae2 180 i2c.write( 0x50, data, 2 );
koziniec 0:59c04ca89ae2 181
koziniec 1:b8cb82927f33 182 data[0] = 0x17; //MAX14690 LDO3Vset register
koziniec 0:59c04ca89ae2 183 data[1] = 0x19; //3.3V
koziniec 0:59c04ca89ae2 184 i2c.write( 0x50, data, 2 );
koziniec 13:ff0b39177386 185 gps_power(OFF);
koziniec 6:af25f19eb4e6 186 wait(2);
koziniec 13:ff0b39177386 187 pc.printf("\n\n\rOpen EPIRB - Simple mode\n\r");
koziniec 13:ff0b39177386 188 pc.printf("Press and hold both side buttons to signal rescue needed\n\r");
koziniec 13:ff0b39177386 189 pc.printf("Full functionality will start in:");
koziniec 13:ff0b39177386 190 for (int i=9; i > 0; i--) {
koziniec 13:ff0b39177386 191 time_t seconds = time(NULL); //get current epoch
koziniec 13:ff0b39177386 192 pc.printf("%d",i);
koziniec 13:ff0b39177386 193 while(time(NULL) - seconds < 1) {
koziniec 13:ff0b39177386 194 if (true/*button_combination()==SOS_PRESSED*/) {
koziniec 13:ff0b39177386 195 //do the emergency code
koziniec 13:ff0b39177386 196 if (gps_update()==EXIT_SUCCESS) {
koziniec 13:ff0b39177386 197 gps_data_present = true;
koziniec 13:ff0b39177386 198 int gps_epoch = get_epoch_from_last_gps_time();
koziniec 13:ff0b39177386 199 set_time(gps_epoch);
koziniec 13:ff0b39177386 200 pc.printf("Got a GPS fix and time.\n\r");
koziniec 13:ff0b39177386 201 pc.printf("Sending SOS in 10 seconds");
koziniec 13:ff0b39177386 202 green_led=ON;
koziniec 13:ff0b39177386 203 } else {
koziniec 13:ff0b39177386 204 pc.printf("\n\rGPS timed out and we have no existing fix.\n\r");
koziniec 13:ff0b39177386 205 pc.printf("We can send an Iridium packet but coordinates are rough.\n\r");
koziniec 14:8ff04e82bda2 206 pc.printf("Sending SOS in 10 seconds");
koziniec 14:8ff04e82bda2 207 red_led=ON;
koziniec 13:ff0b39177386 208 }
koziniec 13:ff0b39177386 209 while(true) {}; //STOP HERE
koziniec 13:ff0b39177386 210 }
koziniec 13:ff0b39177386 211 }
koziniec 13:ff0b39177386 212 pc.printf("\b"); //Backspace
koziniec 0:59c04ca89ae2 213 }
koziniec 13:ff0b39177386 214 // normal functionality lives here
koziniec 13:ff0b39177386 215 pc.printf("\n\rStarting normal operation\n\r");
koziniec 13:ff0b39177386 216 /*
koziniec 13:ff0b39177386 217 if (true) { //Temp simulation
koziniec 13:ff0b39177386 218 while (1) {
koziniec 13:ff0b39177386 219 if (gps_update()==EXIT_SUCCESS) {
koziniec 13:ff0b39177386 220 gps_data_present = true;
koziniec 13:ff0b39177386 221 int gps_epoch = get_epoch_from_last_gps_time();
koziniec 13:ff0b39177386 222 set_time(gps_epoch);
koziniec 13:ff0b39177386 223 pc.printf("Got a GPS fix and time.\n\r");
koziniec 13:ff0b39177386 224 } else {
koziniec 13:ff0b39177386 225 pc.printf("GPS timed out and we have no existing fix.\n\r");
koziniec 13:ff0b39177386 226 pc.printf("We can send an Iridium packet but coordinates are rough.\n\r");
koziniec 13:ff0b39177386 227 }
koziniec 13:ff0b39177386 228 time_t seconds = time(NULL);
koziniec 13:ff0b39177386 229 //printf("Time as a basic string = %s", ctime(&seconds));
koziniec 13:ff0b39177386 230 wait(60);
koziniec 13:ff0b39177386 231 seconds = time(NULL);
koziniec 13:ff0b39177386 232
koziniec 13:ff0b39177386 233 wait(33);
koziniec 13:ff0b39177386 234 seconds = time(NULL);
koziniec 13:ff0b39177386 235 printf("Time as a basic string = %s", ctime(&seconds));
koziniec 13:ff0b39177386 236 wait(60);
koziniec 13:ff0b39177386 237 } */
koziniec 13:ff0b39177386 238 }
koziniec 0:59c04ca89ae2 239
koziniec 0:59c04ca89ae2 240
koziniec 7:4218bb385ca4 241
koziniec 7:4218bb385ca4 242
koziniec 7:4218bb385ca4 243
koziniec 0:59c04ca89ae2 244
koziniec 7:4218bb385ca4 245
koziniec 0:59c04ca89ae2 246
koziniec 7:4218bb385ca4 247