CIU32_L051_M307R/bsp/src/bsp_history.c

462 lines
15 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.

#include "bsp_history.h"
#include "bsp_flash.h"
#include "bsp_rtc.h"
#include "drv_uart.h"
#include "lwrb.h"
#include "serial.h"
#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 下面
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++)
{
sum += data[i];
}
return sum;
}
/**
* @description: 从接收缓冲区中获取一帧有效数据
* @param {TsFrameData} *pFrameData 主机帧
* @param {uint8_t} *p_src 接收缓冲区
* @param {uint16_t} src_len 接收缓冲区长度
* @return {*}
*/
TsFrameData *HR_GetFrameData(const rt_uint8_t *p_src, const rt_uint8_t src_len)
{
rt_uint8_t data_field_len = 0;
rt_uint8_t check_sum = 0;
TsFrameData *get_buffer = RT_NULL;
for (rt_size_t i = 0; i < src_len; i++)
{
if (p_src[i] == FRAME_HEADER)
{
data_field_len = p_src[i + 3];
if (p_src[i + 3 + data_field_len + 2] == FRAME_TAIL)
{
check_sum = HR_CheckSum(&p_src[i], (4 + data_field_len));
if (p_src[i + 3 + data_field_len + 1] == check_sum)
{
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;
}
get_buffer->c1 = p_src[i + 1];
get_buffer->c2 = (TeFrameC2)p_src[i + 2];
get_buffer->len = data_field_len;
if (data_field_len > 0)
{
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
rt_uint8_t HR_GenerateRawFrame(TsRawFrameData *pRawData, rt_uint8_t c1, TeFrameC2 c2, const rt_uint8_t *p_src, rt_uint8_t src_len)
{
pRawData->len = src_len + 6;
rt_memset(pRawData->buf, 0, sizeof(pRawData->buf));
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;
// LOG_HEX("HrRawData", 16, &pRawData->buf[0], pRawData->len);
return RT_EOK;
}
#endif
#if 1
ErrorStatus HR_ProcessData(const TsFrameData *pHostFrameData)
{
TsRawFrameData RawData;
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;
data_len = FRAME_DATA_LEN;
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);
data_len = FRAME_DATA_LEN;
if (Flash_GetRecord(kAlarmRecord, c1, (TsRecordsTime *)data_field) != SUCCESS)
{
if (data_field[0] == 0)
{
rt_memset(data_field, 0, data_len);
}
goto send;
}
break;
}
case kAlarmRcyRecord: // 查询第n条探测器报警恢复记录 AA 01 02 00 AD 55
{
LOG_D("kAlarmRcyRecord(%d)", c1);
data_len = 7;
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);
data_len = FRAME_DATA_LEN;
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);
data_len = FRAME_DATA_LEN;
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);
data_len = FRAME_DATA_LEN;
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);
data_len = FRAME_DATA_LEN;
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);
data_len = FRAME_DATA_LEN;
if (Flash_GetRecord(kSensorFailureRecord, 1, (TsRecordsTime *)&data_field[0]) != SUCCESS)
{
if (c1 != 0) // 接收到的数据不对直接返回0
{
rt_memset(data_field, 0, data_len);
}
else
{
if (data_field[1] == 0) // 未失效
{
rt_memset(data_field, 0, data_len);
}
else // 失效
{
data_field[0] = 1;
}
}
goto send;
}
break;
}
case kGetCurrentTime: // AA 00 08 00 B2 55
{
uint8_t rtctime[3] = {0}, rtcdate[3] = {0};
RTT_LOG_D("kGetCurrentTime");
data_len = FRAME_DATA_LEN;
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;
}
/*扩展命令*/
#if 0
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;
}
case kSetCurrentTime: /*2024-03-25 17:34:56 AA 00 0A 07 07 E8 03 19 11 22 38 31 55*/
{
LOG_D("kSetCurrentTime");
data_len = 7;
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]);
// BSP_Rtc_DateTime_Cfg();
// RTC_Set(RtcDateTime.year, RtcDateTime.month, RtcDateTime.day,
// RtcDateTime.hour, RtcDateTime.minute, RtcDateTime.second);
// 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;
}
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;
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);
// Flash_GetProductTimeLimit(&ReadLimitTime, kFactoryTimeId);
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;
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;
}
#endif
default:
break;
}
send:
{
if ((c1 == 0) && ((0 < c2) & (c2 < kSensorFailureRecord)))
{
rt_memset(data_field, 0, data_len);
}
HR_GenerateRawFrame(&RawData, c1, (TeFrameC2)c2, data_field, data_len);
LPUART1_Write(&RawData.buf[0], RawData.len);
}
return SUCCESS;
}
#endif
#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)
{
rt_sem_take(hr_rx_sem, RT_WAITING_FOREVER); // 等待信号量
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);
if (HostFrameData != RT_NULL)
{
LOG_HEX("HostFrameData", 16, &HostFrameData->data[0], HostFrameData->len); // 数据段
HR_ProcessData(HostFrameData);
}
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)
{
LOG_E("hr_rx_sem create failed");
}
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