102 lines
3.5 KiB
C
102 lines
3.5 KiB
C
#ifndef RELAY_H
|
||
#define RELAY_H
|
||
|
||
#include "main.h"
|
||
|
||
/* 4路继电器控制引脚定义: PB7, PB8, PC0, PC2 */
|
||
#define Relay1_Pin GPIO_PIN_7
|
||
#define Relay2_Pin GPIO_PIN_8
|
||
#define Relay3_Pin GPIO_PIN_0
|
||
#define Relay4_Pin GPIO_PIN_2
|
||
|
||
#define Relay1_Port GPIOB
|
||
#define Relay2_Port GPIOB
|
||
#define Relay3_Port GPIOC
|
||
#define Relay4_Port GPIOC
|
||
|
||
/* 继电器控制宏, 高电平吸合, 低电平释放 */
|
||
#define Relay1_ON HAL_GPIO_WritePin(Relay1_Port, Relay1_Pin, GPIO_PIN_SET)
|
||
#define Relay1_OFF HAL_GPIO_WritePin(Relay1_Port, Relay1_Pin, GPIO_PIN_RESET)
|
||
#define Relay2_ON HAL_GPIO_WritePin(Relay2_Port, Relay2_Pin, GPIO_PIN_SET)
|
||
#define Relay2_OFF HAL_GPIO_WritePin(Relay2_Port, Relay2_Pin, GPIO_PIN_RESET)
|
||
#define Relay3_ON HAL_GPIO_WritePin(Relay3_Port, Relay3_Pin, GPIO_PIN_SET)
|
||
#define Relay3_OFF HAL_GPIO_WritePin(Relay3_Port, Relay3_Pin, GPIO_PIN_RESET)
|
||
#define Relay4_ON HAL_GPIO_WritePin(Relay4_Port, Relay4_Pin, GPIO_PIN_SET)
|
||
#define Relay4_OFF HAL_GPIO_WritePin(Relay4_Port, Relay4_Pin, GPIO_PIN_RESET)
|
||
|
||
/* 4路继电器反馈输入引脚定义: PB6, PB9, PC1, PC3 */
|
||
#define Relay1_FB_Pin GPIO_PIN_6
|
||
#define Relay2_FB_Pin GPIO_PIN_9
|
||
#define Relay3_FB_Pin GPIO_PIN_1
|
||
#define Relay4_FB_Pin GPIO_PIN_3
|
||
|
||
#define Relay1_FB_Port GPIOB
|
||
#define Relay2_FB_Port GPIOB
|
||
#define Relay3_FB_Port GPIOC
|
||
#define Relay4_FB_Port GPIOC
|
||
|
||
/* 反馈电平定义: 继电器吸合后反馈输出高电平, 释放后输出低电平 */
|
||
#define FB_ACTIVE GPIO_PIN_SET
|
||
#define FB_INACTIVE GPIO_PIN_RESET
|
||
|
||
/* 手动模式检测引脚: PA8, 高电平=手动模式, 低电平=正常模式 */
|
||
#define MANUAL_MODE_Pin GPIO_PIN_8
|
||
#define MANUAL_MODE_Port GPIOA
|
||
#define MANUAL_MODE_ACTIVE GPIO_PIN_SET
|
||
|
||
/* 反馈检测总开关: 0=禁用反馈检测, 任何情况都返回正常 */
|
||
#define RELAY_FB_ENABLE 1
|
||
|
||
/* 继电器反馈状态枚举 */
|
||
typedef enum {
|
||
RELAY_OK = 0, /* 反馈正常 */
|
||
RELAY_FAIL_OPEN, /* 反馈未正常吸合 */
|
||
RELAY_FAIL_STUCK, /* 反馈未正常释放 */
|
||
RELAY_UNKNOWN /* 未知状态 */
|
||
} RelayStatus;
|
||
|
||
/* 继电器初始化 */
|
||
void relayInit(void);
|
||
|
||
/* 网络连接成功后, 从 EEPROM 恢复继电器上一次状态 */
|
||
void relayRestoreState(void);
|
||
|
||
/* 执行MQTT下发的继电器控制命令 */
|
||
void relayAction(uint8_t *data);
|
||
#define relay_action relayAction
|
||
|
||
/* 上报继电器状态到平台 */
|
||
void relayStatueUpdata(void);
|
||
|
||
/* 读取 PA8 手动模式输入: 1=手动模式, 0=正常模式 */
|
||
int relayIsManualMode(void);
|
||
|
||
/* 读取指定继电器反馈引脚原始电平 */
|
||
GPIO_PinState relayReadFb(uint8_t ch);
|
||
|
||
/* 设置指定继电器开关状态(只写 GPIO + Relay_State,不碰 EEPROM/网络) */
|
||
void relaySet(uint8_t ch, uint8_t on);
|
||
|
||
/* 请求一次状态上报(置 relay_report_pending,由主循环延时统一上报) */
|
||
void relayRequestReport(void);
|
||
|
||
/* 命令执行后状态上报标志, 主循环检测到后延时上报 */
|
||
extern volatile uint8_t relay_report_pending;
|
||
extern volatile uint32_t relay_report_tick;
|
||
|
||
/* 继电器命令响应阶段控制:
|
||
0: 空闲
|
||
1: 已动作, 等待反馈稳定
|
||
2: 反馈已读, 已发送 response 和 status, 结束
|
||
*/
|
||
extern volatile uint8_t relay_cmd_stage;
|
||
extern volatile uint32_t relay_cmd_tick;
|
||
extern volatile uint8_t relay_cmd_ch;
|
||
extern volatile GPIO_PinState relay_cmd_fb_before;
|
||
extern char relay_cmd_id[20];
|
||
|
||
/* 运行继电器命令响应状态机,由主循环每轮调用 */
|
||
void relayCmdProcess(void);
|
||
|
||
#endif
|