#include "menu_port.h" #include "elog.h" // #define Max_MenuBuf_Size 256 extern UART_HandleTypeDef huart3; extern const struct menu_tree_node menu_tree[]; // extern osMessageQueueId_t menuMsgQueueHandle; // extern osSemaphoreId_t elog_menuHandle; uint8_t Menu_Buf[Max_MenuBuf_Size]; UART_HandleTypeDef *Menuhuart = &huart3; MenuPort_t *menuport; MenuPort_t * MenuPort_Init( ) { MenuPort_t *Handle = (MenuPort_t *)malloc(sizeof(MenuPort_t)); if (Handle == NULL) { Menuport_Error("fail to create MenuPort"); return NULL; } Handle->menu = (struct menu *)malloc(sizeof(struct menu)); return Handle; } void MenuPort_Setup( MenuPort_t *menuport, UART_HandleTypeDef *huart, GPIO_TypeDef *gpio, uint16_t pin, uint8_t mode ,uint8_t trans_mode) { menuport->huart = huart; menuport->gpio = gpio; menuport->pin = pin; menuport->mode = mode; menuport->trans_mode = trans_mode; } /* 待传入的函数 实际函数*/ int MenuPort_Send(MenuPort_t *menuport, uint8_t * buf, uint32_t size){ if( menuport->mode ==1 ) { HAL_GPIO_WritePin(menuport->gpio,menuport->pin , SET); } switch (menuport->trans_mode) { case 1: HAL_UART_Transmit_IT(menuport->huart, buf, size); break; case 2: HAL_UART_Transmit_DMA(menuport->huart, buf, size); break; default: HAL_UART_Transmit(menuport->huart, buf, size,0xFFFF); } if( menuport->mode ==1 ) { HAL_GPIO_WritePin( menuport->gpio, menuport->pin , RESET ); } return 0; } void Menuport_receive_callback(MenuPort_t *menuport, uint8_t *buf,uint32_t size) { /* 接收回调 中断直接调用menu, 不经过menuport回调*/ menu_parse_callback( menuport->menu, (char *)buf, size ); } void menuport_exit( MenuPort_t *menuport) { if ( menu_get_state(menuport->menu) != 0 ) { // osSemaphoreRelease(elog_menuHandle); /* 一直持有到菜单结束才释放*/ menu_exit(menuport->menu ); } } void Menuport_Error(char *error) { /* 定制输出 error内容*/ // printf (error); while (1); } void menu_entry( void *argument) { // osStatus_t status; // uint8_t recv_buff[Max_MenuBuf_Size] ={0}; menuport = MenuPort_Init(); MenuPort_Setup( menuport, Menuhuart, NULL, 0, 0, 0 ); /* poll 模式发送,DMA IT 模式会出问题*/ menu_init( menuport->menu, menu_tree, (void*)menuport, ( menu_send_function_type ) MenuPort_Send ); } void Menu_Task( MenuPort_t *menuport){ menu_print_callback(menuport->menu); // for ( ; ; ) // { // osDelay(10); // menu_print_callback(((MenuPort_t *)argument)->menu); // } }