Test software for SatChat prototype hardware Platform - MAX32630FTHR

Dependencies:   USBDevice max32630fthr

Committer:
koziniec
Date:
Sat Jul 01 07:57:16 2017 +0000
Revision:
9:b8a60ade343e
Parent:
8:b4a6c632c809
Child:
10:349d4fa9037f
Functional; Need to add check for A valid fix.; shutdown GPS; Then copy gps fix data to global variables

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 9:b8a60ade343e 24 char gpsfix_ns[1] = {0};
koziniec 9:b8a60ade343e 25 char gpsfix_ew[1] = {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 // gps_power(off); //Yes - No need for GPS now
koziniec 9:b8a60ade343e 73 // while (gps.readable()){
koziniec 9:b8a60ade343e 74 // char dummy = gps.getc(); //Empty serial buffer because overflows reveal MBED bugs :-(
koziniec 9:b8a60ade343e 75 // }
koziniec 9:b8a60ade343e 76 pc.printf( " %s\n\r", token ); //Get the time
koziniec 9:b8a60ade343e 77 if (token != NULL) {
koziniec 9:b8a60ade343e 78 token = strtok(NULL, ",");
koziniec 9:b8a60ade343e 79 pc.printf("Time: %s\n\r",token);
koziniec 9:b8a60ade343e 80 }
koziniec 9:b8a60ade343e 81 if (token != NULL) {
koziniec 9:b8a60ade343e 82 token = strtok(NULL, ",");
koziniec 9:b8a60ade343e 83 pc.printf("Valid: %s\n\r",token);
koziniec 9:b8a60ade343e 84 }
koziniec 9:b8a60ade343e 85 //If valid, get the rest of the tokens and pass to static variable.
koziniec 9:b8a60ade343e 86
koziniec 9:b8a60ade343e 87 }
koziniec 8:b4a6c632c809 88 }
koziniec 7:4218bb385ca4 89
koziniec 9:b8a60ade343e 90
koziniec 8:b4a6c632c809 91
koziniec 4:e996385ca6d9 92
koziniec 4:e996385ca6d9 93 while (gps.readable()) {
koziniec 4:e996385ca6d9 94 char dummy = gps.getc();
koziniec 1:b8cb82927f33 95 }
koziniec 1:b8cb82927f33 96 }
koziniec 1:b8cb82927f33 97
koziniec 1:b8cb82927f33 98 }
koziniec 1:b8cb82927f33 99 int main()
koziniec 1:b8cb82927f33 100 {
koziniec 1:b8cb82927f33 101 //
koziniec 1:b8cb82927f33 102 char data[2];
koziniec 1:b8cb82927f33 103 data[0] = 0x1A; //MAX14690 BootCfg register
koziniec 1:b8cb82927f33 104 data[1] = 0x30; //Always-On Mode, off state via PWR_OFF_CMD
koziniec 0:59c04ca89ae2 105 i2c.write( 0x50, data, 2 );
koziniec 0:59c04ca89ae2 106
koziniec 1:b8cb82927f33 107 data[0] = 0x17; //MAX14690 LDO3Vset register
koziniec 0:59c04ca89ae2 108 data[1] = 0x19; //3.3V
koziniec 0:59c04ca89ae2 109 i2c.write( 0x50, data, 2 );
koziniec 1:b8cb82927f33 110 gps_power(off);
koziniec 6:af25f19eb4e6 111 wait(2);
koziniec 1:b8cb82927f33 112 while (1) {
koziniec 1:b8cb82927f33 113 gps_update();
koziniec 7:4218bb385ca4 114
koziniec 7:4218bb385ca4 115
koziniec 0:59c04ca89ae2 116 }
koziniec 0:59c04ca89ae2 117 }
koziniec 0:59c04ca89ae2 118
koziniec 0:59c04ca89ae2 119
koziniec 7:4218bb385ca4 120
koziniec 7:4218bb385ca4 121
koziniec 7:4218bb385ca4 122
koziniec 0:59c04ca89ae2 123
koziniec 7:4218bb385ca4 124
koziniec 0:59c04ca89ae2 125
koziniec 7:4218bb385ca4 126