2024-08-31 10:27:58 +08:00
|
|
|
|
#include "bsp_history.h"
|
|
|
|
|
#include "bsp_flash.h"
|
|
|
|
|
#include "bsp_rtc.h"
|
|
|
|
|
#include "drv_uart.h"
|
|
|
|
|
#include "lwrb.h"
|
|
|
|
|
#include "serial.h"
|
2024-09-02 15:12:26 +08:00
|
|
|
|
#include "rtdef.h"
|
|
|
|
|
#include "user_rtt.h"
|
|
|
|
|
#define LOG_TAG "bsp_hr" // 该模块对应的标签。不定义时,默认:NO_TAG
|
|
|
|
|
#define LOG_LVL LOG_LVL_DBG // 该模块对应的日志输出级别。不定义时,默认:调试级别
|
|
|
|
|
#include <ulog.h> // 必须在 LOG_TAG 与 LOG_LVL 下面
|
2024-08-31 10:27:58 +08:00
|
|
|
|
|
|
|
|
|
ALIGN(RT_ALIGN_SIZE)
|
|
|
|
|
static char hr_thread_stack[HR_THREAD_STACK_SIZE];
|
|
|
|
|
static struct rt_thread hr_thread;
|
|
|
|
|
|
|
|
|
|
/* 用于接收消息的信号量 */
|
|
|
|
|
rt_sem_t hr_rx_sem = RT_NULL;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @description: 从帧起始符开始到校验码之前所有字节的和的模256,即各字节不计超过255的溢出值的二进制算术和。
|
|
|
|
|
* @param {uint8_t} *data
|
|
|
|
|
* @param {uint16_t} len
|
|
|
|
|
* @return {*}
|
|
|
|
|
*/
|
|
|
|
|
static rt_uint8_t HR_CheckSum(const rt_uint8_t *data, rt_size_t len)
|
|
|
|
|
{
|
|
|
|
|
rt_uint8_t sum = 0;
|
|
|
|
|
|
|
|
|
|
for (rt_size_t i = 0; i < len; i++)
|
2024-09-02 15:12:26 +08:00
|
|
|
|
{
|
|
|
|
|
sum += data[i];
|
|
|
|
|
}
|
2024-08-31 10:27:58 +08:00
|
|
|
|
return sum;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @description: 从接收缓冲区中获取一帧有效数据
|
|
|
|
|
* @param {TsFrameData} *pFrameData 主机帧
|
|
|
|
|
* @param {uint8_t} *p_src 接收缓冲区
|
|
|
|
|
* @param {uint16_t} src_len 接收缓冲区长度
|
|
|
|
|
* @return {*}
|
|
|
|
|
*/
|
2024-09-02 15:12:26 +08:00
|
|
|
|
TsFrameData *HR_GetFrameData(const rt_uint8_t *p_src, const rt_uint8_t src_len)
|
2024-08-31 10:27:58 +08:00
|
|
|
|
{
|
|
|
|
|
rt_uint8_t data_field_len = 0;
|
2024-09-02 15:12:26 +08:00
|
|
|
|
rt_uint8_t check_sum = 0;
|
2024-08-31 10:27:58 +08:00
|
|
|
|
|
|
|
|
|
TsFrameData *get_buffer = RT_NULL;
|
|
|
|
|
|
2024-09-02 15:12:26 +08:00
|
|
|
|
for (rt_size_t i = 0; i < src_len; i++)
|
2024-08-31 10:27:58 +08:00
|
|
|
|
{
|
2024-09-02 15:12:26 +08:00
|
|
|
|
if (p_src[i] == FRAME_HEADER)
|
2024-08-31 10:27:58 +08:00
|
|
|
|
{
|
|
|
|
|
data_field_len = p_src[i + 3];
|
|
|
|
|
|
2024-09-02 15:12:26 +08:00
|
|
|
|
if (p_src[i + 3 + data_field_len + 2] == FRAME_TAIL)
|
2024-08-31 10:27:58 +08:00
|
|
|
|
{
|
2024-09-02 15:12:26 +08:00
|
|
|
|
check_sum = HR_CheckSum(&p_src[i], (4 + data_field_len));
|
2024-08-31 10:27:58 +08:00
|
|
|
|
|
2024-09-02 15:12:26 +08:00
|
|
|
|
if (p_src[i + 3 + data_field_len + 1] == check_sum)
|
2024-08-31 10:27:58 +08:00
|
|
|
|
{
|
|
|
|
|
get_buffer = (TsFrameData *)rt_malloc(sizeof(TsFrameData) + sizeof(rt_uint8_t) * data_field_len);
|
|
|
|
|
if (get_buffer == RT_NULL)
|
|
|
|
|
{
|
|
|
|
|
LOG_E("get space fail\r\n");
|
|
|
|
|
|
|
|
|
|
return RT_NULL;
|
|
|
|
|
}
|
2024-09-02 15:12:26 +08:00
|
|
|
|
get_buffer->c1 = p_src[i + 1];
|
|
|
|
|
get_buffer->c2 = (TeFrameC2)p_src[i + 2];
|
2024-08-31 10:27:58 +08:00
|
|
|
|
get_buffer->len = data_field_len;
|
|
|
|
|
|
2024-09-02 15:12:26 +08:00
|
|
|
|
if (data_field_len > 0)
|
2024-08-31 10:27:58 +08:00
|
|
|
|
{
|
|
|
|
|
rt_memmove(get_buffer->data, &p_src[i + 4], data_field_len);
|
|
|
|
|
}
|
|
|
|
|
LOG_D("HR_GetDataFrame Success!");
|
|
|
|
|
|
|
|
|
|
return get_buffer;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
LOG_E("HR_GetDataFrame Fail!");
|
|
|
|
|
|
|
|
|
|
return get_buffer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if 1
|
2024-09-02 15:12:26 +08:00
|
|
|
|
rt_uint8_t HR_GenerateRawFrame(TsRawFrameData *pRawData, rt_uint8_t c1, TeFrameC2 c2, const rt_uint8_t *p_src, rt_uint8_t src_len)
|
2024-08-31 10:27:58 +08:00
|
|
|
|
{
|
|
|
|
|
pRawData->len = src_len + 6;
|
|
|
|
|
|
2024-09-02 15:12:26 +08:00
|
|
|
|
rt_memset(pRawData->buf, 0, sizeof(pRawData->buf));
|
2024-08-31 10:27:58 +08:00
|
|
|
|
|
|
|
|
|
pRawData->buf[0] = FRAME_HEADER;
|
|
|
|
|
pRawData->buf[1] = c1;
|
|
|
|
|
pRawData->buf[2] = c2;
|
|
|
|
|
pRawData->buf[3] = src_len;
|
|
|
|
|
|
|
|
|
|
rt_memmove(&pRawData->buf[4], p_src, src_len);
|
|
|
|
|
|
|
|
|
|
// 从帧起始符开始到校验码之前所有字节的和的模256
|
|
|
|
|
// ,即各字节不计超过255的溢出值的二进制算术和。
|
|
|
|
|
pRawData->buf[pRawData->len - 2] = HR_CheckSum(&pRawData->buf[0], pRawData->len - 2);
|
|
|
|
|
pRawData->buf[pRawData->len - 1] = FRAME_TAIL;
|
|
|
|
|
|
2024-09-02 15:12:26 +08:00
|
|
|
|
// LOG_HEX("HrRawData", 16, &pRawData->buf[0], pRawData->len);
|
2024-08-31 10:27:58 +08:00
|
|
|
|
|
|
|
|
|
return RT_EOK;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if 1
|
2024-09-02 15:12:26 +08:00
|
|
|
|
ErrorStatus HR_ProcessData(const TsFrameData *pHostFrameData)
|
2024-08-31 10:27:58 +08:00
|
|
|
|
{
|
|
|
|
|
TsRawFrameData RawData;
|
2024-09-02 15:12:26 +08:00
|
|
|
|
|
2024-08-31 10:27:58 +08:00
|
|
|
|
rt_uint8_t data_field[64] = {0};
|
|
|
|
|
rt_uint8_t c1, c2, data_len = 0;
|
|
|
|
|
|
|
|
|
|
c1 = pHostFrameData->c1;
|
|
|
|
|
c2 = pHostFrameData->c2;
|
|
|
|
|
|
|
|
|
|
switch (c2)
|
|
|
|
|
{
|
|
|
|
|
case kNumOfRecords: // 查询各类记录的总数 AA 00 00 00 AA 55
|
|
|
|
|
{
|
|
|
|
|
LOG_D("kNumOfRecords");
|
|
|
|
|
c1 = 0;
|
2024-09-02 15:12:26 +08:00
|
|
|
|
data_len = FRAME_DATA_LEN;
|
2024-08-31 10:27:58 +08:00
|
|
|
|
if (Flash_GetTotalRecord((TsTotalRecords *)&data_field[0]) != SUCCESS)
|
|
|
|
|
{
|
|
|
|
|
goto send;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case kAlarmRecord: // 查询第n条探测器报警记录AA 01 01 00 AC 55
|
|
|
|
|
{
|
|
|
|
|
LOG_D("kAlarmRecord(%d)", c1);
|
2024-09-02 15:12:26 +08:00
|
|
|
|
data_len = FRAME_DATA_LEN;
|
2024-08-31 10:27:58 +08:00
|
|
|
|
if (Flash_GetRecord(kAlarmRecord, c1, (TsRecordsTime *)data_field) != SUCCESS)
|
|
|
|
|
{
|
|
|
|
|
if (data_field[0] == 0)
|
2024-09-02 15:12:26 +08:00
|
|
|
|
{
|
|
|
|
|
rt_memset(data_field, 0, data_len);
|
|
|
|
|
}
|
2024-08-31 10:27:58 +08:00
|
|
|
|
goto send;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case kAlarmRcyRecord: // 查询第n条探测器报警恢复记录 AA 01 02 00 AD 55
|
|
|
|
|
{
|
|
|
|
|
LOG_D("kAlarmRcyRecord(%d)", c1);
|
2024-09-02 15:12:26 +08:00
|
|
|
|
data_len = 7;
|
2024-08-31 10:27:58 +08:00
|
|
|
|
if (Flash_GetRecord(kAlarmRcyRecord, c1, (TsRecordsTime *)data_field) != SUCCESS)
|
|
|
|
|
{
|
|
|
|
|
goto send;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case kFaultRecord: // 查询第n条探测器故障记录 AA 01 03 00 AE 55
|
|
|
|
|
{
|
|
|
|
|
LOG_D("kFaultRecord(%d)", c1);
|
2024-09-02 15:12:26 +08:00
|
|
|
|
data_len = FRAME_DATA_LEN;
|
2024-08-31 10:27:58 +08:00
|
|
|
|
if (Flash_GetRecord(kFaultRecord, c1, (TsRecordsTime *)&data_field) != SUCCESS)
|
|
|
|
|
{
|
|
|
|
|
goto send;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case kFaultRcyRecord: // 查询第n条探测器故障恢复记录 AA 01 04 00 AF 55 AA 66 04 00 14 55
|
|
|
|
|
{
|
|
|
|
|
LOG_D("kFaultRcyRecord(%d)", c1);
|
2024-09-02 15:12:26 +08:00
|
|
|
|
data_len = FRAME_DATA_LEN;
|
2024-08-31 10:27:58 +08:00
|
|
|
|
if (Flash_GetRecord(kFaultRcyRecord, c1, (TsRecordsTime *)data_field) != SUCCESS)
|
|
|
|
|
{
|
|
|
|
|
goto send;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case kPowerFailureRecord: // 查询第n条探测器掉电记录 AA 01 05 00 B0 55
|
|
|
|
|
{
|
|
|
|
|
LOG_D("kPowerFailureRecord(%d)", c1);
|
2024-09-02 15:12:26 +08:00
|
|
|
|
data_len = FRAME_DATA_LEN;
|
2024-08-31 10:27:58 +08:00
|
|
|
|
if (Flash_GetRecord(kPowerFailureRecord, c1, (TsRecordsTime *)data_field) != SUCCESS)
|
|
|
|
|
{
|
|
|
|
|
goto send;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case kPowerOnRecord: // 查询第n条探测器上电记录 AA 01 06 00 B1 55
|
|
|
|
|
{
|
|
|
|
|
LOG_D("kPowerOnRecord(%d)", c1);
|
2024-09-02 15:12:26 +08:00
|
|
|
|
data_len = FRAME_DATA_LEN;
|
2024-08-31 10:27:58 +08:00
|
|
|
|
if (Flash_GetRecord(kPowerOnRecord, c1, (TsRecordsTime *)data_field) == SUCCESS)
|
|
|
|
|
{
|
|
|
|
|
goto send;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case kSensorFailureRecord: // 查询气体传感器失效记录 AA 00 07 00 B1 55
|
|
|
|
|
{
|
|
|
|
|
LOG_D("kSensorFailureRecord(%d)", c1);
|
|
|
|
|
|
2024-09-02 15:12:26 +08:00
|
|
|
|
data_len = FRAME_DATA_LEN;
|
2024-08-31 10:27:58 +08:00
|
|
|
|
if (Flash_GetRecord(kSensorFailureRecord, 1, (TsRecordsTime *)&data_field[0]) != SUCCESS)
|
|
|
|
|
{
|
|
|
|
|
|
2024-09-02 15:12:26 +08:00
|
|
|
|
if (c1 != 0) // 接收到的数据不对,直接返回0
|
2024-08-31 10:27:58 +08:00
|
|
|
|
{
|
|
|
|
|
rt_memset(data_field, 0, data_len);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2024-09-02 15:12:26 +08:00
|
|
|
|
if (data_field[1] == 0) // 未失效
|
2024-08-31 10:27:58 +08:00
|
|
|
|
{
|
|
|
|
|
rt_memset(data_field, 0, data_len);
|
|
|
|
|
}
|
2024-09-02 15:12:26 +08:00
|
|
|
|
else // 失效
|
2024-08-31 10:27:58 +08:00
|
|
|
|
{
|
|
|
|
|
data_field[0] = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
goto send;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case kGetCurrentTime: // AA 00 08 00 B2 55
|
|
|
|
|
{
|
2024-09-02 15:12:26 +08:00
|
|
|
|
uint8_t rtctime[3] = {0}, rtcdate[3] = {0};
|
|
|
|
|
|
|
|
|
|
RTT_LOG_D("kGetCurrentTime");
|
|
|
|
|
|
|
|
|
|
data_len = FRAME_DATA_LEN;
|
2024-08-31 10:27:58 +08:00
|
|
|
|
|
|
|
|
|
BSP_Rtc_Get_Calendar(rtcdate, rtctime);
|
|
|
|
|
|
|
|
|
|
data_field[0] = 0x14;
|
|
|
|
|
data_field[1] = std_rtc_convert_bcd2bin(rtcdate[0]);
|
|
|
|
|
data_field[2] = std_rtc_convert_bcd2bin(rtcdate[1]);
|
|
|
|
|
data_field[3] = std_rtc_convert_bcd2bin(rtcdate[2]);
|
|
|
|
|
data_field[4] = std_rtc_convert_bcd2bin(rtctime[0]);
|
|
|
|
|
data_field[5] = std_rtc_convert_bcd2bin(rtctime[1]);
|
|
|
|
|
data_field[5] = std_rtc_convert_bcd2bin(rtctime[2]);
|
|
|
|
|
|
|
|
|
|
goto send;
|
|
|
|
|
}
|
2024-09-02 15:12:26 +08:00
|
|
|
|
/*扩展命令*/
|
|
|
|
|
#if 0
|
2024-08-31 10:27:58 +08:00
|
|
|
|
case kGetCurrentTimeSecond: // AA 00 09 00 B3 55
|
|
|
|
|
{
|
|
|
|
|
LOG_D("kGetCurrentTimeSecond");
|
|
|
|
|
|
|
|
|
|
data_len = 7;
|
|
|
|
|
|
|
|
|
|
BSP_Rtc_Get_Calendar(rtcdate, rtctime);
|
|
|
|
|
|
|
|
|
|
data_field[0] = 0x14;
|
|
|
|
|
data_field[1] = std_rtc_convert_bcd2bin(rtcdate[0]);
|
|
|
|
|
data_field[2] = std_rtc_convert_bcd2bin(rtcdate[1]);
|
|
|
|
|
data_field[3] = std_rtc_convert_bcd2bin(rtcdate[2]);
|
|
|
|
|
data_field[4] = std_rtc_convert_bcd2bin(rtctime[0]);
|
|
|
|
|
data_field[5] = std_rtc_convert_bcd2bin(rtctime[1]);
|
|
|
|
|
data_field[5] = std_rtc_convert_bcd2bin(rtctime[2]);
|
|
|
|
|
|
|
|
|
|
goto send;
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
2024-09-02 15:12:26 +08:00
|
|
|
|
case kSetCurrentTime: /*2024-03-25 17:34:56 AA 00 0A 07 07 E8 03 19 11 22 38 31 55*/
|
|
|
|
|
{
|
|
|
|
|
LOG_D("kSetCurrentTime");
|
2024-08-31 10:27:58 +08:00
|
|
|
|
|
2024-09-02 15:12:26 +08:00
|
|
|
|
data_len = 7;
|
2024-08-31 10:27:58 +08:00
|
|
|
|
|
2024-09-02 15:12:26 +08:00
|
|
|
|
RtcDateTime.hour = pHostFrameData->data[4];
|
|
|
|
|
RtcDateTime.minute = pHostFrameData->data[5];
|
|
|
|
|
RtcDateTime.second = pHostFrameData->data[6];
|
|
|
|
|
RtcDateTime.day = pHostFrameData->data[3];
|
|
|
|
|
RtcDateTime.month = pHostFrameData->data[2];
|
|
|
|
|
RtcDateTime.year = (rt_uint16_t)(pHostFrameData->data[0] << 8 | pHostFrameData->data[1]);
|
2024-08-31 10:27:58 +08:00
|
|
|
|
|
2024-09-02 15:12:26 +08:00
|
|
|
|
// BSP_Rtc_DateTime_Cfg();
|
2024-08-31 10:27:58 +08:00
|
|
|
|
// RTC_Set(RtcDateTime.year, RtcDateTime.month, RtcDateTime.day,
|
|
|
|
|
// RtcDateTime.hour, RtcDateTime.minute, RtcDateTime.second);
|
|
|
|
|
|
|
|
|
|
// BSP_Rtc_Get_Calendar(rtcdate, rtctime);
|
|
|
|
|
|
2024-09-02 15:12:26 +08:00
|
|
|
|
data_field[0] = 0x14;
|
|
|
|
|
data_field[1] = std_rtc_convert_bcd2bin(rtcdate[0]);
|
|
|
|
|
data_field[2] = std_rtc_convert_bcd2bin(rtcdate[1]);
|
|
|
|
|
data_field[3] = std_rtc_convert_bcd2bin(rtcdate[2]);
|
|
|
|
|
data_field[4] = std_rtc_convert_bcd2bin(rtctime[0]);
|
|
|
|
|
data_field[5] = std_rtc_convert_bcd2bin(rtctime[1]);
|
|
|
|
|
data_field[5] = std_rtc_convert_bcd2bin(rtctime[2]);
|
2024-08-31 10:27:58 +08:00
|
|
|
|
|
2024-09-02 15:12:26 +08:00
|
|
|
|
goto send;
|
2024-08-31 10:27:58 +08:00
|
|
|
|
|
2024-09-02 15:12:26 +08:00
|
|
|
|
break;
|
|
|
|
|
}
|
2024-08-31 10:27:58 +08:00
|
|
|
|
case kSetFactoryTime: /*2024-03-26 9:30:00 AA 00 0B 07 07 E8 03 1A 09 1E 00 EF 55*/
|
|
|
|
|
{
|
|
|
|
|
LOG_D("kSetFactoryTime\r\n");
|
|
|
|
|
data_len = 7;
|
2024-09-02 15:12:26 +08:00
|
|
|
|
Flash_SetProductTimeLimit((rt_uint16_t)(pHostFrameData->data[0] << 8 | pHostFrameData->data[1]), pHostFrameData->data[2],
|
|
|
|
|
pHostFrameData->data[3], pHostFrameData->data[4], pHostFrameData->data[5], kFactoryTimeId);
|
2024-08-31 10:27:58 +08:00
|
|
|
|
// Flash_GetProductTimeLimit(&ReadLimitTime, kFactoryTimeId);
|
|
|
|
|
|
2024-09-02 15:12:26 +08:00
|
|
|
|
data_field[0] = (uint8_t)(ReadLimitTime.time.year >> 8);
|
|
|
|
|
data_field[1] = (uint8_t)(ReadLimitTime.Struct.year);
|
|
|
|
|
data_field[2] = ReadLimitTime.Struct.month;
|
|
|
|
|
data_field[3] = ReadLimitTime.Struct.day;
|
|
|
|
|
data_field[4] = ReadLimitTime.Struct.hour;
|
|
|
|
|
data_field[5] = ReadLimitTime.Struct.minute;
|
|
|
|
|
data_field[6] = ReadLimitTime.Struct.second;
|
2024-08-31 10:27:58 +08:00
|
|
|
|
|
|
|
|
|
goto send;
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case kSetExpirationTime: /*2028-3-26 9:30:00 AA 00 0C 07 07 EC 03 1A 09 1E 00 F4 55*/
|
|
|
|
|
{
|
|
|
|
|
LOG_D("kSetExpirationTime");
|
|
|
|
|
|
|
|
|
|
data_len = 7;
|
|
|
|
|
|
|
|
|
|
// Flash_SetProductTimeLimit((uint16_t)(pHostFrameData->data[0] << 8 | pHostFrameData->data[1]), pHostFrameData->data[2], pHostFrameData->data[3], pHostFrameData->data[4], pHostFrameData->data[5], pHostFrameData->data[6], kExpirationTimeId);
|
|
|
|
|
// Flash_GetProductTimeLimit(&ReadLimitTime, kExpirationTimeId);
|
|
|
|
|
|
|
|
|
|
// data_field[0] = (uint8_t)(ReadLimitTime.Struct.year >> 8);
|
|
|
|
|
// data_field[1] = (uint8_t)(ReadLimitTime.Struct.year);
|
|
|
|
|
// data_field[2] = ReadLimitTime.Struct.month;
|
|
|
|
|
// data_field[3] = ReadLimitTime.Struct.day;
|
|
|
|
|
// data_field[4] = ReadLimitTime.Struct.hour;
|
|
|
|
|
// data_field[5] = ReadLimitTime.Struct.minute;
|
|
|
|
|
// data_field[6] = ReadLimitTime.Struct.second;
|
|
|
|
|
|
|
|
|
|
goto send;
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case kSetAlarmValue: /* 3000 AA 00 0D 02 0B B8 7C 55 */
|
|
|
|
|
{
|
|
|
|
|
// logDebug("设置传感器标定的报警阈值");
|
|
|
|
|
data_len = 2;
|
|
|
|
|
value = (uint16_t)(pHostFrameData->data[0] << 8) | pHostFrameData->data[1];
|
|
|
|
|
// Flash_Set_AlarmLel(value);
|
|
|
|
|
// LOG_D("kSetAlarmLelValue: %d\r\n", Flash_Get_AlarmLel());
|
|
|
|
|
data_field[0] = (uint8_t)(value >> 8);
|
|
|
|
|
data_field[1] = (uint8_t)(value);
|
|
|
|
|
|
|
|
|
|
goto send;
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case kGetAlarmValue: //*AA 00 0F 00 B9 55*/
|
|
|
|
|
{
|
|
|
|
|
data_len = 2;
|
|
|
|
|
// value = Flash_Get_AlarmLel();
|
|
|
|
|
LOG_D("kGetAlarmValue: %d\r\n", value);
|
|
|
|
|
data_field[0] = (uint8_t)(value >> 8);
|
|
|
|
|
data_field[1] = (uint8_t)(value);
|
|
|
|
|
|
|
|
|
|
goto send;
|
|
|
|
|
break;
|
|
|
|
|
}
|
2024-09-02 15:12:26 +08:00
|
|
|
|
#endif
|
2024-08-31 10:27:58 +08:00
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
send:
|
|
|
|
|
{
|
2024-09-02 15:12:26 +08:00
|
|
|
|
if ((c1 == 0) && ((0 < c2) & (c2 < kSensorFailureRecord)))
|
2024-08-31 10:27:58 +08:00
|
|
|
|
{
|
2024-09-02 15:12:26 +08:00
|
|
|
|
rt_memset(data_field, 0, data_len);
|
2024-08-31 10:27:58 +08:00
|
|
|
|
}
|
2024-09-02 15:12:26 +08:00
|
|
|
|
HR_GenerateRawFrame(&RawData, c1, (TeFrameC2)c2, data_field, data_len);
|
|
|
|
|
LPUART1_Write(&RawData.buf[0], RawData.len);
|
|
|
|
|
}
|
|
|
|
|
return SUCCESS;
|
2024-08-31 10:27:58 +08:00
|
|
|
|
}
|
2024-09-02 15:12:26 +08:00
|
|
|
|
#endif
|
2024-08-31 10:27:58 +08:00
|
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
|
//用于处理主动发送数据
|
|
|
|
|
static void hr_send_thread_entry(void *param)
|
|
|
|
|
{
|
|
|
|
|
rt_uint8_t info[3] = {0};
|
|
|
|
|
TsRawFrameData RawData = {0};
|
|
|
|
|
|
|
|
|
|
while (1)
|
|
|
|
|
{
|
|
|
|
|
// LOG_D("Get_VIN_VoltageInt1000x() = %d\r\n", Get_VIN_VoltageInt1000x());
|
|
|
|
|
info[0] = ((Get_VIN_VoltageInt1000x() >> 8) & 0xFF);
|
|
|
|
|
info[1] = (Get_VIN_VoltageInt1000x() & 0xFF);
|
|
|
|
|
info[2] = event_index.current_event;
|
|
|
|
|
// LOG_D("info[0] = %#X,info[1] = %#X,info[2]= %#X\n", info[0],info[1],info[2]);
|
|
|
|
|
HR_GenerateRawFrame(&RawData, 0x00, 0x0E, info, 3);
|
|
|
|
|
|
|
|
|
|
rt_device_write(rt_hr_device, 0, &RawData.buf[0], RawData.len);
|
|
|
|
|
rt_thread_mdelay(10000);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// 用于处理上位机下发的指令
|
|
|
|
|
static void Hr_Thread_Entry(void *param)
|
|
|
|
|
{
|
|
|
|
|
rt_uint8_t buf[32] = {0};
|
|
|
|
|
while (1)
|
|
|
|
|
{
|
2024-09-02 15:12:26 +08:00
|
|
|
|
rt_sem_take(hr_rx_sem, RT_WAITING_FOREVER); // 等待信号量
|
2024-08-31 10:27:58 +08:00
|
|
|
|
LOG_D("hr_rx_sem");
|
|
|
|
|
|
|
|
|
|
rt_uint8_t buf_len = lwrb_get_full(&lpuart1_rx_rb);
|
|
|
|
|
LOG_D("buf_len = %d\n", buf_len);
|
|
|
|
|
lwrb_read(&lpuart1_rx_rb, buf, buf_len);
|
|
|
|
|
LOG_HEX("lpuart1_rx_rb", 16, &buf[0], buf_len);
|
|
|
|
|
|
|
|
|
|
if (buf_len >= HOST_FRAME_MIN_LEN)
|
|
|
|
|
{
|
|
|
|
|
TsFrameData *HostFrameData = HR_GetFrameData(buf, buf_len);
|
2024-09-02 15:12:26 +08:00
|
|
|
|
if (HostFrameData != RT_NULL)
|
2024-08-31 10:27:58 +08:00
|
|
|
|
{
|
2024-09-02 15:12:26 +08:00
|
|
|
|
LOG_HEX("HostFrameData", 16, &HostFrameData->data[0], HostFrameData->len); // 数据段
|
|
|
|
|
HR_ProcessData(HostFrameData);
|
2024-08-31 10:27:58 +08:00
|
|
|
|
}
|
|
|
|
|
rt_free(HostFrameData);
|
|
|
|
|
HostFrameData = RT_NULL;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int BSP_HR_Init(void)
|
|
|
|
|
{
|
|
|
|
|
hr_rx_sem = rt_sem_create("hr_rx_sem", 0, RT_IPC_FLAG_FIFO);
|
|
|
|
|
if (hr_rx_sem == RT_NULL)
|
|
|
|
|
{
|
2024-09-02 15:12:26 +08:00
|
|
|
|
LOG_E("hr_rx_sem create failed");
|
2024-08-31 10:27:58 +08:00
|
|
|
|
}
|
2024-09-02 15:12:26 +08:00
|
|
|
|
|
2024-08-31 10:27:58 +08:00
|
|
|
|
rt_thread_init(&hr_thread,
|
|
|
|
|
"hr_thread",
|
|
|
|
|
Hr_Thread_Entry,
|
|
|
|
|
RT_NULL,
|
|
|
|
|
&hr_thread_stack[0],
|
|
|
|
|
sizeof(hr_thread_stack),
|
|
|
|
|
HR_THREAD_PRIORITY, HR_THREAD_TIMESLICE);
|
|
|
|
|
rt_thread_startup(&hr_thread);
|
|
|
|
|
|
|
|
|
|
LOG_I("BSP_HR_Init");
|
|
|
|
|
|
|
|
|
|
return RT_EOK;
|
|
|
|
|
}
|
|
|
|
|
#ifdef RT_USING_COMPONENTS_INIT
|
|
|
|
|
INIT_APP_EXPORT(BSP_HR_Init);
|
|
|
|
|
#endif
|