Skip to content

Commit 2983175

Browse files
authored
Added functionality to pass custom parameter to HardwareTimer callback (#892)
1 parent dc7a43f commit 2983175

File tree

6 files changed

+20
-22
lines changed

6 files changed

+20
-22
lines changed

cores/arduino/HardwareTimer.cpp

+7-8
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,7 @@ uint32_t HardwareTimer::getCaptureCompare(uint32_t channel, TimerCompareFormat_
859859
* HERTZ_FORMAT: return value is the frequency in hertz for Capture/Compare value
860860
* @retval None
861861
*/
862-
void HardwareTimer::setPWM(uint32_t channel, uint32_t pin, uint32_t frequency, uint32_t dutycycle, void (*PeriodCallback)(HardwareTimer *), void (*CompareCallback)(HardwareTimer *))
862+
void HardwareTimer::setPWM(uint32_t channel, uint32_t pin, uint32_t frequency, uint32_t dutycycle, callback_function_t PeriodCallback, callback_function_t CompareCallback)
863863
{
864864
setPWM(channel, digitalPinToPinName(pin), frequency, dutycycle, PeriodCallback, CompareCallback);
865865
}
@@ -876,7 +876,7 @@ void HardwareTimer::setPWM(uint32_t channel, uint32_t pin, uint32_t frequency, u
876876
* HERTZ_FORMAT: return value is the frequency in hertz for Capture/Compare value
877877
* @retval None
878878
*/
879-
void HardwareTimer::setPWM(uint32_t channel, PinName pin, uint32_t frequency, uint32_t dutycycle, void (*PeriodCallback)(HardwareTimer *), void (*CompareCallback)(HardwareTimer *))
879+
void HardwareTimer::setPWM(uint32_t channel, PinName pin, uint32_t frequency, uint32_t dutycycle, callback_function_t PeriodCallback, callback_function_t CompareCallback)
880880
{
881881
setMode(channel, TIMER_OUTPUT_COMPARE_PWM1, pin);
882882
setOverflow(frequency, HERTZ_FORMAT);
@@ -908,9 +908,9 @@ void HardwareTimer::setInterruptPriority(uint32_t preemptPriority, uint32_t subP
908908
* @param callback: interrupt callback
909909
* @retval None
910910
*/
911-
void HardwareTimer::attachInterrupt(void (*callback)(HardwareTimer *))
911+
void HardwareTimer::attachInterrupt(callback_function_t callback)
912912
{
913-
if (callbacks[0] != NULL) {
913+
if (callbacks[0]) {
914914
// Callback previously configured : do not clear neither enable IT, it is just a change of callback
915915
callbacks[0] = callback;
916916
} else {
@@ -941,7 +941,7 @@ void HardwareTimer::detachInterrupt()
941941
* @param callback: interrupt callback
942942
* @retval None
943943
*/
944-
void HardwareTimer::attachInterrupt(uint32_t channel, void (*callback)(HardwareTimer *))
944+
void HardwareTimer::attachInterrupt(uint32_t channel, callback_function_t callback)
945945
{
946946
int interrupt = getIT(channel);
947947
if (interrupt == -1) {
@@ -951,7 +951,6 @@ void HardwareTimer::attachInterrupt(uint32_t channel, void (*callback)(HardwareT
951951
if ((channel == 0) || (channel > (TIMER_CHANNELS + 1))) {
952952
Error_Handler(); // only channel 1..4 have an interrupt
953953
}
954-
955954
if (callbacks[channel] != NULL) {
956955
// Callback previously configured : do not clear neither enable IT, it is just a change of callback
957956
callbacks[channel] = callback;
@@ -1047,7 +1046,7 @@ void HardwareTimer::updateCallback(TIM_HandleTypeDef *htim)
10471046
HardwareTimer *HT = (HardwareTimer *)(obj->__this);
10481047

10491048
if (HT->callbacks[0] != NULL) {
1050-
HT->callbacks[0](HT);
1049+
HT->callbacks[0]();
10511050
}
10521051
}
10531052

@@ -1088,7 +1087,7 @@ void HardwareTimer::captureCompareCallback(TIM_HandleTypeDef *htim)
10881087
HardwareTimer *HT = (HardwareTimer *)(obj->__this);
10891088

10901089
if (HT->callbacks[channel] != NULL) {
1091-
HT->callbacks[channel](HT);
1090+
HT->callbacks[channel]();
10921091
}
10931092
}
10941093

cores/arduino/HardwareTimer.h

+8-6
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ typedef enum {
9292

9393
#ifdef __cplusplus
9494

95+
#include <functional>
96+
using callback_function_t = std::function<void(void)>;
97+
9598
/* Class --------------------------------------------------------*/
9699
class HardwareTimer {
97100
public:
@@ -109,8 +112,8 @@ class HardwareTimer {
109112
void setOverflow(uint32_t val, TimerFormat_t format = TICK_FORMAT); // set AutoReload register depending on format provided
110113
uint32_t getOverflow(TimerFormat_t format = TICK_FORMAT); // return overflow depending on format provided
111114

112-
void setPWM(uint32_t channel, PinName pin, uint32_t frequency, uint32_t dutycycle, void (*PeriodCallback)(HardwareTimer *) = NULL, void (*CompareCallback)(HardwareTimer *) = NULL); // Set all in one command freq in HZ, Duty in percentage. Including both interrup.
113-
void setPWM(uint32_t channel, uint32_t pin, uint32_t frequency, uint32_t dutycycle, void (*PeriodCallback)(HardwareTimer *) = NULL, void (*CompareCallback)(HardwareTimer *) = NULL);
115+
void setPWM(uint32_t channel, PinName pin, uint32_t frequency, uint32_t dutycycle, callback_function_t PeriodCallback = nullptr, callback_function_t CompareCallback = nullptr); // Set all in one command freq in HZ, Duty in percentage. Including both interrup.
116+
void setPWM(uint32_t channel, uint32_t pin, uint32_t frequency, uint32_t dutycycle, callback_function_t PeriodCallback = nullptr, callback_function_t CompareCallback = nullptr);
114117

115118
void setCount(uint32_t val, TimerFormat_t format = TICK_FORMAT); // set timer counter to value 'val' depending on format provided
116119
uint32_t getCount(TimerFormat_t format = TICK_FORMAT); // return current counter value of timer depending on format provided
@@ -128,14 +131,13 @@ class HardwareTimer {
128131
void setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority); // set interrupt priority
129132

130133
//Add interrupt to period update
131-
void attachInterrupt(void (*handler)(HardwareTimer *)); // Attach interrupt callback which will be called upon update event (timer rollover)
134+
void attachInterrupt(callback_function_t callback); // Attach interrupt callback which will be called upon update event (timer rollover)
132135
void detachInterrupt(); // remove interrupt callback which was attached to update event
133136
bool hasInterrupt(); //returns true if a timer rollover interrupt has already been set
134137
//Add interrupt to capture/compare channel
135-
void attachInterrupt(uint32_t channel, void (*handler)(HardwareTimer *)); // Attach interrupt callback which will be called upon compare match event of specified channel
138+
void attachInterrupt(uint32_t channel, callback_function_t callback); // Attach interrupt callback which will be called upon compare match event of specified channel
136139
void detachInterrupt(uint32_t channel); // remove interrupt callback which was attached to compare match event of specified channel
137140
bool hasInterrupt(uint32_t channel); //returns true if an interrupt has already been set on the channel compare match
138-
139141
void timerHandleDeinit(); // Timer deinitialization
140142

141143
// Refresh() is usefull while timer is running after some registers update
@@ -158,7 +160,7 @@ class HardwareTimer {
158160
private:
159161
TimerModes_t _ChannelMode[TIMER_CHANNELS];
160162
timerObj_t _timerObj;
161-
void (*callbacks[1 + TIMER_CHANNELS])(HardwareTimer *); //Callbacks: 0 for update, 1-4 for channels. (channel5/channel6, if any, doesn't have interrupt)
163+
callback_function_t callbacks[1 + TIMER_CHANNELS]; //Callbacks: 0 for update, 1-4 for channels. (channel5/channel6, if any, doesn't have interrupt)
162164
};
163165

164166
extern timerObj_t *HardwareTimer_Handle[TIMER_NUM];

cores/arduino/Tone.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ typedef struct {
3232
} timerPinInfo_t;
3333

3434
static void timerTonePinInit(PinName p, uint32_t frequency, uint32_t duration);
35-
static void tonePeriodElapsedCallback(HardwareTimer *HT);
35+
static void tonePeriodElapsedCallback();
3636
static timerPinInfo_t TimerTone_pinInfo = {NC, 0};
3737
static HardwareTimer *TimerTone = NULL;
3838

@@ -41,9 +41,8 @@ static HardwareTimer *TimerTone = NULL;
4141
* @param htim : timer handle
4242
* @retval None
4343
*/
44-
static void tonePeriodElapsedCallback(HardwareTimer *HT)
44+
static void tonePeriodElapsedCallback()
4545
{
46-
UNUSED(HT);
4746
GPIO_TypeDef *port = get_GPIO_Port(STM_PORT(TimerTone_pinInfo.pin));
4847

4948
if (port != NULL) {

libraries/Servo/src/stm32/Servo.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,8 @@ uint8_t ServoCount = 0; // the total number o
4040
/************ static functions common to all instances ***********************/
4141

4242
volatile uint32_t CumulativeCountSinceRefresh = 0;
43-
static void Servo_PeriodElapsedCallback(HardwareTimer *HT)
43+
static void Servo_PeriodElapsedCallback()
4444
{
45-
UNUSED(HT);
4645
// Only 1 timer used
4746
timer16_Sequence_t timer_id = _timer1;
4847

libraries/SoftwareSerial/src/SoftwareSerial.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -290,9 +290,8 @@ inline void SoftwareSerial::recv()
290290
//
291291

292292
/* static */
293-
inline void SoftwareSerial::handleInterrupt(HardwareTimer *timer)
293+
inline void SoftwareSerial::handleInterrupt()
294294
{
295-
UNUSED(timer);
296295
if (active_in) {
297296
active_in->recv();
298297
}

libraries/SoftwareSerial/src/SoftwareSerial.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ class SoftwareSerial : public Stream {
8484
void setRX();
8585
void setSpeed(uint32_t speed);
8686
void setRXTX(bool input);
87-
static void handleInterrupt(HardwareTimer *timer);
87+
static void handleInterrupt();
8888

8989
public:
9090
// public methods

0 commit comments

Comments
 (0)