25_R1_chassis/User/device/nuc.c
2025-06-26 16:00:48 +08:00

158 lines
4.1 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 "nuc.h"
#include "crc16.h"
#include <string.h>
#include "define.h"
#include "error_detect.h"
static volatile uint32_t drop_message = 0;
static osThreadId_t thread_alert;
uint8_t nucbuf[32]; //接收缓存区
uint8_t SendBuffer[11]; //发送缓存区
int b=0;
int c =0;
static void NUC_IdleCallback(void) {
osThreadFlagsSet(thread_alert,SIGNAL_NUC_RAW_REDY);
detect_hook(NUC_TOE);
}
int8_t NUC_Init(NUC_t *nuc){
if(nuc == NULL) return DEVICE_ERR_NULL;
if((thread_alert = osThreadGetId()) == NULL ) return DEVICE_ERR_NULL;
BSP_UART_RegisterCallback(BSP_UART_NUC,BSP_UART_IDLE_LINE_CB,
NUC_IdleCallback);
return DEVICE_OK;
}
int8_t NUC_StartReceiving() {
if (HAL_UARTEx_ReceiveToIdle_DMA(BSP_UART_GetHandle(BSP_UART_NUC),
(uint8_t *)nucbuf,
sizeof(nucbuf)) == HAL_OK)
return DEVICE_OK;
return DEVICE_ERR;
}
int8_t NUC_Restart(void) {
__HAL_UART_DISABLE(BSP_UART_GetHandle(BSP_UART_NUC));
__HAL_UART_ENABLE(BSP_UART_GetHandle(BSP_UART_NUC));
return DEVICE_OK;
}
bool_t NUC_WaitDmaCplt(void) {
return (osThreadFlagsWait(SIGNAL_NUC_RAW_REDY, osFlagsWaitAll,500) ==
SIGNAL_NUC_RAW_REDY);
}
//发送函数
int8_t NUC_Send(fp32 *data) {
union {
float x[2];
uint8_t data[8];
}instance;
for (int i = 0; i < 2; i++) {
instance.x[i] = data[i];
}
SendBuffer[0] = 0xFC; //发送ID
SendBuffer[1] = 0x01; //控制帧
for(int i = 2; i < 10; i++){
SendBuffer[i] = instance.data[i-2];
}
SendBuffer[10] = 0xFD; //结束符
if (HAL_UART_Transmit(BSP_UART_GetHandle(BSP_UART_NUC),
(uint8_t *)SendBuffer,sizeof(SendBuffer),1000) == HAL_OK){
b++;
return DEVICE_OK;
}
return DEVICE_ERR;
}
//发送控制函数
void NUC_Send_control(CMD_NUC_t *n,CMD_t *cmd,Chassis_t *chassis) {
static fp32 send_data[2];
//send_data[0]sick校准标志位 1sick校准成功
//send_data[1]:锁框锁球标志位 0锁框 1锁车
//启动sick校准雷达
if (chassis->SICK__SEND_FALG == 1) {
send_data[0] = 1;
send_data[1] = 0;
NUC_Send(send_data); // 发送数据
}
//启动传球
else if(cmd->C_cmd.communicate == YES){
send_data[0] = 0;
send_data[1] = 1;
NUC_Send(send_data); // 发送数据
}
else if(cmd->C_cmd.communicate == NO){
send_data[0] = 0;
send_data[1] = 0;
NUC_Send(send_data); // 发送数据
}
}
//接收函数
int8_t NUC_RawParse(CMD_NUC_t *n) {
if (n == NULL) return DEVICE_ERR_NULL;
union {
float x[4];
char data[16];
} instance; // 方便在浮点数和字符数组之间进行数据转换
if(nucbuf[0]!=HEAD) goto error; //发送ID不是底盘
else{
n->status_fromnuc = nucbuf[1];
n->ctrl_status = nucbuf[2];
switch (n->status_fromnuc) {
case MID:
/* 协议格式
0xFF HEAD
0x09 控制帧
0x01 相机帧
x fp32
y fp32
z fp32
0xFE TAIL
*/
if (nucbuf[19] != TAIL) goto error;
instance.data[0] = nucbuf[3];
instance.data[1] = nucbuf[4];
instance.data[2] = nucbuf[5];
instance.data[3] = nucbuf[6];
n->nuc.vx = instance.x[0];
instance.data[4] = nucbuf[7];
instance.data[5] = nucbuf[8];
instance.data[6] = nucbuf[9];
instance.data[7] = nucbuf[10];
n->nuc.vy = instance.x[1];
instance.data[8] = nucbuf[11];
instance.data[9] = nucbuf[12];
instance.data[10] = nucbuf[13];
instance.data[11] = nucbuf[14];
n->nuc.vw = instance.x[2]/3.1415926535f*360;
instance.data[12] = nucbuf[15];
instance.data[13] = nucbuf[16];
instance.data[14] = nucbuf[17];
instance.data[15] = nucbuf[18];
n->nuc.yaw = instance.x[3]/3.1415926535f*360;
break;
}
return DEVICE_OK;
}
error:
c++;
return DEVICE_ERR;
}
int8_t NUC_HandleOffline(CMD_NUC_t *cmd)
{
if(cmd == NULL) return DEVICE_ERR_NULL;
memset(cmd, 0, sizeof(*cmd));
return 0;
}