2024-11-23 16:22:04 +08:00
|
|
|
|
#include "cm_iomux.h"
|
|
|
|
|
|
#include "cm_gpio.h"
|
|
|
|
|
|
#include "stdio.h"
|
|
|
|
|
|
#include "stdlib.h"
|
|
|
|
|
|
#include "stdarg.h"
|
|
|
|
|
|
#include "cm_os.h"
|
|
|
|
|
|
#include "cm_mem.h"
|
|
|
|
|
|
#include "cm_sys.h"
|
|
|
|
|
|
#include "cm_uart.h"
|
|
|
|
|
|
|
|
|
|
|
|
#include "app_common.h"
|
|
|
|
|
|
#include "app_uart.h"
|
|
|
|
|
|
#include "control_out.h"
|
|
|
|
|
|
#include "radar.h"
|
|
|
|
|
|
#include "local_tts.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-09-15 16:24:44 +08:00
|
|
|
|
#define RADAR_DEBUG_ENABLE 0
|
2024-11-23 16:22:04 +08:00
|
|
|
|
|
|
|
|
|
|
#if RADAR_DEBUG_ENABLE
|
|
|
|
|
|
#include "app_uart.h"
|
|
|
|
|
|
#define DEBUG(fmt, args...) app_printf("[RADAR]" fmt, ##args)
|
|
|
|
|
|
#else
|
2025-07-10 10:01:23 +08:00
|
|
|
|
#define DEBUG(fmt, ...)
|
2024-11-23 16:22:04 +08:00
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
static osThreadId_t os_RADAR_ThreadId;
|
|
|
|
|
|
radar_data_t radar_data;
|
2025-07-12 10:02:05 +08:00
|
|
|
|
osMutexId_t radar_mutex; // 互斥锁
|
2025-09-09 13:26:53 +08:00
|
|
|
|
uint8_t old_state = 0;
|
2024-11-23 16:22:04 +08:00
|
|
|
|
/******************************************************************************
|
|
|
|
|
|
* Name: CRC-16/MODBUS
|
|
|
|
|
|
* Poly: 0x8005 ( x16+x15+x2+1 )
|
|
|
|
|
|
* Init: 0xFFFF
|
|
|
|
|
|
* Refin: True
|
|
|
|
|
|
* Refout: True
|
|
|
|
|
|
* Xorout: 0x0000
|
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
uint16_t crc16_modbus(uint8_t *data, uint16_t length){
|
|
|
|
|
|
uint8_t i;
|
|
|
|
|
|
uint16_t crc = 0xFFFF; // Initial value
|
|
|
|
|
|
while(length--){
|
|
|
|
|
|
crc ^= *data++;
|
|
|
|
|
|
for (i = 0; i < 8; ++i){
|
|
|
|
|
|
if (crc & 1){
|
|
|
|
|
|
crc = (crc >> 1) ^ 0xA001; // 0xA001 = reverse 0x8005
|
|
|
|
|
|
}else{
|
|
|
|
|
|
crc = (crc >> 1);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return crc;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 自动刹车或减速判断处理函数
|
|
|
|
|
|
static void radar_AUTO_BrakeORSpeedCut(uint8_t radar_id , uint16_t Car_Distance){ //距离数据30~4500mm
|
|
|
|
|
|
// 自动刹车距离
|
2025-02-26 17:10:45 +08:00
|
|
|
|
uint16_t Brake_Distance = ((radar_id == RADAR_ID_Back )? SYS_CONF_BRAKE_LIMIT_B : SYS_CONF_BRAKE_LIMIT);
|
2024-11-23 16:22:04 +08:00
|
|
|
|
// 自动减速距离
|
2025-02-26 17:10:45 +08:00
|
|
|
|
uint16_t Speed_Cut_Distance = ((radar_id == RADAR_ID_Back )? SYS_CONF_SPEED_CUT_LIMIT_B : SYS_CONF_SPEED_CUT_LIMIT);
|
2025-07-18 09:43:12 +08:00
|
|
|
|
|
2024-11-23 16:22:04 +08:00
|
|
|
|
|
|
|
|
|
|
if((35 < Car_Distance) && Car_Distance < Brake_Distance){//小于自动刹车距离时
|
|
|
|
|
|
if(!sys_sta.A_brake){
|
|
|
|
|
|
// local_tts_set(5, 15, CM_LOCAL_TTS_DIGIT_AUTO);
|
2025-07-10 10:01:23 +08:00
|
|
|
|
local_tts_text_play("刹车",0,0);
|
2024-11-23 16:22:04 +08:00
|
|
|
|
// Time_Event_Blink(Buzzer_Event,100,100,0xffff,NULL);
|
|
|
|
|
|
}
|
|
|
|
|
|
sys_sta.A_brake =1;//使能自动刹车
|
|
|
|
|
|
sys_sta.A_Speed_Cut=1;
|
|
|
|
|
|
}else if((35 < Car_Distance) && Car_Distance < Speed_Cut_Distance){//小于自动减速距离时
|
|
|
|
|
|
if(sys_sta.A_brake || !sys_sta.A_Speed_Cut){
|
|
|
|
|
|
// local_tts_set(5, 15, CM_LOCAL_TTS_DIGIT_AUTO);
|
2024-11-25 22:16:49 +08:00
|
|
|
|
local_tts_text_play("减速",0,0);
|
2024-11-23 16:22:04 +08:00
|
|
|
|
// Time_Event_Blink(Buzzer_Event,200,500,0xffff,NULL);
|
|
|
|
|
|
}
|
|
|
|
|
|
sys_sta.A_brake =0;
|
|
|
|
|
|
sys_sta.A_Speed_Cut=1;//使能自动减速
|
|
|
|
|
|
}else{
|
|
|
|
|
|
if(sys_sta.A_brake || sys_sta.A_Speed_Cut){
|
2024-11-25 22:16:49 +08:00
|
|
|
|
// local_tts_text_play("自动刹车",0,0);
|
2024-11-23 16:22:04 +08:00
|
|
|
|
// Time_Event_Off(Buzzer_Event,NULL);
|
|
|
|
|
|
}
|
|
|
|
|
|
sys_sta.A_brake =0;
|
|
|
|
|
|
sys_sta.A_Speed_Cut=0;
|
|
|
|
|
|
}
|
2025-07-18 09:43:12 +08:00
|
|
|
|
|
|
|
|
|
|
|
2024-11-23 16:22:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static uint8_t radar_CMDSend_cnt=0; // 发送命令计数
|
|
|
|
|
|
static uint8_t radar_CMDReceive_cnt=0; // 接收命令计数
|
|
|
|
|
|
|
|
|
|
|
|
//发送读取实时值数据命令
|
|
|
|
|
|
void radar_Sendcmd(uint8_t radar_id , uint8_t radar_mode){
|
|
|
|
|
|
uint8_t len=0;
|
|
|
|
|
|
uint8_t data[8];
|
|
|
|
|
|
|
|
|
|
|
|
data[len++] = radar_id;
|
|
|
|
|
|
data[len++] = 0x03;
|
|
|
|
|
|
data[len++] = 0x01;
|
|
|
|
|
|
data[len++] = radar_mode ? 0x01 : 0x00; // 0x01:实时值(120ms) 0x00:处理值(520ms)
|
|
|
|
|
|
data[len++] = 0x00;
|
|
|
|
|
|
data[len++] = 0x01;
|
|
|
|
|
|
|
|
|
|
|
|
uint16_t crc16 =crc16_modbus(data,len);
|
|
|
|
|
|
data[len++] = crc16 & 0xff;
|
|
|
|
|
|
data[len++] = (crc16 >> 8) & 0xff;
|
|
|
|
|
|
uart0_send_msg(data,len,0);
|
|
|
|
|
|
radar_CMDSend_cnt++;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 数据接收处理函数
|
|
|
|
|
|
void radar_CheckData(uint8_t *data, uint16_t data_len){
|
|
|
|
|
|
if(data_len != 7){ // 数据长度不正确
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
uint16_t crc16 =crc16_modbus(data, 5);
|
|
|
|
|
|
if((data[0] == RADAR_ID_Front) || (data[0] == RADAR_ID_Back) ||
|
|
|
|
|
|
(crc16 == (((uint16_t)data[6] << 8 ) | data[5]))){ // 雷达ID匹配
|
|
|
|
|
|
radar_data.radar_id = data[0];
|
|
|
|
|
|
radar_data.distance = ((uint16_t)data[3] << 8 ) | data[4];
|
|
|
|
|
|
radar_AUTO_BrakeORSpeedCut(radar_data.radar_id ,radar_data.distance);
|
2025-02-11 22:42:05 +08:00
|
|
|
|
DEBUG("radar_id:%#02x,distance:%d", radar_data.radar_id, radar_data.distance);
|
2024-11-23 16:22:04 +08:00
|
|
|
|
radar_CMDReceive_cnt++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 定时处理数和获取数据
|
|
|
|
|
|
static void RADAR_TaskHandle(void *param){
|
|
|
|
|
|
uint8_t temp_count =0;
|
2025-07-24 17:08:30 +08:00
|
|
|
|
uint32_t time_count =0;
|
2024-11-23 16:22:04 +08:00
|
|
|
|
while(1){
|
2025-09-09 13:26:53 +08:00
|
|
|
|
|
|
|
|
|
|
if(old_state != jt808_term_param_item.set_term_param.RadarEN)
|
|
|
|
|
|
{
|
|
|
|
|
|
sys_sta.P_Radar_EN = jt808_term_param_item.set_term_param.RadarEN;
|
2025-09-15 16:24:44 +08:00
|
|
|
|
old_state = jt808_term_param_item.set_term_param.RadarEN;
|
|
|
|
|
|
|
|
|
|
|
|
if (0==sys_sta.P_Radar_EN)
|
|
|
|
|
|
{
|
|
|
|
|
|
local_tts_text_play("雷达关闭",0,0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (1==sys_sta.P_Radar_EN)
|
|
|
|
|
|
{
|
|
|
|
|
|
local_tts_text_play("雷达开启",0,0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (2==sys_sta.P_Radar_EN)
|
|
|
|
|
|
{
|
|
|
|
|
|
local_tts_text_play("雷达临时关闭",0,0);
|
|
|
|
|
|
}
|
2025-09-09 13:26:53 +08:00
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
DEBUG("radar task init\r\n");
|
|
|
|
|
|
|
2025-07-12 10:02:05 +08:00
|
|
|
|
if(0==sys_sta.P_Radar_EN)
|
|
|
|
|
|
{
|
2025-07-16 13:31:57 +08:00
|
|
|
|
sys_sta.A_Speed_Cut =0; // 清空自动减速状态
|
|
|
|
|
|
sys_sta.A_brake =0; // 清空自动刹车状态
|
2025-07-18 09:43:12 +08:00
|
|
|
|
DEBUG("radar close\r\n"); // 任务开始
|
|
|
|
|
|
|
2025-07-12 10:02:05 +08:00
|
|
|
|
continue;
|
|
|
|
|
|
}
|
2025-07-18 09:43:12 +08:00
|
|
|
|
|
|
|
|
|
|
DEBUG("radar open\r\n"); // 任务开始
|
2025-07-11 11:22:25 +08:00
|
|
|
|
|
2025-07-12 10:02:05 +08:00
|
|
|
|
osMutexAcquire(radar_mutex, osWaitForever);
|
2025-07-11 11:22:25 +08:00
|
|
|
|
if (1==sys_sta.P_Radar_EN)
|
|
|
|
|
|
{
|
2024-11-23 16:22:04 +08:00
|
|
|
|
if(radar_CMDSend_cnt != radar_CMDReceive_cnt){ // 发送命令和接收命令计数不一致时,复位自动刹车和减速状态
|
|
|
|
|
|
temp_count++;
|
|
|
|
|
|
if(temp_count > 10){ // 连续10次未收到数据,复位自动刹车和减速状态
|
|
|
|
|
|
temp_count =0;
|
|
|
|
|
|
radar_CMDSend_cnt =0; // 清空发送命令计数
|
|
|
|
|
|
radar_CMDReceive_cnt =0; // 清空接收命令计数
|
|
|
|
|
|
DEBUG("radar anomaly......"); // 雷达异常
|
|
|
|
|
|
radar_AUTO_BrakeORSpeedCut(radar_data.radar_id , 0); // 复位自动刹车和减速状态
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-07-18 09:43:12 +08:00
|
|
|
|
|
2024-11-23 16:22:04 +08:00
|
|
|
|
|
|
|
|
|
|
// 进入游客模式开启雷达 //管理员模式优先于游客模式
|
2025-07-17 13:10:22 +08:00
|
|
|
|
if(((0 != sys_sta.O_door_lock) && ((1 == sys_sta.MAG_MODE)&&(1 == sys_sta.PLT_MODE ))) && (1 == sys_sta.P_Radar_EN)){
|
2024-11-23 16:22:04 +08:00
|
|
|
|
// 根据倒车状态确定雷达ID
|
2025-02-11 22:42:05 +08:00
|
|
|
|
// DEBUG("SendCMD:ID=%#02x", (0 == sys_sta.IO_RX_back)?RADAR_ID_Back:RADAR_ID_Front);
|
2024-11-23 16:22:04 +08:00
|
|
|
|
radar_Sendcmd((0 == sys_sta.IO_RX_back)?RADAR_ID_Back:RADAR_ID_Front, RADAR_MODE_Real);
|
2025-07-18 09:43:12 +08:00
|
|
|
|
|
2025-09-09 13:26:53 +08:00
|
|
|
|
// DEBUG("radar 1\r\n"); // 任务结束
|
2025-07-10 10:01:23 +08:00
|
|
|
|
}else{
|
|
|
|
|
|
sys_sta.A_Speed_Cut =0; // 清空自动减速状态
|
|
|
|
|
|
sys_sta.A_brake =0; // 清空自动刹车状态
|
2025-07-21 16:17:35 +08:00
|
|
|
|
DEBUG("radar 1\r\n"); // 任务结束
|
|
|
|
|
|
|
2024-11-23 16:22:04 +08:00
|
|
|
|
}
|
2025-07-18 09:43:12 +08:00
|
|
|
|
|
2025-07-11 11:22:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-12 10:02:05 +08:00
|
|
|
|
else if (2==sys_sta.P_Radar_EN)
|
|
|
|
|
|
{
|
2025-07-21 16:17:35 +08:00
|
|
|
|
|
2025-07-12 10:02:05 +08:00
|
|
|
|
time_count++;
|
2025-07-16 13:31:57 +08:00
|
|
|
|
sys_sta.A_Speed_Cut =0; // 清空自动减速状态
|
|
|
|
|
|
sys_sta.A_brake =0; // 清空自动刹车状态
|
|
|
|
|
|
|
2025-07-24 17:08:30 +08:00
|
|
|
|
if(time_count>=400)
|
2025-07-12 10:02:05 +08:00
|
|
|
|
{
|
2025-09-09 13:26:53 +08:00
|
|
|
|
sys_sta.P_Radar_EN = 1;
|
2025-07-12 10:02:05 +08:00
|
|
|
|
time_count=0;
|
2025-07-21 16:17:35 +08:00
|
|
|
|
|
|
|
|
|
|
|
2025-07-12 10:02:05 +08:00
|
|
|
|
}
|
2025-07-18 09:43:12 +08:00
|
|
|
|
|
2025-07-21 16:17:35 +08:00
|
|
|
|
|
|
|
|
|
|
DEBUG("radar 2\r\n"); // 任务结束
|
2025-07-18 09:43:12 +08:00
|
|
|
|
|
2025-07-12 10:02:05 +08:00
|
|
|
|
}
|
2025-07-21 16:17:35 +08:00
|
|
|
|
|
2025-07-12 10:02:05 +08:00
|
|
|
|
osMutexRelease(radar_mutex);
|
2024-11-23 16:22:04 +08:00
|
|
|
|
osDelay(140/5); // 140ms
|
2025-07-11 11:22:25 +08:00
|
|
|
|
}
|
2024-11-23 16:22:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 雷达测离初始化
|
|
|
|
|
|
void radar_init(void){
|
|
|
|
|
|
radar_data.radar_id = RADAR_ID_Front;
|
|
|
|
|
|
radar_data.distance = 0;
|
2025-07-16 13:31:57 +08:00
|
|
|
|
radar_mutex = osMutexNew(NULL);
|
2024-11-23 16:22:04 +08:00
|
|
|
|
osThreadAttr_t radar_task_attr = {
|
|
|
|
|
|
.name = "uart_tx_task",
|
2024-11-25 22:16:49 +08:00
|
|
|
|
.stack_size = 4096*4,
|
2025-09-15 16:24:44 +08:00
|
|
|
|
.priority= osPriorityBelowNormal
|
2024-11-23 16:22:04 +08:00
|
|
|
|
};
|
|
|
|
|
|
os_RADAR_ThreadId= osThreadNew(RADAR_TaskHandle, 0, &radar_task_attr);
|
|
|
|
|
|
}
|