4G_module/custom/radar/src/radar.c

237 lines
7.3 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 "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"
#define RADAR_DEBUG_ENABLE 0
#if RADAR_DEBUG_ENABLE
#include "app_uart.h"
#define DEBUG(fmt, args...) app_printf("[RADAR]" fmt, ##args)
#else
#define DEBUG(fmt, ...)
#endif
static osThreadId_t os_RADAR_ThreadId;
radar_data_t radar_data;
osMutexId_t radar_mutex; // 互斥锁
uint8_t old_state = 0;
/******************************************************************************
* 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
// 自动刹车距离
uint16_t Brake_Distance = ((radar_id == RADAR_ID_Back )? SYS_CONF_BRAKE_LIMIT_B : SYS_CONF_BRAKE_LIMIT);
// 自动减速距离
uint16_t Speed_Cut_Distance = ((radar_id == RADAR_ID_Back )? SYS_CONF_SPEED_CUT_LIMIT_B : SYS_CONF_SPEED_CUT_LIMIT);
if((35 < Car_Distance) && Car_Distance < Brake_Distance){//小于自动刹车距离时
if(!sys_sta.A_brake){
// local_tts_set(5, 15, CM_LOCAL_TTS_DIGIT_AUTO);
local_tts_text_play("刹车",0,0);
// 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);
local_tts_text_play("减速",0,0);
// 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){
// local_tts_text_play("自动刹车",0,0);
// Time_Event_Off(Buzzer_Event,NULL);
}
sys_sta.A_brake =0;
sys_sta.A_Speed_Cut=0;
}
}
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);
DEBUG("radar_id:%#02x,distance:%d", radar_data.radar_id, radar_data.distance);
radar_CMDReceive_cnt++;
}
}
// 定时处理数和获取数据
static void RADAR_TaskHandle(void *param){
uint8_t temp_count =0;
uint32_t time_count =0;
while(1){
if(old_state != jt808_term_param_item.set_term_param.RadarEN)
{
sys_sta.P_Radar_EN = jt808_term_param_item.set_term_param.RadarEN;
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);
}
}
DEBUG("radar task init\r\n");
if(0==sys_sta.P_Radar_EN)
{
sys_sta.A_Speed_Cut =0; // 清空自动减速状态
sys_sta.A_brake =0; // 清空自动刹车状态
DEBUG("radar close\r\n"); // 任务开始
continue;
}
DEBUG("radar open\r\n"); // 任务开始
osMutexAcquire(radar_mutex, osWaitForever);
if (1==sys_sta.P_Radar_EN)
{
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); // 复位自动刹车和减速状态
}
}
// 进入游客模式开启雷达 //管理员模式优先于游客模式
if(((0 != sys_sta.O_door_lock) && ((1 == sys_sta.MAG_MODE)&&(1 == sys_sta.PLT_MODE ))) && (1 == sys_sta.P_Radar_EN)){
// 根据倒车状态确定雷达ID
// DEBUG("SendCMD:ID=%#02x", (0 == sys_sta.IO_RX_back)?RADAR_ID_Back:RADAR_ID_Front);
radar_Sendcmd((0 == sys_sta.IO_RX_back)?RADAR_ID_Back:RADAR_ID_Front, RADAR_MODE_Real);
// DEBUG("radar 1\r\n"); // 任务结束
}else{
sys_sta.A_Speed_Cut =0; // 清空自动减速状态
sys_sta.A_brake =0; // 清空自动刹车状态
DEBUG("radar 1\r\n"); // 任务结束
}
}
else if (2==sys_sta.P_Radar_EN)
{
time_count++;
sys_sta.A_Speed_Cut =0; // 清空自动减速状态
sys_sta.A_brake =0; // 清空自动刹车状态
if(time_count>=400)
{
sys_sta.P_Radar_EN = 1;
time_count=0;
}
DEBUG("radar 2\r\n"); // 任务结束
}
osMutexRelease(radar_mutex);
osDelay(140/5); // 140ms
}
}
// 雷达测离初始化
void radar_init(void){
radar_data.radar_id = RADAR_ID_Front;
radar_data.distance = 0;
radar_mutex = osMutexNew(NULL);
osThreadAttr_t radar_task_attr = {
.name = "uart_tx_task",
.stack_size = 4096*4,
.priority= osPriorityBelowNormal
};
os_RADAR_ThreadId= osThreadNew(RADAR_TaskHandle, 0, &radar_task_attr);
}