#include "front_end_controler.h" #define TAG "FronEndControler" Task_t usartRxtask; Task_t eventProcesstask; FunctionCB m_cb[50]; int32_t m_ncb = 0; static bool processerstate; static tjc_packet_t* eventpacket; static UART_HandleTypeDef* tjcUart;//前端数据串口接收 //临时函数 void task_init(){ static uint8_t rxbuf[128]; tjcUart = &huart4; tjcUart->USR_UartITRxing = 1; tjcUart->USR_UartITRxBuf = rxbuf; tjcUart->USR_UartITRxBufSize = 128; tjcUart->USR_UartITRxOff = 0; HAL_UART_Receive_IT(tjcUart, &tjcUart->USR_UartITRxBufCache, 1); } #define UART_RX_OVERTIME 5//接收最大时间 /* * @brief: 串口数据打包 * */ void processRxpacket(uint8_t* data, size_t len ){ if(!(data[len - 1] == 0xFF && data[len - 2] && data[len - 3])){//接收到帧尾数据 ZLOGI(TAG,"RX invalid packet"); processerstate = error; } else{ uint8_t packetType = data[0]; static tjc_packet_t packet; packet.datalen = len; memset(packet.data, 0, sizeof(packet.data)); memcpy(packet.data, data, len); ZLOGI(TAG, "packet information: %s\n", packet.data); eventpacket = &packet; processerstate = sucess; } } /* * @brief: 串口数据接收 * */ void uartRxTask(void){ static uint8_t processbuf[128]; int32_t rxsize = 0; //ZLOGI("main","test3\n"); if (tjcUart->USR_UartITRxOff != 0 && haspassedms(tjcUart->USR_UartITLastRxTicket) > UART_RX_OVERTIME) { HAL_Delay(1);//延时1毫秒以后串口发送的数据没问题 if (tjcUart->USR_UartITRxOff != 0 && haspassedms(tjcUart->USR_UartITLastRxTicket) > UART_RX_OVERTIME) { memcpy(processbuf, tjcUart->USR_UartITRxBuf, tjcUart->USR_UartITRxOff ); rxsize = tjcUart->USR_UartITRxOff; tjcUart->USR_UartITRxOff = 0; } } if(rxsize != 0) { processRxpacket(processbuf, rxsize); } } /* * @brief:前端事件处理 * */ tjc_event_t event_cache; tjc_event_t input_file_event_cache; bool input_file_event_cache_state; void eventProcessTask(void){ static tjc_packet_t packet; packet = *(eventpacket); if(processerstate) { memset(&event_cache, 0, sizeof(event_cache)); uint8_t packetType = packet.data[0]; if (packetType == tjc_button_event){ event_cache.event_id = packet.data[0]; event_cache.pid = packet.data[1]; event_cache.bid = packet.data[2]; event_cache.date.button_event.val = packet.data[3]; callUsrEventCb(&event_cache); }else if (packetType == tjc_inputfield_content_change_event1){ event_cache.event_id = packet.data[0]; event_cache.pid = packet.data[1]; event_cache.bid = packet.data[2]; // const char* strbegin = (const char*)&packet.data[3]; // strbegin = zcpystr(event_cache.date.inputfiled_content.text, strbegin, sizeof(event_cache.d.inputfield_content.text)); callUsrEventCb(&event_cache); input_file_event_cache = event_cache;//文本修改事件需要刷新页面 input_file_event_cache_state = true; }else if (tjc_sys_event_page_id == packetType){ event_cache.event_id = packet.data[0]; event_cache.pid = packet.data[1]; event_cache.bid = packet.data[2]; callUsrEventCb(&event_cache); } } } void Front_initialize(void){ Task_init(&usartRxtask); //Task_init(&eventProcesstask); } void Front_startSchedule(void) { //uart_start注册数据处理 Task_start(uartRxTask,&usartRxtask); //Task_start(eventProcessTask,&usartRxtask); } void regOnUsrEventCb(FunctionCB cb){ m_cb[m_ncb] = cb; m_ncb++; } void callUsrEventCb(tjc_event_t* event){ for (int32_t i = 0; i < m_ncb; i++) { m_cb[i](event); } }