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

171 lines
3.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @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