Test software for SatChat prototype hardware Platform - MAX32630FTHR

Dependencies:   USBDevice max32630fthr

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?

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 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