From 230721cd6271f3239b42e1d2471f8db15bebd712 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Fri, 24 Nov 2023 07:18:14 +1100 Subject: Periodically check int lines instead of relying on interrupts --- src/drivers/gpios.cpp | 33 ++++++--------------------------- src/drivers/include/gpios.hpp | 5 +---- src/drivers/include/samd.hpp | 4 ---- src/drivers/samd.cpp | 27 ++++++--------------------- 4 files changed, 13 insertions(+), 56 deletions(-) (limited to 'src/drivers') diff --git a/src/drivers/gpios.cpp b/src/drivers/gpios.cpp index dc737710..e5560665 100644 --- a/src/drivers/gpios.cpp +++ b/src/drivers/gpios.cpp @@ -6,12 +6,13 @@ #include "gpios.hpp" -#include - #include +#include "assert.h" #include "driver/gpio.h" #include "esp_attr.h" +#include "esp_err.h" +#include "esp_intr_alloc.h" #include "hal/gpio_types.h" #include "i2c.hpp" @@ -60,12 +61,7 @@ constexpr std::pair unpack(uint16_t ba) { return std::pair((uint8_t)ba, (uint8_t)(ba >> 8)); } -SemaphoreHandle_t Gpios::sReadPending; - -IRAM_ATTR static void interrupt_isr(void* arg) { - SemaphoreHandle_t sem = reinterpret_cast(arg); - xSemaphoreGive(sem); -} +static constexpr gpio_num_t kIntPin = GPIO_NUM_34; auto Gpios::Create() -> Gpios* { Gpios* instance = new Gpios(); @@ -78,22 +74,10 @@ auto Gpios::Create() -> Gpios* { } Gpios::Gpios() : ports_(pack(kPortADefault, kPortBDefault)), inputs_(0) { - gpio_config_t config{ - .pin_bit_mask = static_cast(1) << GPIO_NUM_34, - .mode = GPIO_MODE_INPUT, - .pull_up_en = GPIO_PULLUP_ENABLE, - .pull_down_en = GPIO_PULLDOWN_DISABLE, - .intr_type = GPIO_INTR_NEGEDGE, - }; - gpio_config(&config); - gpio_install_isr_service(ESP_INTR_FLAG_LEVEL1); - gpio_isr_handler_add(GPIO_NUM_34, &interrupt_isr, sReadPending); + gpio_set_direction(kIntPin, GPIO_MODE_INPUT); } -Gpios::~Gpios() { - gpio_isr_handler_remove(GPIO_NUM_34); - gpio_uninstall_isr_service(); -} +Gpios::~Gpios() {} auto Gpios::WriteBuffered(Pin pin, bool value) -> void { if (value) { @@ -142,9 +126,4 @@ auto Gpios::Read() -> bool { return true; } -auto Gpios::CreateReadPending() -> SemaphoreHandle_t { - sReadPending = xSemaphoreCreateBinary(); - return sReadPending; -} - } // namespace drivers diff --git a/src/drivers/include/gpios.hpp b/src/drivers/include/gpios.hpp index 18f71551..1755da92 100644 --- a/src/drivers/include/gpios.hpp +++ b/src/drivers/include/gpios.hpp @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -108,8 +109,6 @@ class Gpios : public IGpios { */ auto Read(void) -> bool; - static auto CreateReadPending() -> SemaphoreHandle_t; - // Not copyable or movable. There should usually only ever be once instance // of this class, and that instance will likely have a static lifetime. Gpios(const Gpios&) = delete; @@ -120,8 +119,6 @@ class Gpios : public IGpios { std::atomic ports_; std::atomic inputs_; - - static SemaphoreHandle_t sReadPending; }; } // namespace drivers diff --git a/src/drivers/include/samd.hpp b/src/drivers/include/samd.hpp index 2640eb8b..d9f1ca48 100644 --- a/src/drivers/include/samd.hpp +++ b/src/drivers/include/samd.hpp @@ -54,8 +54,6 @@ class Samd { auto ResetToFlashSamd() -> void; auto PowerDown() -> void; - static auto CreateReadPending() -> SemaphoreHandle_t; - // Not copyable or movable. There should usually only ever be once instance // of this class, and that instance will likely have a static lifetime. Samd(const Samd&) = delete; @@ -64,8 +62,6 @@ class Samd { private: std::optional charge_status_; UsbStatus usb_status_; - - static SemaphoreHandle_t sReadPending; }; } // namespace drivers diff --git a/src/drivers/samd.cpp b/src/drivers/samd.cpp index e6014306..f361513e 100644 --- a/src/drivers/samd.cpp +++ b/src/drivers/samd.cpp @@ -5,12 +5,15 @@ */ #include "samd.hpp" -#include + +#include #include #include "esp_err.h" #include "esp_log.h" +#include "hal/gpio_types.h" #include "hal/i2c_types.h" + #include "i2c.hpp" enum Registers : uint8_t { @@ -26,23 +29,10 @@ static const uint8_t kAddress = 0x45; namespace drivers { -SemaphoreHandle_t Samd::sReadPending; - -static void interrupt_isr(void* arg) { - SemaphoreHandle_t sem = reinterpret_cast(arg); - xSemaphoreGive(sem); -} +static constexpr gpio_num_t kIntPin = GPIO_NUM_35; Samd::Samd() { - gpio_config_t config{ - .pin_bit_mask = static_cast(1) << GPIO_NUM_35, - .mode = GPIO_MODE_INPUT, - .pull_up_en = GPIO_PULLUP_ENABLE, - .pull_down_en = GPIO_PULLDOWN_DISABLE, - .intr_type = GPIO_INTR_NEGEDGE, - }; - gpio_config(&config); - gpio_isr_handler_add(GPIO_NUM_35, &interrupt_isr, sReadPending); + gpio_set_direction(kIntPin, GPIO_MODE_INPUT); // Being able to interface with the SAMD properly is critical. To ensure we // will be able to, we begin by checking the I2C protocol version is @@ -153,9 +143,4 @@ auto Samd::PowerDown() -> void { ESP_ERROR_CHECK(transaction.Execute(3)); } -auto Samd::CreateReadPending() -> SemaphoreHandle_t { - sReadPending = xSemaphoreCreateBinary(); - return sReadPending; -} - } // namespace drivers -- cgit v1.2.3