From 0b936e57740cd76aa3643d0adcc5d741978302c0 Mon Sep 17 00:00:00 2001 From: Erik tideman Date: Sun, 26 Jan 2020 14:32:30 +0100 Subject: [PATCH 1/8] Added functionality to pass custom parameter to HardwareTimer callback --- cores/arduino/HardwareTimer.cpp | 16 +++++++++++++--- cores/arduino/HardwareTimer.h | 8 ++++++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/cores/arduino/HardwareTimer.cpp b/cores/arduino/HardwareTimer.cpp index 7477eea9de..97591be69b 100644 --- a/cores/arduino/HardwareTimer.cpp +++ b/cores/arduino/HardwareTimer.cpp @@ -850,8 +850,9 @@ void HardwareTimer::setInterruptPriority(uint32_t preemptPriority, uint32_t subP * @param callback: interrupt callback * @retval None */ -void HardwareTimer::attachInterrupt(void (*callback)(HardwareTimer *)) +void HardwareTimer::attachInterrupt(void (*callback)(HardwareTimer *), void *arg) { + args[0] = arg; if (callbacks[0] != NULL) { // Callback previously configured : do not clear neither enable IT, it is just a change of callback callbacks[0] = callback; @@ -875,6 +876,7 @@ void HardwareTimer::detachInterrupt() // Disable update interrupt and clear callback __HAL_TIM_DISABLE_IT(&(_timerObj.handle), TIM_IT_UPDATE); // disables the interrupt call to save cpu cycles for useless context switching callbacks[0] = NULL; + args[0] = NULL; } /** @@ -883,7 +885,7 @@ void HardwareTimer::detachInterrupt() * @param callback: interrupt callback * @retval None */ -void HardwareTimer::attachInterrupt(uint32_t channel, void (*callback)(HardwareTimer *)) +void HardwareTimer::attachInterrupt(uint32_t channel, void (*callback)(HardwareTimer *), void *arg) { int interrupt = getIT(channel); if (interrupt == -1) { @@ -893,7 +895,7 @@ void HardwareTimer::attachInterrupt(uint32_t channel, void (*callback)(HardwareT if ((channel == 0) || (channel > (TIMER_CHANNELS + 1))) { Error_Handler(); // only channel 1..4 have an interrupt } - + args[channel] = arg; if (callbacks[channel] != NULL) { // Callback previously configured : do not clear neither enable IT, it is just a change of callback callbacks[channel] = callback; @@ -927,6 +929,14 @@ void HardwareTimer::detachInterrupt(uint32_t channel) // Disable interrupt corresponding to channel and clear callback __HAL_TIM_DISABLE_IT(&(_timerObj.handle), interrupt); callbacks[channel] = NULL; + args[channel] = NULL; +} + +void* HardwareTimer::getArg(uint32_t channel){ + if (channel > (TIMER_CHANNELS + 1)) { + Error_Handler(); + } + return args[channel]; } /** diff --git a/cores/arduino/HardwareTimer.h b/cores/arduino/HardwareTimer.h index c02e47e587..789f7dd76d 100644 --- a/cores/arduino/HardwareTimer.h +++ b/cores/arduino/HardwareTimer.h @@ -126,14 +126,16 @@ class HardwareTimer { void setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority); // set interrupt priority //Add interrupt to period update - void attachInterrupt(void (*handler)(HardwareTimer *)); // Attach interrupt callback which will be called upon update event (timer rollover) + void attachInterrupt(void (*handler)(HardwareTimer *), void *arg = NULL); // Attach interrupt callback which will be called upon update event (timer rollover) void detachInterrupt(); // remove interrupt callback which was attached to update event bool hasInterrupt(); //returns true if a timer rollover interrupt has already been set //Add interrupt to capture/compare channel - void attachInterrupt(uint32_t channel, void (*handler)(HardwareTimer *)); // Attach interrupt callback which will be called upon compare match event of specified channel + void attachInterrupt(uint32_t channel, void (*handler)(HardwareTimer *), void *arg = NULL); // Attach interrupt callback which will be called upon compare match event of specified channel void detachInterrupt(uint32_t channel); // remove interrupt callback which was attached to compare match event of specified channel bool hasInterrupt(uint32_t channel); //returns true if an interrupt has already been set on the channel compare match + void* getArg(uint32_t channel = 0); + void timerHandleDeinit(); // Timer deinitialization // Refresh() is usefull while timer is running after some registers update @@ -152,6 +154,8 @@ class HardwareTimer { TimerModes_t _ChannelMode[TIMER_CHANNELS]; timerObj_t _timerObj; void (*callbacks[1 + TIMER_CHANNELS])(HardwareTimer *); //Callbacks: 0 for update, 1-4 for channels. (channel5/channel6, if any, doesn't have interrupt) + void *args[1 + TIMER_CHANNELS]; + int getChannel(uint32_t channel); int getLLChannel(uint32_t channel); int getIT(uint32_t channel); From 015ca5ae2e32a3354a86d1f837fd16ffabf6d92b Mon Sep 17 00:00:00 2001 From: Erik tideman Date: Mon, 27 Jan 2020 19:36:20 +0100 Subject: [PATCH 2/8] Fixed comments from review in HardwareTimer --- cores/arduino/HardwareTimer.cpp | 21 ++++++++++++++++++--- cores/arduino/HardwareTimer.h | 4 ++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/cores/arduino/HardwareTimer.cpp b/cores/arduino/HardwareTimer.cpp index 97591be69b..8200fd7afc 100644 --- a/cores/arduino/HardwareTimer.cpp +++ b/cores/arduino/HardwareTimer.cpp @@ -932,9 +932,24 @@ void HardwareTimer::detachInterrupt(uint32_t channel) args[channel] = NULL; } -void* HardwareTimer::getArg(uint32_t channel){ - if (channel > (TIMER_CHANNELS + 1)) { - Error_Handler(); +/** + * @brief Get argument attached to (rollover) event. + * @retval Associated pointer to attached argument or NULL if not set. + */ +void *HardwareTimer::getArg() +{ + return args[0]; +} + +/** + * @brief Get argument attached to Capture/Compare event. + * @param channel: arduino channel [1..4] + * @retval Associated pointer to attached argument or NULL if not set. + */ +void *HardwareTimer::getArg(uint32_t channel) +{ + if ((channel == 0) || (channel > (TIMER_CHANNELS + 1))) { + Error_Handler(); // only channel 1..4 have an interrupt } return args[channel]; } diff --git a/cores/arduino/HardwareTimer.h b/cores/arduino/HardwareTimer.h index 789f7dd76d..d8a33157ad 100644 --- a/cores/arduino/HardwareTimer.h +++ b/cores/arduino/HardwareTimer.h @@ -129,12 +129,12 @@ class HardwareTimer { void attachInterrupt(void (*handler)(HardwareTimer *), void *arg = NULL); // Attach interrupt callback which will be called upon update event (timer rollover) void detachInterrupt(); // remove interrupt callback which was attached to update event bool hasInterrupt(); //returns true if a timer rollover interrupt has already been set + void *getArg(); // Getter for attached argument to event (timer rollover) //Add interrupt to capture/compare channel void attachInterrupt(uint32_t channel, void (*handler)(HardwareTimer *), void *arg = NULL); // Attach interrupt callback which will be called upon compare match event of specified channel void detachInterrupt(uint32_t channel); // remove interrupt callback which was attached to compare match event of specified channel bool hasInterrupt(uint32_t channel); //returns true if an interrupt has already been set on the channel compare match - - void* getArg(uint32_t channel = 0); + void *getArg(uint32_t channel); // Getter for attached argument to compare match event of specified channel void timerHandleDeinit(); // Timer deinitialization From e34baac876ad67bfb1cea24a22e4cdb07a4b15cb Mon Sep 17 00:00:00 2001 From: Erik Tideman Date: Tue, 28 Jan 2020 19:14:08 +0100 Subject: [PATCH 3/8] added comments for new param in attachInterrupts --- cores/arduino/HardwareTimer.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cores/arduino/HardwareTimer.cpp b/cores/arduino/HardwareTimer.cpp index 8200fd7afc..8c9aed52b7 100644 --- a/cores/arduino/HardwareTimer.cpp +++ b/cores/arduino/HardwareTimer.cpp @@ -848,6 +848,7 @@ void HardwareTimer::setInterruptPriority(uint32_t preemptPriority, uint32_t subP /** * @brief Attach interrupt callback on update (rollover) event * @param callback: interrupt callback + * @param arg: pointer to optional argument to associate with interrupt * @retval None */ void HardwareTimer::attachInterrupt(void (*callback)(HardwareTimer *), void *arg) @@ -883,6 +884,7 @@ void HardwareTimer::detachInterrupt() * @brief Attach interrupt callback on Capture/Compare event * @param channel: Arduino channel [1..4] * @param callback: interrupt callback + * @param arg: pointer to optional argument to associate with interrupt * @retval None */ void HardwareTimer::attachInterrupt(uint32_t channel, void (*callback)(HardwareTimer *), void *arg) From c2b6251e275e61e35f922a51b9d635bacb15678d Mon Sep 17 00:00:00 2001 From: Erik tideman Date: Thu, 5 Mar 2020 15:28:11 +0100 Subject: [PATCH 4/8] Changed HardwareTimer to use std::function instead of pointer as callbacks from interrupts --- cores/arduino/HardwareTimer.cpp | 41 ++++++--------------------------- cores/arduino/HardwareTimer.h | 17 +++++++------- cores/arduino/Tone.cpp | 5 ++-- 3 files changed, 17 insertions(+), 46 deletions(-) diff --git a/cores/arduino/HardwareTimer.cpp b/cores/arduino/HardwareTimer.cpp index 8c9aed52b7..33ddd91c13 100644 --- a/cores/arduino/HardwareTimer.cpp +++ b/cores/arduino/HardwareTimer.cpp @@ -801,7 +801,7 @@ uint32_t HardwareTimer::getCaptureCompare(uint32_t channel, TimerCompareFormat_ * HERTZ_FORMAT: return value is the frequency in hertz for Capture/Compare value * @retval None */ -void HardwareTimer::setPWM(uint32_t channel, uint32_t pin, uint32_t frequency, uint32_t dutycycle, void (*PeriodCallback)(HardwareTimer *), void (*CompareCallback)(HardwareTimer *)) +void HardwareTimer::setPWM(uint32_t channel, uint32_t pin, uint32_t frequency, uint32_t dutycycle, callback_function_t PeriodCallback, callback_function_t CompareCallback) { setPWM(channel, digitalPinToPinName(pin), frequency, dutycycle, PeriodCallback, CompareCallback); } @@ -818,7 +818,7 @@ void HardwareTimer::setPWM(uint32_t channel, uint32_t pin, uint32_t frequency, u * HERTZ_FORMAT: return value is the frequency in hertz for Capture/Compare value * @retval None */ -void HardwareTimer::setPWM(uint32_t channel, PinName pin, uint32_t frequency, uint32_t dutycycle, void (*PeriodCallback)(HardwareTimer *), void (*CompareCallback)(HardwareTimer *)) +void HardwareTimer::setPWM(uint32_t channel, PinName pin, uint32_t frequency, uint32_t dutycycle, callback_function_t PeriodCallback, callback_function_t CompareCallback) { setMode(channel, TIMER_OUTPUT_COMPARE_PWM1, pin); setOverflow(frequency, HERTZ_FORMAT); @@ -848,13 +848,11 @@ void HardwareTimer::setInterruptPriority(uint32_t preemptPriority, uint32_t subP /** * @brief Attach interrupt callback on update (rollover) event * @param callback: interrupt callback - * @param arg: pointer to optional argument to associate with interrupt * @retval None */ -void HardwareTimer::attachInterrupt(void (*callback)(HardwareTimer *), void *arg) +void HardwareTimer::attachInterrupt(callback_function_t callback) { - args[0] = arg; - if (callbacks[0] != NULL) { + if (callbacks[0] != nullptr) { // Callback previously configured : do not clear neither enable IT, it is just a change of callback callbacks[0] = callback; } else { @@ -877,7 +875,6 @@ void HardwareTimer::detachInterrupt() // Disable update interrupt and clear callback __HAL_TIM_DISABLE_IT(&(_timerObj.handle), TIM_IT_UPDATE); // disables the interrupt call to save cpu cycles for useless context switching callbacks[0] = NULL; - args[0] = NULL; } /** @@ -887,7 +884,7 @@ void HardwareTimer::detachInterrupt() * @param arg: pointer to optional argument to associate with interrupt * @retval None */ -void HardwareTimer::attachInterrupt(uint32_t channel, void (*callback)(HardwareTimer *), void *arg) +void HardwareTimer::attachInterrupt(uint32_t channel, callback_function_t callback) { int interrupt = getIT(channel); if (interrupt == -1) { @@ -897,7 +894,6 @@ void HardwareTimer::attachInterrupt(uint32_t channel, void (*callback)(HardwareT if ((channel == 0) || (channel > (TIMER_CHANNELS + 1))) { Error_Handler(); // only channel 1..4 have an interrupt } - args[channel] = arg; if (callbacks[channel] != NULL) { // Callback previously configured : do not clear neither enable IT, it is just a change of callback callbacks[channel] = callback; @@ -931,29 +927,6 @@ void HardwareTimer::detachInterrupt(uint32_t channel) // Disable interrupt corresponding to channel and clear callback __HAL_TIM_DISABLE_IT(&(_timerObj.handle), interrupt); callbacks[channel] = NULL; - args[channel] = NULL; -} - -/** - * @brief Get argument attached to (rollover) event. - * @retval Associated pointer to attached argument or NULL if not set. - */ -void *HardwareTimer::getArg() -{ - return args[0]; -} - -/** - * @brief Get argument attached to Capture/Compare event. - * @param channel: arduino channel [1..4] - * @retval Associated pointer to attached argument or NULL if not set. - */ -void *HardwareTimer::getArg(uint32_t channel) -{ - if ((channel == 0) || (channel > (TIMER_CHANNELS + 1))) { - Error_Handler(); // only channel 1..4 have an interrupt - } - return args[channel]; } /** @@ -1016,7 +989,7 @@ void HardwareTimer::updateCallback(TIM_HandleTypeDef *htim) HardwareTimer *HT = (HardwareTimer *)(obj->__this); if (HT->callbacks[0] != NULL) { - HT->callbacks[0](HT); + HT->callbacks[0](); } } @@ -1057,7 +1030,7 @@ void HardwareTimer::captureCompareCallback(TIM_HandleTypeDef *htim) HardwareTimer *HT = (HardwareTimer *)(obj->__this); if (HT->callbacks[channel] != NULL) { - HT->callbacks[channel](HT); + HT->callbacks[channel](); } } diff --git a/cores/arduino/HardwareTimer.h b/cores/arduino/HardwareTimer.h index d8a33157ad..ca16a6a36e 100644 --- a/cores/arduino/HardwareTimer.h +++ b/cores/arduino/HardwareTimer.h @@ -92,6 +92,9 @@ typedef enum { #ifdef __cplusplus +#include +typedef std::function callback_function_t; + /* Class --------------------------------------------------------*/ class HardwareTimer { public: @@ -109,8 +112,8 @@ class HardwareTimer { void setOverflow(uint32_t val, TimerFormat_t format = TICK_FORMAT); // set AutoReload register depending on format provided uint32_t getOverflow(TimerFormat_t format = TICK_FORMAT); // return overflow depending on format provided - 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. - void setPWM(uint32_t channel, uint32_t pin, uint32_t frequency, uint32_t dutycycle, void (*PeriodCallback)(HardwareTimer *) = NULL, void (*CompareCallback)(HardwareTimer *) = NULL); + 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. + void setPWM(uint32_t channel, uint32_t pin, uint32_t frequency, uint32_t dutycycle, callback_function_t PeriodCallback = nullptr, callback_function_t CompareCallback = nullptr); void setCount(uint32_t val, TimerFormat_t format = TICK_FORMAT); // set timer counter to value 'val' depending on format provided @@ -126,16 +129,13 @@ class HardwareTimer { void setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority); // set interrupt priority //Add interrupt to period update - void attachInterrupt(void (*handler)(HardwareTimer *), void *arg = NULL); // Attach interrupt callback which will be called upon update event (timer rollover) + void attachInterrupt(callback_function_t callback); // Attach interrupt callback which will be called upon update event (timer rollover) void detachInterrupt(); // remove interrupt callback which was attached to update event bool hasInterrupt(); //returns true if a timer rollover interrupt has already been set - void *getArg(); // Getter for attached argument to event (timer rollover) //Add interrupt to capture/compare channel - void attachInterrupt(uint32_t channel, void (*handler)(HardwareTimer *), void *arg = NULL); // Attach interrupt callback which will be called upon compare match event of specified channel + void attachInterrupt(uint32_t channel, callback_function_t callback); // Attach interrupt callback which will be called upon compare match event of specified channel void detachInterrupt(uint32_t channel); // remove interrupt callback which was attached to compare match event of specified channel bool hasInterrupt(uint32_t channel); //returns true if an interrupt has already been set on the channel compare match - void *getArg(uint32_t channel); // Getter for attached argument to compare match event of specified channel - void timerHandleDeinit(); // Timer deinitialization // Refresh() is usefull while timer is running after some registers update @@ -153,8 +153,7 @@ class HardwareTimer { private: TimerModes_t _ChannelMode[TIMER_CHANNELS]; timerObj_t _timerObj; - void (*callbacks[1 + TIMER_CHANNELS])(HardwareTimer *); //Callbacks: 0 for update, 1-4 for channels. (channel5/channel6, if any, doesn't have interrupt) - void *args[1 + TIMER_CHANNELS]; + callback_function_t callbacks[1 + TIMER_CHANNELS]; //Callbacks: 0 for update, 1-4 for channels. (channel5/channel6, if any, doesn't have interrupt) int getChannel(uint32_t channel); int getLLChannel(uint32_t channel); diff --git a/cores/arduino/Tone.cpp b/cores/arduino/Tone.cpp index cb16254d75..c119906c1a 100644 --- a/cores/arduino/Tone.cpp +++ b/cores/arduino/Tone.cpp @@ -32,7 +32,7 @@ typedef struct { } timerPinInfo_t; static void timerTonePinInit(PinName p, uint32_t frequency, uint32_t duration); -static void tonePeriodElapsedCallback(HardwareTimer *HT); +static callback_function_t tonePeriodElapsedCallback(); static timerPinInfo_t TimerTone_pinInfo = {NC, 0}; static HardwareTimer *TimerTone = NULL; @@ -41,9 +41,8 @@ static HardwareTimer *TimerTone = NULL; * @param htim : timer handle * @retval None */ -static void tonePeriodElapsedCallback(HardwareTimer *HT) +static callback_function_t tonePeriodElapsedCallback() { - UNUSED(HT); GPIO_TypeDef *port = get_GPIO_Port(STM_PORT(TimerTone_pinInfo.pin)); if (port != NULL) { From 029450f3e6a8a9feb7f51f4710a19b11e049cfc6 Mon Sep 17 00:00:00 2001 From: Erik tideman Date: Thu, 5 Mar 2020 16:25:14 +0100 Subject: [PATCH 5/8] changed typedef -> using --- cores/arduino/HardwareTimer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/arduino/HardwareTimer.h b/cores/arduino/HardwareTimer.h index 86e457ad2e..8b39af2816 100644 --- a/cores/arduino/HardwareTimer.h +++ b/cores/arduino/HardwareTimer.h @@ -93,7 +93,7 @@ typedef enum { #ifdef __cplusplus #include -typedef std::function callback_function_t; +using callback_function_t = std::function; /* Class --------------------------------------------------------*/ class HardwareTimer { From f9ea23c89f91cee73b9fca8492b617cead2d0066 Mon Sep 17 00:00:00 2001 From: Erik tideman Date: Thu, 5 Mar 2020 17:07:11 +0100 Subject: [PATCH 6/8] Removed not relevent comment --- cores/arduino/HardwareTimer.cpp | 1 - cores/arduino/HardwareTimer.h | 1 - 2 files changed, 2 deletions(-) diff --git a/cores/arduino/HardwareTimer.cpp b/cores/arduino/HardwareTimer.cpp index 8cec82031a..9f343ba6da 100644 --- a/cores/arduino/HardwareTimer.cpp +++ b/cores/arduino/HardwareTimer.cpp @@ -939,7 +939,6 @@ void HardwareTimer::detachInterrupt() * @brief Attach interrupt callback on Capture/Compare event * @param channel: Arduino channel [1..4] * @param callback: interrupt callback - * @param arg: pointer to optional argument to associate with interrupt * @retval None */ void HardwareTimer::attachInterrupt(uint32_t channel, callback_function_t callback) diff --git a/cores/arduino/HardwareTimer.h b/cores/arduino/HardwareTimer.h index 8b39af2816..1a3ee871f8 100644 --- a/cores/arduino/HardwareTimer.h +++ b/cores/arduino/HardwareTimer.h @@ -150,7 +150,6 @@ class HardwareTimer { // The following function(s) are available for more advanced timer options TIM_HandleTypeDef *getHandle(); // return the handle address for HAL related configuration - int getChannel(uint32_t channel); int getLLChannel(uint32_t channel); int getIT(uint32_t channel); From 5740040cb3de8e9a96a7d8bfebe80e823a67ab42 Mon Sep 17 00:00:00 2001 From: Erik tideman Date: Fri, 6 Mar 2020 18:24:09 +0100 Subject: [PATCH 7/8] Updated missed HardwareTimer interface changes in Servo.cpp/SoftwareSerial.cpp/Tone.cpp --- cores/arduino/Tone.cpp | 4 ++-- libraries/Servo/src/stm32/Servo.cpp | 3 +-- libraries/SoftwareSerial/src/SoftwareSerial.cpp | 3 +-- libraries/SoftwareSerial/src/SoftwareSerial.h | 2 +- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/cores/arduino/Tone.cpp b/cores/arduino/Tone.cpp index c119906c1a..7c475e50f9 100644 --- a/cores/arduino/Tone.cpp +++ b/cores/arduino/Tone.cpp @@ -32,7 +32,7 @@ typedef struct { } timerPinInfo_t; static void timerTonePinInit(PinName p, uint32_t frequency, uint32_t duration); -static callback_function_t tonePeriodElapsedCallback(); +static void tonePeriodElapsedCallback(); static timerPinInfo_t TimerTone_pinInfo = {NC, 0}; static HardwareTimer *TimerTone = NULL; @@ -41,7 +41,7 @@ static HardwareTimer *TimerTone = NULL; * @param htim : timer handle * @retval None */ -static callback_function_t tonePeriodElapsedCallback() +static void tonePeriodElapsedCallback() { GPIO_TypeDef *port = get_GPIO_Port(STM_PORT(TimerTone_pinInfo.pin)); diff --git a/libraries/Servo/src/stm32/Servo.cpp b/libraries/Servo/src/stm32/Servo.cpp index 2202d2a6be..9bf4bb047d 100644 --- a/libraries/Servo/src/stm32/Servo.cpp +++ b/libraries/Servo/src/stm32/Servo.cpp @@ -40,9 +40,8 @@ uint8_t ServoCount = 0; // the total number o /************ static functions common to all instances ***********************/ volatile uint32_t CumulativeCountSinceRefresh = 0; -static void Servo_PeriodElapsedCallback(HardwareTimer *HT) +static void Servo_PeriodElapsedCallback() { - UNUSED(HT); // Only 1 timer used timer16_Sequence_t timer_id = _timer1; diff --git a/libraries/SoftwareSerial/src/SoftwareSerial.cpp b/libraries/SoftwareSerial/src/SoftwareSerial.cpp index 61fdbac6e1..da89fdd7c5 100644 --- a/libraries/SoftwareSerial/src/SoftwareSerial.cpp +++ b/libraries/SoftwareSerial/src/SoftwareSerial.cpp @@ -290,9 +290,8 @@ inline void SoftwareSerial::recv() // /* static */ -inline void SoftwareSerial::handleInterrupt(HardwareTimer *timer) +inline void SoftwareSerial::handleInterrupt() { - UNUSED(timer); if (active_in) { active_in->recv(); } diff --git a/libraries/SoftwareSerial/src/SoftwareSerial.h b/libraries/SoftwareSerial/src/SoftwareSerial.h index 6e9eb8fef4..c569fc2ec6 100644 --- a/libraries/SoftwareSerial/src/SoftwareSerial.h +++ b/libraries/SoftwareSerial/src/SoftwareSerial.h @@ -84,7 +84,7 @@ class SoftwareSerial : public Stream { void setRX(); void setSpeed(uint32_t speed); void setRXTX(bool input); - static void handleInterrupt(HardwareTimer *timer); + static void handleInterrupt(); public: // public methods From 234994022d0a0983e3452125cdf1442f6f02570a Mon Sep 17 00:00:00 2001 From: Frederic Pillon Date: Tue, 10 Mar 2020 18:06:40 +0100 Subject: [PATCH 8/8] Update cores/arduino/HardwareTimer.cpp --- cores/arduino/HardwareTimer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/arduino/HardwareTimer.cpp b/cores/arduino/HardwareTimer.cpp index 9f343ba6da..8568fdb896 100644 --- a/cores/arduino/HardwareTimer.cpp +++ b/cores/arduino/HardwareTimer.cpp @@ -910,7 +910,7 @@ void HardwareTimer::setInterruptPriority(uint32_t preemptPriority, uint32_t subP */ void HardwareTimer::attachInterrupt(callback_function_t callback) { - if (callbacks[0] != nullptr) { + if (callbacks[0]) { // Callback previously configured : do not clear neither enable IT, it is just a change of callback callbacks[0] = callback; } else {