Test software for SatChat prototype hardware Platform - MAX32630FTHR

Dependencies:   USBDevice max32630fthr

Committer:
koziniec
Date:
Sun Jul 02 13:37:27 2017 +0000
Revision:
12:a895e3581542
Parent:
11:a9c16968e7f6
Child:
13:ff0b39177386
Yay!  Epoch sets from GPS :-); GPS routine largely done.  Blocks until a fix is obtained and then returns after setting values in global variables.; ; Need to tidy up (remove) printf.; Add some meaningful LED feedback instead;

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 1:b8cb82927f33 5 #define on 1
koziniec 1:b8cb82927f33 6 #define off 0
koziniec 1:b8cb82927f33 7
koziniec 0:59c04ca89ae2 8 Serial pc(USBTX, USBRX);
koziniec 1:b8cb82927f33 9 Serial gps(P5_3, P5_4, 9600);
koziniec 0:59c04ca89ae2 10 I2C i2c(P5_7,P6_0); // SDA, SCL
koziniec 0:59c04ca89ae2 11
koziniec 1:b8cb82927f33 12 DigitalOut red_led(LED1,1);
koziniec 1:b8cb82927f33 13 DigitalOut green_led(LED2,1);
koziniec 1:b8cb82927f33 14 DigitalOut blue_led(LED3,1);
koziniec 1:b8cb82927f33 15
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 9:b8a60ade343e 26
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 1:b8cb82927f33 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 12:a895e3581542 39 void set_epoch_from_last_gps_time(void)
koziniec 12:a895e3581542 40 {
koziniec 12:a895e3581542 41 struct tm t;
koziniec 12:a895e3581542 42 time_t t_of_day;
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 12:a895e3581542 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 12:a895e3581542 57 t_of_day = mktime(&t);
koziniec 12:a895e3581542 58 printf("seconds since the Epoch: %ld\n", (long) t_of_day);
koziniec 12:a895e3581542 59 }
koziniec 12:a895e3581542 60
koziniec 1:b8cb82927f33 61 void gps_update(void)
koziniec 1:b8cb82927f33 62 {
koziniec 1:b8cb82927f33 63 gps_power(on);
koziniec 12:a895e3581542 64 bool wait_for_fix = true;
koziniec 12:a895e3581542 65 while (wait_for_fix) {
koziniec 7:4218bb385ca4 66 int checksum = 0;
koziniec 8:b4a6c632c809 67 char nmea_sentence[82] = {0}; //Fill with NULL terminators to save doing it later
koziniec 8:b4a6c632c809 68 while (gps.getc()!='$'); //wait for start of sentence
koziniec 1:b8cb82927f33 69 int nmea_index = 0;
koziniec 7:4218bb385ca4 70 nmea_sentence[nmea_index] = '$'; //Manually insert the '$' because we don't want it included in the checksum loop
koziniec 8:b4a6c632c809 71 char nmea_char = gps.getc(); //get sentence first char from GPS
koziniec 8:b4a6c632c809 72 while (nmea_char != '*') { //Loop building sentence and calc'ing CS until *
koziniec 9:b8a60ade343e 73 checksum ^= nmea_char; //Calc checksum as we read sentence
koziniec 7:4218bb385ca4 74 if ((nmea_sentence[nmea_index] == ',')&&(nmea_char == ',')) {
koziniec 8:b4a6c632c809 75 nmea_sentence[++nmea_index] = ' '; //Pad consecutive comma with a space to make it possible to use strtok with empty values
koziniec 3:1dff075c1c88 76 }
koziniec 7:4218bb385ca4 77 nmea_sentence[++nmea_index] = nmea_char; //build the sentence with the next character
koziniec 1:b8cb82927f33 78 if (nmea_index > 80) {
koziniec 3:1dff075c1c88 79 nmea_index=80; //Don't overflow buffer
koziniec 1:b8cb82927f33 80 }
koziniec 7:4218bb385ca4 81 nmea_char = gps.getc(); //get next char from GPS
koziniec 1:b8cb82927f33 82 }
koziniec 8:b4a6c632c809 83 //Last character was the '*' so read the two hex digits of CS from gps
koziniec 8:b4a6c632c809 84 char hex_checksum[3] = {0};
koziniec 8:b4a6c632c809 85 hex_checksum[0] = gps.getc();
koziniec 8:b4a6c632c809 86 hex_checksum[1] = gps.getc();
koziniec 9:b8a60ade343e 87 if (checksum == (int)strtol(hex_checksum, NULL, 16) ) {
koziniec 9:b8a60ade343e 88 //Valid sentence so check if it's a GPRMC
koziniec 9:b8a60ade343e 89 //pc.printf("Match\n\r");
koziniec 9:b8a60ade343e 90 const char gprmc[7] = "$GPRMC";
koziniec 9:b8a60ade343e 91 char *token;
koziniec 9:b8a60ade343e 92 token = strtok(nmea_sentence, ",");
koziniec 9:b8a60ade343e 93 if (strcmp(token,gprmc) == 0) { //GPRMC ?
koziniec 9:b8a60ade343e 94 pc.printf( " %s\n\r", token ); //Get the time
koziniec 9:b8a60ade343e 95 if (token != NULL) {
koziniec 9:b8a60ade343e 96 token = strtok(NULL, ",");
koziniec 12:a895e3581542 97 if (*token != 32) { //If there is a time present, record it.
koziniec 11:a9c16968e7f6 98 pc.printf("Time: %s\n\r",token);
koziniec 11:a9c16968e7f6 99 memcpy(gpsfix_last_utc_time, token, sizeof gpsfix_last_utc_time - 1);
koziniec 11:a9c16968e7f6 100 }
koziniec 9:b8a60ade343e 101 }
koziniec 9:b8a60ade343e 102 if (token != NULL) {
koziniec 9:b8a60ade343e 103 token = strtok(NULL, ",");
koziniec 10:349d4fa9037f 104 if (*token == 'V') {
koziniec 10:349d4fa9037f 105 pc.printf("VOID");
koziniec 10:349d4fa9037f 106 }
koziniec 9:b8a60ade343e 107 }
koziniec 12:a895e3581542 108 if (*token == 'A') { //Is this an 'A'ctive (valid) fix?
koziniec 10:349d4fa9037f 109 pc.printf("Got a fix\n\r");
koziniec 10:349d4fa9037f 110 gps_power(off); //Yes - No need for GPS now
koziniec 12:a895e3581542 111 wait_for_fix = false; //Stop looping now we have a fix.
koziniec 10:349d4fa9037f 112 while (gps.readable()) {
koziniec 10:349d4fa9037f 113 char dummy = gps.getc(); //Empty serial buffer because overflows reveal MBED bugs :-(
koziniec 10:349d4fa9037f 114 }
koziniec 10:349d4fa9037f 115 if (token != NULL) {
koziniec 10:349d4fa9037f 116 token = strtok(NULL, ",");
koziniec 11:a9c16968e7f6 117 //pc.printf("Latitude: %s\n\r",token);
koziniec 11:a9c16968e7f6 118 memcpy(gpsfix_latitude, token, sizeof gpsfix_latitude - 1);
koziniec 10:349d4fa9037f 119 }
koziniec 10:349d4fa9037f 120 if (token != NULL) {
koziniec 10:349d4fa9037f 121 token = strtok(NULL, ",");
koziniec 11:a9c16968e7f6 122 //pc.printf("North/South: %s\n\r",token);
koziniec 11:a9c16968e7f6 123 gpsfix_ns = *token;
koziniec 10:349d4fa9037f 124 }
koziniec 10:349d4fa9037f 125 if (token != NULL) {
koziniec 10:349d4fa9037f 126 token = strtok(NULL, ",");
koziniec 12:a895e3581542 127 //pc.printf("Longitude: %s\n\r",token);
koziniec 11:a9c16968e7f6 128 memcpy(gpsfix_longtitude, token, sizeof gpsfix_longtitude - 1);
koziniec 10:349d4fa9037f 129 }
koziniec 10:349d4fa9037f 130 if (token != NULL) {
koziniec 10:349d4fa9037f 131 token = strtok(NULL, ",");
koziniec 12:a895e3581542 132 //pc.printf("East/West: %s\n\r",token);
koziniec 11:a9c16968e7f6 133 gpsfix_ew = *token;
koziniec 10:349d4fa9037f 134 }
koziniec 10:349d4fa9037f 135 if (token != NULL) {
koziniec 10:349d4fa9037f 136 token = strtok(NULL, ",");
koziniec 11:a9c16968e7f6 137 //pc.printf("Speed in knots: %s\n\r",token);
koziniec 10:349d4fa9037f 138 }
koziniec 10:349d4fa9037f 139 if (token != NULL) {
koziniec 10:349d4fa9037f 140 token = strtok(NULL, ",");
koziniec 11:a9c16968e7f6 141 //pc.printf("True course: %s\n\r",token);
koziniec 10:349d4fa9037f 142 }
koziniec 10:349d4fa9037f 143 if (token != NULL) {
koziniec 10:349d4fa9037f 144 token = strtok(NULL, ",");
koziniec 11:a9c16968e7f6 145 //pc.printf("Date: %s\n\r",token);
koziniec 11:a9c16968e7f6 146 memcpy(gpsfix_last_utc_date, token, sizeof gpsfix_last_utc_date - 1);
koziniec 10:349d4fa9037f 147 }
koziniec 10:349d4fa9037f 148 if (token != NULL) {
koziniec 10:349d4fa9037f 149 token = strtok(NULL, ",");
koziniec 11:a9c16968e7f6 150 //pc.printf("Variation: %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("Variation East/West: %s\n\r",token);
koziniec 10:349d4fa9037f 155 }
koziniec 10:349d4fa9037f 156 }
koziniec 9:b8a60ade343e 157 }
koziniec 8:b4a6c632c809 158 }
koziniec 4:e996385ca6d9 159 while (gps.readable()) {
koziniec 4:e996385ca6d9 160 char dummy = gps.getc();
koziniec 1:b8cb82927f33 161 }
koziniec 1:b8cb82927f33 162 }
koziniec 12:a895e3581542 163 }
koziniec 1:b8cb82927f33 164
koziniec 1:b8cb82927f33 165 int main()
koziniec 1:b8cb82927f33 166 {
koziniec 1:b8cb82927f33 167 char data[2];
koziniec 1:b8cb82927f33 168 data[0] = 0x1A; //MAX14690 BootCfg register
koziniec 1:b8cb82927f33 169 data[1] = 0x30; //Always-On Mode, off state via PWR_OFF_CMD
koziniec 0:59c04ca89ae2 170 i2c.write( 0x50, data, 2 );
koziniec 0:59c04ca89ae2 171
koziniec 1:b8cb82927f33 172 data[0] = 0x17; //MAX14690 LDO3Vset register
koziniec 0:59c04ca89ae2 173 data[1] = 0x19; //3.3V
koziniec 0:59c04ca89ae2 174 i2c.write( 0x50, data, 2 );
koziniec 1:b8cb82927f33 175 gps_power(off);
koziniec 6:af25f19eb4e6 176 wait(2);
koziniec 1:b8cb82927f33 177 while (1) {
koziniec 1:b8cb82927f33 178 gps_update();
koziniec 12:a895e3581542 179 set_epoch_from_last_gps_time();
koziniec 12:a895e3581542 180 wait(600);
koziniec 0:59c04ca89ae2 181 }
koziniec 0:59c04ca89ae2 182 }
koziniec 0:59c04ca89ae2 183
koziniec 0:59c04ca89ae2 184
koziniec 7:4218bb385ca4 185
koziniec 7:4218bb385ca4 186
koziniec 7:4218bb385ca4 187
koziniec 0:59c04ca89ae2 188
koziniec 7:4218bb385ca4 189
koziniec 0:59c04ca89ae2 190
koziniec 7:4218bb385ca4 191