diff --git a/AdaptiveBrightnessFirmware/Inc/utils.hpp b/AdaptiveBrightnessFirmware/Inc/utils.hpp new file mode 100644 index 0000000..7e8714a --- /dev/null +++ b/AdaptiveBrightnessFirmware/Inc/utils.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include +#include + +namespace util { + +template +auto for_constexpr(Fn&& func, std::index_sequence) +{ + if constexpr(std::is_void_v>>) { + (func(std::integral_constant{}), ...); + } + else { + if((func(std::integral_constant{}) && ...)) + return true; + return false; + } +} + +} // namespace util diff --git a/AdaptiveBrightnessFirmware/Src/main.cpp b/AdaptiveBrightnessFirmware/Src/main.cpp index 50a958d..bf642bb 100644 --- a/AdaptiveBrightnessFirmware/Src/main.cpp +++ b/AdaptiveBrightnessFirmware/Src/main.cpp @@ -1,6 +1,34 @@ -#include +#include +#include +#include + +#include "adc.h" #include "init.h" +#include "usbd_cdc_if.h" +#include "utils.hpp" + +template +uint16_t readLightSensor() +{ + static_assert(SensorID >= 0 && SensorID < 3, "Invalid light sensor ID"); + + std::array adcValues; + + HAL_ADC_Start(&hadc); + + util::for_constexpr( + [&adcValues](const auto& idx) { + constexpr auto i = idx.value; + HAL_ADC_PollForConversion(&hadc, 100); + adcValues[i] = HAL_ADC_GetValue(&hadc); + }, + std::make_index_sequence<3>{}); + + HAL_ADC_Stop(&hadc); + + return adcValues[SensorID]; +} int main() { @@ -17,17 +45,21 @@ int main() HAL_GPIO_WritePin(BLUE_LED_GPIO_Port, BLUE_LED_Pin, GPIO_PIN_SET); while(true) { - HAL_GPIO_WritePin(RED_LED_GPIO_Port, RED_LED_Pin, GPIO_PIN_RESET); - HAL_Delay(1000); - HAL_GPIO_WritePin(RED_LED_GPIO_Port, RED_LED_Pin, GPIO_PIN_SET); + // HAL_GPIO_WritePin(RED_LED_GPIO_Port, RED_LED_Pin, GPIO_PIN_RESET); - HAL_GPIO_WritePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin, GPIO_PIN_RESET); - HAL_Delay(1000); - HAL_GPIO_WritePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin, GPIO_PIN_SET); + util::for_constexpr( + [](const auto& idx) { + constexpr auto i = idx.value; + const auto ldrVal = readLightSensor(); + std::array printBuffer; + const auto bufLen = std::sprintf(reinterpret_cast(printBuffer.data()), "LDR%d: %d\r\n%s", i + 1, ldrVal, (i == 2) ? "\r\n" : ""); + if(bufLen > 0) + CDC_Transmit_FS(printBuffer.data(), bufLen); + }, + std::make_index_sequence<3>{}); - HAL_GPIO_WritePin(BLUE_LED_GPIO_Port, BLUE_LED_Pin, GPIO_PIN_RESET); + // HAL_GPIO_WritePin(RED_LED_GPIO_Port, RED_LED_Pin, GPIO_PIN_SET); HAL_Delay(1000); - HAL_GPIO_WritePin(BLUE_LED_GPIO_Port, BLUE_LED_Pin, GPIO_PIN_SET); } return 0;