From b38f35a9b60c34f28020eeef0c5b133e0825ee55 Mon Sep 17 00:00:00 2001 From: Boris Mladenov Beslimov Date: Thu, 12 Feb 2026 11:57:13 +0100 Subject: [PATCH 1/8] fix(HardFault): Include string.h --- Inc/HALAL/HardFault/HardfaultTrace.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Inc/HALAL/HardFault/HardfaultTrace.h b/Inc/HALAL/HardFault/HardfaultTrace.h index f9e63bd33..151ee8376 100644 --- a/Inc/HALAL/HardFault/HardfaultTrace.h +++ b/Inc/HALAL/HardFault/HardfaultTrace.h @@ -1,6 +1,7 @@ #ifndef __HARD_FAULT_TRACE #define __HARD_FAULT_TRACE +#include #include "stm32h7xx_ll_gpio_wrapper.h" #include "stm32h7xx_ll_bus_wrapper.h" #include "stm32h7xx_ll_tim_wrapper.h" From 80115a69290a95d7388da5eaa749dc8f101fd7b1 Mon Sep 17 00:00:00 2001 From: Boris Mladenov Beslimov Date: Thu, 12 Feb 2026 11:57:34 +0100 Subject: [PATCH 2/8] feat(EXTI)!: Implement EXTIDomain --- Inc/HALAL/Services/EXTI/EXTI.hpp | 151 ++++++++++++++++++++++++++----- Src/HALAL/Services/EXTI/EXTI.cpp | 67 ++++---------- 2 files changed, 148 insertions(+), 70 deletions(-) diff --git a/Inc/HALAL/Services/EXTI/EXTI.hpp b/Inc/HALAL/Services/EXTI/EXTI.hpp index 7cabcf2ea..322aa1e76 100644 --- a/Inc/HALAL/Services/EXTI/EXTI.hpp +++ b/Inc/HALAL/Services/EXTI/EXTI.hpp @@ -5,33 +5,142 @@ * Author: alejandro */ -#pragma once -#include "HALAL/Models/PinModel/Pin.hpp" +#ifndef EXTI_HPP +#define EXTI_HPP +#include "HALAL/Models/GPIO.hpp" +#include "HALAL/Models/Pin.hpp" +#include -#ifdef HAL_EXTI_MODULE_ENABLED +extern "C" void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); -class ExternalInterrupt { -public: +namespace ST_LIB { - class Instance { - public: - IRQn_Type interrupt_request_number; +struct EXTIDomain { - function action = nullptr; - bool is_on = true; + static constexpr uint8_t get_pin_index(uint16_t pin_mask) { + for(uint8_t i = 0; i < 16; i++) { + if (pin_mask & (1 << i)) return i; + } + return 0xFF; + } - Instance() = default; - Instance(IRQn_Type interrupt_request_number); + enum class Trigger : uint8_t { + RISING_EDGE = 6, // ST_LIB::GPIODomain::OperationMode::EXTI_RISING + FALLING_EDGE = 7, // ST_LIB::GPIODomain::OperationMode::EXTI_FALLING + BOTH_EDGES = 8 // ST_LIB::GPIODomain::OperationMode::EXTI_RISING_FALLING }; - static map service_ids; - static map instances; - static uint8_t id_counter; + struct Entry { + std::size_t pin_idx; + uint16_t pin_mask; + void (*action)(); + }; - static uint8_t inscribe(Pin& pin, function&& action, TRIGGER trigger=RISING_EDGE); - static void start(); - static void turn_on(uint8_t id); - static void turn_off(uint8_t id); - static bool get_pin_value(uint8_t id); + struct Device { + using domain = EXTIDomain; + ST_LIB::GPIODomain::GPIO pin; + void (*action)(); + + consteval Device(ST_LIB::GPIODomain::Pin pin, Trigger trigger, void (*action)()) + : pin(pin, static_cast(trigger), ST_LIB::GPIODomain::Pull::None, ST_LIB::GPIODomain::Speed::Low), action(action) { + #ifndef HAL_EXTI_MODULE_ENABLED + ST_LIB::compile_error("EXTI module not enabled in HAL"); + #endif + } + + template + consteval std::size_t inscribe(Ctx &ctx) const { + Entry e; + e.pin_idx = pin.inscribe(ctx); + e.pin_mask = pin.e.pin; + e.action = action; + return ctx.template add(e, this); + } + }; + + static constexpr std::size_t max_instances = 16; + + struct Config { + std::size_t pin_idx; + uint8_t interrupt_num; + void (*action)(); + }; + + template + static consteval std::array build(std::span entries) { + std::array cfgs{}; + + uint16_t used_lines_mask = 0; + + for (std::size_t i = 0; i < N; i++) { + const Entry &e = entries[i]; + + cfgs[i].pin_idx = e.pin_idx; + uint8_t pin_num = get_pin_index(e.pin_mask); + + if (pin_num >= 16) { + ST_LIB::compile_error("Invalid Pin for EXTI"); + } + + uint16_t line_mask = (1 << pin_num); + if (used_lines_mask & line_mask) { + ST_LIB::compile_error("EXTI line already used (Hardware Conflict: Pins with same number share EXTI Line)"); + } + + used_lines_mask |= line_mask; + cfgs[i].interrupt_num = pin_num; + cfgs[i].action = e.action; + } + + return cfgs; + } + + struct Instance { + friend void ::HAL_GPIO_EXTI_Callback(uint16_t); + template friend struct Init; + void turn_off() { is_on = false; } + void turn_on() { is_on = true; } + GPIO_PinState read() { + return gpio->read(); + } + + private: + bool is_on = false; + void (*action)() = nullptr; + GPIODomain::Instance* gpio = nullptr; + }; + + static Instance* g_instances[EXTIDomain::max_instances]; + + template + struct Init { + static inline std::array instances{}; + + static void init(std::span cfgs, + std::span gpio_instances) { + for (std::size_t i = 0; i < N; i++) { + const auto &cfg = cfgs[i]; + auto &inst = instances[i]; + + uint8_t id = cfg.interrupt_num; + g_instances[id] = &inst; + inst.action = cfg.action; + inst.gpio = &gpio_instances[cfg.pin_idx]; + + IRQn_Type irq_n; + if (id <= 4) irq_n = (IRQn_Type)(EXTI0_IRQn + id); + else if (id <= 9) irq_n = EXTI9_5_IRQn; + else irq_n = EXTI15_10_IRQn; + + HAL_NVIC_SetPriority(irq_n, 0, 0); + HAL_NVIC_EnableIRQ(irq_n); + + inst.turn_on(); + } + } + }; }; -#endif + +} + +#endif // EXTI_HPP \ No newline at end of file diff --git a/Src/HALAL/Services/EXTI/EXTI.cpp b/Src/HALAL/Services/EXTI/EXTI.cpp index e0d1536b4..77f70b4e1 100644 --- a/Src/HALAL/Services/EXTI/EXTI.cpp +++ b/Src/HALAL/Services/EXTI/EXTI.cpp @@ -9,66 +9,35 @@ #include "ErrorHandler/ErrorHandler.hpp" -uint8_t ExternalInterrupt::id_counter = 0; -map ExternalInterrupt::service_ids = {}; -ExternalInterrupt::Instance::Instance(IRQn_Type interrupt_request_number) - : interrupt_request_number(interrupt_request_number) {} +extern "C"{ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { - ExternalInterrupt::Instance& exti = ExternalInterrupt::instances[GPIO_Pin]; - if (exti.is_on) { - exti.action(); + auto index = ST_LIB::EXTIDomain::get_pin_index(GPIO_Pin); + if (index >= ST_LIB::EXTIDomain::max_instances) return; + auto* exti = ST_LIB::EXTIDomain::g_instances[index]; + if (exti && exti->is_on && exti->action) { + exti->action(); } } -uint8_t ExternalInterrupt::inscribe(Pin& pin, function&& action, - TRIGGER trigger) { - if (not instances.contains(pin.gpio_pin)) { - ErrorHandler( - " The pin %s is already used or isn t available for EXTI usage", - pin.to_string().c_str()); - return 0; - } - - if (trigger == TRIGGER::RISING_EDGE) { - Pin::inscribe(pin, EXTERNAL_INTERRUPT_RISING); - } else if (trigger == TRIGGER::FAILING_EDGE) { - Pin::inscribe(pin, EXTERNAL_INTERRUPT_FALLING); - } else if (trigger == TRIGGER::BOTH_EDGES) { - Pin::inscribe(pin, EXTERNAL_INTERRUPT_RISING_FALLING); - } - - service_ids[id_counter] = pin; - instances[pin.gpio_pin].action = action; - - return id_counter++; +void EXTI0_IRQHandler() { + HAL_GPIO_EXTI_IRQHandler(0x0001); } -void ExternalInterrupt::start() { - for (auto id_instance : instances) { - Instance& instance = id_instance.second; - HAL_NVIC_SetPriority(instance.interrupt_request_number, 0, 0); - HAL_NVIC_EnableIRQ(instance.interrupt_request_number); +void EXTI1_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(0x0002); } +void EXTI2_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(0x0004); } +void EXTI3_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(0x0008); } +void EXTI4_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(0x0010); } +void EXTI9_5_IRQHandler() { + for (uint16_t pin_mask = 0x0020; pin_mask <= 0x0200; pin_mask <<= 1) { + if (__HAL_GPIO_EXTI_GET_IT(pin_mask) != 0x00U) { HAL_GPIO_EXTI_IRQHandler(pin_mask); } } } - -void ExternalInterrupt::turn_on(uint8_t id) { - if (not service_ids.contains(id)) { - ErrorHandler("ID %d is not registered as an active instance", id); - return; +void EXTI15_10_IRQHandler() { + for (uint16_t pin_mask = 0x0400; pin_mask <= 0x8000; pin_mask <<= 1) { + if (__HAL_GPIO_EXTI_GET_IT(pin_mask) != 0x00U) { HAL_GPIO_EXTI_IRQHandler(pin_mask); } } - - Instance& instance = instances[service_ids[id].gpio_pin]; - instance.is_on = true; } -bool ExternalInterrupt::get_pin_value(uint8_t id) { - if (not service_ids.contains(id)) { - ErrorHandler("ID %d is not registered as an active instance", id); - return false; - } - - Pin& pin = service_ids[id]; - return HAL_GPIO_ReadPin(pin.port, pin.gpio_pin); } From b95e7c5ff4c52929cdb6d0dfa65d909e66ebbd5b Mon Sep 17 00:00:00 2001 From: Boris Mladenov Beslimov Date: Thu, 12 Feb 2026 11:57:55 +0100 Subject: [PATCH 3/8] fix(Sensors): Remove old exti things from Sensor --- Inc/ST-LIB_LOW/Sensors/Sensor/Sensor.hpp | 1 - Src/ST-LIB_LOW/Sensors/Sensor/Sensor.cpp | 5 ----- 2 files changed, 6 deletions(-) diff --git a/Inc/ST-LIB_LOW/Sensors/Sensor/Sensor.hpp b/Inc/ST-LIB_LOW/Sensors/Sensor/Sensor.hpp index 1eade3607..012a410e2 100644 --- a/Inc/ST-LIB_LOW/Sensors/Sensor/Sensor.hpp +++ b/Inc/ST-LIB_LOW/Sensors/Sensor/Sensor.hpp @@ -12,6 +12,5 @@ class Sensor{ public: static void start(); - static std::vector EXTI_id_list; static std::vector inputcapture_id_list; }; diff --git a/Src/ST-LIB_LOW/Sensors/Sensor/Sensor.cpp b/Src/ST-LIB_LOW/Sensors/Sensor/Sensor.cpp index 174e111cc..74a0ddb13 100644 --- a/Src/ST-LIB_LOW/Sensors/Sensor/Sensor.cpp +++ b/Src/ST-LIB_LOW/Sensors/Sensor/Sensor.cpp @@ -1,15 +1,10 @@ #include "Sensors/Sensor/Sensor.hpp" -#include "HALAL/Services/EXTI/EXTI.hpp" #include "HALAL/Services/InputCapture/InputCapture.hpp" -std::vector Sensor::EXTI_id_list{}; std::vector Sensor::inputcapture_id_list{}; void Sensor::start(){ - for(uint8_t exti_id : EXTI_id_list){ - ExternalInterrupt::turn_on(exti_id); - } for(uint8_t inputcapture_id : inputcapture_id_list){ InputCapture::turn_on(inputcapture_id); From 87ee26f352ffc0f98eb7f73ca1e51b8fb94978d7 Mon Sep 17 00:00:00 2001 From: Boris Mladenov Beslimov Date: Thu, 12 Feb 2026 11:58:19 +0100 Subject: [PATCH 4/8] feat(SensorInterrupt): Update to use new EXTI --- .../Sensors/SensorInterrupt/SensorInterrupt.hpp | 9 ++++----- .../Sensors/SensorInterrupt/SensorInterrupt.cpp | 12 +++--------- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/Inc/ST-LIB_LOW/Sensors/SensorInterrupt/SensorInterrupt.hpp b/Inc/ST-LIB_LOW/Sensors/SensorInterrupt/SensorInterrupt.hpp index 20cbc70e1..f41e4ac51 100644 --- a/Inc/ST-LIB_LOW/Sensors/SensorInterrupt/SensorInterrupt.hpp +++ b/Inc/ST-LIB_LOW/Sensors/SensorInterrupt/SensorInterrupt.hpp @@ -15,12 +15,11 @@ class SensorInterrupt{ public: SensorInterrupt() = default; - SensorInterrupt(Pin &pin, std::function &&action, PinState *value, TRIGGER trigger = TRIGGER::RISING_EDGE); - SensorInterrupt(Pin &pin, std::function &&action, PinState &value, TRIGGER trigger = TRIGGER::RISING_EDGE); + SensorInterrupt(ST_LIB::EXTIDomain::Instance &exti, GPIO_PinState *value); + SensorInterrupt(ST_LIB::EXTIDomain::Instance &exti, GPIO_PinState &value); void read(); - uint8_t get_id(); protected: - uint8_t id; - PinState *value; + ST_LIB::EXTIDomain::Instance *exti; + GPIO_PinState *value; }; diff --git a/Src/ST-LIB_LOW/Sensors/SensorInterrupt/SensorInterrupt.cpp b/Src/ST-LIB_LOW/Sensors/SensorInterrupt/SensorInterrupt.cpp index 0d49f1a2c..00bb525ba 100644 --- a/Src/ST-LIB_LOW/Sensors/SensorInterrupt/SensorInterrupt.cpp +++ b/Src/ST-LIB_LOW/Sensors/SensorInterrupt/SensorInterrupt.cpp @@ -1,18 +1,12 @@ #include "Sensors/SensorInterrupt/SensorInterrupt.hpp" #include "Sensors/Sensor/Sensor.hpp" -SensorInterrupt::SensorInterrupt(Pin &pin, std::function &&action, PinState *value, TRIGGER trigger) : value(value) { - id = ExternalInterrupt::inscribe(pin, std::forward>(action), trigger); - - Sensor::EXTI_id_list.insert(Sensor::EXTI_id_list.begin(),id); +SensorInterrupt::SensorInterrupt(ST_LIB::EXTIDomain::Instance &exti, GPIO_PinState *value) : exti(&exti), value(value) { } -SensorInterrupt::SensorInterrupt(Pin &pin, std::function &&action, PinState &value, TRIGGER trigger) : SensorInterrupt::SensorInterrupt(pin,std::forward>(action),&value, trigger){} +SensorInterrupt::SensorInterrupt(ST_LIB::EXTIDomain::Instance &exti, GPIO_PinState &value) : SensorInterrupt::SensorInterrupt(exti, &value){} void SensorInterrupt::read(){ - *value = (PinState)ExternalInterrupt::get_pin_value(id); + *value = exti->read(); } -uint8_t SensorInterrupt::get_id(){ - return id; -} From 022e7c5bce45e5231598b3c5fb0dd05b66e4cb88 Mon Sep 17 00:00:00 2001 From: Boris Mladenov Beslimov Date: Thu, 12 Feb 2026 11:58:52 +0100 Subject: [PATCH 5/8] feat(ST-LIB): Add EXTIDomain and remove old exti update --- Inc/ST-LIB.hpp | 9 +++++++-- Src/HALAL/HALAL.cpp | 4 ---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Inc/ST-LIB.hpp b/Inc/ST-LIB.hpp index 16e622662..a37029e16 100644 --- a/Inc/ST-LIB.hpp +++ b/Inc/ST-LIB.hpp @@ -86,7 +86,7 @@ template struct BuildCtx { using DomainsCtx = BuildCtx; + ADCDomain, EXTIDomain /* PWMDomain, ...*/>; template struct Board { static consteval auto build_ctx() { @@ -111,6 +111,7 @@ template struct Board { constexpr std::size_t sdN = domain_size(); constexpr std::size_t ethN = domain_size(); constexpr std::size_t adcN = domain_size(); + constexpr std::size_t extiN = domain_size(); // ... struct ConfigBundle { @@ -123,6 +124,7 @@ template struct Board { std::array sd_cfgs; std::array eth_cfgs; std::array adc_cfgs; + std::array exti_cfgs; // ... }; @@ -144,6 +146,7 @@ template struct Board { ctx.template span()), .adc_cfgs = ADCDomain::template build(ctx.template span()), + .exti_cfgs = EXTIDomain::template build(ctx.template span()), // ... }; } @@ -160,6 +163,7 @@ template struct Board { constexpr std::size_t sdN = domain_size(); constexpr std::size_t ethN = domain_size(); constexpr std::size_t adcN = domain_size(); + constexpr std::size_t extiN = domain_size(); // ... #ifdef HAL_IWDG_MODULE_ENABLED @@ -185,7 +189,8 @@ template struct Board { cfg.eth_cfgs, DigitalOutputDomain::Init::instances); ADCDomain::Init::init(cfg.adc_cfgs, GPIODomain::Init::instances); - // ... + EXTIDomain::Init::init(cfg.exti_cfgs, + GPIODomain::Init::instances); // ... } template diff --git a/Src/HALAL/HALAL.cpp b/Src/HALAL/HALAL.cpp index 50536b587..624e11539 100644 --- a/Src/HALAL/HALAL.cpp +++ b/Src/HALAL/HALAL.cpp @@ -75,10 +75,6 @@ static void common_start(UART::Peripheral &printf_peripheral) { //Time::start(); #endif -#ifdef HAL_EXTI_MODULE_ENABLED - ExternalInterrupt::start(); -#endif - #ifdef NDEBUG #ifdef HAL_IWDG_MODULE_ENABLED Watchdog::start(); From 3f40e9656e949dc680c6c13a80a951d932dd7c68 Mon Sep 17 00:00:00 2001 From: Boris Mladenov Beslimov Date: Fri, 13 Feb 2026 16:25:56 +0100 Subject: [PATCH 6/8] fix(EXTI): fix infinite loop thing and friend declaration --- Inc/HALAL/Services/EXTI/EXTI.hpp | 5 ++++- Src/HALAL/Services/EXTI/EXTI.cpp | 8 +++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Inc/HALAL/Services/EXTI/EXTI.hpp b/Inc/HALAL/Services/EXTI/EXTI.hpp index 322aa1e76..2f05de896 100644 --- a/Inc/HALAL/Services/EXTI/EXTI.hpp +++ b/Inc/HALAL/Services/EXTI/EXTI.hpp @@ -95,6 +95,8 @@ struct EXTIDomain { return cfgs; } + template struct Init; + struct Instance { friend void ::HAL_GPIO_EXTI_Callback(uint16_t); template friend struct Init; @@ -110,7 +112,7 @@ struct EXTIDomain { GPIODomain::Instance* gpio = nullptr; }; - static Instance* g_instances[EXTIDomain::max_instances]; + static Instance* g_instances[EXTIDomain::max_instances]; template struct Init { @@ -136,6 +138,7 @@ struct EXTIDomain { HAL_NVIC_EnableIRQ(irq_n); inst.turn_on(); + inst.is_on = true; } } }; diff --git a/Src/HALAL/Services/EXTI/EXTI.cpp b/Src/HALAL/Services/EXTI/EXTI.cpp index 77f70b4e1..f91307def 100644 --- a/Src/HALAL/Services/EXTI/EXTI.cpp +++ b/Src/HALAL/Services/EXTI/EXTI.cpp @@ -9,8 +9,10 @@ #include "ErrorHandler/ErrorHandler.hpp" +ST_LIB::EXTIDomain::Instance* ST_LIB::EXTIDomain::g_instances[ST_LIB::EXTIDomain::max_instances]; -extern "C"{ + +extern "C" { void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { auto index = ST_LIB::EXTIDomain::get_pin_index(GPIO_Pin); @@ -30,12 +32,12 @@ void EXTI2_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(0x0004); } void EXTI3_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(0x0008); } void EXTI4_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(0x0010); } void EXTI9_5_IRQHandler() { - for (uint16_t pin_mask = 0x0020; pin_mask <= 0x0200; pin_mask <<= 1) { + for (uint32_t pin_mask = 0x0020; pin_mask <= 0x0200; pin_mask <<= 1) { if (__HAL_GPIO_EXTI_GET_IT(pin_mask) != 0x00U) { HAL_GPIO_EXTI_IRQHandler(pin_mask); } } } void EXTI15_10_IRQHandler() { - for (uint16_t pin_mask = 0x0400; pin_mask <= 0x8000; pin_mask <<= 1) { + for (uint32_t pin_mask = 0x0400; pin_mask <= 0x8000; pin_mask <<= 1) { if (__HAL_GPIO_EXTI_GET_IT(pin_mask) != 0x00U) { HAL_GPIO_EXTI_IRQHandler(pin_mask); } } } From d2ca4d749cbbbf9ea0598feb69818bcfe82a9746 Mon Sep 17 00:00:00 2001 From: Boris Mladenov Beslimov Date: Sat, 14 Feb 2026 00:18:42 +0100 Subject: [PATCH 7/8] Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- Inc/HALAL/Services/EXTI/EXTI.hpp | 10 +++++----- Src/HALAL/Services/EXTI/EXTI.cpp | 1 - .../Sensors/SensorInterrupt/SensorInterrupt.cpp | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Inc/HALAL/Services/EXTI/EXTI.hpp b/Inc/HALAL/Services/EXTI/EXTI.hpp index 2f05de896..816124f3f 100644 --- a/Inc/HALAL/Services/EXTI/EXTI.hpp +++ b/Inc/HALAL/Services/EXTI/EXTI.hpp @@ -9,7 +9,7 @@ #define EXTI_HPP #include "HALAL/Models/GPIO.hpp" #include "HALAL/Models/Pin.hpp" -#include + extern "C" void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); @@ -25,9 +25,9 @@ struct EXTIDomain { } enum class Trigger : uint8_t { - RISING_EDGE = 6, // ST_LIB::GPIODomain::OperationMode::EXTI_RISING - FALLING_EDGE = 7, // ST_LIB::GPIODomain::OperationMode::EXTI_FALLING - BOTH_EDGES = 8 // ST_LIB::GPIODomain::OperationMode::EXTI_RISING_FALLING + RISING_EDGE = static_cast(ST_LIB::GPIODomain::OperationMode::EXTI_RISING), + FALLING_EDGE = static_cast(ST_LIB::GPIODomain::OperationMode::EXTI_FALLING), + BOTH_EDGES = static_cast(ST_LIB::GPIODomain::OperationMode::EXTI_RISING_FALLING) }; struct Entry { @@ -138,7 +138,7 @@ struct EXTIDomain { HAL_NVIC_EnableIRQ(irq_n); inst.turn_on(); - inst.is_on = true; + } } }; diff --git a/Src/HALAL/Services/EXTI/EXTI.cpp b/Src/HALAL/Services/EXTI/EXTI.cpp index f91307def..4e212ad4c 100644 --- a/Src/HALAL/Services/EXTI/EXTI.cpp +++ b/Src/HALAL/Services/EXTI/EXTI.cpp @@ -7,7 +7,6 @@ #include "HALAL/Services/EXTI/EXTI.hpp" -#include "ErrorHandler/ErrorHandler.hpp" ST_LIB::EXTIDomain::Instance* ST_LIB::EXTIDomain::g_instances[ST_LIB::EXTIDomain::max_instances]; diff --git a/Src/ST-LIB_LOW/Sensors/SensorInterrupt/SensorInterrupt.cpp b/Src/ST-LIB_LOW/Sensors/SensorInterrupt/SensorInterrupt.cpp index 00bb525ba..7bc3baa2c 100644 --- a/Src/ST-LIB_LOW/Sensors/SensorInterrupt/SensorInterrupt.cpp +++ b/Src/ST-LIB_LOW/Sensors/SensorInterrupt/SensorInterrupt.cpp @@ -1,5 +1,5 @@ #include "Sensors/SensorInterrupt/SensorInterrupt.hpp" -#include "Sensors/Sensor/Sensor.hpp" + SensorInterrupt::SensorInterrupt(ST_LIB::EXTIDomain::Instance &exti, GPIO_PinState *value) : exti(&exti), value(value) { } From af9761522a2760e8a03491e4898a734a8fcdc87f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20S=C3=A1ez?= Date: Sat, 14 Feb 2026 13:04:27 +0100 Subject: [PATCH 8/8] formatted files --- Inc/HALAL/Services/EXTI/EXTI.hpp | 253 +++++------ Inc/ST-LIB.hpp | 413 +++++++++--------- Inc/ST-LIB_LOW/Sensors/Sensor/Sensor.hpp | 6 +- .../SensorInterrupt/SensorInterrupt.hpp | 14 +- Src/HALAL/HALAL.cpp | 63 ++- Src/HALAL/Services/EXTI/EXTI.cpp | 20 +- Src/ST-LIB_LOW/Sensors/Sensor/Sensor.cpp | 9 +- .../SensorInterrupt/SensorInterrupt.cpp | 13 +- 8 files changed, 396 insertions(+), 395 deletions(-) diff --git a/Inc/HALAL/Services/EXTI/EXTI.hpp b/Inc/HALAL/Services/EXTI/EXTI.hpp index 816124f3f..77daaefd2 100644 --- a/Inc/HALAL/Services/EXTI/EXTI.hpp +++ b/Inc/HALAL/Services/EXTI/EXTI.hpp @@ -2,7 +2,7 @@ * EXTI.hpp * * Created on: Nov 5, 2022 - * Author: alejandro + * Author: alejandro */ #ifndef EXTI_HPP @@ -10,140 +10,143 @@ #include "HALAL/Models/GPIO.hpp" #include "HALAL/Models/Pin.hpp" - extern "C" void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); namespace ST_LIB { struct EXTIDomain { - static constexpr uint8_t get_pin_index(uint16_t pin_mask) { - for(uint8_t i = 0; i < 16; i++) { - if (pin_mask & (1 << i)) return i; - } - return 0xFF; - } - - enum class Trigger : uint8_t { - RISING_EDGE = static_cast(ST_LIB::GPIODomain::OperationMode::EXTI_RISING), - FALLING_EDGE = static_cast(ST_LIB::GPIODomain::OperationMode::EXTI_FALLING), - BOTH_EDGES = static_cast(ST_LIB::GPIODomain::OperationMode::EXTI_RISING_FALLING) - }; - - struct Entry { - std::size_t pin_idx; - uint16_t pin_mask; - void (*action)(); - }; - - struct Device { - using domain = EXTIDomain; - ST_LIB::GPIODomain::GPIO pin; - void (*action)(); - - consteval Device(ST_LIB::GPIODomain::Pin pin, Trigger trigger, void (*action)()) - : pin(pin, static_cast(trigger), ST_LIB::GPIODomain::Pull::None, ST_LIB::GPIODomain::Speed::Low), action(action) { - #ifndef HAL_EXTI_MODULE_ENABLED - ST_LIB::compile_error("EXTI module not enabled in HAL"); - #endif - } - - template - consteval std::size_t inscribe(Ctx &ctx) const { - Entry e; - e.pin_idx = pin.inscribe(ctx); - e.pin_mask = pin.e.pin; - e.action = action; - return ctx.template add(e, this); - } - }; - - static constexpr std::size_t max_instances = 16; - - struct Config { - std::size_t pin_idx; - uint8_t interrupt_num; - void (*action)(); - }; - - template - static consteval std::array build(std::span entries) { - std::array cfgs{}; - - uint16_t used_lines_mask = 0; - - for (std::size_t i = 0; i < N; i++) { - const Entry &e = entries[i]; - - cfgs[i].pin_idx = e.pin_idx; - uint8_t pin_num = get_pin_index(e.pin_mask); - - if (pin_num >= 16) { - ST_LIB::compile_error("Invalid Pin for EXTI"); - } - - uint16_t line_mask = (1 << pin_num); - if (used_lines_mask & line_mask) { - ST_LIB::compile_error("EXTI line already used (Hardware Conflict: Pins with same number share EXTI Line)"); - } - - used_lines_mask |= line_mask; - cfgs[i].interrupt_num = pin_num; - cfgs[i].action = e.action; + static constexpr uint8_t get_pin_index(uint16_t pin_mask) { + for (uint8_t i = 0; i < 16; i++) { + if (pin_mask & (1 << i)) + return i; + } + return 0xFF; } - return cfgs; - } - - template struct Init; - - struct Instance { - friend void ::HAL_GPIO_EXTI_Callback(uint16_t); - template friend struct Init; - void turn_off() { is_on = false; } - void turn_on() { is_on = true; } - GPIO_PinState read() { - return gpio->read(); - } - - private: - bool is_on = false; - void (*action)() = nullptr; - GPIODomain::Instance* gpio = nullptr; - }; - - static Instance* g_instances[EXTIDomain::max_instances]; - - template - struct Init { - static inline std::array instances{}; - - static void init(std::span cfgs, - std::span gpio_instances) { - for (std::size_t i = 0; i < N; i++) { - const auto &cfg = cfgs[i]; - auto &inst = instances[i]; - - uint8_t id = cfg.interrupt_num; - g_instances[id] = &inst; - inst.action = cfg.action; - inst.gpio = &gpio_instances[cfg.pin_idx]; - - IRQn_Type irq_n; - if (id <= 4) irq_n = (IRQn_Type)(EXTI0_IRQn + id); - else if (id <= 9) irq_n = EXTI9_5_IRQn; - else irq_n = EXTI15_10_IRQn; - - HAL_NVIC_SetPriority(irq_n, 0, 0); - HAL_NVIC_EnableIRQ(irq_n); - - inst.turn_on(); - - } + enum class Trigger : uint8_t { + RISING_EDGE = static_cast(ST_LIB::GPIODomain::OperationMode::EXTI_RISING), + FALLING_EDGE = static_cast(ST_LIB::GPIODomain::OperationMode::EXTI_FALLING), + BOTH_EDGES = static_cast(ST_LIB::GPIODomain::OperationMode::EXTI_RISING_FALLING) + }; + + struct Entry { + std::size_t pin_idx; + uint16_t pin_mask; + void (*action)(); + }; + + struct Device { + using domain = EXTIDomain; + ST_LIB::GPIODomain::GPIO pin; + void (*action)(); + + consteval Device(ST_LIB::GPIODomain::Pin pin, Trigger trigger, void (*action)()) + : pin(pin, + static_cast(trigger), + ST_LIB::GPIODomain::Pull::None, + ST_LIB::GPIODomain::Speed::Low), + action(action) { +#ifndef HAL_EXTI_MODULE_ENABLED + ST_LIB::compile_error("EXTI module not enabled in HAL"); +#endif + } + + template consteval std::size_t inscribe(Ctx& ctx) const { + Entry e; + e.pin_idx = pin.inscribe(ctx); + e.pin_mask = pin.e.pin; + e.action = action; + return ctx.template add(e, this); + } + }; + + static constexpr std::size_t max_instances = 16; + + struct Config { + std::size_t pin_idx; + uint8_t interrupt_num; + void (*action)(); + }; + + template + static consteval std::array build(std::span entries) { + std::array cfgs{}; + + uint16_t used_lines_mask = 0; + + for (std::size_t i = 0; i < N; i++) { + const Entry& e = entries[i]; + + cfgs[i].pin_idx = e.pin_idx; + uint8_t pin_num = get_pin_index(e.pin_mask); + + if (pin_num >= 16) { + ST_LIB::compile_error("Invalid Pin for EXTI"); + } + + uint16_t line_mask = (1 << pin_num); + if (used_lines_mask & line_mask) { + ST_LIB::compile_error("EXTI line already used (Hardware Conflict: Pins with same " + "number share EXTI Line)"); + } + + used_lines_mask |= line_mask; + cfgs[i].interrupt_num = pin_num; + cfgs[i].action = e.action; + } + + return cfgs; } - }; + + template struct Init; + + struct Instance { + friend void ::HAL_GPIO_EXTI_Callback(uint16_t); + template friend struct Init; + void turn_off() { is_on = false; } + void turn_on() { is_on = true; } + GPIO_PinState read() { return gpio->read(); } + + private: + bool is_on = false; + void (*action)() = nullptr; + GPIODomain::Instance* gpio = nullptr; + }; + + static Instance* g_instances[EXTIDomain::max_instances]; + + template struct Init { + static inline std::array instances{}; + + static void + init(std::span cfgs, std::span gpio_instances) { + for (std::size_t i = 0; i < N; i++) { + const auto& cfg = cfgs[i]; + auto& inst = instances[i]; + + uint8_t id = cfg.interrupt_num; + g_instances[id] = &inst; + inst.action = cfg.action; + inst.gpio = &gpio_instances[cfg.pin_idx]; + + IRQn_Type irq_n; + if (id <= 4) + irq_n = (IRQn_Type)(EXTI0_IRQn + id); + else if (id <= 9) + irq_n = EXTI9_5_IRQn; + else + irq_n = EXTI15_10_IRQn; + + HAL_NVIC_SetPriority(irq_n, 0, 0); + HAL_NVIC_EnableIRQ(irq_n); + + inst.turn_on(); + } + } + }; }; -} +} // namespace ST_LIB #endif // EXTI_HPP \ No newline at end of file diff --git a/Inc/ST-LIB.hpp b/Inc/ST-LIB.hpp index 0e9723836..726e225ff 100644 --- a/Inc/ST-LIB.hpp +++ b/Inc/ST-LIB.hpp @@ -9,230 +9,235 @@ class STLIB { public: #ifdef STLIB_ETH - static void start(MAC mac, IPV4 ip, IPV4 subnet_mask, IPV4 gateway, - UART::Peripheral &printf_peripheral); - - static void start(const std::string &mac = "00:80:e1:00:00:00", - const std::string &ip = "192.168.1.4", - const std::string &subnet_mask = "255.255.0.0", - const std::string &gateway = "192.168.1.1", - UART::Peripheral &printf_peripheral = UART::uart2); + static void + start(MAC mac, IPV4 ip, IPV4 subnet_mask, IPV4 gateway, UART::Peripheral& printf_peripheral); + + static void start( + const std::string& mac = "00:80:e1:00:00:00", + const std::string& ip = "192.168.1.4", + const std::string& subnet_mask = "255.255.0.0", + const std::string& gateway = "192.168.1.1", + UART::Peripheral& printf_peripheral = UART::uart2 + ); #else - static void start(UART::Peripheral &printf_peripheral = UART::uart2); + static void start(UART::Peripheral& printf_peripheral = UART::uart2); #endif - static void update(); + static void update(); }; namespace ST_LIB { -extern void compile_error(const char *msg); +extern void compile_error(const char* msg); template struct BuildCtx { - template using Decl = typename D::Entry; - template - static constexpr std::size_t max_count_v = D::max_instances; - - std::tuple, max_count_v>...> storage{}; - std::tuple>...> owners{}; - std::array sizes{}; - - template - static consteval std::size_t domain_index() { - if constexpr (I >= sizeof...(Domains)) { - static_assert([] { return false; }(), "Domain not found"); - return 0; - } else if constexpr (std::is_same_v>>) { - return I; - } else { - return domain_index(); + template using Decl = typename D::Entry; + template static constexpr std::size_t max_count_v = D::max_instances; + + std::tuple, max_count_v>...> storage{}; + std::tuple>...> owners{}; + std::array sizes{}; + + template static consteval std::size_t domain_index() { + if constexpr (I >= sizeof...(Domains)) { + static_assert([] { return false; }(), "Domain not found"); + return 0; + } else if constexpr (std::is_same_v>>) { + return I; + } else { + return domain_index(); + } + } + + template + consteval std::size_t add(typename D::Entry e, const Owner* owner) { + constexpr std::size_t I = domain_index(); + auto& arr = std::get(storage); + auto& own = std::get(owners); + auto& size = sizes[I]; + + const auto idx = size; + arr[size] = e; + own[size] = owner; + ++size; + return idx; + } + + template consteval auto span() const { + constexpr std::size_t I = domain_index(); + auto const& arr = std::get(storage); + auto const size = sizes[I]; + using E = typename D::Entry; + return std::span{arr.data(), size}; + } + + template consteval auto owners_span() const { + constexpr std::size_t I = domain_index(); + auto const& arr = std::get(owners); + auto const size = sizes[I]; + return std::span{arr.data(), size}; + } + + template consteval std::size_t size() const { + constexpr std::size_t I = domain_index(); + return sizes[I]; } - } - - template - consteval std::size_t add(typename D::Entry e, const Owner *owner) { - constexpr std::size_t I = domain_index(); - auto &arr = std::get(storage); - auto &own = std::get(owners); - auto &size = sizes[I]; - - const auto idx = size; - arr[size] = e; - own[size] = owner; - ++size; - return idx; - } - - template consteval auto span() const { - constexpr std::size_t I = domain_index(); - auto const &arr = std::get(storage); - auto const size = sizes[I]; - using E = typename D::Entry; - return std::span{arr.data(), size}; - } - - template consteval auto owners_span() const { - constexpr std::size_t I = domain_index(); - auto const &arr = std::get(owners); - auto const size = sizes[I]; - return std::span{arr.data(), size}; - } - - template consteval std::size_t size() const { - constexpr std::size_t I = domain_index(); - return sizes[I]; - } }; -using DomainsCtx = - BuildCtx; - -template struct Board { - static consteval auto build_ctx() { - DomainsCtx ctx{}; - (devs.inscribe(ctx), ...); - return ctx; - } - - static constexpr auto ctx = build_ctx(); - - template static consteval std::size_t domain_size() { - return ctx.template span().size(); - } - - static consteval auto build() { - constexpr std::size_t mpuN = domain_size(); - constexpr std::size_t gpioN = domain_size(); - constexpr std::size_t timN = domain_size(); - constexpr std::size_t dmaN = domain_size(); - constexpr std::size_t spiN = domain_size(); - constexpr std::size_t doutN = domain_size(); - constexpr std::size_t dinN = domain_size(); - constexpr std::size_t mdmaPacketN = domain_size(); - constexpr std::size_t sdN = domain_size(); - constexpr std::size_t ethN = domain_size(); - constexpr std::size_t adcN = domain_size(); - constexpr std::size_t extiN = domain_size(); - // ... - - struct ConfigBundle { - std::array mpu_cfgs; - std::array gpio_cfgs; - std::array tim_cfgs; - std::array dma_cfgs; - std::array spi_cfgs; - std::array dout_cfgs; - std::array din_cfgs; - std::array mdma_packet_cfgs; - std::array sd_cfgs; - std::array eth_cfgs; - std::array adc_cfgs; - std::array exti_cfgs; - // ... - }; - - return ConfigBundle{ - .mpu_cfgs = - MPUDomain::template build(ctx.template span()), - .gpio_cfgs = - GPIODomain::template build(ctx.template span()), - .tim_cfgs = - TimerDomain::template build(ctx.template span()), - .dma_cfgs = DMA_Domain::template build( - ctx.template span()), - .spi_cfgs = SPIDomain::template build( - ctx.template span()), - .dout_cfgs = DigitalOutputDomain::template build( - ctx.template span()), - .din_cfgs = DigitalInputDomain::template build( - ctx.template span()), - .mdma_packet_cfgs = MdmaPacketDomain::template build( - ctx.template span()), - .sd_cfgs = SdDomain::template build(ctx.template span()), - .eth_cfgs = EthernetDomain::template build( - ctx.template span()), - .adc_cfgs = - ADCDomain::template build(ctx.template span()), - .exti_cfgs = EXTIDomain::template build(ctx.template span()), +using DomainsCtx = BuildCtx< + MPUDomain, + GPIODomain, + TimerDomain, + DMA_Domain, + SPIDomain, + DigitalOutputDomain, + DigitalInputDomain, + MdmaPacketDomain, + SdDomain, + EthernetDomain, + ADCDomain, + EXTIDomain /* PWMDomain, ...*/>; + +template struct Board { + static consteval auto build_ctx() { + DomainsCtx ctx{}; + (devs.inscribe(ctx), ...); + return ctx; + } + + static constexpr auto ctx = build_ctx(); + + template static consteval std::size_t domain_size() { + return ctx.template span().size(); + } + + static consteval auto build() { + constexpr std::size_t mpuN = domain_size(); + constexpr std::size_t gpioN = domain_size(); + constexpr std::size_t timN = domain_size(); + constexpr std::size_t dmaN = domain_size(); + constexpr std::size_t spiN = domain_size(); + constexpr std::size_t doutN = domain_size(); + constexpr std::size_t dinN = domain_size(); + constexpr std::size_t mdmaPacketN = domain_size(); + constexpr std::size_t sdN = domain_size(); + constexpr std::size_t ethN = domain_size(); + constexpr std::size_t adcN = domain_size(); + constexpr std::size_t extiN = domain_size(); + // ... + + struct ConfigBundle { + std::array mpu_cfgs; + std::array gpio_cfgs; + std::array tim_cfgs; + std::array dma_cfgs; + std::array spi_cfgs; + std::array dout_cfgs; + std::array din_cfgs; + std::array mdma_packet_cfgs; + std::array sd_cfgs; + std::array eth_cfgs; + std::array adc_cfgs; + std::array exti_cfgs; + // ... + }; + + return ConfigBundle{ + .mpu_cfgs = MPUDomain::template build(ctx.template span()), + .gpio_cfgs = GPIODomain::template build(ctx.template span()), + .tim_cfgs = TimerDomain::template build(ctx.template span()), + .dma_cfgs = DMA_Domain::template build(ctx.template span()), + .spi_cfgs = SPIDomain::template build(ctx.template span()), + .dout_cfgs = + DigitalOutputDomain::template build(ctx.template span() + ), + .din_cfgs = + DigitalInputDomain::template build(ctx.template span()), + .mdma_packet_cfgs = + MdmaPacketDomain::template build(ctx.template span() + ), + .sd_cfgs = SdDomain::template build(ctx.template span()), + .eth_cfgs = EthernetDomain::template build(ctx.template span()), + .adc_cfgs = ADCDomain::template build(ctx.template span()), + .exti_cfgs = EXTIDomain::template build(ctx.template span()), + // ... + }; + } + + static constexpr auto cfg = build(); + + static void init() { + constexpr std::size_t mpuN = domain_size(); + constexpr std::size_t gpioN = domain_size(); + constexpr std::size_t timN = domain_size(); + constexpr std::size_t dmaN = domain_size(); + constexpr std::size_t spiN = domain_size(); + constexpr std::size_t doutN = domain_size(); + constexpr std::size_t dinN = domain_size(); + constexpr std::size_t mdmaPacketN = domain_size(); + constexpr std::size_t sdN = domain_size(); + constexpr std::size_t ethN = domain_size(); + constexpr std::size_t adcN = domain_size(); + constexpr std::size_t extiN = domain_size(); // ... - }; - } - - static constexpr auto cfg = build(); - - static void init() { - constexpr std::size_t mpuN = domain_size(); - constexpr std::size_t gpioN = domain_size(); - constexpr std::size_t timN = domain_size(); - constexpr std::size_t dmaN = domain_size(); - constexpr std::size_t spiN = domain_size(); - constexpr std::size_t doutN = domain_size(); - constexpr std::size_t dinN = domain_size(); - constexpr std::size_t mdmaPacketN = domain_size(); - constexpr std::size_t sdN = domain_size(); - constexpr std::size_t ethN = domain_size(); - constexpr std::size_t adcN = domain_size(); - constexpr std::size_t extiN = domain_size(); - // ... #ifdef HAL_IWDG_MODULE_ENABLED - Watchdog::check_reset_flag(); + Watchdog::check_reset_flag(); #endif - HAL_Init(); - HALconfig::system_clock(); - HALconfig::peripheral_clock(); - - MPUDomain::Init::init(); - GPIODomain::Init::init(cfg.gpio_cfgs); - TimerDomain::Init::init(cfg.tim_cfgs); - DMA_Domain::Init::init(cfg.dma_cfgs); - SPIDomain::Init::init(cfg.spi_cfgs, - GPIODomain::Init::instances, - DMA_Domain::Init::instances); - DigitalOutputDomain::Init::init(cfg.dout_cfgs, - GPIODomain::Init::instances); - DigitalInputDomain::Init::init(cfg.din_cfgs, - GPIODomain::Init::instances); - MdmaPacketDomain::Init::init( - cfg.mdma_packet_cfgs, MPUDomain::Init::instances); - SdDomain::Init::init(cfg.sd_cfgs, - MPUDomain::Init::instances, - DigitalInputDomain::Init::instances); - EthernetDomain::Init::init( - cfg.eth_cfgs, DigitalOutputDomain::Init::instances); - ADCDomain::Init::init(cfg.adc_cfgs, - GPIODomain::Init::instances); - EXTIDomain::Init::init(cfg.exti_cfgs, - GPIODomain::Init::instances); // ... - } - - template - static consteval std::size_t owner_index_of() { - constexpr auto owners = ctx.template owners_span(); - - if constexpr (I >= owners.size()) { - compile_error("Device not registered in domain"); - return 0; - } else { - return owners[I] == &Target ? I : owner_index_of(); + HAL_Init(); + HALconfig::system_clock(); + HALconfig::peripheral_clock(); + + MPUDomain::Init::init(); + GPIODomain::Init::init(cfg.gpio_cfgs); + TimerDomain::Init::init(cfg.tim_cfgs); + DMA_Domain::Init::init(cfg.dma_cfgs); + SPIDomain::Init::init( + cfg.spi_cfgs, + GPIODomain::Init::instances, + DMA_Domain::Init::instances + ); + DigitalOutputDomain::Init::init(cfg.dout_cfgs, GPIODomain::Init::instances); + DigitalInputDomain::Init::init(cfg.din_cfgs, GPIODomain::Init::instances); + MdmaPacketDomain::Init::init( + cfg.mdma_packet_cfgs, + MPUDomain::Init::instances + ); + SdDomain::Init::init( + cfg.sd_cfgs, + MPUDomain::Init::instances, + DigitalInputDomain::Init::instances + ); + EthernetDomain::Init::init(cfg.eth_cfgs, DigitalOutputDomain::Init::instances); + ADCDomain::Init::init(cfg.adc_cfgs, GPIODomain::Init::instances); + EXTIDomain::Init::init(cfg.exti_cfgs, + GPIODomain::Init::instances); // ... + } + + template + static consteval std::size_t owner_index_of() { + constexpr auto owners = ctx.template owners_span(); + + if constexpr (I >= owners.size()) { + compile_error("Device not registered in domain"); + return 0; + } else { + return owners[I] == &Target ? I : owner_index_of(); + } } - } - template static auto &instance_of() { - using DevT = std::remove_cvref_t; - using Domain = typename DevT::domain; + template static auto& instance_of() { + using DevT = std::remove_cvref_t; + using Domain = typename DevT::domain; - constexpr std::size_t idx = owner_index_of(); + constexpr std::size_t idx = owner_index_of(); - constexpr std::size_t N = domain_size(); + constexpr std::size_t N = domain_size(); - if constexpr (std::is_same_v) { - return Domain::template Init::instances[idx]; - } else { - return Domain::template Init::instances[idx]; + if constexpr (std::is_same_v) { + return Domain::template Init::instances[idx]; + } else { + return Domain::template Init::instances[idx]; + } } - } }; } // namespace ST_LIB diff --git a/Inc/ST-LIB_LOW/Sensors/Sensor/Sensor.hpp b/Inc/ST-LIB_LOW/Sensors/Sensor/Sensor.hpp index 012a410e2..edf917b7b 100644 --- a/Inc/ST-LIB_LOW/Sensors/Sensor/Sensor.hpp +++ b/Inc/ST-LIB_LOW/Sensors/Sensor/Sensor.hpp @@ -9,8 +9,8 @@ #include #include -class Sensor{ +class Sensor { public: - static void start(); - static std::vector inputcapture_id_list; + static void start(); + static std::vector inputcapture_id_list; }; diff --git a/Inc/ST-LIB_LOW/Sensors/SensorInterrupt/SensorInterrupt.hpp b/Inc/ST-LIB_LOW/Sensors/SensorInterrupt/SensorInterrupt.hpp index f41e4ac51..e23d25d18 100644 --- a/Inc/ST-LIB_LOW/Sensors/SensorInterrupt/SensorInterrupt.hpp +++ b/Inc/ST-LIB_LOW/Sensors/SensorInterrupt/SensorInterrupt.hpp @@ -12,14 +12,14 @@ #include "HALAL/Services/EXTI/EXTI.hpp" -class SensorInterrupt{ +class SensorInterrupt { public: - SensorInterrupt() = default; - SensorInterrupt(ST_LIB::EXTIDomain::Instance &exti, GPIO_PinState *value); - SensorInterrupt(ST_LIB::EXTIDomain::Instance &exti, GPIO_PinState &value); - void read(); + SensorInterrupt() = default; + SensorInterrupt(ST_LIB::EXTIDomain::Instance& exti, GPIO_PinState* value); + SensorInterrupt(ST_LIB::EXTIDomain::Instance& exti, GPIO_PinState& value); + void read(); protected: - ST_LIB::EXTIDomain::Instance *exti; - GPIO_PinState *value; + ST_LIB::EXTIDomain::Instance* exti; + GPIO_PinState* value; }; diff --git a/Src/HALAL/HALAL.cpp b/Src/HALAL/HALAL.cpp index c62aed75e..bc38c0609 100644 --- a/Src/HALAL/HALAL.cpp +++ b/Src/HALAL/HALAL.cpp @@ -11,29 +11,29 @@ #ifndef STLIB_ETH ETH_HandleTypeDef heth; -void HAL_ETH_IRQHandler(ETH_HandleTypeDef *heth_arg) { (void)heth_arg; } +void HAL_ETH_IRQHandler(ETH_HandleTypeDef* heth_arg) { (void)heth_arg; } #endif // STLIB_ETH namespace HALAL { -static void common_start(UART::Peripheral &printf_peripheral) { +static void common_start(UART::Peripheral& printf_peripheral) { #ifdef HAL_IWDG_MODULE_ENABLED - Watchdog::check_reset_flag(); + Watchdog::check_reset_flag(); #endif - HAL_Init(); - HALconfig::system_clock(); - HALconfig::peripheral_clock(); + HAL_Init(); + HALconfig::system_clock(); + HALconfig::peripheral_clock(); #ifdef HAL_UART_MODULE_ENABLED - UART::set_up_printf(printf_peripheral); + UART::set_up_printf(printf_peripheral); #endif #ifdef HAL_GPIO_MODULE_ENABLED - Pin::start(); + Pin::start(); #endif #ifdef HAL_DMA_MODULE_ENABLED - // DMA::start(); + // DMA::start(); #endif #ifdef HAL_MDMA_MODULE_ENABLED @@ -41,67 +41,64 @@ static void common_start(UART::Peripheral &printf_peripheral) { #endif #ifdef HAL_FMAC_MODULE_ENABLED - MultiplierAccelerator::start(); + MultiplierAccelerator::start(); #endif #ifdef HAL_CORDIC_MODULE_ENABLED - CORDIC_HandleTypeDef hcordic; - hcordic.Instance = CORDIC; - if (HAL_CORDIC_Init(&hcordic) != HAL_OK) { - ErrorHandler("Unable to init CORDIC"); - } + CORDIC_HandleTypeDef hcordic; + hcordic.Instance = CORDIC; + if (HAL_CORDIC_Init(&hcordic) != HAL_OK) { + ErrorHandler("Unable to init CORDIC"); + } #endif #ifdef HAL_I2C_MODULE_ENABLED - I2C::start(); + I2C::start(); #endif #ifdef HAL_SPI_MODULE_ENABLED - SPI::start(); + SPI::start(); #endif #ifdef HAL_UART_MODULE_ENABLED - UART::start(); + UART::start(); #endif #ifdef HAL_FDCAN_MODULE_ENABLED - FDCAN::start(); + FDCAN::start(); #endif #ifdef HAL_TIM_MODULE_ENABLED - // Encoder::start(); - Global_RTC::start_rtc(); - //TimerPeripheral::start(); - //Time::start(); + // Encoder::start(); + Global_RTC::start_rtc(); + // TimerPeripheral::start(); + // Time::start(); #endif #ifdef NDEBUG #ifdef HAL_IWDG_MODULE_ENABLED - Watchdog::start(); + Watchdog::start(); #endif #endif } #ifdef STLIB_ETH -void start(MAC mac, IPV4 ip, IPV4 subnet_mask, IPV4 gateway, - UART::Peripheral &printf_peripheral) { - Ethernet::inscribe(); +void start(MAC mac, IPV4 ip, IPV4 subnet_mask, IPV4 gateway, UART::Peripheral& printf_peripheral) { + Ethernet::inscribe(); - common_start(printf_peripheral); + common_start(printf_peripheral); - Ethernet::start(mac, ip, subnet_mask, gateway); + Ethernet::start(mac, ip, subnet_mask, gateway); #ifdef HAL_TIM_MODULE_ENABLED - SNTP::sntp_update(); + SNTP::sntp_update(); #endif } #else // !STLIB_ETH -void start(UART::Peripheral &printf_peripheral) { - common_start(printf_peripheral); -} +void start(UART::Peripheral& printf_peripheral) { common_start(printf_peripheral); } #endif // STLIB_ETH diff --git a/Src/HALAL/Services/EXTI/EXTI.cpp b/Src/HALAL/Services/EXTI/EXTI.cpp index 4e212ad4c..f4a4b7794 100644 --- a/Src/HALAL/Services/EXTI/EXTI.cpp +++ b/Src/HALAL/Services/EXTI/EXTI.cpp @@ -7,38 +7,38 @@ #include "HALAL/Services/EXTI/EXTI.hpp" - ST_LIB::EXTIDomain::Instance* ST_LIB::EXTIDomain::g_instances[ST_LIB::EXTIDomain::max_instances]; - extern "C" { void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { auto index = ST_LIB::EXTIDomain::get_pin_index(GPIO_Pin); - if (index >= ST_LIB::EXTIDomain::max_instances) return; + if (index >= ST_LIB::EXTIDomain::max_instances) + return; auto* exti = ST_LIB::EXTIDomain::g_instances[index]; if (exti && exti->is_on && exti->action) { exti->action(); } } -void EXTI0_IRQHandler() { - HAL_GPIO_EXTI_IRQHandler(0x0001); -} +void EXTI0_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(0x0001); } void EXTI1_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(0x0002); } void EXTI2_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(0x0004); } void EXTI3_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(0x0008); } void EXTI4_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(0x0010); } -void EXTI9_5_IRQHandler() { +void EXTI9_5_IRQHandler() { for (uint32_t pin_mask = 0x0020; pin_mask <= 0x0200; pin_mask <<= 1) { - if (__HAL_GPIO_EXTI_GET_IT(pin_mask) != 0x00U) { HAL_GPIO_EXTI_IRQHandler(pin_mask); } + if (__HAL_GPIO_EXTI_GET_IT(pin_mask) != 0x00U) { + HAL_GPIO_EXTI_IRQHandler(pin_mask); + } } } void EXTI15_10_IRQHandler() { for (uint32_t pin_mask = 0x0400; pin_mask <= 0x8000; pin_mask <<= 1) { - if (__HAL_GPIO_EXTI_GET_IT(pin_mask) != 0x00U) { HAL_GPIO_EXTI_IRQHandler(pin_mask); } + if (__HAL_GPIO_EXTI_GET_IT(pin_mask) != 0x00U) { + HAL_GPIO_EXTI_IRQHandler(pin_mask); + } } } - } diff --git a/Src/ST-LIB_LOW/Sensors/Sensor/Sensor.cpp b/Src/ST-LIB_LOW/Sensors/Sensor/Sensor.cpp index 74a0ddb13..251dc3619 100644 --- a/Src/ST-LIB_LOW/Sensors/Sensor/Sensor.cpp +++ b/Src/ST-LIB_LOW/Sensors/Sensor/Sensor.cpp @@ -4,10 +4,9 @@ std::vector Sensor::inputcapture_id_list{}; -void Sensor::start(){ - - for(uint8_t inputcapture_id : inputcapture_id_list){ - InputCapture::turn_on(inputcapture_id); - } +void Sensor::start() { + for (uint8_t inputcapture_id : inputcapture_id_list) { + InputCapture::turn_on(inputcapture_id); + } } diff --git a/Src/ST-LIB_LOW/Sensors/SensorInterrupt/SensorInterrupt.cpp b/Src/ST-LIB_LOW/Sensors/SensorInterrupt/SensorInterrupt.cpp index 7bc3baa2c..5c940ddb4 100644 --- a/Src/ST-LIB_LOW/Sensors/SensorInterrupt/SensorInterrupt.cpp +++ b/Src/ST-LIB_LOW/Sensors/SensorInterrupt/SensorInterrupt.cpp @@ -1,12 +1,9 @@ #include "Sensors/SensorInterrupt/SensorInterrupt.hpp" +SensorInterrupt::SensorInterrupt(ST_LIB::EXTIDomain::Instance& exti, GPIO_PinState* value) + : exti(&exti), value(value) {} -SensorInterrupt::SensorInterrupt(ST_LIB::EXTIDomain::Instance &exti, GPIO_PinState *value) : exti(&exti), value(value) { -} - -SensorInterrupt::SensorInterrupt(ST_LIB::EXTIDomain::Instance &exti, GPIO_PinState &value) : SensorInterrupt::SensorInterrupt(exti, &value){} - -void SensorInterrupt::read(){ - *value = exti->read(); -} +SensorInterrupt::SensorInterrupt(ST_LIB::EXTIDomain::Instance& exti, GPIO_PinState& value) + : SensorInterrupt::SensorInterrupt(exti, &value) {} +void SensorInterrupt::read() { *value = exti->read(); }