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.
 
 
 

164 lines
4.1 KiB

#include "front_end_controler.h"
#define TAG "FronEndControler"
Task_t usartRxtask;
Task_t eventProcesstask;
static process_state_t processerstate;
static tjc_packet_t* eventpacket;
static UART_HandleTypeDef* tjcUart;//前端数据串口接收
frontend_t frontend;
//临时函数
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 != sucess)
return ;
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);
}
processerstate = ending;
}
void Front_initialize(void){
Task_init(&usartRxtask);
Task_init(&eventProcesstask);
}
void Front_startSchedule(void)
{
//uart_start注册数据处理
Task_start(uartRxTask,&usartRxtask);
Task_start(eventProcessTask,&eventProcesstask);
}
//注册函数无法传递页面id信息
//所以多加了一个isbelongpage参数同步对应页面函数
void regOnUsrEventCb(FunctionCB cb, uint8_t page){
frontend.m_cb[frontend.m_ncb] = cb;
frontend.isbelongpage[frontend.m_ncb] = page;
frontend.m_ncb++;
}
void callUsrEventCb(tjc_event_t* event){
for (int32_t i = 0; i < frontend.m_ncb; i++) {
frontend.m_cb[i](event,frontend.isbelongpage[i]);
}
}