Test software for SatChat prototype hardware Platform - MAX32630FTHR

Dependencies:   USBDevice max32630fthr

Committer:
koziniec
Date:
Sat Jul 01 06:33:58 2017 +0000
Revision:
8:b4a6c632c809
Parent:
7:4218bb385ca4
Child:
9:b8a60ade343e
Checksum validation works.; Need to nest GPRMC correctly

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 1:b8cb82927f33 16 void gps_power(bool state)
koziniec 1:b8cb82927f33 17 {
koziniec 1:b8cb82927f33 18 char data[2];
koziniec 1:b8cb82927f33 19 data[0] = 0x16; //MAX14690 LDO3cfg register
koziniec 1:b8cb82927f33 20 data[1] = 0xE0; //Disable LDO3
koziniec 1:b8cb82927f33 21 if (state == on) {
koziniec 1:b8cb82927f33 22 data[1] = 0xE2; //Enable LDO3
koziniec 1:b8cb82927f33 23 }
koziniec 1:b8cb82927f33 24 i2c.write( 0x50, data, 2 );
koziniec 1:b8cb82927f33 25 }
koziniec 1:b8cb82927f33 26
koziniec 1:b8cb82927f33 27 void gps_update(void)
koziniec 1:b8cb82927f33 28 {
koziniec 1:b8cb82927f33 29 gps_power(on);
koziniec 8:b4a6c632c809 30
koziniec 1:b8cb82927f33 31 while (1) {
koziniec 7:4218bb385ca4 32 int checksum = 0;
koziniec 8:b4a6c632c809 33 char nmea_sentence[82] = {0}; //Fill with NULL terminators to save doing it later
koziniec 8:b4a6c632c809 34 while (gps.getc()!='$'); //wait for start of sentence
koziniec 1:b8cb82927f33 35 int nmea_index = 0;
koziniec 7:4218bb385ca4 36 nmea_sentence[nmea_index] = '$'; //Manually insert the '$' because we don't want it included in the checksum loop
koziniec 8:b4a6c632c809 37 char nmea_char = gps.getc(); //get sentence first char from GPS
koziniec 8:b4a6c632c809 38 while (nmea_char != '*') { //Loop building sentence and calc'ing CS until *
koziniec 8:b4a6c632c809 39 checksum ^= nmea_char; //Calc checksum as we read sentence
koziniec 7:4218bb385ca4 40 if ((nmea_sentence[nmea_index] == ',')&&(nmea_char == ',')) {
koziniec 8:b4a6c632c809 41 nmea_sentence[++nmea_index] = ' '; //Pad consecutive comma with a space to make it possible to use strtok with empty values
koziniec 3:1dff075c1c88 42 }
koziniec 7:4218bb385ca4 43 nmea_sentence[++nmea_index] = nmea_char; //build the sentence with the next character
koziniec 1:b8cb82927f33 44 if (nmea_index > 80) {
koziniec 3:1dff075c1c88 45 nmea_index=80; //Don't overflow buffer
koziniec 1:b8cb82927f33 46 }
koziniec 7:4218bb385ca4 47 nmea_char = gps.getc(); //get next char from GPS
koziniec 1:b8cb82927f33 48 }
koziniec 8:b4a6c632c809 49 //Last character was the '*' so read the two hex digits of CS from gps
koziniec 8:b4a6c632c809 50 char hex_checksum[3] = {0};
koziniec 8:b4a6c632c809 51 hex_checksum[0] = gps.getc();
koziniec 8:b4a6c632c809 52 hex_checksum[1] = gps.getc();
koziniec 8:b4a6c632c809 53 if (checksum == (int)strtol(hex_checksum, NULL, 16) ){
koziniec 8:b4a6c632c809 54 pc.printf("Match\n\r");
koziniec 8:b4a6c632c809 55 }
koziniec 7:4218bb385ca4 56
koziniec 4:e996385ca6d9 57 // const char s[2] = ",";
koziniec 1:b8cb82927f33 58 const char gprmc[7] = "$GPRMC";
koziniec 1:b8cb82927f33 59 char *token;
koziniec 1:b8cb82927f33 60 token = strtok(nmea_sentence, ",");
koziniec 4:e996385ca6d9 61 if (strcmp(token,gprmc) == 0) {
koziniec 1:b8cb82927f33 62 pc.printf( " %s\n\r", token );
koziniec 4:e996385ca6d9 63 while (token != NULL) {
koziniec 4:e996385ca6d9 64 token = strtok(NULL, ",");
koziniec 7:4218bb385ca4 65 // pc.printf( " %s\n\r", token );
koziniec 4:e996385ca6d9 66 }
koziniec 7:4218bb385ca4 67 // pc.printf("GPS CS:");
koziniec 8:b4a6c632c809 68
koziniec 7:4218bb385ca4 69 pc.printf("%d \n\r",checksum);
koziniec 4:e996385ca6d9 70 }
koziniec 4:e996385ca6d9 71
koziniec 4:e996385ca6d9 72 while (gps.readable()) {
koziniec 4:e996385ca6d9 73 char dummy = gps.getc();
koziniec 1:b8cb82927f33 74 }
koziniec 1:b8cb82927f33 75 }
koziniec 1:b8cb82927f33 76
koziniec 1:b8cb82927f33 77 }
koziniec 1:b8cb82927f33 78 int main()
koziniec 1:b8cb82927f33 79 {
koziniec 1:b8cb82927f33 80 //
koziniec 1:b8cb82927f33 81 char data[2];
koziniec 1:b8cb82927f33 82 data[0] = 0x1A; //MAX14690 BootCfg register
koziniec 1:b8cb82927f33 83 data[1] = 0x30; //Always-On Mode, off state via PWR_OFF_CMD
koziniec 0:59c04ca89ae2 84 i2c.write( 0x50, data, 2 );
koziniec 0:59c04ca89ae2 85
koziniec 1:b8cb82927f33 86 data[0] = 0x17; //MAX14690 LDO3Vset register
koziniec 0:59c04ca89ae2 87 data[1] = 0x19; //3.3V
koziniec 0:59c04ca89ae2 88 i2c.write( 0x50, data, 2 );
koziniec 1:b8cb82927f33 89 gps_power(off);
koziniec 6:af25f19eb4e6 90 wait(2);
koziniec 1:b8cb82927f33 91 while (1) {
koziniec 1:b8cb82927f33 92 gps_update();
koziniec 7:4218bb385ca4 93
koziniec 7:4218bb385ca4 94
koziniec 0:59c04ca89ae2 95 }
koziniec 0:59c04ca89ae2 96 }
koziniec 0:59c04ca89ae2 97
koziniec 0:59c04ca89ae2 98
koziniec 7:4218bb385ca4 99
koziniec 7:4218bb385ca4 100
koziniec 7:4218bb385ca4 101
koziniec 0:59c04ca89ae2 102
koziniec 7:4218bb385ca4 103
koziniec 0:59c04ca89ae2 104
koziniec 7:4218bb385ca4 105