deregisterCallback and some error handling

This commit is contained in:
2024-04-20 15:00:27 -03:00
parent 01e709aada
commit 5d993e0f6d
2 changed files with 25 additions and 8 deletions

View File

@@ -12,23 +12,38 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
} }
EXTIHandler_STM32::EXTIHandler_STM32() { EXTIHandler_STM32::EXTIHandler_STM32() {
// TODO Auto-generated constructor stub
} }
EXTIHandler_STM32::~EXTIHandler_STM32() { EXTIHandler_STM32::~EXTIHandler_STM32() {
// TODO Auto-generated destructor stub
} }
void EXTIHandler_STM32::EXTI_Callback(uint16_t GPIO_Pin){ void EXTIHandler_STM32::EXTI_Callback(uint16_t GPIO_Pin){
if(objects[gpioPinToPinNumber(GPIO_Pin)]){ // TODO Protect array with mutex
objects[gpioPinToPinNumber(GPIO_Pin)]->irqHandler(nullptr); EXTIHandler_STM32* object = objects[gpioPinToPinNumber(GPIO_Pin)];
if(object){
object->irqHandler(nullptr);
} }
} }
int32_t EXTIHandler_STM32::registerCallback(GPIO_Pin_STM32* pin){ int32_t EXTIHandler_STM32::registerCallback(GPIO_Pin_STM32* pin){
if(objects[gpioPinToPinNumber(pin->getPin())] == nullptr){ // TODO Protect array with mutex
objects[gpioPinToPinNumber(pin->getPin())] = this; 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; return 0;
}else{ }else{
return -1; return -1;
@@ -36,6 +51,7 @@ int32_t EXTIHandler_STM32::registerCallback(GPIO_Pin_STM32* pin){
} }
int8_t EXTIHandler_STM32::gpioPinToPinNumber(uint16_t GPIO_Pin) { int8_t EXTIHandler_STM32::gpioPinToPinNumber(uint16_t GPIO_Pin) {
assert_param(IS_GPIO_PIN(GPIO_Pin));
switch(GPIO_Pin){ switch(GPIO_Pin){
case GPIO_PIN_0: case GPIO_PIN_0:
return 0; return 0;
@@ -69,7 +85,7 @@ int8_t EXTIHandler_STM32::gpioPinToPinNumber(uint16_t GPIO_Pin) {
return 14; return 14;
case GPIO_PIN_15: case GPIO_PIN_15:
return 15; return 15;
default:
return -1;
} }
// TODO implement error handling here
return -1;
} }

View File

@@ -18,6 +18,7 @@ public:
static void EXTI_Callback(uint16_t GPIO_Pin); static void EXTI_Callback(uint16_t GPIO_Pin);
protected: protected:
int32_t registerCallback(GPIO_Pin_STM32* pin); int32_t registerCallback(GPIO_Pin_STM32* pin);
int32_t deregisterCallback(GPIO_Pin_STM32* pin);
private: private:
virtual void irqHandler(void* parameter) = 0; virtual void irqHandler(void* parameter) = 0;
static int8_t gpioPinToPinNumber(uint16_t GPIO_Pin); static int8_t gpioPinToPinNumber(uint16_t GPIO_Pin);