You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

160 lines
3.9 KiB

#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);
}
}