From 160be7e67a10d01b6e44c4bf2521c0ccd6348976 Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Thu, 5 Jan 2023 15:05:09 +0100 Subject: [PATCH 1/5] Wrapped Ticker functions with #pragma disabling -Wcast-function-type --- libraries/Ticker/src/Ticker.h | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/libraries/Ticker/src/Ticker.h b/libraries/Ticker/src/Ticker.h index 82804e0f37d..b5773fb1fd1 100644 --- a/libraries/Ticker/src/Ticker.h +++ b/libraries/Ticker/src/Ticker.h @@ -47,6 +47,8 @@ class Ticker _attach_ms(milliseconds, true, reinterpret_cast(callback), 0); } +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-function-type" template void attach(float seconds, void (*callback)(TArg), TArg arg) { @@ -65,6 +67,7 @@ class Ticker uint32_t arg32 = (uint32_t)arg; _attach_ms(milliseconds, true, reinterpret_cast(callback), arg32); } +#pragma GCC diagnostic pop void once(float seconds, callback_t callback) { @@ -73,9 +76,11 @@ class Ticker void once_ms(uint32_t milliseconds, callback_t callback) { - _attach_ms(milliseconds, false, reinterpret_cast(callback), 0); + _attach_ms(milliseconds, false, reinterpret_cast(callback), 0); } +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-function-type" template void once(float seconds, void (*callback)(TArg), TArg arg) { @@ -91,11 +96,12 @@ class Ticker uint32_t arg32 = (uint32_t)(arg); _attach_ms(milliseconds, false, reinterpret_cast(callback), arg32); } +#pragma GCC diagnostic pop void detach(); bool active(); -protected: +protected: void _attach_ms(uint32_t milliseconds, bool repeat, callback_with_arg_t callback, uint32_t arg); From 887f3ca0cfe2bb06462918600c8341c07cda01e6 Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Mon, 9 Jan 2023 12:18:48 +0100 Subject: [PATCH 2/5] Revert "Wrapped Ticker functions with #pragma disabling -Wcast-function-type" This reverts commit 160be7e67a10d01b6e44c4bf2521c0ccd6348976. --- libraries/Ticker/src/Ticker.h | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/libraries/Ticker/src/Ticker.h b/libraries/Ticker/src/Ticker.h index b5773fb1fd1..82804e0f37d 100644 --- a/libraries/Ticker/src/Ticker.h +++ b/libraries/Ticker/src/Ticker.h @@ -47,8 +47,6 @@ class Ticker _attach_ms(milliseconds, true, reinterpret_cast(callback), 0); } -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wcast-function-type" template void attach(float seconds, void (*callback)(TArg), TArg arg) { @@ -67,7 +65,6 @@ class Ticker uint32_t arg32 = (uint32_t)arg; _attach_ms(milliseconds, true, reinterpret_cast(callback), arg32); } -#pragma GCC diagnostic pop void once(float seconds, callback_t callback) { @@ -76,11 +73,9 @@ class Ticker void once_ms(uint32_t milliseconds, callback_t callback) { - _attach_ms(milliseconds, false, reinterpret_cast(callback), 0); + _attach_ms(milliseconds, false, reinterpret_cast(callback), 0); } -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wcast-function-type" template void once(float seconds, void (*callback)(TArg), TArg arg) { @@ -96,12 +91,11 @@ class Ticker uint32_t arg32 = (uint32_t)(arg); _attach_ms(milliseconds, false, reinterpret_cast(callback), arg32); } -#pragma GCC diagnostic pop void detach(); bool active(); -protected: +protected: void _attach_ms(uint32_t milliseconds, bool repeat, callback_with_arg_t callback, uint32_t arg); From 9faf13fee8bc1c99fd0c2331e1eb342b43ba6467 Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Mon, 9 Jan 2023 12:28:34 +0100 Subject: [PATCH 3/5] Fixed Ticker example --- libraries/Ticker/examples/Arguments/Arguments.ino | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/libraries/Ticker/examples/Arguments/Arguments.ino b/libraries/Ticker/examples/Arguments/Arguments.ino index cde8acbfa09..d66183e1b6a 100644 --- a/libraries/Ticker/examples/Arguments/Arguments.ino +++ b/libraries/Ticker/examples/Arguments/Arguments.ino @@ -7,8 +7,9 @@ Ticker tickerSetHigh; Ticker tickerSetLow; -void setPin(int state) { - digitalWrite(LED_PIN, state); +// Argument to callback must always be passed a reference +void setPin(int *state) { + digitalWrite(LED_PIN, *state); } void setup() { @@ -16,10 +17,12 @@ void setup() { digitalWrite(1, LOW); // every 25 ms, call setPin(0) - tickerSetLow.attach_ms(25, setPin, 0); + int state = 0; + tickerSetLow.attach_ms(25, setPin, &state); // every 26 ms, call setPin(1) - tickerSetHigh.attach_ms(26, setPin, 1); + state = 1; + tickerSetHigh.attach_ms(26, setPin, &state); } void loop() { From f62c4cb37477ba8e86c664d619bbfdb3b39fcac4 Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Wed, 11 Jan 2023 14:40:10 +0100 Subject: [PATCH 4/5] Modified Ticker example --- .../Ticker/examples/Arguments/Arguments.ino | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/libraries/Ticker/examples/Arguments/Arguments.ino b/libraries/Ticker/examples/Arguments/Arguments.ino index d66183e1b6a..158caf59f8e 100644 --- a/libraries/Ticker/examples/Arguments/Arguments.ino +++ b/libraries/Ticker/examples/Arguments/Arguments.ino @@ -1,28 +1,45 @@ +/* + * This example demonstrates used of Ticker with arguments. + * You can call the same callback function with different argument on different times. + * Based on the argument the callback can perform different tasks. + */ + #include #include -// attach a LED to GPIO 21 -#define LED_PIN 21 +// Arguments for the function must remain valid (not run out of scope) otherwise the function would read garbage data. +int LED_PIN_1 = 4; +int LED_PIN_2 = LED_BUILTIN; Ticker tickerSetHigh; Ticker tickerSetLow; // Argument to callback must always be passed a reference -void setPin(int *state) { - digitalWrite(LED_PIN, *state); +void swapState(int *pin) { + static int led_1_state = 1; + static int led_2_state = 1; + if(*pin == LED_PIN_1){ + Serial.printf("[%lu ms] set pin %d to state: %d\n", millis(), *pin, led_1_state); + digitalWrite(*pin, led_1_state); + led_1_state = led_1_state ? 0 : 1; // reverse for next pass + }else if(*pin == LED_PIN_2){ + Serial.printf("[%lu ms] set pin %d to state: %d\n", millis(), *pin, led_2_state); + digitalWrite(*pin, led_2_state); + led_2_state = led_2_state ? 0 : 1; // reverse for next pass + } } void setup() { - pinMode(LED_PIN, OUTPUT); - digitalWrite(1, LOW); + Serial.begin(115200); + pinMode(LED_PIN_1, OUTPUT); + pinMode(LED_PIN_2, OUTPUT); + //digitalWrite(1, LOW); - // every 25 ms, call setPin(0) - int state = 0; - tickerSetLow.attach_ms(25, setPin, &state); + // Blink LED every 500 ms on LED_PIN_1 + tickerSetLow.attach_ms(500, swapState, &LED_PIN_1); - // every 26 ms, call setPin(1) - state = 1; - tickerSetHigh.attach_ms(26, setPin, &state); + // Blink LED every 1000 ms on LED_PIN_2 + tickerSetHigh.attach_ms(1000, swapState, &LED_PIN_2); } void loop() { From 2b69a093cfa9a923f5a5c9faac587d5d9deac715 Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Mon, 16 Jan 2023 10:27:08 +0100 Subject: [PATCH 5/5] Fixed LED_BUILTIN err for ESP32 --- libraries/Ticker/examples/Arguments/Arguments.ino | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libraries/Ticker/examples/Arguments/Arguments.ino b/libraries/Ticker/examples/Arguments/Arguments.ino index 158caf59f8e..7f5bc5cde21 100644 --- a/libraries/Ticker/examples/Arguments/Arguments.ino +++ b/libraries/Ticker/examples/Arguments/Arguments.ino @@ -9,7 +9,11 @@ // Arguments for the function must remain valid (not run out of scope) otherwise the function would read garbage data. int LED_PIN_1 = 4; -int LED_PIN_2 = LED_BUILTIN; +#ifdef LED_BUILTIN + int LED_PIN_2 = LED_BUILTIN; +#else + int LED_PIN_2 = 8; +#endif Ticker tickerSetHigh; Ticker tickerSetLow;