#include "HCBle.h"

/**
提示: 虽然 BLE 以及 GPS都是DMA+ UART接收，但是它们都有所不同
BLE --- DMA + IDLE 中断  循环 DMA + 空闲中断触发处理  UART IDLE  
GPS --- DMA +固定长度 + TC中断   设置固定长度 DMA    DMA传输完成中断

#{
  "lat": 23.123456,
  "lon": 113.654321,
  "angle": 95.0
}\n
**/

// 外部变量引入区

extern   UART_HandleTypeDef huart4;
extern DMA_HandleTypeDef handle_GPDMA1_Channel5;
extern DMA_HandleTypeDef handle_GPDMA1_Channel4;

/*
变量定义区
*/
char HC_Send_Data[128];
uint8_t HC_Recevie[RX_DataSize]; // 蓝牙接收缓存
volatile uint16_t rx_index = 0; //作为接收字符串指针
volatile uint8_t data_received = 0;  // 0 --- 未接收    1 --- 接收

uint8_t  rx_data;    //接收字符
// dma
uint8_t uart_dma_rx_buf[UART_DMA_RX_BUF_SIZE];
RingBuffer ble_rx_ring = {0}; //初始化
MotorCommand cmd;
LocationData current_location = {0};
float imu_angle = 0.0f;


//初始化DMA接收函数
void HCBle_InitDMAReception(void)
{
	HAL_UART_Receive_DMA(&huart4,uart_dma_rx_buf,UART_DMA_RX_BUF_SIZE);
	__HAL_UART_ENABLE_IT(&huart4,UART_IT_IDLE); //使用空闲中断
}




// 发送数据
void HCBle_SendData(char *p,...)
{
	va_list ap;
	va_start(ap,p);
	vsprintf(HC_Send_Data,p,ap);
	va_end(ap);
// 编译控制
#ifdef DEBUG_EN
	//  信息输出接口
	HAL_UART_Transmit(&huart4,(uint8_t *)HC_Send_Data,strlen(HC_Send_Data),100);
// HAL_UART_Transmi(&huart1,(uint8_t *)formatBuf,strlen(formatBuf),1);
// 对于没有使用中断的串口发送，是需要加入一个阻塞的 
#else 
	HAL_UART_Transmit_DMA(&huart4, (uint8_t *)HC_Send_Data, strlen(HC_Send_Data));
#endif	
	
}
// 对于发送数据 可以加入一个DMA




//// 蓝牙数据接收
//void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
//{
//	if(huart->Instance == UART4)
//	{
//		if(rx_data == '\n')
//		{
//			if(rx_index > 0)
//			{
//				HC_Recevie[rx_index] = '\0';
//				data_received = 1;
//				rx_index = 0;  //我认为接收完字符串后 把字符传给别的处理后 需要清除这里的字符串 memset
//			}else if(rx_index < RX_DataSize - 1)
//			{
//				
//			}else
//			{
//				rx_index = 0; //缓冲区溢出，重置
//				memset(HC_Recevie,'\0',RX_DataSize);
//			}
//		}
//		
//		HAL_UART_Receive_IT(huart,&rx_data,1);
//	}
//}



// 接下来就是定义 Json数据处理 以及 发送数据给手机App
uint8_t flag;

// Json数据解析  后续使用到Thread x 进行解析
void HCBle_ExtractAndParseFrame(void)
{
	static char json_buf[128];
	static int idx = 0;
	static int in_frame = 0;

	while (ble_rx_ring.tail != ble_rx_ring.head)
	{
		char c = ble_rx_ring.buffer[ble_rx_ring.tail];
		ble_rx_ring.tail = (ble_rx_ring.tail + 1) % RING_BUFFER_SIZE;

		// 帧开始：#
		if (c == '#') {
			idx = 0;
			in_frame = 1;
			json_buf[idx++] = c;
		}
		else if (in_frame) {
			if (idx < sizeof(json_buf) - 1) {
				json_buf[idx++] = c;

				// 帧结束：\n
				if (c == '\n') {
					json_buf[idx] = '\0';

					// ? JSON处理
					if (strstr(json_buf, "leftSpeed") && strstr(json_buf, "rightSpeed")) {
						sscanf(json_buf, "#{\"leftSpeed\":%d,\"rightSpeed\":%d}", &cmd.LeftSpeed, &cmd.RightSpeed);
						tx_event_flags_set(&system_events,EVENT_BLE_COMMAND_RECEIVED,TX_OR);
						//SetMotorSpeed(cmd.LeftSpeed, cmd.RightSpeed); 后续加入
						HCBle_SendData("左=%d, 右=%d\r\n", cmd.LeftSpeed, cmd.RightSpeed);
					}

					in_frame = 0;
					idx = 0;
				}
			} else {
				// 超出缓冲区，强制重启
				in_frame = 0;
				idx = 0;
			}
		}
	}
}

#ifdef TEST  //定义在app_thread.h中
// BLE接收任务
void ble_rx_task_entry(ULONG thread_input)
{
    HCBle_InitDMAReception();
	HCBle_SendData("BLE RX 任务已启动\r\n");
    while(1)
    {
        // 处理接收到的数据
        HCBle_ExtractAndParseFrame();
		tx_thread_sleep(10);
	}
}

void ble_tx_task_entry(ULONG thread_input) {
    BLE_Message msg;
	HCBle_SendData("BLE TX 任务已启动\r\n");
    while(1) {
        if (tx_queue_receive(&ble_tx_queue, &msg, TX_WAIT_FOREVER) == TX_SUCCESS) {
//            HCBle_SendData("%s", msg.data);
			    HCBle_SendData("#{\"lat\":%.6f,\"lon\":%.6f,\"angle\":%.2f}\n", 
                    23.123456, 113.654321, 95.0);
        }
    }
}


#endif 



