diff --git a/RBcore/drv_interface.c b/RBcore/drv_interface.c index 06d4413..27ffb5b 100644 --- a/RBcore/drv_interface.c +++ b/RBcore/drv_interface.c @@ -226,12 +226,14 @@ void Read_RS485_1(void *argument) } extern void MotorInit(void); +extern void Mlogic_Init(void); void Drv_InterfaceInit(void) { MsgCenter_Init(); MotorInit(); RBcore_Init(); + Mlogic_Init(); const osThreadAttr_t Read_RS485_1_attributes = { .name = "RS485_1", diff --git a/RBcore/include/BHBF.h b/RBcore/include/BHBF.h index f568a8f..11e9b01 100644 --- a/RBcore/include/BHBF.h +++ b/RBcore/include/BHBF.h @@ -68,7 +68,7 @@ extern "C"{ /*==============================================* * constants or macros define * *----------------------------------------------*/ -#define MODULE_NAME_RBCORE "RBcore" +#define MODULE_NAME_RBCORE "RBcore" #define MODULE_NAME_MOTOR "motor" typedef enum { @@ -81,6 +81,7 @@ typedef enum { MOTOR_CMD_POSITION_MODE, // 位置模式 MOTOR_CMD_END = 0x0100, + RBCORE_CMD_STOP_ALL, // 机器人停止 RBCORE_CMD_MANUAL_FORWARD, // 机器人手动前进 RBCORE_CMD_MANUAL_BACKWARD, // 机器人手动后退 RBCORE_CMD_MANUAL_TURNLEFT, // 机器人手动左转 diff --git a/project/paint_robot_new/CMakeLists.txt b/project/paint_robot_new/CMakeLists.txt index 793f897..ca8cfea 100644 --- a/project/paint_robot_new/CMakeLists.txt +++ b/project/paint_robot_new/CMakeLists.txt @@ -9,8 +9,8 @@ else() message(FATAL_ERROR "Cannot find common build logic at ${COMMON_CMAKE_PATH}") endif() -if(TARGET bspMCU) - target_link_libraries(${TARGET_NAME} PUBLIC bspMCU) +if(TARGET RBcore) + target_link_libraries(${TARGET_NAME} PUBLIC RBcore) else() - message(FATAL_ERROR "[${TARGET_NAME}] Dependency 'bspMCU' not found.") + message(FATAL_ERROR "[${TARGET_NAME}] Dependency 'RBcore' not found.") endif() \ No newline at end of file diff --git a/project/paint_robot_new/include/paint_robot_new.h b/project/paint_robot_new/include/paint_robot_new.h index 8af2f56..f22fd92 100644 --- a/project/paint_robot_new/include/paint_robot_new.h +++ b/project/paint_robot_new/include/paint_robot_new.h @@ -59,14 +59,34 @@ extern "C"{ /*==============================================* * include header files * *----------------------------------------------*/ - +#include /*==============================================* * constants or macros define * *----------------------------------------------*/ - +typedef struct _MSP_MK32_Button +{ + int32_t RxIndex; + int32_t CH0_RY_H; + int32_t CH1_RY_V; + int32_t CH2_LY_V; + int32_t CH3_LY_H; + int32_t CH4_SA; + int32_t CH5_SB; + int32_t CH6_SC; + int32_t CH7_SD; + int32_t CH8_SE; + int32_t CH9_SF; + int32_t CH10_LD1; + int32_t CH11_RD1; + int32_t CH12_S1; + int32_t CH13_S2; + int32_t CH14_LT; + int32_t CH15_RT; + int32_t IsOnline; +} MSP_MK32_Button; /*==============================================* * project-wide global variables * diff --git a/project/paint_robot_new/paint_robot_new.c b/project/paint_robot_new/paint_robot_new.c index b8f9228..f1c16f2 100644 --- a/project/paint_robot_new/paint_robot_new.c +++ b/project/paint_robot_new/paint_robot_new.c @@ -17,6 +17,7 @@ ******************************************************************************/ #include "paint_robot_new.h" +#include "BHBF.h" /*----------------------------------------------* * 外部变量说明 * @@ -29,7 +30,7 @@ /*----------------------------------------------* * 内部函数原型说明 * *----------------------------------------------*/ - +static MSP_MK32_Button RB_MK32; /*----------------------------------------------* * 全局变量 * *----------------------------------------------*/ @@ -46,5 +47,133 @@ * 宏定义 * *----------------------------------------------*/ +static int check_MK32Data(char *_pBuffer, uint32_t _iSize) +{ + if (_pBuffer[0] != 0x0f) + { + return -1; + } + if (_pBuffer[24] != 0x0f) + { + return -1; + } + else + { + return 25; + } +} + +static void decode_MK32Data(const char *buf, uint32_t _iSize) +{ + int16_t CH[16]; + int Start_byte = -1; + + CH[0] = ((buf[Start_byte + 1] | buf[Start_byte + 2] << 8) & 0x07FF); + CH[1] = ((buf[Start_byte + 2] >> 3 | buf[Start_byte + 3] << 5) & 0x07FF); + CH[2] = ((buf[Start_byte + 3] >> 6 | buf[Start_byte + 4] << 2 + | buf[Start_byte + 5] << 10) & 0x07FF); + CH[3] = ((buf[Start_byte + 5] >> 1 | buf[Start_byte + 6] << 7) & 0x07FF); + CH[4] = ((buf[Start_byte + 6] >> 4 | buf[Start_byte + 7] << 4) & 0x07FF); + CH[5] = ((buf[Start_byte + 7] >> 7 | buf[Start_byte + 8] << 1 + | buf[Start_byte + 9] << 9) & 0x07FF); + CH[6] = ((buf[Start_byte + 9] >> 2 | buf[Start_byte + 10] << 6) & 0x07FF); + CH[7] = ((buf[Start_byte + 10] >> 5 | buf[Start_byte + 11] << 3) & 0x07FF); + CH[8] = ((buf[Start_byte + 12] | buf[Start_byte + 13] << 8) & 0x07FF); + CH[9] = ((buf[Start_byte + 13] >> 3 | buf[Start_byte + 14] << 5) & 0x07FF); + CH[10] = ((buf[Start_byte + 14] >> 6 | buf[Start_byte + 15] << 2 + | buf[Start_byte + 16] << 10) & 0x07FF); + CH[11] = ((buf[Start_byte + 16] >> 1 | buf[Start_byte + 17] << 7) & 0x07FF); + CH[12] = ((buf[Start_byte + 17] >> 4 | buf[Start_byte + 18] << 4) & 0x07FF); + CH[13] = ((buf[Start_byte + 18] >> 7 | buf[Start_byte + 19] << 1 + | buf[Start_byte + 20] << 9) & 0x07FF); + CH[14] = ((buf[Start_byte + 20] >> 2 | buf[Start_byte + 21] << 6) & 0x07FF); + CH[15] = ((buf[Start_byte + 21] >> 5 | buf[Start_byte + 22] << 3) & 0x07FF); + + int32_t* channel_ptrs[16] = + { + &RB_MK32.CH0_RY_H, &RB_MK32.CH1_RY_V, &RB_MK32.CH2_LY_V, &RB_MK32.CH3_LY_H, + &RB_MK32.CH4_SA, &RB_MK32.CH5_SB, &RB_MK32.CH6_SC, &RB_MK32.CH7_SD, + &RB_MK32.CH8_SE, &RB_MK32.CH9_SF, &RB_MK32.CH10_LD1, &RB_MK32.CH11_RD1, + &RB_MK32.CH12_S1, &RB_MK32.CH13_S2, &RB_MK32.CH14_LT, &RB_MK32.CH15_RT + }; + + // 按键数值转换:1050为中间值,272-1712 + for (int i = 0; i < 16; i++) + { + // 通过指针解引用赋值,完美替代原来的 RB_MK32[i + 1] + *channel_ptrs[i] = (int32_t)((CH[i] - 992) * 1.388889); + } + + // 【核心修改】:通过具体的成员名访问 IsOnline,替代原来的 RB_MK32[17] + if (buf[22] == 0) + { + RB_MK32.IsOnline = 1; + } + else + { + RB_MK32.IsOnline = 0; + } + RB_MK32.RxIndex++; +} + +void MK32_Init(void) +{ + TUartUserData *ptUartUserData = UART_userdata_init(5, 115200, 512); + g_ptE28_SBUS = rd_ComCreate(check_MK32Data, decode_MK32Data, E28_SBUS_Send, ptUartUserData->m_buf_size, ptUartUserData); + UART_IT_init(g_ptE28_SBUS); +} + +void MK32_Task(void *argument) +{ + while(1) + { + int angle; + angle = atan2(RB_MK32.CH1_RY_V, RB_MK32.CH0_RY_H) * 180 / M_PI; + if(RB_MK32.CH5_SB == 0) + { + // 前进 + if((angle >= 45) && (angle <= 135)) + { + MsgCenter_SendTo(MODULE_NAME_RBCORE, RBCORE_CMD_MANUAL_FORWARD, NULL, 0); + } + // 后退 + else if((angle >= -135) && (angle < -45)) + { + MsgCenter_SendTo(MODULE_NAME_RBCORE, RBCORE_CMD_MANUAL_BACKWARD, NULL, 0); + } + else + { + MsgCenter_SendTo(MODULE_NAME_RBCORE, RBCORE_CMD_STOP_ALL, NULL, 0); + } + } + else + { + // 前进 + if((angle >= 45) && (angle <= 135)) + { + MsgCenter_SendTo(MODULE_NAME_RBCORE, RBCORE_CMD_MANUAL_FORWARD, NULL, 0); + } + // 后退 + else if((angle >= -135) && (angle < -45)) + { + MsgCenter_SendTo(MODULE_NAME_RBCORE, RBCORE_CMD_MANUAL_BACKWARD, NULL, 0); + } + else + { + MsgCenter_SendTo(MODULE_NAME_RBCORE, RBCORE_CMD_STOP_ALL, NULL, 0); + } + } + Rd_Delay(1); + } +} +void Mlogic_Init(void) +{ + const osThreadAttr_t logic_attributes = { + .name = "main_logic", + .stack_size = 1024, + .priority = (osPriority_t) osPriorityRealtime2, + }; + (void)osThreadNew(MK32_Task, NULL, &logic_attributes); +}