Test software for SatChat prototype hardware Platform - MAX32630FTHR
Dependencies: USBDevice max32630fthr
main.cpp@11:a9c16968e7f6, 2017-07-01 (annotated)
- Committer:
- koziniec
- Date:
- Sat Jul 01 16:48:47 2017 +0000
- Revision:
- 11:a9c16968e7f6
- Parent:
- 10:349d4fa9037f
- Child:
- 12:a895e3581542
Need to check the global gps variables are sound.; Need to check both source and destination nmea entry sizes to avoid overflow.; set the clock.
Who changed what in which revision?
User | Revision | Line number | New 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 | 1:b8cb82927f33 | 39 | void gps_update(void) |
koziniec | 1:b8cb82927f33 | 40 | { |
koziniec | 1:b8cb82927f33 | 41 | gps_power(on); |
koziniec | 9:b8a60ade343e | 42 | |
koziniec | 1:b8cb82927f33 | 43 | while (1) { |
koziniec | 7:4218bb385ca4 | 44 | int checksum = 0; |
koziniec | 8:b4a6c632c809 | 45 | char nmea_sentence[82] = {0}; //Fill with NULL terminators to save doing it later |
koziniec | 8:b4a6c632c809 | 46 | while (gps.getc()!='$'); //wait for start of sentence |
koziniec | 1:b8cb82927f33 | 47 | int nmea_index = 0; |
koziniec | 7:4218bb385ca4 | 48 | nmea_sentence[nmea_index] = '$'; //Manually insert the '$' because we don't want it included in the checksum loop |
koziniec | 8:b4a6c632c809 | 49 | char nmea_char = gps.getc(); //get sentence first char from GPS |
koziniec | 8:b4a6c632c809 | 50 | while (nmea_char != '*') { //Loop building sentence and calc'ing CS until * |
koziniec | 9:b8a60ade343e | 51 | checksum ^= nmea_char; //Calc checksum as we read sentence |
koziniec | 7:4218bb385ca4 | 52 | if ((nmea_sentence[nmea_index] == ',')&&(nmea_char == ',')) { |
koziniec | 8:b4a6c632c809 | 53 | nmea_sentence[++nmea_index] = ' '; //Pad consecutive comma with a space to make it possible to use strtok with empty values |
koziniec | 3:1dff075c1c88 | 54 | } |
koziniec | 7:4218bb385ca4 | 55 | nmea_sentence[++nmea_index] = nmea_char; //build the sentence with the next character |
koziniec | 1:b8cb82927f33 | 56 | if (nmea_index > 80) { |
koziniec | 3:1dff075c1c88 | 57 | nmea_index=80; //Don't overflow buffer |
koziniec | 1:b8cb82927f33 | 58 | } |
koziniec | 7:4218bb385ca4 | 59 | nmea_char = gps.getc(); //get next char from GPS |
koziniec | 1:b8cb82927f33 | 60 | } |
koziniec | 8:b4a6c632c809 | 61 | //Last character was the '*' so read the two hex digits of CS from gps |
koziniec | 8:b4a6c632c809 | 62 | char hex_checksum[3] = {0}; |
koziniec | 8:b4a6c632c809 | 63 | hex_checksum[0] = gps.getc(); |
koziniec | 8:b4a6c632c809 | 64 | hex_checksum[1] = gps.getc(); |
koziniec | 9:b8a60ade343e | 65 | if (checksum == (int)strtol(hex_checksum, NULL, 16) ) { |
koziniec | 9:b8a60ade343e | 66 | //Valid sentence so check if it's a GPRMC |
koziniec | 9:b8a60ade343e | 67 | //pc.printf("Match\n\r"); |
koziniec | 9:b8a60ade343e | 68 | const char gprmc[7] = "$GPRMC"; |
koziniec | 9:b8a60ade343e | 69 | char *token; |
koziniec | 9:b8a60ade343e | 70 | token = strtok(nmea_sentence, ","); |
koziniec | 9:b8a60ade343e | 71 | if (strcmp(token,gprmc) == 0) { //GPRMC ? |
koziniec | 9:b8a60ade343e | 72 | pc.printf( " %s\n\r", token ); //Get the time |
koziniec | 9:b8a60ade343e | 73 | if (token != NULL) { |
koziniec | 9:b8a60ade343e | 74 | token = strtok(NULL, ","); |
koziniec | 11:a9c16968e7f6 | 75 | if (*token != 32){ //If there is a time present, record it. |
koziniec | 11:a9c16968e7f6 | 76 | pc.printf("Time: %s\n\r",token); |
koziniec | 11:a9c16968e7f6 | 77 | memcpy(gpsfix_last_utc_time, token, sizeof gpsfix_last_utc_time - 1); |
koziniec | 11:a9c16968e7f6 | 78 | } |
koziniec | 9:b8a60ade343e | 79 | } |
koziniec | 9:b8a60ade343e | 80 | if (token != NULL) { |
koziniec | 9:b8a60ade343e | 81 | token = strtok(NULL, ","); |
koziniec | 10:349d4fa9037f | 82 | if (*token == 'V') { |
koziniec | 10:349d4fa9037f | 83 | pc.printf("VOID"); |
koziniec | 10:349d4fa9037f | 84 | } |
koziniec | 9:b8a60ade343e | 85 | } |
koziniec | 10:349d4fa9037f | 86 | if (*token == 'A') { |
koziniec | 10:349d4fa9037f | 87 | pc.printf("Got a fix\n\r"); |
koziniec | 10:349d4fa9037f | 88 | gps_power(off); //Yes - No need for GPS now |
koziniec | 10:349d4fa9037f | 89 | while (gps.readable()) { |
koziniec | 10:349d4fa9037f | 90 | char dummy = gps.getc(); //Empty serial buffer because overflows reveal MBED bugs :-( |
koziniec | 10:349d4fa9037f | 91 | } |
koziniec | 10:349d4fa9037f | 92 | if (token != NULL) { |
koziniec | 10:349d4fa9037f | 93 | token = strtok(NULL, ","); |
koziniec | 11:a9c16968e7f6 | 94 | //pc.printf("Latitude: %s\n\r",token); |
koziniec | 11:a9c16968e7f6 | 95 | memcpy(gpsfix_latitude, token, sizeof gpsfix_latitude - 1); |
koziniec | 10:349d4fa9037f | 96 | } |
koziniec | 10:349d4fa9037f | 97 | if (token != NULL) { |
koziniec | 10:349d4fa9037f | 98 | token = strtok(NULL, ","); |
koziniec | 11:a9c16968e7f6 | 99 | //pc.printf("North/South: %s\n\r",token); |
koziniec | 11:a9c16968e7f6 | 100 | gpsfix_ns = *token; |
koziniec | 10:349d4fa9037f | 101 | } |
koziniec | 10:349d4fa9037f | 102 | if (token != NULL) { |
koziniec | 10:349d4fa9037f | 103 | token = strtok(NULL, ","); |
koziniec | 10:349d4fa9037f | 104 | pc.printf("Longitude: %s\n\r",token); |
koziniec | 11:a9c16968e7f6 | 105 | memcpy(gpsfix_longtitude, token, sizeof gpsfix_longtitude - 1); |
koziniec | 10:349d4fa9037f | 106 | } |
koziniec | 10:349d4fa9037f | 107 | if (token != NULL) { |
koziniec | 10:349d4fa9037f | 108 | token = strtok(NULL, ","); |
koziniec | 10:349d4fa9037f | 109 | pc.printf("East/West: %s\n\r",token); |
koziniec | 11:a9c16968e7f6 | 110 | gpsfix_ew = *token; |
koziniec | 10:349d4fa9037f | 111 | } |
koziniec | 10:349d4fa9037f | 112 | if (token != NULL) { |
koziniec | 10:349d4fa9037f | 113 | token = strtok(NULL, ","); |
koziniec | 11:a9c16968e7f6 | 114 | //pc.printf("Speed in knots: %s\n\r",token); |
koziniec | 10:349d4fa9037f | 115 | } |
koziniec | 10:349d4fa9037f | 116 | if (token != NULL) { |
koziniec | 10:349d4fa9037f | 117 | token = strtok(NULL, ","); |
koziniec | 11:a9c16968e7f6 | 118 | //pc.printf("True course: %s\n\r",token); |
koziniec | 10:349d4fa9037f | 119 | } |
koziniec | 10:349d4fa9037f | 120 | if (token != NULL) { |
koziniec | 10:349d4fa9037f | 121 | token = strtok(NULL, ","); |
koziniec | 11:a9c16968e7f6 | 122 | //pc.printf("Date: %s\n\r",token); |
koziniec | 11:a9c16968e7f6 | 123 | memcpy(gpsfix_last_utc_date, token, sizeof gpsfix_last_utc_date - 1); |
koziniec | 10:349d4fa9037f | 124 | } |
koziniec | 10:349d4fa9037f | 125 | if (token != NULL) { |
koziniec | 10:349d4fa9037f | 126 | token = strtok(NULL, ","); |
koziniec | 11:a9c16968e7f6 | 127 | //pc.printf("Variation: %s\n\r",token); |
koziniec | 10:349d4fa9037f | 128 | } |
koziniec | 10:349d4fa9037f | 129 | if (token != NULL) { |
koziniec | 10:349d4fa9037f | 130 | token = strtok(NULL, ","); |
koziniec | 11:a9c16968e7f6 | 131 | //pc.printf("Variation East/West: %s\n\r",token); |
koziniec | 10:349d4fa9037f | 132 | } |
koziniec | 10:349d4fa9037f | 133 | } |
koziniec | 10:349d4fa9037f | 134 | |
koziniec | 9:b8a60ade343e | 135 | } |
koziniec | 8:b4a6c632c809 | 136 | } |
koziniec | 7:4218bb385ca4 | 137 | |
koziniec | 10:349d4fa9037f | 138 | |
koziniec | 8:b4a6c632c809 | 139 | |
koziniec | 4:e996385ca6d9 | 140 | |
koziniec | 4:e996385ca6d9 | 141 | while (gps.readable()) { |
koziniec | 4:e996385ca6d9 | 142 | char dummy = gps.getc(); |
koziniec | 1:b8cb82927f33 | 143 | } |
koziniec | 1:b8cb82927f33 | 144 | } |
koziniec | 1:b8cb82927f33 | 145 | |
koziniec | 1:b8cb82927f33 | 146 | } |
koziniec | 1:b8cb82927f33 | 147 | int main() |
koziniec | 1:b8cb82927f33 | 148 | { |
koziniec | 1:b8cb82927f33 | 149 | // |
koziniec | 1:b8cb82927f33 | 150 | char data[2]; |
koziniec | 1:b8cb82927f33 | 151 | data[0] = 0x1A; //MAX14690 BootCfg register |
koziniec | 1:b8cb82927f33 | 152 | data[1] = 0x30; //Always-On Mode, off state via PWR_OFF_CMD |
koziniec | 0:59c04ca89ae2 | 153 | i2c.write( 0x50, data, 2 ); |
koziniec | 0:59c04ca89ae2 | 154 | |
koziniec | 1:b8cb82927f33 | 155 | data[0] = 0x17; //MAX14690 LDO3Vset register |
koziniec | 0:59c04ca89ae2 | 156 | data[1] = 0x19; //3.3V |
koziniec | 0:59c04ca89ae2 | 157 | i2c.write( 0x50, data, 2 ); |
koziniec | 1:b8cb82927f33 | 158 | gps_power(off); |
koziniec | 6:af25f19eb4e6 | 159 | wait(2); |
koziniec | 1:b8cb82927f33 | 160 | while (1) { |
koziniec | 1:b8cb82927f33 | 161 | gps_update(); |
koziniec | 7:4218bb385ca4 | 162 | |
koziniec | 7:4218bb385ca4 | 163 | |
koziniec | 0:59c04ca89ae2 | 164 | } |
koziniec | 0:59c04ca89ae2 | 165 | } |
koziniec | 0:59c04ca89ae2 | 166 | |
koziniec | 0:59c04ca89ae2 | 167 | |
koziniec | 7:4218bb385ca4 | 168 | |
koziniec | 7:4218bb385ca4 | 169 | |
koziniec | 7:4218bb385ca4 | 170 | |
koziniec | 0:59c04ca89ae2 | 171 | |
koziniec | 7:4218bb385ca4 | 172 | |
koziniec | 0:59c04ca89ae2 | 173 | |
koziniec | 7:4218bb385ca4 | 174 |