diff --git a/flight/Modules/GPS/GPS.c b/flight/Modules/GPS/GPS.c index 353debebe..856e2db80 100644 --- a/flight/Modules/GPS/GPS.c +++ b/flight/Modules/GPS/GPS.c @@ -49,14 +49,6 @@ #include "WorldMagModel.h" #include "CoordinateConversions.h" -//#define FULL_COLD_RESTART // uncomment this to tell the GPS to do a FULL COLD restart -//#define DISABLE_GPS_TRESHOLD // - -// **************** -// constants/macros/typdefs - -#define GPS_TIMEOUT_MS 500 - // **************** // Private functions @@ -66,17 +58,20 @@ static void setHomeLocation(GPSPositionData * gpsData); // **************** // Private constants +//#define FULL_COLD_RESTART // uncomment this to tell the GPS to do a FULL COLD restart +//#define DISABLE_GPS_TRESHOLD // + +#define GPS_TIMEOUT_MS 500 +#define GPS_COMMAND_RESEND_TIMEOUT_MS 2000 + // Unfortunately need a good size stack for the WMM calculation #ifdef ENABLE_GPS_BINARY_GTOP - #define STACK_SIZE_BYTES 800 + #define STACK_SIZE_BYTES 800 #else - #define STACK_SIZE_BYTES 800 + #define STACK_SIZE_BYTES 800 #endif -#define TASK_PRIORITY (tskIDLE_PRIORITY + 1) - -// **************** -// Private types +#define TASK_PRIORITY (tskIDLE_PRIORITY + 1) // **************** // Private variables @@ -271,14 +266,17 @@ static void gpsTask(void *parameters) // Check for GPS timeout timeNowMs = xTaskGetTickCount() * portTICK_RATE_MS; if ((timeNowMs - timeOfLastUpdateMs) > GPS_TIMEOUT_MS) - { + { // we have not received any valid GPS sentences for a while. + // either the GPS is not plugged in or a hardware problem or the GPS has locked up. + GPSPositionGet(&GpsData); GpsData.Status = GPSPOSITION_STATUS_NOGPS; GPSPositionSet(&GpsData); AlarmsSet(SYSTEMALARMS_ALARM_GPS, SYSTEMALARMS_ALARM_ERROR); - if ((timeNowMs - timeOfLastCommandMs) > 5000) /// 5000ms - { // resend the command .. just case the gps has only just been plugged in or the gps did not get our last command + if ((timeNowMs - timeOfLastCommandMs) >= GPS_COMMAND_RESEND_TIMEOUT_MS) + { // resend the command .. just incase the gps has only just been plugged in or the gps did not get our last command + timeOfLastCommandMs = timeNowMs; #ifdef ENABLE_GPS_BINARY_GTOP GTOP_BIN_init(); @@ -299,13 +297,11 @@ static void gpsTask(void *parameters) #ifdef DISABLE_GPS_TRESHOLD PIOS_COM_SendStringNonBlocking(gpsPort,"$PMTK397,0*23\r\n"); #endif - - timeOfLastCommandMs = timeNowMs; } } else - { - // Had an update + { // we appear to be receiving GPS sentences OK, we've had an update + HomeLocationData home; HomeLocationGet(&home); diff --git a/flight/Modules/GPS/GTOP_BIN.c b/flight/Modules/GPS/GTOP_BIN.c index cd24b98a0..86f0ee57c 100644 --- a/flight/Modules/GPS/GTOP_BIN.c +++ b/flight/Modules/GPS/GTOP_BIN.c @@ -34,7 +34,6 @@ #include "gpsposition.h" #include "gpstime.h" -//#include #include // memmove #ifdef ENABLE_GPS_BINARY_GTOP @@ -84,9 +83,10 @@ typedef struct // ************ -// buffer that holds the binary packet +// buffer that holds the incoming binary packet static uint8_t gps_rx_buffer[sizeof(t_gps_bin_packet)] __attribute__ ((aligned(4))); +// number of bytes currently in the binary packet buffer static uint8_t gps_rx_buffer_wr = 0; // ************ @@ -137,9 +137,8 @@ int GTOP_BIN_update_position(uint8_t b, volatile uint32_t *chksum_errors, volati if (rx_packet->header == 0x2404) break; // found a valid header marker - // remove oldest byte from buffer - if (gps_rx_buffer_wr > 1) - memmove(gps_rx_buffer, gps_rx_buffer + 1, gps_rx_buffer_wr - 1); + // shift all the bytes down one position + memmove(gps_rx_buffer, gps_rx_buffer + 1, gps_rx_buffer_wr - 1); gps_rx_buffer_wr--; } @@ -150,6 +149,7 @@ int GTOP_BIN_update_position(uint8_t b, volatile uint32_t *chksum_errors, volati // we have enough bytes for a complete binary packet + // check to see if certain params are valid if (rx_packet->header != 0x2404 || rx_packet->end_word != 0x0A0D || rx_packet->asterisk != 0x2A || @@ -159,6 +159,7 @@ int GTOP_BIN_update_position(uint8_t b, volatile uint32_t *chksum_errors, volati (rx_packet->data.fix_type < 1 || rx_packet->data.fix_type > 3) ) { // invalid packet if (parsing_errors) *parsing_errors++; + // shift all the bytes down one position memmove(gps_rx_buffer, gps_rx_buffer + 1, gps_rx_buffer_wr - 1); gps_rx_buffer_wr--; continue; @@ -173,14 +174,13 @@ int GTOP_BIN_update_position(uint8_t b, volatile uint32_t *chksum_errors, volati if (checksum != rx_packet->checksum) { // checksum error if (chksum_errors) *chksum_errors++; + // shift all the bytes down one position memmove(gps_rx_buffer, gps_rx_buffer + 1, gps_rx_buffer_wr - 1); gps_rx_buffer_wr--; continue; } } - // checksum appears correct - // // we now have a valid complete binary packet, update the GpsData and GpsTime objects // correct the endian order of the parameters @@ -237,10 +237,10 @@ int GTOP_BIN_update_position(uint8_t b, volatile uint32_t *chksum_errors, volati else gps_rx_buffer_wr = 0; - return 0; // found a valid packet + return 0; // found a valid packet } - return -1; // no valid packet found + return -1; // no valid packet found } // ************