Test software for SatChat prototype hardware Platform - MAX32630FTHR

Dependencies:   USBDevice max32630fthr

Committer:
koziniec
Date:
Mon Jul 03 15:46:51 2017 +0000
Revision:
13:ff0b39177386
Parent:
12:a895e3581542
Child:
14:8ff04e82bda2
Not fully tested but the start of the BLACK code framework.; Commit before moving the buffer clearing code to GPS(OFF)

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