![](/media/cache/profiles/b3ae71410b0091cf042616c0cedc8131.jpg.50x50_q85.jpg)
Test software for SatChat prototype hardware Platform - MAX32630FTHR
Dependencies: USBDevice max32630fthr
main.cpp
- Committer:
- koziniec
- Date:
- 2017-07-02
- Revision:
- 12:a895e3581542
- Parent:
- 11:a9c16968e7f6
- Child:
- 13:ff0b39177386
File content as of revision 12:a895e3581542:
#include "mbed.h" #include "max32630fthr.h" #include <stdbool.h> #define on 1 #define off 0 Serial pc(USBTX, USBRX); Serial gps(P5_3, P5_4, 9600); I2C i2c(P5_7,P6_0); // SDA, SCL DigitalOut red_led(LED1,1); DigitalOut green_led(LED2,1); DigitalOut blue_led(LED3,1); char gpsfix_last_utc_time[11] = {0}; char gpsfix_last_utc_date[7] = {0}; char gpsfix_longtitude[12] = {0}; char gpsfix_latitude[12] = {0}; char gpsfix_speed[8] = {0}; //Set but not used char gpsfix_course[7] = {0}; //Set but not used char gpsfix_variation[7] = {0}; //Set but not used char gpsfix_mag_var_ew[1] = {0};//Set but not used char gpsfix_ns = 0; char gpsfix_ew = 0; void gps_power(bool state) { char data[2]; data[0] = 0x16; //MAX14690 LDO3cfg register data[1] = 0xE0; //Disable LDO3 if (state == on) { data[1] = 0xE2; //Enable LDO3 } i2c.write( 0x50, data, 2 ); } void set_epoch_from_last_gps_time(void) { struct tm t; time_t t_of_day; char two_char_str[3] = {0}; memcpy(two_char_str, gpsfix_last_utc_date+4, 2); t.tm_year = atoi(two_char_str)+100; //Years since 1900 memcpy(two_char_str, gpsfix_last_utc_date+2, 2); t.tm_mon = atoi(two_char_str)-1; // Month, 0 - jan gpsfix_last_utc_date memcpy(two_char_str, gpsfix_last_utc_date, 2); t.tm_mday = atoi(two_char_str); // Day of the month gpsfix_last_utc_date memcpy(two_char_str, gpsfix_last_utc_time, 2); t.tm_hour = atoi(two_char_str); memcpy(two_char_str, gpsfix_last_utc_time+2, 2); t.tm_min = atoi(two_char_str); memcpy(two_char_str, gpsfix_last_utc_time+4, 2); t.tm_sec = atoi(two_char_str); t.tm_isdst = 0; // Is DST on? 1 = yes, 0 = no, -1 = unknown t_of_day = mktime(&t); printf("seconds since the Epoch: %ld\n", (long) t_of_day); } void gps_update(void) { gps_power(on); bool wait_for_fix = true; while (wait_for_fix) { int checksum = 0; char nmea_sentence[82] = {0}; //Fill with NULL terminators to save doing it later while (gps.getc()!='$'); //wait for start of sentence int nmea_index = 0; nmea_sentence[nmea_index] = '$'; //Manually insert the '$' because we don't want it included in the checksum loop char nmea_char = gps.getc(); //get sentence first char from GPS while (nmea_char != '*') { //Loop building sentence and calc'ing CS until * checksum ^= nmea_char; //Calc checksum as we read sentence if ((nmea_sentence[nmea_index] == ',')&&(nmea_char == ',')) { nmea_sentence[++nmea_index] = ' '; //Pad consecutive comma with a space to make it possible to use strtok with empty values } nmea_sentence[++nmea_index] = nmea_char; //build the sentence with the next character if (nmea_index > 80) { nmea_index=80; //Don't overflow buffer } nmea_char = gps.getc(); //get next char from GPS } //Last character was the '*' so read the two hex digits of CS from gps char hex_checksum[3] = {0}; hex_checksum[0] = gps.getc(); hex_checksum[1] = gps.getc(); if (checksum == (int)strtol(hex_checksum, NULL, 16) ) { //Valid sentence so check if it's a GPRMC //pc.printf("Match\n\r"); const char gprmc[7] = "$GPRMC"; char *token; token = strtok(nmea_sentence, ","); if (strcmp(token,gprmc) == 0) { //GPRMC ? pc.printf( " %s\n\r", token ); //Get the time if (token != NULL) { token = strtok(NULL, ","); if (*token != 32) { //If there is a time present, record it. pc.printf("Time: %s\n\r",token); memcpy(gpsfix_last_utc_time, token, sizeof gpsfix_last_utc_time - 1); } } if (token != NULL) { token = strtok(NULL, ","); if (*token == 'V') { pc.printf("VOID"); } } if (*token == 'A') { //Is this an 'A'ctive (valid) fix? pc.printf("Got a fix\n\r"); gps_power(off); //Yes - No need for GPS now wait_for_fix = false; //Stop looping now we have a fix. while (gps.readable()) { char dummy = gps.getc(); //Empty serial buffer because overflows reveal MBED bugs :-( } if (token != NULL) { token = strtok(NULL, ","); //pc.printf("Latitude: %s\n\r",token); memcpy(gpsfix_latitude, token, sizeof gpsfix_latitude - 1); } if (token != NULL) { token = strtok(NULL, ","); //pc.printf("North/South: %s\n\r",token); gpsfix_ns = *token; } if (token != NULL) { token = strtok(NULL, ","); //pc.printf("Longitude: %s\n\r",token); memcpy(gpsfix_longtitude, token, sizeof gpsfix_longtitude - 1); } if (token != NULL) { token = strtok(NULL, ","); //pc.printf("East/West: %s\n\r",token); gpsfix_ew = *token; } if (token != NULL) { token = strtok(NULL, ","); //pc.printf("Speed in knots: %s\n\r",token); } if (token != NULL) { token = strtok(NULL, ","); //pc.printf("True course: %s\n\r",token); } if (token != NULL) { token = strtok(NULL, ","); //pc.printf("Date: %s\n\r",token); memcpy(gpsfix_last_utc_date, token, sizeof gpsfix_last_utc_date - 1); } if (token != NULL) { token = strtok(NULL, ","); //pc.printf("Variation: %s\n\r",token); } if (token != NULL) { token = strtok(NULL, ","); //pc.printf("Variation East/West: %s\n\r",token); } } } } while (gps.readable()) { char dummy = gps.getc(); } } } int main() { char data[2]; data[0] = 0x1A; //MAX14690 BootCfg register data[1] = 0x30; //Always-On Mode, off state via PWR_OFF_CMD i2c.write( 0x50, data, 2 ); data[0] = 0x17; //MAX14690 LDO3Vset register data[1] = 0x19; //3.3V i2c.write( 0x50, data, 2 ); gps_power(off); wait(2); while (1) { gps_update(); set_epoch_from_last_gps_time(); wait(600); } }