/** * @file bsp_relay.c * @brief Relay control driver implementation */ #include "bsp_relay.h" #include "bsp_flash.h" #include /* Private variables ----------------------------------------------------------*/ static fan_mode_t s_fan_mode = FAN_MODE_MANUAL; static float s_fan_threshold = 30.0f; // Default threshold: 30°C /** * @brief Initialize all relay pins * @retval None */ void BSP_Relay_Init(void) { /* Set all relays to OFF state (high level) by default */ HAL_GPIO_WritePin(LIGHT_GPIO_Port, LIGHT_Pin, RELAY_OFF); HAL_GPIO_WritePin(FAN_GPIO_Port, FAN_Pin, RELAY_OFF); /* Load settings from Flash */ system_settings_t settings; if (BSP_Flash_LoadSettings(&settings)) { s_fan_mode = (fan_mode_t)settings.fan_mode; s_fan_threshold = settings.fan_threshold; } else { /* Use default values if no valid settings */ s_fan_mode = FAN_MODE_AUTO; s_fan_threshold = 30.0f; } } /** * @brief Turn LIGHT relay ON (low level output) * @retval None */ void BSP_LIGHT_On(void) { HAL_GPIO_WritePin(LIGHT_GPIO_Port, LIGHT_Pin, RELAY_ON); } /** * @brief Turn LIGHT relay OFF (high level output) * @retval None */ void BSP_LIGHT_Off(void) { HAL_GPIO_WritePin(LIGHT_GPIO_Port, LIGHT_Pin, RELAY_OFF); } /** * @brief Toggle LIGHT relay state * @retval None */ void BSP_LIGHT_Toggle(void) { HAL_GPIO_TogglePin(LIGHT_GPIO_Port, LIGHT_Pin); } uint8_t BSP_LIGHT_GetState(void) { return (HAL_GPIO_ReadPin(LIGHT_GPIO_Port, LIGHT_Pin) == RELAY_ON) ? 1 : 0; } /** * @brief Turn FAN relay ON (low level output) * @retval None */ void BSP_FAN_On(void) { HAL_GPIO_WritePin(FAN_GPIO_Port, FAN_Pin, RELAY_ON); } /** * @brief Turn FAN relay OFF (high level output) * @retval None */ void BSP_FAN_Off(void) { HAL_GPIO_WritePin(FAN_GPIO_Port, FAN_Pin, RELAY_OFF); } /** * @brief Toggle FAN relay state * @retval None */ void BSP_FAN_Toggle(void) { HAL_GPIO_TogglePin(FAN_GPIO_Port, FAN_Pin); } uint8_t BSP_FAN_GetState(void) { return (HAL_GPIO_ReadPin(FAN_GPIO_Port, FAN_Pin) == RELAY_ON) ? 1 : 0; } /** * @brief Set FAN mode and save to Flash */ void BSP_FAN_SetMode(fan_mode_t mode) { s_fan_mode = mode; /* Save to Flash */ system_settings_t settings = { .fan_threshold = s_fan_threshold, .fan_mode = mode, .light_state = BSP_LIGHT_GetState(), .valid = SETTINGS_VALID_FLAG }; BSP_Flash_SaveSettings(&settings); } fan_mode_t BSP_FAN_GetMode(void) { return s_fan_mode; } /** * @brief Set temperature threshold for auto mode and save to Flash */ void BSP_FAN_SetThreshold(float threshold) { s_fan_threshold = threshold; /* Save to Flash */ system_settings_t settings = { .fan_threshold = threshold, .fan_mode = s_fan_mode, .light_state = BSP_LIGHT_GetState(), .valid = SETTINGS_VALID_FLAG }; BSP_Flash_SaveSettings(&settings); } float BSP_FAN_GetThreshold(void) { return s_fan_threshold; } /** * @brief Auto control FAN based on temperature * @param current_temp: current temperature in Celsius */ void BSP_FAN_AutoControl(float current_temp) { if (s_fan_mode != FAN_MODE_AUTO) return; if (current_temp >= s_fan_threshold) { BSP_FAN_On(); } else { BSP_FAN_Off(); } } /** * @brief Get system state */ void BSP_System_GetState(system_state_t *state) { if (state == NULL) return; state->fan_mode = s_fan_mode; state->fan_threshold = s_fan_threshold; state->light_state = BSP_LIGHT_GetState(); state->fan_state = BSP_FAN_GetState(); }