diff options
author | uvok | 2025-07-19 10:23:53 +0200 |
---|---|---|
committer | uvok | 2025-07-19 10:23:53 +0200 |
commit | b5662a6e820845dad42147e0be18718a10f47581 (patch) | |
tree | cc42e56a8457e264e5e0e0ca67e3c885b96e6f3b /src | |
parent | 7f4bd7d961679d4fe5b0bc6e6255968e65352111 (diff) |
gpio: Change queue type, use digitalPinToInterrupt macro, logging
Diffstat (limited to 'src')
-rw-r--r-- | src/gpio.cpp | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/src/gpio.cpp b/src/gpio.cpp index e76368a..a7927a8 100644 --- a/src/gpio.cpp +++ b/src/gpio.cpp @@ -1,6 +1,7 @@ #include "badge/gpio.h" #include "badge/config.h" +#include "badge/log.h" #include <Arduino.h> @@ -17,10 +18,17 @@ static void gpio_loop(void *); -typedef uint32_t pin_notification_t; +typedef struct +{ + uint32_t timestamp; + uint32_t pin : 8; + uint32_t state : 1; +} pin_notification_t; + +_Static_assert(sizeof(uint32_t) >= sizeof(unsigned long), "return type of millis"); #define GPIO_STACK 2048 -#define GPIO_QUEUE_LEN 4 +#define GPIO_QUEUE_LEN 32 static unsigned long pressedTime = 0; static unsigned long releasedTime = 0; @@ -58,7 +66,7 @@ void de::uvok::badge::gpio_init(void) { pinMode(p, GPIO_MODE_INPUT); // simply use pin number as arg - attachInterruptArg(p, gpio_pin_irq, (void *)(ptrdiff_t)p, CHANGE); + attachInterruptArg(digitalPinToInterrupt(p), gpio_pin_irq, (void *)(ptrdiff_t)p, CHANGE); inputs[p].last_level = digitalRead(p); } #endif @@ -96,10 +104,9 @@ static void gpio_loop(void *ctx) pin_notification_t received; if (xQueueReceive(gpio_task_stuff.queue_handle, &received, portMAX_DELAY) == pdTRUE) { - const int level = (received & 0x100) ? HIGH : LOW; - const bool pressed = !level; - const int pin = received & 0xff; - Serial.printf("Pin %d was %s\n", pin, pressed ? "pressed" : "released"); + const bool pressed = !received.state; + const uint8_t pin = received.pin; + LOG_F("(%u) Pin %u was %s\n", received.timestamp, pin, pressed ? "pressed" : "released"); } } } @@ -109,14 +116,14 @@ static ARDUINO_ISR_ATTR void gpio_pin_irq(void *arg) uint8_t pin_no = (uint8_t)(ptrdiff_t)arg; uint32_t now = millis(); // Elecrow inputs - the selector - are very dirty... - const bool is_dirty = now - inputs[pin_no].last_change < 100; - inputs[pin_no].last_change = now; - if (is_dirty) - return; + // const bool is_dirty = now - inputs[pin_no].last_change < 50; + // inputs[pin_no].last_change = now; + // if (is_dirty) + // return; int pinLevel = digitalRead(pin_no); - pin_notification_t send = (pinLevel << 8) | (pin_no); + pin_notification_t send = {.timestamp = now, .pin = pin_no, .state = (pinLevel == HIGH)}; BaseType_t wakeup = false; xQueueSendFromISR(gpio_task_stuff.queue_handle, &send, &wakeup); if (wakeup) |