178 lines
3.6 KiB
C
178 lines
3.6 KiB
C
/**
|
|
* @file bsp_relay.c
|
|
* @brief Relay control driver implementation
|
|
*/
|
|
|
|
#include "bsp_relay.h"
|
|
#include "bsp_flash.h"
|
|
#include <stddef.h>
|
|
|
|
/* 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();
|
|
}
|