Changing Timer callback to Mbed Callback

Time handler class had a c style callback attached to it which
had been hampering us to be fully object oriented.
That particular callback is changed to Mbed Callback which is attatched
to a specific object hence allowing us to be fully object oriented.
pull/6059/head
Hasnain Virk 2018-01-05 10:47:09 +02:00
parent e18d76aa7e
commit f62253ca0e
4 changed files with 51 additions and 58 deletions

View File

@ -41,13 +41,6 @@ using namespace events;
*/ */
static EventQueue *ev_queue; static EventQueue *ev_queue;
/*!
* TODO: We should get rid of this
*
* Static handle to LoRaMac object. This is needed for static callback methods.
*/
static LoRaMac* isrHandler = NULL;
/*! /*!
* Maximum length of the fOpts field * Maximum length of the fOpts field
*/ */
@ -93,8 +86,6 @@ LoRaMac::LoRaMac(LoRaWANTimeHandler &lora_time)
: mac_commands(*this), : mac_commands(*this),
_lora_time(lora_time) _lora_time(lora_time)
{ {
isrHandler = this;
lora_phy = NULL; lora_phy = NULL;
//radio_events_t RadioEvents; //radio_events_t RadioEvents;
LoRaMacDevEui = NULL; LoRaMacDevEui = NULL;
@ -172,64 +163,64 @@ LoRaMac::~LoRaMac()
**************************************************************************/ **************************************************************************/
void LoRaMac::handle_tx_done(void) void LoRaMac::handle_tx_done(void)
{ {
ev_queue->call(isrHandler, &LoRaMac::OnRadioTxDone); ev_queue->call(this, &LoRaMac::OnRadioTxDone);
} }
void LoRaMac::handle_rx_done(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) void LoRaMac::handle_rx_done(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
{ {
ev_queue->call(isrHandler, &LoRaMac::OnRadioRxDone, payload, size, rssi, snr); ev_queue->call(this, &LoRaMac::OnRadioRxDone, payload, size, rssi, snr);
} }
void LoRaMac::handle_rx_error(void) void LoRaMac::handle_rx_error(void)
{ {
ev_queue->call(isrHandler, &LoRaMac::OnRadioRxError); ev_queue->call(this, &LoRaMac::OnRadioRxError);
} }
void LoRaMac::handle_rx_timeout(void) void LoRaMac::handle_rx_timeout(void)
{ {
ev_queue->call(isrHandler, &LoRaMac::OnRadioRxTimeout); ev_queue->call(this, &LoRaMac::OnRadioRxTimeout);
} }
void LoRaMac::handle_tx_timeout(void) void LoRaMac::handle_tx_timeout(void)
{ {
ev_queue->call(isrHandler, &LoRaMac::OnRadioTxTimeout); ev_queue->call(this, &LoRaMac::OnRadioTxTimeout);
} }
void LoRaMac::handle_cad_done(bool cad) void LoRaMac::handle_cad_done(bool cad)
{ {
//TODO Not implemented yet //TODO Not implemented yet
//ev_queue->call(isrHandler, &LoRaMac::OnRadioCadDone, cad); //ev_queue->call(this, &LoRaMac::OnRadioCadDone, cad);
} }
void LoRaMac::handle_fhss_change_channel(uint8_t cur_channel) void LoRaMac::handle_fhss_change_channel(uint8_t cur_channel)
{ {
// TODO Not implemented yet // TODO Not implemented yet
//ev_queue->call(isrHandler, &LoRaMac::OnRadioFHSSChangeChannel, cur_channel); //ev_queue->call(this, &LoRaMac::OnRadioFHSSChangeChannel, cur_channel);
} }
void LoRaMac::handle_mac_state_check_timer_event(void) void LoRaMac::handle_mac_state_check_timer_event(void)
{ {
ev_queue->call(isrHandler, &LoRaMac::OnMacStateCheckTimerEvent); ev_queue->call(this, &LoRaMac::OnMacStateCheckTimerEvent);
} }
void LoRaMac::handle_delayed_tx_timer_event(void) void LoRaMac::handle_delayed_tx_timer_event(void)
{ {
ev_queue->call(isrHandler, &LoRaMac::OnTxDelayedTimerEvent); ev_queue->call(this, &LoRaMac::OnTxDelayedTimerEvent);
} }
void LoRaMac::handle_ack_timeout() void LoRaMac::handle_ack_timeout()
{ {
ev_queue->call(isrHandler, &LoRaMac::OnAckTimeoutTimerEvent); ev_queue->call(this, &LoRaMac::OnAckTimeoutTimerEvent);
} }
void LoRaMac::handle_rx1_timer_event(void) void LoRaMac::handle_rx1_timer_event(void)
{ {
ev_queue->call(isrHandler, &LoRaMac::OnRxWindow1TimerEvent); ev_queue->call(this, &LoRaMac::OnRxWindow1TimerEvent);
} }
void LoRaMac::handle_rx2_timer_event(void) void LoRaMac::handle_rx2_timer_event(void)
{ {
ev_queue->call(isrHandler, &LoRaMac::OnRxWindow2TimerEvent); ev_queue->call(this, &LoRaMac::OnRxWindow2TimerEvent);
} }
/*************************************************************************** /***************************************************************************
@ -1794,13 +1785,13 @@ LoRaMacStatus_t LoRaMac::LoRaMacInitialization(LoRaMacPrimitives_t *primitives,
lora_phy->put_radio_to_sleep(); lora_phy->put_radio_to_sleep();
// Initialize timers // Initialize timers
_lora_time.TimerInit(&MacStateCheckTimer, handle_mac_state_check_timer_event); _lora_time.TimerInit(&MacStateCheckTimer, mbed::callback(this, &LoRaMac::handle_mac_state_check_timer_event));
_lora_time.TimerSetValue(&MacStateCheckTimer, MAC_STATE_CHECK_TIMEOUT); _lora_time.TimerSetValue(&MacStateCheckTimer, MAC_STATE_CHECK_TIMEOUT);
_lora_time.TimerInit(&TxDelayedTimer, handle_delayed_tx_timer_event); _lora_time.TimerInit(&TxDelayedTimer, mbed::callback(this, &LoRaMac::handle_delayed_tx_timer_event));
_lora_time.TimerInit(&RxWindowTimer1, handle_rx1_timer_event); _lora_time.TimerInit(&RxWindowTimer1, mbed::callback(this, &LoRaMac::handle_rx1_timer_event));
_lora_time.TimerInit(&RxWindowTimer2, handle_rx2_timer_event); _lora_time.TimerInit(&RxWindowTimer2, mbed::callback(this, &LoRaMac::handle_rx2_timer_event));
_lora_time.TimerInit(&AckTimeoutTimer, handle_ack_timeout); _lora_time.TimerInit(&AckTimeoutTimer, mbed::callback(this, &LoRaMac::handle_ack_timeout));
// Store the current initialization time // Store the current initialization time
LoRaMacInitializationTime = _lora_time.TimerGetCurrentTime(); LoRaMacInitializationTime = _lora_time.TimerGetCurrentTime();
@ -2694,11 +2685,11 @@ LoRaMacStatus_t LoRaMac::LoRaMacMcpsRequest( McpsReq_t *mcpsRequest )
radio_events_t *LoRaMac::GetPhyEventHandlers() radio_events_t *LoRaMac::GetPhyEventHandlers()
{ {
RadioEvents.tx_done = mbed::callback(handle_tx_done); RadioEvents.tx_done = mbed::callback(this, &LoRaMac::handle_tx_done);
RadioEvents.rx_done = mbed::callback(handle_rx_done); RadioEvents.rx_done = mbed::callback(this, &LoRaMac::handle_rx_done);
RadioEvents.rx_error = mbed::callback(handle_rx_error); RadioEvents.rx_error = mbed::callback(this, &LoRaMac::handle_rx_error);
RadioEvents.tx_timeout = mbed::callback(handle_tx_timeout); RadioEvents.tx_timeout = mbed::callback(this, &LoRaMac::handle_tx_timeout);
RadioEvents.rx_timeout = mbed::callback(handle_rx_timeout); RadioEvents.rx_timeout = mbed::callback(this, &LoRaMac::handle_rx_timeout);
return &RadioEvents; return &RadioEvents;
} }

View File

@ -583,25 +583,25 @@ private:
* \brief Opens up a continuous RX 2 window. This is used for * \brief Opens up a continuous RX 2 window. This is used for
* class c devices. * class c devices.
*/ */
void OpenContinuousRx2Window( void ); void OpenContinuousRx2Window(void);
/** /**
* Prototypes for ISR handlers * Prototypes for ISR handlers
*/ */
static void handle_cad_done(bool cad); void handle_cad_done(bool cad);
static void handle_tx_done(void); void handle_tx_done(void);
static void handle_rx_done(uint8_t *payload, uint16_t size, int16_t rssi, void handle_rx_done(uint8_t *payload, uint16_t size, int16_t rssi,
int8_t snr); int8_t snr);
static void handle_rx_error(void); void handle_rx_error(void);
static void handle_rx_timeout(void); void handle_rx_timeout(void);
static void handle_tx_timeout(void); void handle_tx_timeout(void);
static void handle_fhss_change_channel(uint8_t cur_channel); void handle_fhss_change_channel(uint8_t cur_channel);
static void handle_rx1_timer_event(void); void handle_rx1_timer_event(void);
static void handle_rx2_timer_event(void); void handle_rx2_timer_event(void);
static void handle_ack_timeout(void); void handle_ack_timeout(void);
static void handle_delayed_tx_timer_event(void); void handle_delayed_tx_timer_event(void);
static void handle_mac_state_check_timer_event(void); void handle_mac_state_check_timer_event(void);
static void handle_next_tx_timer_event(void); void handle_next_tx_timer_event(void);
private: private:
/** /**

View File

@ -45,7 +45,7 @@ TimerTime_t LoRaWANTimeHandler::TimerGetElapsedTime( TimerTime_t savedTime )
return TimerGetCurrentTime() - savedTime; return TimerGetCurrentTime() - savedTime;
} }
void LoRaWANTimeHandler::TimerInit( TimerEvent_t *obj, void ( *callback )( void ) ) void LoRaWANTimeHandler::TimerInit( TimerEvent_t *obj, mbed::Callback<void()> callback)
{ {
obj->value = 0; obj->value = 0;
obj->Callback = callback; obj->Callback = callback;

View File

@ -33,7 +33,7 @@ SPDX-License-Identifier: BSD-3-Clause
typedef struct TimerEvent_s typedef struct TimerEvent_s
{ {
uint32_t value; uint32_t value;
void ( *Callback )( void ); mbed::Callback<void()> Callback;
SingletonPtr<mbed::Ticker> Timer; SingletonPtr<mbed::Ticker> Timer;
}TimerEvent_t; }TimerEvent_t;
@ -52,6 +52,17 @@ public:
*/ */
void TimerTimeCounterInit(events::EventQueue *queue); void TimerTimeCounterInit(events::EventQueue *queue);
/*!
* \brief Initializes the timer object.
*
* \remark The TimerSetValue function must be called before starting the timer.
* This function initializes the timestamp and reloads the value at 0.
*
* \param [in] obj The structure containing the timer object parameters.
* \param [in] callback The function callback called at the end of the timeout.
*/
void TimerInit( TimerEvent_t *obj, mbed::Callback<void()> callback);
/*! /*!
* \brief Read the current time. * \brief Read the current time.
* *
@ -67,16 +78,7 @@ public:
*/ */
TimerTime_t TimerGetElapsedTime( TimerTime_t savedTime ); TimerTime_t TimerGetElapsedTime( TimerTime_t savedTime );
/*!
* \brief Initializes the timer object.
*
* \remark The TimerSetValue function must be called before starting the timer.
* This function initializes the timestamp and reloads the value at 0.
*
* \param [in] obj The structure containing the timer object parameters.
* \param [in] callback The function callback called at the end of the timeout.
*/
void TimerInit( TimerEvent_t *obj, void ( *callback )( void ) );
/*! /*!
* \brief Starts and adds the timer object to the list of timer events. * \brief Starts and adds the timer object to the list of timer events.