1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-02-26 15: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 bool rfm22_timeToSend(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_calcChannelFromClock(struct pios_rfm22b_dev *rfm22b_dev);
static bool rfm22_changeChannel(struct pios_rfm22b_dev *rfm22b_dev);
static void rfm22_clearLEDs();
// 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 void rfm22_hmac_sha1(const uint8_t *data, size_t len, uint8_t key[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->stats.tx_byte_count += len;
rfm22b_dev->packet_start_ticks = xTaskGetTickCount();
if (rfm22b_dev->packet_start_ticks == 0) {
rfm22b_dev->packet_start_ticks = 1;
rfm22b_dev->packet_start_time = pios_rfm22_time_ms();
if (rfm22b_dev->packet_start_time == 0) {
rfm22b_dev->packet_start_time = 1;
}
// 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
D2_LED_ON;
#endif // PIOS_RFM22B_DEBUG_ON_TELEM
rfm22b_dev->packet_start_ticks = xTaskGetTickCount();
if (rfm22b_dev->packet_start_ticks == 0) {
rfm22b_dev->packet_start_ticks = 1;
rfm22b_dev->packet_start_time = pios_rfm22_time_ms();
if (rfm22b_dev->packet_start_time == 0) {
rfm22b_dev->packet_start_time = 1;
}
// 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)) {
return;
}
portTickType lastEventTicks = xTaskGetTickCount();
uint32_t lastEventTime = pios_rfm22_time_ms();
while (1) {
#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.
if (xSemaphoreTake(rfm22b_dev->isrPending, ISR_TIMEOUT / portTICK_RATE_MS) == pdTRUE) {
lastEventTicks = xTaskGetTickCount();
lastEventTime = pios_rfm22_time_ms();
// Process events through the state machine.
enum pios_radio_event event;
@ -1210,14 +1211,14 @@ static void pios_rfm22_task(void *parameters)
}
} else {
// Has it been too long since the last event?
portTickType curTicks = xTaskGetTickCount();
if (pios_rfm22_time_difference_ms(lastEventTicks, curTicks) > PIOS_RFM22B_SUPERVISOR_TIMEOUT) {
uint32_t curTime = pios_rfm22_time_ms();
if (pios_rfm22_time_difference_ms(lastEventTime, curTime) > PIOS_RFM22B_SUPERVISOR_TIMEOUT) {
// Clear the event queue.
enum pios_radio_event event;
while (xQueueReceive(rfm22b_dev->eventQueue, &event, 0) == pdTRUE) {
// Do nothing;
}
lastEventTicks = xTaskGetTickCount();
lastEventTime = pios_rfm22_time_ms();
// Transsition through an error event.
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);
}
portTickType curTicks = xTaskGetTickCount();
// Have we been sending / receiving this packet too long?
if ((rfm22b_dev->packet_start_ticks > 0) &&
(pios_rfm22_time_difference_ms(rfm22b_dev->packet_start_ticks, curTicks) > (rfm22b_dev->packet_time * 3))) {
uint32_t curTime = pios_rfm22_time_ms();
if ((rfm22b_dev->packet_start_time > 0) &&
(pios_rfm22_time_difference_ms(rfm22b_dev->packet_start_time, curTime) > (rfm22b_dev->packet_time * 3))) {
rfm22_process_event(rfm22b_dev, RADIO_EVENT_TIMEOUT);
}
@ -1388,15 +1388,14 @@ static enum pios_radio_event rfm22_init(struct pios_rfm22b_dev *rfm22b_dev)
rfm22b_dev->tx_packet_handle = NULL;
// Initialize the devide state
rfm22b_dev->rx_buffer_wr = 0;
rfm22b_dev->tx_data_rd = rfm22b_dev->tx_data_wr = 0;
rfm22b_dev->rx_buffer_wr = 0;
rfm22b_dev->tx_data_rd = rfm22b_dev->tx_data_wr = 0;
rfm22b_dev->channel = 0;
rfm22b_dev->channel_index = 0;
rfm22b_dev->afc_correction_Hz = 0;
rfm22b_dev->packet_start_ticks = 0;
rfm22b_dev->tx_complete_ticks = 0;
rfm22b_dev->rfm22b_state = RFM22B_STATE_INITIALIZING;
rfm22b_dev->last_contact = 0;
rfm22b_dev->channel_index = 0;
rfm22b_dev->afc_correction_Hz = 0;
rfm22b_dev->packet_start_time = 0;
rfm22b_dev->rfm22b_state = RFM22B_STATE_INITIALIZING;
rfm22b_dev->last_contact = 0;
// software reset the RF chip .. following procedure according to Si4x3x Errata (rev. B)
rfm22_write_claim(rfm22b_dev, RFM22_op_and_func_ctrl1, RFM22_opfc1_swres);
@ -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_dev->rx_buffer_wr = 0;
rfm22b_dev->packet_start_ticks = 0;
rfm22b_dev->packet_start_time = 0;
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
if (res == PIOS_RFM22B_TX_COMPLETE) {
radio_dev->tx_complete_ticks = xTaskGetTickCount();
// Is this an ACK?
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;
// Start a new transaction
radio_dev->packet_start_ticks = 0;
radio_dev->packet_start_time = 0;
#ifdef PIOS_RFM22B_DEBUG_ON_TELEM
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)) {
return RADIO_EVENT_NUM_EVENTS;
}
rfm22b_dev->packet_start_ticks = 0;
rfm22b_dev->packet_start_time = 0;
// No event generated
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);
}
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.afc_correction = radio_dev->afc_correction_Hz;
} else {
@ -2128,7 +2125,7 @@ static enum pios_radio_event radio_rxData(struct pios_rfm22b_dev *radio_dev)
#endif
// Start a new transaction
radio_dev->packet_start_ticks = 0;
radio_dev->packet_start_time = 0;
break;
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)
{
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)
{
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.
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.
*
* @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)) {
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)
{
portTickType time = rfm22_coordinatorTime(rfm22b_dev, xTaskGetTickCount());
uint32_t time = rfm22_coordinatorTime(rfm22b_dev);
bool is_coordinator = rfm22_isCoordinator(rfm22b_dev);
// If this is a one-way link, only the coordinator can send.
@ -2404,10 +2403,10 @@ 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)
{
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.
// 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;
return rfm22_calcChannel(rfm22b_dev, n);
}
@ -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)
{
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;
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)
{
rfm22b_dev->stats.timeouts++;
rfm22b_dev->packet_start_ticks = 0;
rfm22b_dev->packet_start_time = 0;
// Release the Tx packet if it's set.
if (rfm22b_dev->tx_packet_handle != 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.
* 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.
* Get the current time in ms from the ticks counter.
*/
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) {
return (end_time - start_time) * portTICK_RATE_MS;
return end_time - start_time;
}
// 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;
// The packet timers.
portTickType packet_start_ticks;
portTickType tx_complete_ticks;
portTickType packet_start_time;
portTickType time_delta;
portTickType last_contact;
};