From 5d993e0f6db0d90f0a200fd3ca47c7da5933b544 Mon Sep 17 00:00:00 2001 From: Gabriel Lima Date: Sat, 20 Apr 2024 15:00:27 -0300 Subject: [PATCH] deregisterCallback and some error handling --- Core/Src/Components/EXTIHandler_STM32.cpp | 32 +++++++++++++++++------ Core/Src/Components/EXTIHandler_STM32.hpp | 1 + 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/Core/Src/Components/EXTIHandler_STM32.cpp b/Core/Src/Components/EXTIHandler_STM32.cpp index 792ec94..a367fdd 100644 --- a/Core/Src/Components/EXTIHandler_STM32.cpp +++ b/Core/Src/Components/EXTIHandler_STM32.cpp @@ -12,23 +12,38 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ } EXTIHandler_STM32::EXTIHandler_STM32() { - // TODO Auto-generated constructor stub } EXTIHandler_STM32::~EXTIHandler_STM32() { - // TODO Auto-generated destructor stub + } void EXTIHandler_STM32::EXTI_Callback(uint16_t GPIO_Pin){ - if(objects[gpioPinToPinNumber(GPIO_Pin)]){ - objects[gpioPinToPinNumber(GPIO_Pin)]->irqHandler(nullptr); + // TODO Protect array with mutex + EXTIHandler_STM32* object = objects[gpioPinToPinNumber(GPIO_Pin)]; + if(object){ + object->irqHandler(nullptr); } } int32_t EXTIHandler_STM32::registerCallback(GPIO_Pin_STM32* pin){ - if(objects[gpioPinToPinNumber(pin->getPin())] == nullptr){ - objects[gpioPinToPinNumber(pin->getPin())] = this; + // TODO Protect array with mutex + int8_t pinNumber = gpioPinToPinNumber(pin->getPin()); + if(!objects[pinNumber]){ + objects[pinNumber] = this; + return 0; + }else{ + // Already enabled + return -1; + } +} + +int32_t EXTIHandler_STM32::deregisterCallback(GPIO_Pin_STM32* pin){ + // TODO Protect array with mutex + int8_t pinNumber = gpioPinToPinNumber(pin->getPin()); + if(objects[pinNumber]){ + objects[pinNumber] = nullptr; return 0; }else{ return -1; @@ -36,6 +51,7 @@ int32_t EXTIHandler_STM32::registerCallback(GPIO_Pin_STM32* pin){ } int8_t EXTIHandler_STM32::gpioPinToPinNumber(uint16_t GPIO_Pin) { + assert_param(IS_GPIO_PIN(GPIO_Pin)); switch(GPIO_Pin){ case GPIO_PIN_0: return 0; @@ -69,7 +85,7 @@ int8_t EXTIHandler_STM32::gpioPinToPinNumber(uint16_t GPIO_Pin) { return 14; case GPIO_PIN_15: return 15; - default: - return -1; } + // TODO implement error handling here + return -1; } diff --git a/Core/Src/Components/EXTIHandler_STM32.hpp b/Core/Src/Components/EXTIHandler_STM32.hpp index 3f99e38..810e239 100644 --- a/Core/Src/Components/EXTIHandler_STM32.hpp +++ b/Core/Src/Components/EXTIHandler_STM32.hpp @@ -18,6 +18,7 @@ public: static void EXTI_Callback(uint16_t GPIO_Pin); protected: int32_t registerCallback(GPIO_Pin_STM32* pin); + int32_t deregisterCallback(GPIO_Pin_STM32* pin); private: virtual void irqHandler(void* parameter) = 0; static int8_t gpioPinToPinNumber(uint16_t GPIO_Pin);