1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-02-27 16:54:15 +01:00

Merged in webbbn/librepilot/LP-507-convert-all-times-in-rfm22b-drive (pull request #415)

LP-507 Converts all tick times in the rfm22b driver to ms.

Approved-by: Lalanne Laurent <f5soh@free.fr>
Approved-by: Alessio Morale <alessiomorale@gmail.com>
Approved-by: Philippe Renon <philippe_renon@yahoo.fr>
This commit is contained in:
Brian Webb 2017-04-22 17:35:40 +00:00 committed by Alessio Morale
commit 027e021378
2 changed files with 60 additions and 54 deletions

View File

@ -200,14 +200,15 @@ static bool rfm22_isCoordinator(struct pios_rfm22b_dev *rfm22b_dev);
static uint32_t rfm22_destinationID(struct pios_rfm22b_dev *rfm22b_dev); static uint32_t rfm22_destinationID(struct pios_rfm22b_dev *rfm22b_dev);
static bool rfm22_timeToSend(struct pios_rfm22b_dev *rfm22b_dev); static bool rfm22_timeToSend(struct pios_rfm22b_dev *rfm22b_dev);
static void rfm22_synchronizeClock(struct pios_rfm22b_dev *rfm22b_dev); static void rfm22_synchronizeClock(struct pios_rfm22b_dev *rfm22b_dev);
static portTickType rfm22_coordinatorTime(struct pios_rfm22b_dev *rfm22b_dev, portTickType ticks); static uint32_t rfm22_coordinatorTime(struct pios_rfm22b_dev *rfm22b_dev);
static uint8_t rfm22_calcChannel(struct pios_rfm22b_dev *rfm22b_dev, uint8_t index); static uint8_t rfm22_calcChannel(struct pios_rfm22b_dev *rfm22b_dev, uint8_t index);
static uint8_t rfm22_calcChannelFromClock(struct pios_rfm22b_dev *rfm22b_dev); static uint8_t rfm22_calcChannelFromClock(struct pios_rfm22b_dev *rfm22b_dev);
static bool rfm22_changeChannel(struct pios_rfm22b_dev *rfm22b_dev); static bool rfm22_changeChannel(struct pios_rfm22b_dev *rfm22b_dev);
static void rfm22_clearLEDs(); static void rfm22_clearLEDs();
// Utility functions. // Utility functions.
static uint32_t pios_rfm22_time_difference_ms(portTickType start_time, portTickType end_time); static uint32_t pios_rfm22_time_ms();
static uint32_t pios_rfm22_time_difference_ms(uint32_t start_time, uint32_t end_time);
static struct pios_rfm22b_dev *pios_rfm22_alloc(void); static struct pios_rfm22b_dev *pios_rfm22_alloc(void);
static void rfm22_hmac_sha1(const uint8_t *data, size_t len, uint8_t key[SHA1_DIGEST_LENGTH], static void rfm22_hmac_sha1(const uint8_t *data, size_t len, uint8_t key[SHA1_DIGEST_LENGTH],
uint8_t digest[SHA1_DIGEST_LENGTH]); uint8_t digest[SHA1_DIGEST_LENGTH]);
@ -810,9 +811,9 @@ bool PIOS_RFM22B_TransmitPacket(uint32_t rfm22b_id, uint8_t *p, uint8_t len)
rfm22b_dev->tx_packet_handle = p; rfm22b_dev->tx_packet_handle = p;
rfm22b_dev->stats.tx_byte_count += len; rfm22b_dev->stats.tx_byte_count += len;
rfm22b_dev->packet_start_ticks = xTaskGetTickCount(); rfm22b_dev->packet_start_time = pios_rfm22_time_ms();
if (rfm22b_dev->packet_start_ticks == 0) { if (rfm22b_dev->packet_start_time == 0) {
rfm22b_dev->packet_start_ticks = 1; rfm22b_dev->packet_start_time = 1;
} }
// Claim the SPI bus. // Claim the SPI bus.
@ -1050,9 +1051,9 @@ pios_rfm22b_int_result PIOS_RFM22B_ProcessRx(uint32_t rfm22b_id)
#ifdef PIOS_RFM22B_DEBUG_ON_TELEM #ifdef PIOS_RFM22B_DEBUG_ON_TELEM
D2_LED_ON; D2_LED_ON;
#endif // PIOS_RFM22B_DEBUG_ON_TELEM #endif // PIOS_RFM22B_DEBUG_ON_TELEM
rfm22b_dev->packet_start_ticks = xTaskGetTickCount(); rfm22b_dev->packet_start_time = pios_rfm22_time_ms();
if (rfm22b_dev->packet_start_ticks == 0) { if (rfm22b_dev->packet_start_time == 0) {
rfm22b_dev->packet_start_ticks = 1; rfm22b_dev->packet_start_time = 1;
} }
// We detected the preamble, now wait for sync. // We detected the preamble, now wait for sync.
@ -1187,7 +1188,7 @@ static void pios_rfm22_task(void *parameters)
if (!PIOS_RFM22B_Validate(rfm22b_dev)) { if (!PIOS_RFM22B_Validate(rfm22b_dev)) {
return; return;
} }
portTickType lastEventTicks = xTaskGetTickCount(); uint32_t lastEventTime = pios_rfm22_time_ms();
while (1) { while (1) {
#if defined(PIOS_INCLUDE_WDG) && defined(PIOS_WDG_RFM22B) #if defined(PIOS_INCLUDE_WDG) && defined(PIOS_WDG_RFM22B)
@ -1197,7 +1198,7 @@ static void pios_rfm22_task(void *parameters)
// Wait for a signal indicating an external interrupt or a pending send/receive request. // Wait for a signal indicating an external interrupt or a pending send/receive request.
if (xSemaphoreTake(rfm22b_dev->isrPending, ISR_TIMEOUT / portTICK_RATE_MS) == pdTRUE) { if (xSemaphoreTake(rfm22b_dev->isrPending, ISR_TIMEOUT / portTICK_RATE_MS) == pdTRUE) {
lastEventTicks = xTaskGetTickCount(); lastEventTime = pios_rfm22_time_ms();
// Process events through the state machine. // Process events through the state machine.
enum pios_radio_event event; enum pios_radio_event event;
@ -1210,14 +1211,14 @@ static void pios_rfm22_task(void *parameters)
} }
} else { } else {
// Has it been too long since the last event? // Has it been too long since the last event?
portTickType curTicks = xTaskGetTickCount(); uint32_t curTime = pios_rfm22_time_ms();
if (pios_rfm22_time_difference_ms(lastEventTicks, curTicks) > PIOS_RFM22B_SUPERVISOR_TIMEOUT) { if (pios_rfm22_time_difference_ms(lastEventTime, curTime) > PIOS_RFM22B_SUPERVISOR_TIMEOUT) {
// Clear the event queue. // Clear the event queue.
enum pios_radio_event event; enum pios_radio_event event;
while (xQueueReceive(rfm22b_dev->eventQueue, &event, 0) == pdTRUE) { while (xQueueReceive(rfm22b_dev->eventQueue, &event, 0) == pdTRUE) {
// Do nothing; // Do nothing;
} }
lastEventTicks = xTaskGetTickCount(); lastEventTime = pios_rfm22_time_ms();
// Transsition through an error event. // Transsition through an error event.
rfm22_process_event(rfm22b_dev, RADIO_EVENT_ERROR); rfm22_process_event(rfm22b_dev, RADIO_EVENT_ERROR);
@ -1229,11 +1230,10 @@ static void pios_rfm22_task(void *parameters)
rfm22_process_event(rfm22b_dev, RADIO_EVENT_RX_MODE); rfm22_process_event(rfm22b_dev, RADIO_EVENT_RX_MODE);
} }
portTickType curTicks = xTaskGetTickCount();
// Have we been sending / receiving this packet too long? // Have we been sending / receiving this packet too long?
uint32_t curTime = pios_rfm22_time_ms();
if ((rfm22b_dev->packet_start_ticks > 0) && if ((rfm22b_dev->packet_start_time > 0) &&
(pios_rfm22_time_difference_ms(rfm22b_dev->packet_start_ticks, curTicks) > (rfm22b_dev->packet_time * 3))) { (pios_rfm22_time_difference_ms(rfm22b_dev->packet_start_time, curTime) > (rfm22b_dev->packet_time * 3))) {
rfm22_process_event(rfm22b_dev, RADIO_EVENT_TIMEOUT); rfm22_process_event(rfm22b_dev, RADIO_EVENT_TIMEOUT);
} }
@ -1393,8 +1393,7 @@ static enum pios_radio_event rfm22_init(struct pios_rfm22b_dev *rfm22b_dev)
rfm22b_dev->channel = 0; rfm22b_dev->channel = 0;
rfm22b_dev->channel_index = 0; rfm22b_dev->channel_index = 0;
rfm22b_dev->afc_correction_Hz = 0; rfm22b_dev->afc_correction_Hz = 0;
rfm22b_dev->packet_start_ticks = 0; rfm22b_dev->packet_start_time = 0;
rfm22b_dev->tx_complete_ticks = 0;
rfm22b_dev->rfm22b_state = RFM22B_STATE_INITIALIZING; rfm22b_dev->rfm22b_state = RFM22B_STATE_INITIALIZING;
rfm22b_dev->last_contact = 0; rfm22b_dev->last_contact = 0;
@ -1807,7 +1806,7 @@ static void rfm22_rxFailure(struct pios_rfm22b_dev *rfm22b_dev)
{ {
rfm22b_add_rx_status(rfm22b_dev, RADIO_FAILURE_RX_PACKET); rfm22b_add_rx_status(rfm22b_dev, RADIO_FAILURE_RX_PACKET);
rfm22b_dev->rx_buffer_wr = 0; rfm22b_dev->rx_buffer_wr = 0;
rfm22b_dev->packet_start_ticks = 0; rfm22b_dev->packet_start_time = 0;
rfm22b_dev->rfm22b_state = RFM22B_STATE_TRANSITION; rfm22b_dev->rfm22b_state = RFM22B_STATE_TRANSITION;
} }
@ -1944,14 +1943,12 @@ static enum pios_radio_event radio_txData(struct pios_rfm22b_dev *radio_dev)
// Is the transmition complete // Is the transmition complete
if (res == PIOS_RFM22B_TX_COMPLETE) { if (res == PIOS_RFM22B_TX_COMPLETE) {
radio_dev->tx_complete_ticks = xTaskGetTickCount();
// Is this an ACK? // Is this an ACK?
ret_event = RADIO_EVENT_RX_MODE; ret_event = RADIO_EVENT_RX_MODE;
radio_dev->tx_packet_handle = 0; radio_dev->tx_packet_handle = 0;
radio_dev->tx_data_wr = radio_dev->tx_data_rd = 0; radio_dev->tx_data_wr = radio_dev->tx_data_rd = 0;
// Start a new transaction // Start a new transaction
radio_dev->packet_start_ticks = 0; radio_dev->packet_start_time = 0;
#ifdef PIOS_RFM22B_DEBUG_ON_TELEM #ifdef PIOS_RFM22B_DEBUG_ON_TELEM
D1_LED_OFF; D1_LED_OFF;
@ -1972,7 +1969,7 @@ static enum pios_radio_event radio_setRxMode(struct pios_rfm22b_dev *rfm22b_dev)
if (!PIOS_RFM22B_ReceivePacket((uint32_t)rfm22b_dev, rfm22b_dev->rx_packet)) { if (!PIOS_RFM22B_ReceivePacket((uint32_t)rfm22b_dev, rfm22b_dev->rx_packet)) {
return RADIO_EVENT_NUM_EVENTS; return RADIO_EVENT_NUM_EVENTS;
} }
rfm22b_dev->packet_start_ticks = 0; rfm22b_dev->packet_start_time = 0;
// No event generated // No event generated
return RADIO_EVENT_NUM_EVENTS; return RADIO_EVENT_NUM_EVENTS;
@ -2096,7 +2093,7 @@ static enum pios_radio_event radio_receivePacket(struct pios_rfm22b_dev *radio_d
rfm22_synchronizeClock(radio_dev); rfm22_synchronizeClock(radio_dev);
} }
radio_dev->stats.link_state = OPLINKSTATUS_LINKSTATE_CONNECTED; radio_dev->stats.link_state = OPLINKSTATUS_LINKSTATE_CONNECTED;
radio_dev->last_contact = xTaskGetTickCount(); radio_dev->last_contact = pios_rfm22_time_ms();
radio_dev->stats.rssi = radio_dev->rssi_dBm; radio_dev->stats.rssi = radio_dev->rssi_dBm;
radio_dev->stats.afc_correction = radio_dev->afc_correction_Hz; radio_dev->stats.afc_correction = radio_dev->afc_correction_Hz;
} else { } else {
@ -2128,7 +2125,7 @@ static enum pios_radio_event radio_rxData(struct pios_rfm22b_dev *radio_dev)
#endif #endif
// Start a new transaction // Start a new transaction
radio_dev->packet_start_ticks = 0; radio_dev->packet_start_time = 0;
break; break;
case PIOS_RFM22B_INT_FAILURE: case PIOS_RFM22B_INT_FAILURE:
@ -2252,7 +2249,7 @@ static void rfm22_updateStats(struct pios_rfm22b_dev *rfm22b_dev)
*/ */
static bool rfm22_checkTimeOut(struct pios_rfm22b_dev *rfm22b_dev) static bool rfm22_checkTimeOut(struct pios_rfm22b_dev *rfm22b_dev)
{ {
return pios_rfm22_time_difference_ms(rfm22b_dev->last_contact, xTaskGetTickCount()) >= CONNECTED_TIMEOUT; return pios_rfm22_time_difference_ms(rfm22b_dev->last_contact, pios_rfm22_time_ms()) >= CONNECTED_TIMEOUT;
} }
/** /**
@ -2315,7 +2312,7 @@ uint32_t rfm22_destinationID(struct pios_rfm22b_dev *rfm22b_dev)
*/ */
static void rfm22_synchronizeClock(struct pios_rfm22b_dev *rfm22b_dev) static void rfm22_synchronizeClock(struct pios_rfm22b_dev *rfm22b_dev)
{ {
portTickType start_time = rfm22b_dev->packet_start_ticks; uint32_t start_time = rfm22b_dev->packet_start_time;
// This packet was transmitted on channel 0, calculate the time delta that will force us to transmit on channel 0 at the time this packet started. // This packet was transmitted on channel 0, calculate the time delta that will force us to transmit on channel 0 at the time this packet started.
uint16_t frequency_hop_cycle_time = rfm22b_dev->packet_time * rfm22b_dev->num_channels; uint16_t frequency_hop_cycle_time = rfm22b_dev->packet_time * rfm22b_dev->num_channels;
@ -2329,17 +2326,19 @@ static void rfm22_synchronizeClock(struct pios_rfm22b_dev *rfm22b_dev)
} }
/** /**
* Return the extimated current clock ticks count on the coordinator modem. * Return the estimated current time on the coordinator modem.
* This is the master clock used for all synchronization. * This is the master clock used for all synchronization.
* *
* @param[in] rfm22b_dev The device structure * @param[in] rfm22b_dev The device structure
*/ */
static portTickType rfm22_coordinatorTime(struct pios_rfm22b_dev *rfm22b_dev, portTickType ticks) static uint32_t rfm22_coordinatorTime(struct pios_rfm22b_dev *rfm22b_dev)
{ {
uint32_t time = pios_rfm22_time_ms();
if (rfm22_isCoordinator(rfm22b_dev)) { if (rfm22_isCoordinator(rfm22b_dev)) {
return ticks; return time;
} }
return ticks + rfm22b_dev->time_delta; return time + rfm22b_dev->time_delta;
} }
/** /**
@ -2349,7 +2348,7 @@ static portTickType rfm22_coordinatorTime(struct pios_rfm22b_dev *rfm22b_dev, po
*/ */
static bool rfm22_timeToSend(struct pios_rfm22b_dev *rfm22b_dev) static bool rfm22_timeToSend(struct pios_rfm22b_dev *rfm22b_dev)
{ {
portTickType time = rfm22_coordinatorTime(rfm22b_dev, xTaskGetTickCount()); uint32_t time = rfm22_coordinatorTime(rfm22b_dev);
bool is_coordinator = rfm22_isCoordinator(rfm22b_dev); bool is_coordinator = rfm22_isCoordinator(rfm22b_dev);
// If this is a one-way link, only the coordinator can send. // If this is a one-way link, only the coordinator can send.
@ -2404,7 +2403,7 @@ static uint8_t rfm22_calcChannel(struct pios_rfm22b_dev *rfm22b_dev, uint8_t ind
*/ */
static uint8_t rfm22_calcChannelFromClock(struct pios_rfm22b_dev *rfm22b_dev) static uint8_t rfm22_calcChannelFromClock(struct pios_rfm22b_dev *rfm22b_dev)
{ {
portTickType time = rfm22_coordinatorTime(rfm22b_dev, xTaskGetTickCount()); uint32_t time = rfm22_coordinatorTime(rfm22b_dev);
// Divide time into 8ms blocks. Coordinator sends in first 2 ms, and remote send in 5th and 6th ms. // Divide time into 8ms blocks. Coordinator sends in first 2 ms, and remote send in 5th and 6th ms.
// Channel changes occur in the last 2 ms. // Channel changes occur in the last 2 ms.
uint8_t n = (time / rfm22b_dev->packet_time) % rfm22b_dev->num_channels; uint8_t n = (time / rfm22b_dev->packet_time) % rfm22b_dev->num_channels;
@ -2441,7 +2440,7 @@ static bool rfm22_changeChannel(struct pios_rfm22b_dev *rfm22b_dev)
static enum pios_radio_event rfm22_txFailure(struct pios_rfm22b_dev *rfm22b_dev) static enum pios_radio_event rfm22_txFailure(struct pios_rfm22b_dev *rfm22b_dev)
{ {
rfm22b_dev->stats.tx_failure++; rfm22b_dev->stats.tx_failure++;
rfm22b_dev->packet_start_ticks = 0; rfm22b_dev->packet_start_time = 0;
rfm22b_dev->tx_data_wr = rfm22b_dev->tx_data_rd = 0; rfm22b_dev->tx_data_wr = rfm22b_dev->tx_data_rd = 0;
return RADIO_EVENT_TX_START; return RADIO_EVENT_TX_START;
} }
@ -2455,7 +2454,7 @@ static enum pios_radio_event rfm22_txFailure(struct pios_rfm22b_dev *rfm22b_dev)
static enum pios_radio_event rfm22_timeout(struct pios_rfm22b_dev *rfm22b_dev) static enum pios_radio_event rfm22_timeout(struct pios_rfm22b_dev *rfm22b_dev)
{ {
rfm22b_dev->stats.timeouts++; rfm22b_dev->stats.timeouts++;
rfm22b_dev->packet_start_ticks = 0; rfm22b_dev->packet_start_time = 0;
// Release the Tx packet if it's set. // Release the Tx packet if it's set.
if (rfm22b_dev->tx_packet_handle != 0) { if (rfm22b_dev->tx_packet_handle != 0) {
rfm22b_dev->tx_data_rd = rfm22b_dev->tx_data_wr = 0; rfm22b_dev->tx_data_rd = rfm22b_dev->tx_data_wr = 0;
@ -2526,19 +2525,27 @@ static enum pios_radio_event rfm22_fatal_error(__attribute__((unused)) struct pi
*****************************************************************************/ *****************************************************************************/
/** /**
* Calculate the time difference between the start time and end time. * Get the current time in ms from the ticks counter.
* Times are in ticks. Also handles rollover.
*
* @param[in] start_time The start time in ticks.
* @param[in] end_time The end time in ticks.
*/ */
static uint32_t pios_rfm22_time_difference_ms(portTickType start_time, portTickType end_time) static uint32_t pios_rfm22_time_ms()
{
return xTaskGetTickCount() * portTICK_RATE_MS;
}
/**
* Calculate the time difference between the start time and end time.
* Times are in ms. Also handles rollover.
*
* @param[in] start_time The start time in ms.
* @param[in] end_time The end time in ms.
*/
static uint32_t pios_rfm22_time_difference_ms(uint32_t start_time, uint32_t end_time)
{ {
if (end_time >= start_time) { if (end_time >= start_time) {
return (end_time - start_time) * portTICK_RATE_MS; return end_time - start_time;
} }
// Rollover // Rollover
return ((portMAX_DELAY - start_time) + end_time) * portTICK_RATE_MS; return (UINT32_MAX - start_time) + end_time;
} }
/** /**

View File

@ -308,8 +308,7 @@ struct pios_rfm22b_dev {
int32_t afc_correction_Hz; int32_t afc_correction_Hz;
// The packet timers. // The packet timers.
portTickType packet_start_ticks; portTickType packet_start_time;
portTickType tx_complete_ticks;
portTickType time_delta; portTickType time_delta;
portTickType last_contact; portTickType last_contact;
}; };