/******************************************************************************* * File Name : BT.c * Description : * Created on : 2018Äê7ÔÂ23ÈÕ * Author : ¶Å¼ü *******************************************************************************/ /******************************************************************************* * Include Files * *******************************************************************************/ #include "stdio.h" #include "stdarg.h" #include "string.h" #include "AppConfig.h" #include "HIDO_VLQueue.h" #include "HIDO_Input.h" #include "HIDO_Timer.h" #include "HIDO_Util.h" #include "bluetooth.h" #include "DBG.h" #include "mainex.h" #include "Uart.h" /******************************************************************************* * Macro * *******************************************************************************/ // È«¾Ö״̬±êÖ¾ volatile uint8_t g_bt_configured = 0; // ÅäÖÃÍê³É±êÖ¾ volatile uint8_t g_bt_paired = 0; // Åä¶ÔÍê³É±êÖ¾ volatile uint8_t g_bt_at_moded = 0; // AT_MODE static BT_RevState bt_state = BT_STATE_IDLE; static char bt_buffer[50]; // ½ÓÊÕ»º³åÇø static u8 bt_index = 0; // µ±Ç°½ÓÊÕλÖà static HIDO_UINT8 l_au8BTUartRxBuf[BT_UART_RX_BUF_SIZE]; static HIDO_UINT8 l_au8BTUartTxBuf[BT_UART_TX_BUF_SIZE]; HIDO_UINT8 uart6_dma_rxbuf[UART6_DMA_RX_BUF_SIZE] = {0}; HIDO_UINT8 uart6_dma_recv_end_flag = 0; HIDO_UINT8 uart6_dma_recv_len = 0; /******************************************************************************* * Local Variable * *******************************************************************************/ // ÅäÖú¯ÊýÉùÃ÷ static HIDO_UINT8 ConfigBluetoothMasterSlave(void); static void Bluetooth_Config_Slave(void); // Ó³É亯Êý£º½« [-100,100] Ó³Éäµ½ [1000,2000] static uint32_t Map(int16_t input, int16_t in_min, int16_t in_max, uint32_t out_min, uint32_t out_max) { return (input - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } // ÉèÖõç»ú PWM£¨Ç°½ø/ºóÍË£© static void Set_Motor_PWM(int16_t speed) { uint32_t pulse = Map(speed, -100, 100, 1000, 2000); // -100~100 ¡ú 1000~2000 __HAL_TIM_SetCompare(&MOTOR_TIM, MOTOR_CHANNEL, pulse); } // ÉèÖÃתÏò PWM£¨×óת/ÓÒת£© static void Set_Steering_PWM(int16_t steer) { uint32_t pulse = Map(steer, -100, 100, 1000, 2000); // -100~100 ¡ú 1000~2000 __HAL_TIM_SetCompare(&STEERING_TIM, STEERING_CHANNEL, pulse); } /******************************************************************************* * Function Name : DBG_Init * Description : µ÷ÊÔ´òÓ¡³õʼ»¯ * Input : None * Output : None * Return : None * Author : ¶Å¼ü * Modified Date: : 2018Äê7ÔÂ23ÈÕ *******************************************************************************/ HIDO_VOID BT_Init(void) { ST_UartInit stInit; memset(&stInit, 0, sizeof(stInit)); stInit.m_eRxMode = UART_RX_MODE_DMA; stInit.m_eTxMode = UART_TX_MODE_DMA; stInit.m_pu8RxBuf = l_au8BTUartRxBuf; stInit.m_u32RxBufSize = BT_UART_RX_BUF_SIZE; stInit.m_pu8TxBuf = l_au8BTUartTxBuf; stInit.m_u32TxBufSize = BT_UART_TX_BUF_SIZE; stInit.m_u32TxQueueMemberCnt = BT_UART_TX_QUEUE_MEMBER_CNT; Uart_Init(UART_ID_BT, &stInit); } static void BTUsartParseDataHandler(uint8_t data) { switch (bt_state) { case BT_STATE_IDLE: if(data!=NULL) { bt_state=BT_STATE_RECEIVING; } break; case BT_STATE_RECEIVING: bt_buffer[bt_index++] = data; if (bt_index >2 && bt_buffer[bt_index-2] == '\r' && bt_buffer[bt_index-1] == '\n') { // ¼ì²âµ½ÍêÕû½áÊø·û "\r\n" bt_buffer[bt_index] = '\0'; // Ìí¼Ó×Ö·û´®ÖÕÖ¹·û bt_index = 0; // ÖØÖûº³åÇø bt_state = BT_STATE_COMPLETE; } break; case BT_STATE_COMPLETE: // ״̬»ú´íÎó£¬ÖØÖÃ״̬ bt_state = BT_STATE_IDLE; break; } } // À¶ÑÀÅäÖú¯ÊýʵÏÖ static HIDO_UINT8 BT_Enter_ATmode(void) { HIDO_UINT8 u8RecvChar = 0; //DBG_SerialPutString("AT+ENAT\r\n"); Uart_Send(UART_ID_BT, (HIDO_UINT8 *) "AT+ENAT\r\n", strlen("AT+ENAT\r\n")); while (Uart_GetChar(UART_ID_BT, &u8RecvChar) == HIDO_OK) { BTUsartParseDataHandler(u8RecvChar); // Èç¹ûÊý¾Ý½ÓÊÕÍê³É£¬´¦ÀíÊý¾ÝÖ¡ if (bt_state == BT_STATE_COMPLETE) { if(0==strcmp(bt_buffer,"\r\nOK\r\n")) { memset(bt_buffer, 0, 50); bt_state = BT_STATE_IDLE; g_bt_at_moded=1; return BT_CONFIG_SUCCESS; } } } return BT_CONFIG_FAIL; } // À¶ÑÀ¶Ï¿ªÁ¬½Ó void BT_DisConnect(void) { HIDO_UINT8 u8RecvChar = 0; //DBG_SerialPutString("AT+ENAT\r\n"); Uart_Send(UART_ID_BT, (HIDO_UINT8 *) "AT+ENAT\r\n", strlen("AT+ENAT\r\n")); // delay_ms(10); Uart_Send(UART_ID_BT, (HIDO_UINT8 *) "AT+LENC\r\n", strlen("AT+LENC\r\n")); // delay_ms(10); Uart_Send(UART_ID_BT, (HIDO_UINT8 *) "AT+EXAT\r\n", strlen("AT+EXAT\r\n")); } // À¶ÑÀÅäÖú¯ÊýʵÏÖ static HIDO_UINT8 BT_Get_SLaveMode(void) { HIDO_UINT8 u8RecvChar = 0; DBG_SerialPutString("AT+ROLE\r\n"); while (Uart_GetChar(UART_ID_BT, &u8RecvChar) == HIDO_OK) { BTUsartParseDataHandler(u8RecvChar); // Èç¹ûÊý¾Ý½ÓÊÕÍê³É£¬´¦ÀíÊý¾ÝÖ¡ if (bt_state == BT_STATE_COMPLETE) { if(0==strcmp(bt_buffer,"LAVE\r\n")) { memset(bt_buffer, 0, 50); bt_state = BT_STATE_IDLE; g_bt_configured=1; DBG_SerialPutString(" AT+REST\r\n");//Í˳öÖ¸Áî²¢½øÈë͸´«Ä£Ê½ return BT_CONFIG_SUCCESS; } } } return BT_CONFIG_FAIL; } // À¶ÑÀÅäÖú¯ÊýʵÏÖ static HIDO_UINT8 BT_wait_PairMode(void) { HIDO_UINT8 u8RecvChar = 0; while (Uart_GetChar(UART_ID_BT, &u8RecvChar) == HIDO_OK) { BTUsartParseDataHandler(u8RecvChar); // Èç¹ûÊý¾Ý½ÓÊÕÍê³É£¬´¦ÀíÊý¾ÝÖ¡ if (bt_state == BT_STATE_COMPLETE) { if(0==strcmp(bt_buffer,"AT+LED1\r\n")) { memset(bt_buffer, 0, 50); bt_state = BT_STATE_IDLE; g_bt_paired = 1; return BT_CONFIG_SUCCESS; } } } return BT_CONFIG_FAIL; } // À¶ÑÀÅäÖú¯ÊýʵÏÖ static HIDO_UINT8 BT_connect_status(void) { HIDO_UINT8 u8RecvChar = 0; DBG_SerialPutString("AT+CONN\r\n"); while (Uart_GetChar(UART_ID_BT, &u8RecvChar) == HIDO_OK) { BTUsartParseDataHandler(u8RecvChar); // Èç¹ûÊý¾Ý½ÓÊÕÍê³É£¬´¦ÀíÊý¾ÝÖ¡ if (bt_state == BT_STATE_COMPLETE) { if(0==strcmp(bt_buffer,"1\r\n")) { memset(bt_buffer, 0, 50); bt_state = BT_STATE_IDLE; g_bt_paired = 1; return BT_CONFIG_SUCCESS; } } } return BT_CONFIG_FAIL; } // À¶ÑÀÈÎÎñ´¦Àíº¯Êý//DBG_SerialPutString("AT+SLAV\r\n");//ÅäÖôӻú static void Bluetooth_Config_Slave(void) { if(g_bt_configured==0) { if(g_bt_at_moded==0) { BT_Enter_ATmode(); } else { if(BT_Get_SLaveMode()) { g_bt_configured=1; } } } } // Ö÷´¦Àíº¯Êý void Joystick_Process(Joystick_t *joy) { // ÌáÈ¡ y1 ¿ØÖÆÇ°½ø/ºóÍË int16_t motor_val = joy->y1; // -100 ~ +100 Set_Motor_PWM(motor_val); // ÌáÈ¡ x2 ¿ØÖÆ×ªÏò int16_t steering_val = joy->x2; // -100 ~ +100 Set_Steering_PWM(steering_val); } // ʾÀýÊäÈë: "[joystick,-22,-2,0,0]" void Parse_Joystick_Data(char *data) { Joystick_t joy = {0}; if (strstr(data, "joystick") == NULL) return; // Ìø¹ý "[joystick," char *ptr = strstr(data, "joystick"); if (!ptr) return; ptr += 10; // Ìø¹ý "joystick," // ½âÎöËĸöÕûÊý char *end; joy.x1 = strtol(ptr, &end, 10); if (end == ptr) return; ptr = end + 1; joy.y1 = strtol(ptr, &end, 10); if (end == ptr) return; ptr = end + 1; joy.x2 = strtol(ptr, &end, 10); if (end == ptr) return; ptr = end + 1; joy.y2 = strtol(ptr, &end, 10); // ´¦ÀíÊý¾Ý Joystick_Process(&joy); } /******************************************************************************* * Function Name : BT_Init * Description : µ÷ÊÔ´òÓ¡ÂÖѯ * Input : None * Output : None * Return : None * Author : ¶Å¼ü * Modified Date: : 2018Äê7ÔÂ23ÈÕ *******************************************************************************/ HIDO_VOID BT_Poll(void) { if (uart6_dma_recv_len>0)//HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_13) == GPIO_PIN_RESET { if (uart6_dma_recv_end_flag == 1) //½ÓÊÕÍê³É±êÖ¾ { Uart_Send(UART_ID_DBG, (HIDO_UINT8 *)uart6_dma_rxbuf,uart6_dma_recv_len); // ½âÎöÊý¾Ý Parse_Joystick_Data(uart6_dma_rxbuf); } uart6_dma_recv_len = 0;//Çå³ý¼ÆÊý uart6_dma_recv_end_flag = 0;//Çå³ý½ÓÊÕ½áÊø±ê־λ memset(uart6_dma_rxbuf, 0, UART6_DMA_RX_BUF_SIZE); HAL_UART_Receive_DMA(&huart6, uart6_dma_rxbuf, UART6_DMA_RX_BUF_SIZE); //ÖØÐ´ò¿ªDMA½ÓÊÕ } #if 0 else if(0==g_com_map[BT_SLAVE_STATUS]) { DBG_SerialPutString("AT+ENAT\r\n"); //delay_ms(10); DBG_SerialPutString("AT+SLAV\r\n"); g_com_map[BT_SLAVE_STATUS]=1; save_com_map_to_flash(); } #endif }