25_R1_chassis/User/device/nuc.c

182 lines
4.6 KiB
C

#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[5];
// uint8_t data[20];
// }instance;
// for (int i = 0; i < 5; i++) {
// instance.x[i] = data[i];
// }
// SendBuffer[0] = 0xFC; //发送ID
// SendBuffer[1] = 0x01; //控制帧
// for(int i = 2; i < 22; i++){
// SendBuffer[i] = instance.data[i-2];
// }
// SendBuffer[22] = 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;
//}
//满足视觉的特定发送
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[5];
//启动sick校准雷达
if (chassis->SICK__SEND_FALG == 1) {
send_data[0] = 1;
send_data[1] = 0;
send_data[2] = 2;
send_data[3] = 3;
send_data[4] = 4;
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;
}