From c5c9da8af4bf56db1fd1fde0608414a01b393859 Mon Sep 17 00:00:00 2001 From: Richard Meadows Date: Tue, 19 Jan 2016 18:21:53 +0000 Subject: [PATCH] [flight][gps-no-lock] Change behaviour when GPS looses lock, refactor gps_is_locked to return enum * Transmit UHF telemetery with no lock * Hibernate for <1s with no lock, regardless of flight state --- firmware/inc/gps.h | 20 ++++++++++++++------ firmware/src/gps_osp.c | 16 ++++++++-------- firmware/src/main.c | 12 ++++++++---- firmware/src/sequencer.c | 7 ++++--- 4 files changed, 34 insertions(+), 21 deletions(-) diff --git a/firmware/inc/gps.h b/firmware/inc/gps.h index 2db5fba..3146141 100644 --- a/firmware/inc/gps.h +++ b/firmware/inc/gps.h @@ -31,7 +31,7 @@ /** * GPS Error types */ -enum gps_error_t { +enum gps_error { GPS_NOERROR, GPS_ERROR_BAD_CHECKSUM, GPS_ERROR_INVALID_FRAME, @@ -40,11 +40,19 @@ enum gps_error_t { /** * GPS Flight State */ -enum gps_flight_state_t { +enum gps_flight_state { GPS_FLIGHT_STATE_LAUNCH, GPS_FLIGHT_STATE_FLOAT, }; +/** + * GPS Lock State + */ +enum gps_lock_state { + GPS_NO_LOCK = 0, + GPS_LOCKED = 1, +}; + /* UBX ------------------------------------------------------------- */ #ifdef GPS_TYPE_UBX @@ -93,7 +101,7 @@ struct gps_data_t { }; -enum gps_error_t gps_get_error_state(void); +enum gps_error gps_get_error_state(void); struct gps_data_t gps_get_data(void); void gps_setup(void); @@ -117,7 +125,7 @@ struct gps_data_t { uint8_t time_to_first_fix; /* seconds / counts */ }; -enum gps_error_t gps_get_error_state(void); +enum gps_error gps_get_error_state(void); struct gps_data_t gps_get_data(void); void gps_setup(void); @@ -125,8 +133,8 @@ void gps_setup(void); #endif /* GPS_TYPE_DUMMY */ /* All ------------------------------------------------------------ */ -enum gps_flight_state_t gps_get_flight_state(void); -uint8_t gps_is_locked(void); +enum gps_flight_state gps_get_flight_state(void); +enum gps_lock_state gps_is_locked(void); void gps_usart_init_enable(uint32_t baud_rate); void gps_reset(void); diff --git a/firmware/src/gps_osp.c b/firmware/src/gps_osp.c index 9916e72..f7bbbcc 100644 --- a/firmware/src/gps_osp.c +++ b/firmware/src/gps_osp.c @@ -56,26 +56,26 @@ int32_t osp_index = SFD_WAITING; uint16_t osp_payload_length = 0; uint8_t osp_irq_buffer[OSP_BUFFER_LEN]; -volatile enum gps_error_t gps_error_state; +volatile enum gps_error gps_error_state; /** * GPS Active? */ -enum gps_power_state_t { +enum gps_power_state { GPS_HIBERNATE = 0, GPS_ACTIVE = 1, }; -enum gps_power_state_t gps_power_state = GPS_HIBERNATE; +enum gps_power_state gps_power_state = GPS_HIBERNATE; /** * Flight State */ -enum gps_flight_state_t gps_flight_state = GPS_FLIGHT_STATE_LAUNCH; +enum gps_flight_state gps_flight_state = GPS_FLIGHT_STATE_LAUNCH; /** * Lock State */ -uint8_t gps_is_locked_priv = 0; +enum gps_lock_state gps_is_locked_priv = GPS_NO_LOCK; /** * OSP Output Ack/Nack @@ -476,7 +476,7 @@ void _osp_send_message(osp_message_t* message, uint8_t* payload, uint16_t length /** * Returns current flight state */ -enum gps_flight_state_t gps_get_flight_state(void) +enum gps_flight_state gps_get_flight_state(void) { return gps_flight_state; } @@ -532,7 +532,7 @@ void gps_make_hibernate(void) /** * Lock state. Set by gps_get_data */ -uint8_t gps_is_locked(void) +enum gps_lock_state gps_is_locked(void) { return gps_is_locked_priv; } @@ -547,7 +547,7 @@ uint8_t gps_is_locked(void) * Gets the current error state of the GPS to check validity of last * request */ -enum gps_error_t gps_get_error_state(void) +enum gps_error gps_get_error_state(void) { return gps_error_state; } diff --git a/firmware/src/main.c b/firmware/src/main.c index 0858c34..0f61827 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -170,7 +170,7 @@ void aprs_telemetry(struct tracker_datapoint* dp) { struct tracker_datapoint* backlog_dp_ptr; - if (!gps_is_locked()) return; /* Don't bother with no GPS */ + if (gps_is_locked() == GPS_NO_LOCK) return; /* Don't bother with no GPS */ /* Set location */ aprs_set_datapoint(dp); @@ -215,10 +215,14 @@ uint32_t hibernate_time_s = 1; */ void set_hibernate_time(void) { - if (gps_get_flight_state() == GPS_FLIGHT_STATE_LAUNCH) { - hibernate_time_s = 60-20; /* approx every minute */ + if (gps_is_locked() == GPS_NO_LOCK) { /* no lock */ + hibernate_time_s = 0; /* shortest hibernate */ + + } else if (gps_get_flight_state() == GPS_FLIGHT_STATE_LAUNCH) { + hibernate_time_s = 60-20; /* approx every minute */ + } else { - hibernate_time_s = 240-20; /* approx every 4 minutes */ + hibernate_time_s = 240-20; /* approx every 4 minutes */ } } /** diff --git a/firmware/src/sequencer.c b/firmware/src/sequencer.c index 7d8d37a..f5836d7 100644 --- a/firmware/src/sequencer.c +++ b/firmware/src/sequencer.c @@ -55,7 +55,8 @@ void telemetry_sequence(struct tracker_datapoint* dp, uint32_t n) #if RF_TX_ENABLE #if TELEMETRY_ENABLE #if TELEMETRY_USE_GEOFENCE - if (location_telemetry_active()) { + if (location_telemetry_active() || /* in geofence */ + (gps_is_locked() == GPS_NO_LOCK)) { /* or no lock */ #endif /* Pips */ @@ -106,8 +107,8 @@ void run_sequencer(uint32_t n) telemetry_sequence(dp, n); /* Backlog */ - if (((n % 15) == 10) && /* Once per hour with 4 minute wakeup */ - gps_is_locked()) { /* And the gps is locked */ + if (((n % 15) == 10) && /* Once per hour with 4 minute wakeup */ + gps_is_locked() == GPS_LOCKED) { /* And the gps is locked */ record_backlog(dp); } }