[gps_ubx] improve polling functions, use GPS_MAXIDLE, tidy indent

main-solar-only
Richard Meadows 2016-08-04 12:15:34 +01:00
rodzic d29d7f8176
commit 7505efd54c
3 zmienionych plików z 96 dodań i 89 usunięć

Wyświetl plik

@ -45,7 +45,7 @@ typedef enum {
*/ */
#define MAXIDLE_WHILE_TELEMETRY_ACTIVE 60000 #define MAXIDLE_WHILE_TELEMETRY_ACTIVE 60000
#define MAXIDLE_WAIT_FOR_NEXT_TELEMETRY 30000 #define MAXIDLE_WAIT_FOR_NEXT_TELEMETRY 30000
#define MAXIDLE_WAIT_FOR_GPS 30000 #define MAXIDLE_WAIT_FOR_GPS 1000
struct idle_counter { struct idle_counter {
uint32_t while_telemetry_active; uint32_t while_telemetry_active;

Wyświetl plik

@ -147,9 +147,10 @@ struct tracker_datapoint* collect_data(void)
* ---- GPS UBX ---- * ---- GPS UBX ----
*/ */
/* wait for GPS, if it takes forever the watchdog will save us */ /* wait for GPS, if it takes forever the watchdog will save us */
kick_the_watchdog(); while (gps_update_time_pending() || gps_update_position_pending()) {
while (gps_update_time_pending() || gps_update_position_pending()); idle(IDLE_WAIT_FOR_GPS);
kick_the_watchdog(); }
if (gps_get_error_state() != GPS_NOERROR) { if (gps_get_error_state() != GPS_NOERROR) {
/* Error updating GPS position */ /* Error updating GPS position */

Wyświetl plik

@ -109,9 +109,9 @@ volatile ubx_message_t* const ubx_messages[] = {
/** /**
* Platform specific handlers * Platform specific handlers
*/ */
#define _send_buffer(tx_data, length) \ #define _send_buffer(tx_data, length) \
do { usart_write_buffer_wait(GPS_SERCOM, tx_data, length); } while (0) do { usart_write_buffer_wait(GPS_SERCOM, tx_data, length); } while (0)
#define _error_handler(error_type) \ #define _error_handler(error_type) \
do { gps_error_state = error_type; } while (0) do { gps_error_state = error_type; } while (0)
@ -177,13 +177,13 @@ void ubx_process_frame(uint8_t* frame)
/** Otherwise it could be a message frame, search for a type */ /** Otherwise it could be a message frame, search for a type */
for (uint32_t i = 0; i < sizeof(ubx_messages)/sizeof(ubx_message_t*); i++) { for (uint32_t i = 0; i < sizeof(ubx_messages)/sizeof(ubx_message_t*); i++) {
if (message_id == ubx_messages[i]->id) { // Match! if (message_id == ubx_messages[i]->id) { // Match!
/* Populate struct */ /* Populate struct */
memcpy((void*)(ubx_messages[i]+1), frame + 4, payload_length); memcpy((void*)(ubx_messages[i]+1), frame + 4, payload_length);
/* Set the message state */ /* Set the message state */
ubx_messages[i]->state = UBX_PACKET_UPDATED; ubx_messages[i]->state = UBX_PACKET_UPDATED;
return; return;
} }
} }
} }
@ -280,6 +280,16 @@ enum gps_error _ubx_poll(ubx_message_t* message) {
return gps_error_state; return gps_error_state;
} }
/**
* Implements a microsecond delay
*/
static inline void delay_us(uint32_t microseconds)
{
volatile int32_t i = microseconds * 8;
while(i--);
}
/** /**
* Disable NMEA messages on the uBlox * Disable NMEA messages on the uBlox
*/ */
@ -295,10 +305,10 @@ void gps_set_io_config(uint32_t baud_rate)
ubx_cfg_prt.payload.flags = 0; ubx_cfg_prt.payload.flags = 0;
_ubx_send_message((ubx_message_t*)&ubx_cfg_prt, _ubx_send_message((ubx_message_t*)&ubx_cfg_prt,
(uint8_t*)&ubx_cfg_prt.payload, (uint8_t*)&ubx_cfg_prt.payload,
sizeof(ubx_cfg_prt.payload)); sizeof(ubx_cfg_prt.payload));
for (int i = 0; i < 1000*100; i++); delay_us(1000*50);
} }
/** /**
@ -311,10 +321,10 @@ void gps_cfg_rst(void)
ubx_cfg_rst.payload.reserved1 = 0; ubx_cfg_rst.payload.reserved1 = 0;
_ubx_send_message((ubx_message_t*)&ubx_cfg_rst, _ubx_send_message((ubx_message_t*)&ubx_cfg_rst,
(uint8_t*)&ubx_cfg_rst.payload, (uint8_t*)&ubx_cfg_rst.payload,
sizeof(ubx_cfg_rst.payload)); sizeof(ubx_cfg_rst.payload));
for (int i = 0; i < 1000*100; i++); delay_us(1000*50);
} }
@ -369,7 +379,7 @@ void gps_update_position(void)
int gps_update_time_pending(void) int gps_update_time_pending(void)
{ {
return (ubx_nav_timeutc.state == UBX_PACKET_WAITING && return (ubx_nav_timeutc.state == UBX_PACKET_WAITING &&
gps_error_state == GPS_NOERROR); gps_error_state == GPS_NOERROR);
} }
/** /**
* Indicates a pending position update from the GPS * Indicates a pending position update from the GPS
@ -377,7 +387,7 @@ int gps_update_time_pending(void)
int gps_update_position_pending(void) int gps_update_position_pending(void)
{ {
return (((ubx_nav_posllh.state == UBX_PACKET_WAITING) || return (((ubx_nav_posllh.state == UBX_PACKET_WAITING) ||
(ubx_nav_sol.state == UBX_PACKET_WAITING)) && (ubx_nav_sol.state == UBX_PACKET_WAITING)) &&
gps_error_state == GPS_NOERROR); gps_error_state == GPS_NOERROR);
//(ubx_nav_status.state == UBX_PACKET_WAITING); //(ubx_nav_status.state == UBX_PACKET_WAITING);
@ -471,8 +481,8 @@ void gps_set_platform_model(void)
ubx_cfg_nav5.payload.dynModel = GPS_PLATFORM_MODEL; ubx_cfg_nav5.payload.dynModel = GPS_PLATFORM_MODEL;
/* Send */ /* Send */
_ubx_send_message((ubx_message_t*)&ubx_cfg_nav5, _ubx_send_message((ubx_message_t*)&ubx_cfg_nav5,
(uint8_t*)&ubx_cfg_nav5.payload, (uint8_t*)&ubx_cfg_nav5.payload,
sizeof(ubx_cfg_nav5.payload)); sizeof(ubx_cfg_nav5.payload));
} }
} }
@ -498,8 +508,8 @@ void gps_set_timepulse_five(uint32_t frequency)
/* Write the new settings */ /* Write the new settings */
_ubx_send_message((ubx_message_t*)&ubx_cfg_tp5, _ubx_send_message((ubx_message_t*)&ubx_cfg_tp5,
(uint8_t*)&ubx_cfg_tp5.payload, (uint8_t*)&ubx_cfg_tp5.payload,
sizeof(ubx_cfg_tp5.payload)); sizeof(ubx_cfg_tp5.payload));
} }
/** /**
* Set which GNSS constellations to use * Set which GNSS constellations to use
@ -514,12 +524,12 @@ void gps_set_gnss(void)
/* For each configuration block */ /* For each configuration block */
for (uint8_t i = 0; i < ubx_cfg_gnss.payload.numConfigBlocks; i++) { for (uint8_t i = 0; i < ubx_cfg_gnss.payload.numConfigBlocks; i++) {
/* If it's the configuration for something other than GPS */ /* If it's the configuration for something other than GPS */
if (ubx_cfg_gnss.payload.block[i].gnssID != UBX_GNSS_GPS) { if (ubx_cfg_gnss.payload.block[i].gnssID != UBX_GNSS_GPS) {
/* Disable this GNSS system */ /* Disable this GNSS system */
ubx_cfg_gnss.payload.block[i].flags &= ~0x1; ubx_cfg_gnss.payload.block[i].flags &= ~0x1;
} }
} }
break; break;
default: default:
@ -528,8 +538,8 @@ void gps_set_gnss(void)
/* Write the new settings */ /* Write the new settings */
_ubx_send_message((ubx_message_t*)&ubx_cfg_gnss, _ubx_send_message((ubx_message_t*)&ubx_cfg_gnss,
(uint8_t*)&ubx_cfg_gnss.payload, (uint8_t*)&ubx_cfg_gnss.payload,
4 + (8 * ubx_cfg_gnss.payload.numConfigBlocks)); 4 + (8 * ubx_cfg_gnss.payload.numConfigBlocks));
} }
/** /**
* Sets the powersave mode * Sets the powersave mode
@ -540,8 +550,8 @@ void gps_set_powersave(bool powersave_on)
/* Write the new settings */ /* Write the new settings */
_ubx_send_message((ubx_message_t*)&ubx_cfg_rxm, _ubx_send_message((ubx_message_t*)&ubx_cfg_rxm,
(uint8_t*)&ubx_cfg_rxm.payload, (uint8_t*)&ubx_cfg_rxm.payload,
sizeof(ubx_cfg_rxm.payload)); sizeof(ubx_cfg_rxm.payload));
} }
/** /**
* Sets the PWR power state * Sets the PWR power state
@ -553,8 +563,8 @@ void gps_set_power_state(bool gnss_running)
/* Write the new settings */ /* Write the new settings */
_ubx_send_message((ubx_message_t*)&ubx_cfg_pwr, _ubx_send_message((ubx_message_t*)&ubx_cfg_pwr,
(uint8_t*)&ubx_cfg_pwr.payload, (uint8_t*)&ubx_cfg_pwr.payload,
sizeof(ubx_cfg_pwr.payload)); sizeof(ubx_cfg_pwr.payload));
} }
/** /**
* Sets the powersave mode automatically based on if we're locked. * Sets the powersave mode automatically based on if we're locked.
@ -585,30 +595,30 @@ void gps_usart_init_enable(uint32_t baud_rate)
{ {
/* USART */ /* USART */
usart_init(GPS_SERCOM, usart_init(GPS_SERCOM,
USART_DATAORDER_LSB, /** Bit order (MSB or LSB first) */ USART_DATAORDER_LSB, /** Bit order (MSB or LSB first) */
USART_TRANSFER_ASYNCHRONOUSLY, /** Asynchronous or synchronous mode */ USART_TRANSFER_ASYNCHRONOUSLY, /** Asynchronous or synchronous mode */
USART_PARITY_NONE, /** USART parity */ USART_PARITY_NONE, /** USART parity */
USART_STOPBITS_1, /** Number of stop bits */ USART_STOPBITS_1, /** Number of stop bits */
USART_CHARACTER_SIZE_8BIT, /** USART character size */ USART_CHARACTER_SIZE_8BIT, /** USART character size */
GPS_SERCOM_MUX, /** USART pinout */ GPS_SERCOM_MUX, /** USART pinout */
false, /** Immediate buffer overflow notification */ false, /** Immediate buffer overflow notification */
false, /** Enable IrDA encoding format */ false, /** Enable IrDA encoding format */
19, /** Minimum pulse length required for IrDA rx */ 19, /** Minimum pulse length required for IrDA rx */
false, /** Enable LIN Slave Support */ false, /** Enable LIN Slave Support */
false, /** Enable start of frame dection */ false, /** Enable start of frame dection */
false, /** Enable collision dection */ false, /** Enable collision dection */
baud_rate, /** USART Baud rate */ baud_rate, /** USART Baud rate */
true, /** Enable receiver */ true, /** Enable receiver */
true, /** Enable transmitter */ true, /** Enable transmitter */
false, /** Sample on the rising edge of XLCK */ false, /** Sample on the rising edge of XLCK */
false, /** Use the external clock applied to the XCK pin. */ false, /** Use the external clock applied to the XCK pin. */
0, /** External clock frequency in synchronous mode. */ 0, /** External clock frequency in synchronous mode. */
true, /** Run in standby */ true, /** Run in standby */
GPS_GCLK, /** GCLK generator source */ GPS_GCLK, /** GCLK generator source */
GPS_SERCOM_MOGI_PINMUX, /** PAD0 pinmux */ GPS_SERCOM_MOGI_PINMUX, /** PAD0 pinmux */
GPS_SERCOM_MIGO_PINMUX, /** PAD1 pinmux */ GPS_SERCOM_MIGO_PINMUX, /** PAD1 pinmux */
PINMUX_UNUSED, /** PAD2 pinmux */ PINMUX_UNUSED, /** PAD2 pinmux */
PINMUX_UNUSED); /** PAD3 pinmux */ PINMUX_UNUSED); /** PAD3 pinmux */
usart_enable(GPS_SERCOM); usart_enable(GPS_SERCOM);
} }
@ -635,9 +645,9 @@ void gps_reset(void)
{ {
#ifdef GPS_RESET_PIN #ifdef GPS_RESET_PIN
port_pin_set_config(GPS_RESET_PIN, port_pin_set_config(GPS_RESET_PIN,
PORT_PIN_DIR_OUTPUT, /* Direction */ PORT_PIN_DIR_OUTPUT, /* Direction */
PORT_PIN_PULL_NONE, /* Pull */ PORT_PIN_PULL_NONE, /* Pull */
false); /* Powersave */ false); /* Powersave */
port_pin_set_output_level(GPS_RESET_PIN, 0); /* active low */ port_pin_set_output_level(GPS_RESET_PIN, 0); /* active low */
#endif #endif
} }
@ -668,10 +678,6 @@ void gps_init(void)
/* Incoming ubx messages are handled in an irq */ /* Incoming ubx messages are handled in an irq */
usart_register_rx_callback(GPS_SERCOM, gps_rx_callback, GPS_SERCOM_INT_PRIO); usart_register_rx_callback(GPS_SERCOM, gps_rx_callback, GPS_SERCOM_INT_PRIO);
kick_the_watchdog();
for (int i = 0; i < 100*1000; i++) { kick_the_watchdog(); }
/* Set the platform model */ /* Set the platform model */
gps_set_platform_model(); gps_set_platform_model();
@ -696,30 +702,30 @@ void usart_loopback_test(void)
uint16_t data; uint16_t data;
usart_init(GPS_SERCOM, usart_init(GPS_SERCOM,
USART_DATAORDER_LSB, /** Bit order (MSB or LSB first) */ USART_DATAORDER_LSB, /** Bit order (MSB or LSB first) */
USART_TRANSFER_ASYNCHRONOUSLY, /** Asynchronous or synchronous mode */ USART_TRANSFER_ASYNCHRONOUSLY, /** Asynchronous or synchronous mode */
USART_PARITY_NONE, /** USART parity */ USART_PARITY_NONE, /** USART parity */
USART_STOPBITS_1, /** Number of stop bits */ USART_STOPBITS_1, /** Number of stop bits */
USART_CHARACTER_SIZE_8BIT, /** USART character size */ USART_CHARACTER_SIZE_8BIT, /** USART character size */
USART_MUX_LOOPBACK, /** USART pin out */ USART_MUX_LOOPBACK, /** USART pin out */
false, /** Immediate buffer overflow notification */ false, /** Immediate buffer overflow notification */
false, /** Enable IrDA encoding format */ false, /** Enable IrDA encoding format */
19, /** Minimum pulse length required for IrDA rx */ 19, /** Minimum pulse length required for IrDA rx */
false, /** Enable LIN Slave Support */ false, /** Enable LIN Slave Support */
false, /** Enable start of frame dection */ false, /** Enable start of frame dection */
false, /** Enable collision dection */ false, /** Enable collision dection */
GPS_BAUD_RATE, /** USART Baud rate */ GPS_BAUD_RATE, /** USART Baud rate */
true, /** Enable receiver */ true, /** Enable receiver */
true, /** Enable transmitter */ true, /** Enable transmitter */
false, /** Sample on the rising edge of XLCK */ false, /** Sample on the rising edge of XLCK */
false, /** Use the external clock applied to the XCK pin. */ false, /** Use the external clock applied to the XCK pin. */
0, /** External clock frequency in synchronous mode. */ 0, /** External clock frequency in synchronous mode. */
false, /** Run in standby */ false, /** Run in standby */
GPS_GCLK, /** GCLK generator source */ GPS_GCLK, /** GCLK generator source */
GPS_SERCOM_MOGI_PINMUX, /** PAD0 pinmux */ GPS_SERCOM_MOGI_PINMUX, /** PAD0 pinmux */
GPS_SERCOM_MIGO_PINMUX, /** PAD1 pinmux */ GPS_SERCOM_MIGO_PINMUX, /** PAD1 pinmux */
PINMUX_UNUSED, /** PAD2 pinmux */ PINMUX_UNUSED, /** PAD2 pinmux */
PINMUX_UNUSED); /** PAD3 pinmux */ PINMUX_UNUSED); /** PAD3 pinmux */
usart_enable(GPS_SERCOM); usart_enable(GPS_SERCOM);