适配乐迪
This commit is contained in:
parent
eb6f11b02c
commit
f82b125112
@ -153,112 +153,7 @@
|
||||
<Ww>
|
||||
<count>0</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>chassis</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>1</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>ctrl</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>2</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>dr16,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>3</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>UP_t,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>4</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>UP,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>5</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>can,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>6</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>up_cmd,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>7</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>rc_ctrl</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>8</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>up_cmd</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>9</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>cmd,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>10</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>ctrl,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>11</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>ctrl_up,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>12</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>task_runtime,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>13</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>can,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>14</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>can_rx,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>15</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>can_out,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>16</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>gcan</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>17</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>raw_tx,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>18</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>raw_rx2,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>19</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>can_rx,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>20</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>can_out</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>21</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>UP_CAN_out,0x0A</ItemText>
|
||||
<ItemText>rc_ctrl,0x0A</ItemText>
|
||||
</Ww>
|
||||
</WatchWindow1>
|
||||
<Tracepoint>
|
||||
|
Binary file not shown.
@ -27,7 +27,10 @@
|
||||
{
|
||||
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
|
||||
}
|
||||
|
||||
// 对摇杆输出做指数曲线映射,提升小范围操控精度
|
||||
float expo_map(float value, float expo_factor) {
|
||||
return value * (1 - expo_factor) + value * fabs(value) * expo_factor;
|
||||
}
|
||||
int Setint_Deadzone(int value,int deadzone)
|
||||
{
|
||||
if(value>=-deadzone&&value<=deadzone)
|
||||
|
@ -159,5 +159,5 @@ PolarCoordinate_t addPolarVectors(PolarCoordinate_t v1, PolarCoordinate_t v2);
|
||||
uint8_t average(uint8_t arr[], uint8_t n);
|
||||
|
||||
int abs_value(int num);
|
||||
|
||||
float expo_map(float value, float expo_factor) ;
|
||||
#endif
|
||||
|
@ -29,37 +29,16 @@ return 0;
|
||||
|
||||
static void CMD_RcLogic(const CMD_RC_t *rc, CMD_t *cmd) {
|
||||
|
||||
/* 将操纵杆的对应值转换为底盘的控制向量和云台变化的欧拉角 */
|
||||
// RC_dr16 ,
|
||||
// RC_r12ds
|
||||
//
|
||||
|
||||
/*乐迪反馈值转换(-1 -- 1 )范围*/
|
||||
|
||||
// if(rc->ch_x<0) cmd->Vx =map_fp32(rc->ch_x,-337,0,-1,0);
|
||||
// else cmd->Vx =map_fp32(rc->ch_x,0,310,0,1);
|
||||
//
|
||||
//
|
||||
// if(rc->ch_y<0) cmd->Vy =map_fp32(rc->ch_y,-260,0,-1,0);
|
||||
// else cmd->Vy =map_fp32(rc->ch_y,0,312,0,1);
|
||||
|
||||
// if(rc->ch_w<0) cmd->Vw =map_fp32(rc->ch_w,-308,0,-1,0);
|
||||
// else cmd->Vw =map_fp32(rc->ch_w,0,291,0,1);
|
||||
|
||||
|
||||
// cmd->key_ctrl_l = rc->key [0];
|
||||
// cmd->key_ctrl_r = rc->key [1];
|
||||
//
|
||||
cmd->Vx = rc->dr16.ch_r_x;
|
||||
cmd->Vy = rc->dr16.ch_r_y;
|
||||
cmd->Vw = rc->dr16.ch_l_x;
|
||||
|
||||
cmd->poscamear = rc->dr16.ch_l_y;
|
||||
|
||||
cmd->Vx = rc->ch_r_x;
|
||||
cmd->Vy = rc->ch_r_y;
|
||||
cmd->Vw = rc->ch_l_x;
|
||||
|
||||
cmd->poscamear = rc->ch_l_y;
|
||||
|
||||
cmd->key_ctrl_l = rc->sw_l;
|
||||
cmd->key_ctrl_r = rc->sw_r ;
|
||||
cmd->key_ctrl_l = rc->dr16.sw_l;
|
||||
cmd->key_ctrl_r = rc->dr16.sw_r ;
|
||||
|
||||
|
||||
}
|
||||
@ -80,7 +59,7 @@ int8_t CMD_ParseRc(CMD_t *cmd,CMD_RC_t *rc){
|
||||
if (rc == NULL) return -1;
|
||||
|
||||
/*c当rc丢控时,恢复机器人至默认状态 */
|
||||
if ((rc->sw_l == CMD_SW_ERR) || (rc->sw_r == CMD_SW_ERR)) {
|
||||
if ((rc->dr16.sw_l == CMD_SW_ERR) || (rc->dr16.sw_r == CMD_SW_ERR)) {
|
||||
CMD_RcLostLogic(cmd);
|
||||
} else {
|
||||
CMD_RcLogic(rc, cmd);
|
||||
@ -123,69 +102,52 @@ int8_t CMD_ParseNuc(CMD_t *cmd,CMD_NUC_t *n){
|
||||
|
||||
|
||||
|
||||
/*
|
||||
遥控器模式重新分配
|
||||
|
||||
这一部分没有设置具体的模式名,后期根据需要修改
|
||||
遥控器模式(RC):
|
||||
左按键 --- 右按键
|
||||
mode1
|
||||
up no_mode
|
||||
mode2
|
||||
|
||||
|
||||
mode3
|
||||
down no_mode
|
||||
mode4
|
||||
|
||||
mid auto_navi(0x09)雷达导航
|
||||
|
||||
*/
|
||||
/*遥控器,上下层通用,按键控制,统一到cmd*/
|
||||
int8_t CMD_ParseRC(CMD_t *cmd,const CMD_RC_t *rc) {
|
||||
|
||||
|
||||
if(cmd == NULL) return -1;
|
||||
|
||||
cmd->Vx = rc->ch_r_x;
|
||||
cmd->Vy = rc->ch_r_y;
|
||||
cmd->Vw = rc->ch_l_x;
|
||||
cmd->Vx = rc->dr16.ch_r_x;
|
||||
cmd->Vy = rc->dr16.ch_r_y;
|
||||
cmd->Vw = rc->dr16.ch_l_x;
|
||||
|
||||
cmd->poscamear = rc->ch_l_y;
|
||||
cmd->poscamear = rc->dr16.ch_l_y;
|
||||
|
||||
cmd->key_ctrl_l = rc->sw_l;
|
||||
cmd->key_ctrl_r = rc->sw_r ;
|
||||
cmd->key_ctrl_l = rc->dr16.sw_l;
|
||||
cmd->key_ctrl_r = rc->dr16.sw_r ;
|
||||
|
||||
if ((rc->sw_l == CMD_SW_ERR) || (rc->sw_r == CMD_SW_ERR)) {
|
||||
if ((rc->dr16.sw_l == CMD_SW_ERR) || (rc->dr16.sw_r == CMD_SW_ERR)) {
|
||||
cmd->CMD_CtrlType =RELAXED;
|
||||
}
|
||||
else if(rc->sw_l==CMD_SW_UP)
|
||||
else if(rc->dr16.sw_l==CMD_SW_UP)
|
||||
{
|
||||
cmd ->CMD_CtrlType =RCcontrol;
|
||||
if(rc->sw_r ==CMD_SW_UP) cmd ->CMD_mode =Pitch; //左上,右上,投篮,设置好的
|
||||
if(rc->dr16.sw_r ==CMD_SW_UP) cmd ->CMD_mode =Pitch; //左上,右上,投篮,设置好的
|
||||
|
||||
if(rc->sw_r ==CMD_SW_MID) cmd ->CMD_mode =Normal; //左上,右中,无模式
|
||||
if(rc->dr16.sw_r ==CMD_SW_MID) cmd ->CMD_mode =Normal; //左上,右中,无模式
|
||||
|
||||
if(rc->sw_r ==CMD_SW_DOWN) cmd ->CMD_mode =Normal; //左上,右上,手动调整
|
||||
if(rc->dr16.sw_r ==CMD_SW_DOWN) cmd ->CMD_mode =Normal; //左上,右上,手动调整
|
||||
}
|
||||
|
||||
else if(rc->sw_l==CMD_SW_MID)
|
||||
else if(rc->dr16.sw_l==CMD_SW_MID)
|
||||
{
|
||||
|
||||
cmd ->CMD_CtrlType =AUTO;
|
||||
if(rc->sw_r ==CMD_SW_UP) cmd ->CMD_mode =AUTO_NAVI; //左中,右中,雷达
|
||||
if(rc->dr16.sw_r ==CMD_SW_UP) cmd ->CMD_mode =AUTO_NAVI; //左中,右中,雷达
|
||||
|
||||
if(rc->sw_r ==CMD_SW_MID) cmd ->CMD_mode =Normal; //左中,右中,无模式
|
||||
if(rc->dr16.sw_r ==CMD_SW_MID) cmd ->CMD_mode =Normal; //左中,右中,无模式
|
||||
|
||||
if(rc->sw_r ==CMD_SW_DOWN) cmd ->CMD_mode =AUTO_PICK; //左中,右下,视觉
|
||||
if(rc->dr16.sw_r ==CMD_SW_DOWN) cmd ->CMD_mode =AUTO_PICK; //左中,右下,视觉
|
||||
|
||||
}
|
||||
else if(rc->sw_l==CMD_SW_DOWN)
|
||||
else if(rc->dr16.sw_l==CMD_SW_DOWN)
|
||||
{
|
||||
cmd ->CMD_CtrlType =RCcontrol;
|
||||
if(rc->sw_r ==CMD_SW_UP) cmd ->CMD_mode =Normal; //左下,右上,投篮
|
||||
if(rc->sw_r ==CMD_SW_MID) cmd ->CMD_mode =Normal; //左下,右中,无模式
|
||||
if(rc->sw_r ==CMD_SW_DOWN) cmd ->CMD_mode =Normal; //左下,右上,无模式
|
||||
if(rc->dr16.sw_r ==CMD_SW_UP) cmd ->CMD_mode =Normal; //左下,右上,投篮
|
||||
if(rc->dr16.sw_r ==CMD_SW_MID) cmd ->CMD_mode =Normal; //左下,右中,无模式
|
||||
if(rc->dr16.sw_r ==CMD_SW_DOWN) cmd ->CMD_mode =Normal; //左下,右上,无模式
|
||||
}
|
||||
|
||||
|
||||
|
@ -54,23 +54,36 @@ typedef enum {
|
||||
CMD_SW_MID = 3,
|
||||
CMD_SW_DOWN = 2,
|
||||
} CMD_SwitchPos_t;
|
||||
|
||||
typedef enum{
|
||||
RC_DR16,
|
||||
RC_LD
|
||||
}rc_type_t;
|
||||
/*遥控器值,使用CMD_RcLogic函数传入CMD_t结构体*/
|
||||
typedef struct {
|
||||
|
||||
rc_type_t rc_type;
|
||||
|
||||
struct {
|
||||
float ch_l_x; /* 遥控器左侧摇杆横轴值,上为正 */
|
||||
float ch_l_y; /* 遥控器左侧摇杆纵轴值,右为正 */
|
||||
float ch_r_x; /* 遥控器右侧摇杆横轴值,上为正 */
|
||||
float ch_r_y; /* 遥控器右侧摇杆纵轴值,右为正 */
|
||||
|
||||
float ch_res; /* 第五通道值 */
|
||||
|
||||
CMD_SwitchPos_t sw_r; /* 右侧拨杆位置 */
|
||||
CMD_SwitchPos_t sw_l; /* 左侧拨杆位置 */
|
||||
|
||||
|
||||
uint16_t key; /* 按键值 */
|
||||
|
||||
uint16_t res; /* 保留,未启用 */
|
||||
}__attribute__((packed))dr16;
|
||||
|
||||
struct {
|
||||
fp32 map_ch[4];
|
||||
int16_t ch[4];
|
||||
int16_t sw[8];
|
||||
|
||||
}__attribute__((packed))LD;
|
||||
|
||||
|
||||
} __attribute__((packed))CMD_RC_t;
|
||||
|
||||
|
@ -12,42 +12,132 @@
|
||||
#include "error_detect.h"
|
||||
|
||||
|
||||
//#define DR16_t
|
||||
#define LD_t
|
||||
|
||||
#ifdef DR16
|
||||
#define FRAME_LEN 36
|
||||
|
||||
#elif defined(LD_t)
|
||||
|
||||
#define FRAME_LEN 25
|
||||
|
||||
#endif
|
||||
/* Private define ----------------------------------------------------------- */
|
||||
#define DR16_CH_VALUE_MIN (364u)
|
||||
#define DR16_CH_VALUE_MID (1024u)
|
||||
#define DR16_CH_VALUE_MAX (1684u)
|
||||
|
||||
/* Private macro ------------------------------------------------------------ */
|
||||
/* Private typedef ---------------------------------------------------------- */
|
||||
/* Private variables -------------------------------------------------------- */
|
||||
#define RC_CH_VALUE_MIN ((uint16_t)364)
|
||||
#define RC_CH_VALUE_MID ((uint16_t)1024)
|
||||
#define RC_CH_VALUE_MAX ((uint16_t)1684)
|
||||
|
||||
static osThreadId_t thread_alert;
|
||||
uint8_t cbuf[36]; //此处设置为两帧字节的长度 若为一帧会出现乱码的情况
|
||||
/* Private function -------------------------------------------------------- */
|
||||
static void DR16_RxCpltCallback(void) {
|
||||
static uint8_t cbuf[FRAME_LEN]; //此处设置为两帧字节的长度 若为一帧会出现乱码的情况
|
||||
|
||||
/*通用,初始化,串口回调注册,dma数据接收*/
|
||||
int8_t RC_SBUS_Init(void )
|
||||
{
|
||||
if ((thread_alert = osThreadGetId()) == NULL) return DEVICE_ERR_NULL;
|
||||
|
||||
BSP_UART_RegisterCallback(BSP_UART_REMOTE, BSP_UART_IDLE_LINE_CB,
|
||||
RC_SBUS_RxCpltCallback);
|
||||
return DEVICE_OK;
|
||||
}
|
||||
|
||||
static void RC_SBUS_RxCpltCallback(void) {
|
||||
osThreadFlagsSet(thread_alert, SIGNAL_DR16_RAW_REDY);
|
||||
// detect_hook(DR16_TOE);
|
||||
}
|
||||
int8_t RC_SBUS_Restart(void) {
|
||||
__HAL_UART_DISABLE(BSP_UART_GetHandle(BSP_UART_REMOTE));
|
||||
__HAL_UART_ENABLE(BSP_UART_GetHandle(BSP_UART_REMOTE));
|
||||
return DEVICE_OK;
|
||||
}
|
||||
int8_t RC_SBUS_StartDmaRecv(void) {
|
||||
|
||||
if (HAL_UARTEx_ReceiveToIdle_DMA(BSP_UART_GetHandle(BSP_UART_REMOTE),
|
||||
(uint8_t *)cbuf,
|
||||
sizeof(cbuf)) == HAL_OK)
|
||||
return DEVICE_OK;
|
||||
return DEVICE_ERR;
|
||||
}
|
||||
bool RC_SBUS_WaitDmaCplt(uint32_t timeout) {
|
||||
return (osThreadFlagsWait(SIGNAL_DR16_RAW_REDY, osFlagsWaitAll, timeout) ==
|
||||
SIGNAL_DR16_RAW_REDY);
|
||||
}
|
||||
/*乐迪数据解析 */
|
||||
int8_t LD_ParseRaw( RC_ctrl_t *rc_ctrl)
|
||||
{
|
||||
rc_ctrl->ch[0] = (cbuf[1] | (cbuf[2] << 8)) & 0x07ff; //!< Channel 0
|
||||
rc_ctrl->ch[1] = ((cbuf[2] >> 3) | (cbuf[3] << 5)) & 0x07ff; //!< Channel 1
|
||||
rc_ctrl->ch[2] = ((cbuf[3] >> 6) | (cbuf[4] << 2) | //!< Channel 2
|
||||
(cbuf[5] << 10)) &0x07ff;
|
||||
rc_ctrl->ch[3] = ((cbuf[5] >> 1) | (cbuf[6] << 7)) & 0x07ff; //!< Channel 3
|
||||
|
||||
rc_ctrl->sw[0] = ((int16_t)cbuf[6] >> 4 | ((int16_t)cbuf[7] << 4 )) & 0x07FF; //!< Switch left
|
||||
rc_ctrl->sw[1] = ((int16_t)cbuf[7] >> 7 | ((int16_t)cbuf[8] << 1 ) | (int16_t)cbuf[9] << 9 ) & 0x07FF; //!< Switch right
|
||||
rc_ctrl->sw[2] = ((int16_t)cbuf[9] >> 2 | ((int16_t)cbuf[10] << 6 )) & 0x07FF;; //!< Mouse X axis
|
||||
rc_ctrl->sw[3] = ((int16_t)cbuf[10] >> 5 | ((int16_t)cbuf[11] << 3 )) & 0x07FF; //!< Mouse Y axis
|
||||
rc_ctrl->sw[4] = ((int16_t)cbuf[12] << 0 | ((int16_t)cbuf[13] << 8 )) & 0x07FF; //!< Mouse Z axis
|
||||
rc_ctrl->sw[5] = ((int16_t)cbuf[13] >> 3 | ((int16_t)cbuf[14] << 5 )) & 0x07FF; //!< Mouse Left Is Press ?
|
||||
rc_ctrl->sw[6] = ((int16_t)cbuf[14] >> 6 | ((int16_t)cbuf[15] << 2 ) | (int16_t)cbuf[16] << 10 ) & 0x07FF; //!< Mouse Right Is Press ?
|
||||
rc_ctrl->sw[7] = ((int16_t)cbuf[16] >> 1 | ((int16_t)cbuf[17] << 7 )) & 0x07FF; //!< KeyBoard value
|
||||
|
||||
rc_ctrl->ch[0] -= RC_CH_VALUE_MID;
|
||||
rc_ctrl->ch[1] -= RC_CH_VALUE_MID;
|
||||
rc_ctrl->ch[2] -= RC_CH_VALUE_MID;
|
||||
rc_ctrl->ch[3] -= RC_CH_VALUE_MID;
|
||||
|
||||
|
||||
rc_ctrl->ch[0] += 24; //y(-694,693)左右
|
||||
rc_ctrl->ch[1] = -rc_ctrl->ch[1]-24; //x(-693,694)前后
|
||||
rc_ctrl->ch[2] = -rc_ctrl->ch[2]+764; //m(95,1482)油门
|
||||
rc_ctrl->ch[3] += 24; //w(-694,693)旋转
|
||||
|
||||
rc_ctrl->ch[1] = map_int(rc_ctrl->ch[1],-693,694,-700,700); //x映射到(-700,700)
|
||||
rc_ctrl->ch[0] = map_int(rc_ctrl->ch[0],-694,693,-700,700); //y映射到(-700,700)
|
||||
rc_ctrl->ch[3] = 0.5*(rc_ctrl->ch[3]); //w
|
||||
|
||||
// //死区(-30,30)
|
||||
// if(rc_ctrl->ch[0]>-50&&rc_ctrl->ch[0]<50) rc_ctrl->ch[0]=0;
|
||||
// if(rc_ctrl->ch[1]>-50&&rc_ctrl->ch[1]<50) rc_ctrl->ch[1]=0;
|
||||
// if(rc_ctrl->ch[2]>-50&&rc_ctrl->ch[2]<50) rc_ctrl->ch[2]=0;
|
||||
// if(rc_ctrl->ch[3]>-50&&rc_ctrl->ch[3]<50) rc_ctrl->ch[3]=0;
|
||||
//
|
||||
|
||||
rc_ctrl->map_ch[0]=map_fp32(rc_ctrl->ch[0],-719,680,-1,1);
|
||||
rc_ctrl->map_ch[1]=map_fp32(rc_ctrl->ch[1],-567,832,-1,1);
|
||||
rc_ctrl->map_ch[2]=map_fp32(rc_ctrl->ch[2],95,1482,0,1);
|
||||
rc_ctrl->map_ch[3]=map_fp32(rc_ctrl->ch[3],-317,375,-1,1);
|
||||
|
||||
rc_ctrl->map_ch[0]=expo_map(rc_ctrl->map_ch[0], 0.7f);
|
||||
rc_ctrl->map_ch[1]=expo_map(rc_ctrl->map_ch[1],0.7f);
|
||||
rc_ctrl->map_ch[2]=expo_map(rc_ctrl->map_ch[2],0.7f);
|
||||
rc_ctrl->map_ch[3]=expo_map(rc_ctrl->map_ch[3],0.7f);
|
||||
|
||||
//死区(-30,30)
|
||||
if(rc_ctrl->map_ch[0]>-0.05&&rc_ctrl->map_ch[0]<0.05) rc_ctrl->map_ch[0]=0;
|
||||
if(rc_ctrl->map_ch[1]>-0.05&&rc_ctrl->map_ch[1]<0.05) rc_ctrl->map_ch[1]=0;
|
||||
if(rc_ctrl->map_ch[2]>-0.05&&rc_ctrl->map_ch[2]<0.05) rc_ctrl->map_ch[2]=0;
|
||||
if(rc_ctrl->map_ch[3]>-0.05&&rc_ctrl->map_ch[3]<0.05) rc_ctrl->map_ch[3]=0;
|
||||
|
||||
}
|
||||
/*dr16数据解析+校验 */
|
||||
static bool DR16_DataCorrupted(const DR16_t *dr16) {
|
||||
if (dr16 == NULL) return DEVICE_ERR_NULL;
|
||||
|
||||
if ((dr16->data.ch_r_x < DR16_CH_VALUE_MIN) ||
|
||||
(dr16->data.ch_r_x > DR16_CH_VALUE_MAX))
|
||||
if ((dr16->data.ch_r_x < RC_CH_VALUE_MIN) ||
|
||||
(dr16->data.ch_r_x > RC_CH_VALUE_MAX))
|
||||
return true;
|
||||
|
||||
if ((dr16->data.ch_r_y < DR16_CH_VALUE_MIN) ||
|
||||
(dr16->data.ch_r_y > DR16_CH_VALUE_MAX))
|
||||
if ((dr16->data.ch_r_y < RC_CH_VALUE_MIN) ||
|
||||
(dr16->data.ch_r_y > RC_CH_VALUE_MAX))
|
||||
return true;
|
||||
|
||||
if ((dr16->data.ch_l_x < DR16_CH_VALUE_MIN) ||
|
||||
(dr16->data.ch_l_x > DR16_CH_VALUE_MAX))
|
||||
if ((dr16->data.ch_l_x < RC_CH_VALUE_MIN) ||
|
||||
(dr16->data.ch_l_x > RC_CH_VALUE_MAX))
|
||||
return true;
|
||||
|
||||
if ((dr16->data.ch_l_y < 1000u) ||
|
||||
(dr16->data.ch_l_y > DR16_CH_VALUE_MAX))
|
||||
(dr16->data.ch_l_y > RC_CH_VALUE_MAX))
|
||||
return true;
|
||||
|
||||
if (dr16->data.sw_l == 0) return true;
|
||||
@ -56,35 +146,6 @@ static bool DR16_DataCorrupted(const DR16_t *dr16) {
|
||||
|
||||
return false;
|
||||
}
|
||||
/* Exported functions ------------------------------------------------------- */
|
||||
int8_t DR16_Init(DR16_t *dr16) {
|
||||
if (dr16 == NULL) return DEVICE_ERR_NULL;
|
||||
if ((thread_alert = osThreadGetId()) == NULL) return DEVICE_ERR_NULL;
|
||||
|
||||
BSP_UART_RegisterCallback(BSP_UART_REMOTE, BSP_UART_IDLE_LINE_CB,
|
||||
DR16_RxCpltCallback);
|
||||
return DEVICE_OK;
|
||||
}
|
||||
|
||||
int8_t DR16_Restart(void) {
|
||||
__HAL_UART_DISABLE(BSP_UART_GetHandle(BSP_UART_REMOTE));
|
||||
__HAL_UART_ENABLE(BSP_UART_GetHandle(BSP_UART_REMOTE));
|
||||
return DEVICE_OK;
|
||||
}
|
||||
|
||||
int8_t DR16_StartDmaRecv(DR16_t *dr16) {
|
||||
if (HAL_UARTEx_ReceiveToIdle_DMA(BSP_UART_GetHandle(BSP_UART_REMOTE),
|
||||
(uint8_t *)cbuf,
|
||||
sizeof(cbuf)) == HAL_OK)
|
||||
return DEVICE_OK;
|
||||
return DEVICE_ERR;
|
||||
}
|
||||
|
||||
bool DR16_WaitDmaCplt(uint32_t timeout) {
|
||||
return (osThreadFlagsWait(SIGNAL_DR16_RAW_REDY, osFlagsWaitAll, timeout) ==
|
||||
SIGNAL_DR16_RAW_REDY);
|
||||
}
|
||||
|
||||
int8_t DR16_ParseRaw(DR16_t *dr16)
|
||||
{
|
||||
if(dr16 ==NULL) return DEVICE_ERR_NULL;
|
||||
@ -97,31 +158,48 @@ int8_t DR16_ParseRaw(DR16_t *dr16)
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int8_t DR16_ParseRC(const DR16_t *dr16, CMD_RC_t *rc) {
|
||||
int8_t RC_ParseRC( DR16_t *dr16, RC_ctrl_t *rc_ctrl, CMD_RC_t *rc) {
|
||||
if (dr16 == NULL) return DEVICE_ERR_NULL;
|
||||
|
||||
if (rc_ctrl == NULL) return DEVICE_ERR_NULL;
|
||||
#ifdef DR16
|
||||
/*DR16部分*/
|
||||
rc->rc_type=RC_DR16;
|
||||
DR16_ParseRaw(dr16);
|
||||
if (DR16_DataCorrupted(dr16)) {
|
||||
return DEVICE_ERR;
|
||||
} else {
|
||||
memset(rc, 0, sizeof(*rc));
|
||||
}
|
||||
float full_range = (float)(DR16_CH_VALUE_MAX - DR16_CH_VALUE_MIN);
|
||||
|
||||
rc->ch_r_x = 2 * ((float)dr16->data.ch_r_x - DR16_CH_VALUE_MID) / full_range;
|
||||
rc->ch_r_y = 2 * ((float)dr16->data.ch_r_y - DR16_CH_VALUE_MID) / full_range;
|
||||
rc->ch_l_x = 2 * ((float)dr16->data.ch_l_x - DR16_CH_VALUE_MID) / full_range;
|
||||
rc->ch_l_y = 2 * ((float)dr16->data.ch_l_y - DR16_CH_VALUE_MID) / full_range;
|
||||
float full_range = (float)(RC_CH_VALUE_MAX - RC_CH_VALUE_MIN);
|
||||
|
||||
rc->sw_l = (CMD_SwitchPos_t)dr16->data.sw_l;
|
||||
rc->sw_r = (CMD_SwitchPos_t)dr16->data.sw_r;
|
||||
rc->dr16.ch_r_x = 2 * ((float)dr16->data.ch_r_x - RC_CH_VALUE_MID) / full_range;
|
||||
rc->dr16.ch_r_y = 2 * ((float)dr16->data.ch_r_y - RC_CH_VALUE_MID) / full_range;
|
||||
rc->dr16.ch_l_x = 2 * ((float)dr16->data.ch_l_x - RC_CH_VALUE_MID) / full_range;
|
||||
rc->dr16.ch_l_y = 2 * ((float)dr16->data.ch_l_y - RC_CH_VALUE_MID) / full_range;
|
||||
|
||||
rc->key = dr16->data.key;
|
||||
rc->dr16.sw_l = (CMD_SwitchPos_t)dr16->data.sw_l;
|
||||
rc->dr16.sw_r = (CMD_SwitchPos_t)dr16->data.sw_r;
|
||||
|
||||
rc->dr16.key = dr16->data.key;
|
||||
|
||||
// rc->ch_res = ((float)dr16->data.res - DR16_CH_VALUE_MID) / full_range;
|
||||
|
||||
|
||||
#elif defined(LD_t)
|
||||
|
||||
/*乐迪*/
|
||||
rc->rc_type=RC_LD;
|
||||
LD_ParseRaw(rc_ctrl);
|
||||
|
||||
memcpy(&rc->LD, rc_ctrl, sizeof(RC_ctrl_t));
|
||||
#endif
|
||||
return DEVICE_OK;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*离线处理*/
|
||||
int8_t DR16_HandleOffline(const DR16_t *dr16, CMD_RC_t *rc) {
|
||||
if (dr16 == NULL) return DEVICE_ERR_NULL;
|
||||
if (rc == NULL) return DEVICE_ERR_NULL;
|
||||
@ -130,7 +208,3 @@ int8_t DR16_HandleOffline(const DR16_t *dr16, CMD_RC_t *rc) {
|
||||
memset(rc, 0, sizeof(*rc));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -11,11 +11,6 @@
|
||||
/* Exported constants ------------------------------------------------------- */
|
||||
/* Exported macro ----------------------------------------------------------- */
|
||||
/* Exported types ----------------------------------------------------------- */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
typedef __packed struct
|
||||
{
|
||||
uint16_t ch_r_x : 11;
|
||||
@ -37,17 +32,39 @@ typedef struct {
|
||||
DR16_Data_t data;
|
||||
} DR16_t;
|
||||
|
||||
/* Exported functions prototypes -------------------------------------------- */
|
||||
int8_t DR16_Init(DR16_t *dr16);
|
||||
int8_t DR16_Restart(void);
|
||||
|
||||
int8_t DR16_StartDmaRecv(DR16_t *dr16);
|
||||
bool DR16_WaitDmaCplt(uint32_t timeout);
|
||||
|
||||
#define SBUS_RX_BUF_NUM 25u
|
||||
|
||||
#define RC_FRAME_LENGTH 18u
|
||||
|
||||
|
||||
|
||||
typedef __packed struct
|
||||
{
|
||||
fp32 map_ch[4];
|
||||
int16_t ch[4];
|
||||
int16_t sw[8];
|
||||
|
||||
} RC_ctrl_t;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int8_t RC_SBUS_Init(void );
|
||||
static void RC_SBUS_RxCpltCallback(void) ;
|
||||
int8_t RC_SBUS_Restart(void) ;
|
||||
int8_t RC_SBUS_StartDmaRecv(void) ;
|
||||
bool RC_SBUS_WaitDmaCplt(uint32_t timeout) ;
|
||||
int8_t LD_ParseRaw( RC_ctrl_t *rc_ctrl);
|
||||
static bool DR16_DataCorrupted(const DR16_t *dr16) ;
|
||||
int8_t DR16_ParseRaw(DR16_t *dr16);
|
||||
int8_t DR16_ParseRC(const DR16_t *dr16, CMD_RC_t *rc);
|
||||
int8_t DR16_HandleOffline(const DR16_t *dr16, CMD_RC_t *rc);
|
||||
int8_t RC_ParseRC( DR16_t *dr16, RC_ctrl_t *rc_ctrl, CMD_RC_t *rc) ;
|
||||
int8_t DR16_HandleOffline(const DR16_t *dr16, CMD_RC_t *rc) ;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
@ -12,19 +12,17 @@
|
||||
/* Private define ----------------------------------------------------------- */
|
||||
/* Private macro ------------------------------------------------------------ */
|
||||
/* Private variables -------------------------------------------------------- */
|
||||
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
DR16_t dr16;
|
||||
CMD_RC_t cmd_rc;
|
||||
RC_ctrl_t ld;
|
||||
#else
|
||||
static DR16_t dr16;
|
||||
static CMD_RC_t cmd_rc;
|
||||
static RC_ctrl_t cc;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/* Private function --------------------------------------------------------- */
|
||||
/* Exported functions ------------------------------------------------------- */
|
||||
|
||||
@ -35,29 +33,20 @@ static CMD_RC_t cmd_rc;
|
||||
*/
|
||||
void Task_dr16(void *argument) {
|
||||
(void)argument; /* 未使用,消除警告 */
|
||||
const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_DR16;
|
||||
uint32_t tick = osKernelGetTickCount();
|
||||
|
||||
|
||||
|
||||
DR16_Init(&dr16); /* 初始化dr16 */
|
||||
|
||||
RC_SBUS_Init(); /* 初始化dr16 */
|
||||
|
||||
while (1) {
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
/* */
|
||||
task_runtime.stack_water_mark.dr16 = osThreadGetStackSpace(osThreadGetId());
|
||||
#endif
|
||||
|
||||
/* 开启DMA */
|
||||
DR16_StartDmaRecv(&dr16);
|
||||
RC_SBUS_StartDmaRecv();
|
||||
|
||||
if (DR16_WaitDmaCplt(30)) {
|
||||
/* 转换 */
|
||||
DR16_ParseRaw(&dr16);
|
||||
DR16_ParseRC(&dr16, &cmd_rc);
|
||||
if (RC_SBUS_WaitDmaCplt(30)) {
|
||||
|
||||
RC_ParseRC(&dr16,&ld, &cmd_rc);
|
||||
} else {
|
||||
/* 处理遥控器离线 */
|
||||
DR16_HandleOffline(&dr16, &cmd_rc);
|
||||
@ -65,10 +54,4 @@ void Task_dr16(void *argument) {
|
||||
osMessageQueueReset(task_runtime.msgq.cmd.raw.rc);
|
||||
osMessageQueuePut(task_runtime.msgq.cmd.raw.rc, &cmd_rc, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
tick += delay_tick; /* 计算下一个唤醒时*/
|
||||
|
||||
osDelay(10);
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user