1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-06-12 01:53:07 +03:00

Fix Ticker callback casting. (#6282)

Fixes errors seen in #6281 and adds a slight test case to the examples
to ensure no compiler errors.
This commit is contained in:
Earle F. Philhower, III
2019-07-10 20:15:10 -07:00
committed by Develo
parent 7c6701512f
commit 8c37601614
2 changed files with 13 additions and 8 deletions

View File

@ -32,7 +32,7 @@ public:
Ticker(); Ticker();
~Ticker(); ~Ticker();
typedef void (*callback_with_arg_t)(void*); typedef void (*callback_with_arg_t)(void *);
typedef std::function<void(void)> callback_function_t; typedef std::function<void(void)> callback_function_t;
void attach_scheduled(float seconds, callback_function_t callback) void attach_scheduled(float seconds, callback_function_t callback)
@ -64,14 +64,14 @@ public:
// C-cast serves two purposes: // C-cast serves two purposes:
// static_cast for smaller integer types, // static_cast for smaller integer types,
// reinterpret_cast + const_cast for pointer types // reinterpret_cast + const_cast for pointer types
_attach_s(seconds, true, reinterpret_cast<callback_with_arg_t>(callback), (void*)arg); _attach_s(seconds, true, reinterpret_cast<callback_with_arg_t>(callback), reinterpret_cast<void *>(arg));
} }
template<typename TArg> template<typename TArg>
void attach_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg) void attach_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg)
{ {
static_assert(sizeof(TArg) <= sizeof(void*), "attach() callback argument size must be <= sizeof(void*)"); static_assert(sizeof(TArg) <= sizeof(void*), "attach() callback argument size must be <= sizeof(void*)");
_attach_ms(milliseconds, true, reinterpret_cast<callback_with_arg_t>(callback), (void*)arg); _attach_ms(milliseconds, true, reinterpret_cast<callback_with_arg_t>(callback), reinterpret_cast<void *>(arg));
} }
void once_scheduled(float seconds, callback_function_t callback) void once_scheduled(float seconds, callback_function_t callback)
@ -100,14 +100,14 @@ public:
void once(float seconds, void (*callback)(TArg), TArg arg) void once(float seconds, void (*callback)(TArg), TArg arg)
{ {
static_assert(sizeof(TArg) <= sizeof(void*), "attach() callback argument size must be <= sizeof(void*)"); static_assert(sizeof(TArg) <= sizeof(void*), "attach() callback argument size must be <= sizeof(void*)");
_attach_s(seconds, false, reinterpret_cast<callback_with_arg_t>(callback), (void*)arg); _attach_s(seconds, false, reinterpret_cast<callback_with_arg_t>(callback), reinterpret_cast<void *>(arg));
} }
template<typename TArg> template<typename TArg>
void once_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg) void once_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg)
{ {
static_assert(sizeof(TArg) <= sizeof(void*), "attach() callback argument size must be <= sizeof(void*)"); static_assert(sizeof(TArg) <= sizeof(void*), "attach() callback argument size must be <= sizeof(void*)");
_attach_ms(milliseconds, false, reinterpret_cast<callback_with_arg_t>(callback), (void*)arg); _attach_ms(milliseconds, false, reinterpret_cast<callback_with_arg_t>(callback), reinterpret_cast<void *>(arg));
} }
void detach(); void detach();
@ -122,7 +122,6 @@ protected:
private: private:
void _attach_s(float seconds, bool repeat, callback_with_arg_t callback, void* arg); void _attach_s(float seconds, bool repeat, callback_with_arg_t callback, void* arg);
//char _etsTimerMem[sizeof(ETSTimer)];
ETSTimer _etsTimer; ETSTimer _etsTimer;
}; };

View File

@ -14,12 +14,17 @@
#include <Ticker.h> #include <Ticker.h>
Ticker tickerSetHigh; Ticker tickerSetHigh;
Ticker tickerSetAnalog;
Ticker tickerSetLow; Ticker tickerSetLow;
void setPin(int state) { void setPin(int state) {
digitalWrite(LED_BUILTIN, state); digitalWrite(LED_BUILTIN, state);
} }
void setPinChar(char state) {
digitalWrite(LED_BUILTIN, state);
}
void setup() { void setup() {
pinMode(LED_BUILTIN, OUTPUT); pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(1, LOW); digitalWrite(1, LOW);
@ -27,8 +32,9 @@ void setup() {
// every 25 ms, call setPin(0) // every 25 ms, call setPin(0)
tickerSetLow.attach_ms(25, setPin, 0); tickerSetLow.attach_ms(25, setPin, 0);
// every 26 ms, call setPin(1) // every 26 ms, call setPinChar(1)
tickerSetHigh.attach_ms(26, setPin, 1); tickerSetHigh.attach_ms(26, setPinChar, (char)1);
} }
void loop() { void loop() {