可用的文件,全部
This commit is contained in:
177
Core/Bsp/bsp_relay.c
Normal file
177
Core/Bsp/bsp_relay.c
Normal file
@@ -0,0 +1,177 @@
|
||||
/**
|
||||
* @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();
|
||||
}
|
||||
Reference in New Issue
Block a user