shuichan_old/V1.4/STM32F103_App1/HardWare/RELAY/relay.h

102 lines
3.5 KiB
C
Raw Normal View History

#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