diff --git a/AdaptiveBrightnessFirmware/Inc/light_sensors.hpp b/AdaptiveBrightnessFirmware/Inc/light_sensors.hpp new file mode 100644 index 0000000..6542373 --- /dev/null +++ b/AdaptiveBrightnessFirmware/Inc/light_sensors.hpp @@ -0,0 +1,44 @@ +#pragma once + +#include +#include +#include + +#include "adc.h" +#include "utils.hpp" + +class LightSensors { + public: + static inline const std::array& getValues() + { + sampleLightSensors(); + return m_adcValues; + } + + template + static inline const int16_t& getValue() + { + static_assert(Idx < m_adcValues.size(), "Invalid light sensor index"); + + sampleLightSensors(); + return m_adcValues[Idx]; + } + + private: + static std::array m_adcValues; + + static void sampleLightSensors() + { + HAL_ADC_Start(&hadc); + + util::for_constexpr( + [](const auto& idx) { + constexpr auto i = idx.value; + HAL_ADC_PollForConversion(&hadc, HAL_MAX_DELAY); + m_adcValues[i] = HAL_ADC_GetValue(&hadc); + }, + std::make_index_sequence{}); + + HAL_ADC_Stop(&hadc); + } +}; diff --git a/AdaptiveBrightnessFirmware/Makefile b/AdaptiveBrightnessFirmware/Makefile index fc9cbe4..565e954 100644 --- a/AdaptiveBrightnessFirmware/Makefile +++ b/AdaptiveBrightnessFirmware/Makefile @@ -74,7 +74,8 @@ Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c # C++ sources CXX_SOURCES = \ Src/main.cpp \ -Src/uart_vcp.cpp +Src/uart_vcp.cpp \ +Src/light_sensors.cpp # ASM sources ASM_SOURCES = \ diff --git a/AdaptiveBrightnessFirmware/Src/light_sensors.cpp b/AdaptiveBrightnessFirmware/Src/light_sensors.cpp new file mode 100644 index 0000000..09e9698 --- /dev/null +++ b/AdaptiveBrightnessFirmware/Src/light_sensors.cpp @@ -0,0 +1,3 @@ +#include "light_sensors.hpp" + +std::array LightSensors::m_adcValues = {}; diff --git a/AdaptiveBrightnessFirmware/Src/main.cpp b/AdaptiveBrightnessFirmware/Src/main.cpp index 370c2c3..bfc72a5 100644 --- a/AdaptiveBrightnessFirmware/Src/main.cpp +++ b/AdaptiveBrightnessFirmware/Src/main.cpp @@ -3,33 +3,13 @@ #include #include -#include "adc.h" #include "init.h" +#include "light_sensors.hpp" #include "terminal.hpp" #include "uart.hpp" -#include "utils.hpp" using serial_t = uart::Vcp<>; -std::array sampleLightSensors() -{ - std::array adcValues; - - HAL_ADC_Start(&hadc); - - util::for_constexpr( - [&adcValues](const auto& idx) { - constexpr auto i = idx.value; - HAL_ADC_PollForConversion(&hadc, HAL_MAX_DELAY); - adcValues[i] = HAL_ADC_GetValue(&hadc); - }, - std::make_index_sequence{}); - - HAL_ADC_Stop(&hadc); - - return adcValues; -} - static volatile bool g_error = false; extern "C" void Error_Handler(void) @@ -65,9 +45,10 @@ int main() HAL_GPIO_WritePin(BLUE_LED_GPIO_Port, BLUE_LED_Pin, GPIO_PIN_SET); serial_t serial; + LightSensors lightSensors; while(true) { - const auto ldrValues = sampleLightSensors(); + const auto ldrValues = lightSensors.getValues(); std::array printBuffer;