JT-DT-YD4N02B_4G_RTT_MRS/bsp/src/bsp_relay.c

171 lines
3.9 KiB
C
Raw Normal View History

2024-12-30 11:50:48 +08:00
/*
* @Author: mbw
* @Date: 2024-10-09 08:42:14
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-10-29 16:03:50
* @FilePath: \JT-DT-YD4N02A_RTT_MRS-4G\bsp\src\bsp_relay.c
* @Description:
*
* Copyright (c) 2024 by ${git_name_email}, All Rights Reserved.
*/
#include "bsp_relay.h"
#include "rtthread.h"
#include "pin.h"
#include "bsp_flash.h"
//用到了atoi
#include <stdlib.h>
#include "agile_led.h"
agile_led_t *relay = RT_NULL;
#define LOG_TAG "bsp.relay"
#define LOG_LVL LOG_LVL_DBG
#include <ulog.h>
#define RELAY_LINKED 0x02
#define RELAY_FUNCTION_ON 0x04
#define RELAY_STATUS_OPEN 0x07
#define RELAY_STATUS_CLOSE 0x06
#define RELAY_NOT_CONNECTED 0x04
#define RELAY_FUNCTION_OFF 0x00
volatile rt_uint8_t relay_state_flag = 0;// 0:关闭1打开
struct rt_timer relay_timer;
// 获取继电器连接状态
static int Get_Relay_Link_Status(void)
{
// TODO: 需要有检测功能
return RELAY_LINKED;
// return RELAY_NOT_CONNECTED;
}
// 获取继电器状态
int Get_Relay_Status(void)
{
rt_uint8_t relay_state = (rt_uint8_t)Flash_Get_SysCfg(kRelaySwitchId) & 0x07; // 获取开关阀功能开关状态
if (relay_state & RELAY_FUNCTION_ON) // 继电器功能开启了
{
LOG_D("具备继电器功能");
if (Get_Relay_Link_Status() & RELAY_LINKED)
{
LOG_D("继电器已经连接");
if (rt_pin_read(RELAY_PIN)) // 高电平
{
return RELAY_STATUS_OPEN;
}
else // 低电平
{
return RELAY_STATUS_CLOSE;
}
}
else
{
LOG_D("继电器未连接");
return RELAY_NOT_CONNECTED; // 0x04为未连接
}
}
return RELAY_FUNCTION_OFF; // 0继电器功能未开启
}
/*
* @brief
* 0x07 0x06
*/
int BSP_Set_Relay_Status(rt_bool_t status)
{
rt_uint8_t ret = Get_Relay_Status();
if (ret == RELAY_FUNCTION_OFF || ret == RELAY_NOT_CONNECTED) // 功能未开启或未连接
{
return (ret | 0xB0);
}
else
{
if (status == 0)
{
if (ret == RELAY_STATUS_CLOSE) // 继电器已经关闭
{
return RELAY_STATUS_CLOSE;
}
else
{
relay_state_flag = 0;
return RELAY_STATUS_CLOSE;
}
}
else
{
if (ret == RELAY_STATUS_OPEN) // 继电器已经打开
{
return RELAY_STATUS_OPEN;
}
else
{
relay_state_flag = 1;
return RELAY_STATUS_OPEN;
}
}
}
}
// 定时器回调函数
void BSP_Relay_Timer_Callback(void *parameter)
{
static rt_uint8_t last_pos = 0;
rt_uint8_t pos = 0;
pos = relay_state_flag;
// 执行动作逻辑
if (last_pos != pos)
{
if (pos == 1)
{
LOG_D("RELAY_ON");
// TODO: 闭合继电器动作
RELAY_ON;
}
else if (pos == 0)
{
LOG_D("RELAY_OFF");
// TODO: 断开继电器动作
RELAY_OFF;
}
last_pos = pos;
}
}
int BSP_RELAY_Init(void)
{
rt_pin_mode(RELAY_PIN, PIN_MODE_OUTPUT);
RELAY_OFF;
LOG_D("BSP_RELAY_Init");
rt_timer_init(&relay_timer, "relay_timer", BSP_Relay_Timer_Callback, RT_NULL, 50, RT_TIMER_FLAG_PERIODIC);
rt_timer_start(&relay_timer); // 启动定时器
return RT_EOK;
}
// INIT_DEVICE_EXPORT(BSP_RELAY_Init);
#ifdef TEST_ENABLE
static void TEST_RELAY(int argc, char **argv)
{
if (argc == 2)
{
int flag = atoi(argv[1]);
if (flag)
{
relay_state_flag = 1;
}
else
{
relay_state_flag = 0;
}
}
}
MSH_CMD_EXPORT(TEST_RELAY, "TEST_RELAY");
#endif