#include "ui/ui_comm_impl.h" #include "ui/ui_task.h" #include "ui/ui_interface.h" #include "ui/ui_info.h" #include "app_init/app_init.h" #include "app_init/task_lock.h" #include "mylog/mylog.h" #include "publicdata/publicdata.h" #include "wdt_task/wdt_task.h" #define UITASK_TASK_ID (TASK_ID_UI) #define UITASK_SLEEP_TIME_MS() (MY_GET_SLEEP_TIME(UITASK_TASK_ID)) #define UITASK_LOCK_INIT() (u8_task_lock_ctrl(UITASK_TASK_ID, TASK_LOCK_OP_INIT)) #define UITASK_LOCK_TAKE() (u8_task_lock_ctrl(UITASK_TASK_ID, TASK_LOCK_OP_TAKE)) #define UITASK_LOCK_GIVE() (u8_task_lock_ctrl(UITASK_TASK_ID, TASK_LOCK_OP_GIVE)) #define UITASK_FEED_DOG() (v_wdt_setFlag(UITASK_TASK_ID)) #define UITASK_LOG(fmt, ...) MYLOG_MSG(UITASK_TASK_ID, (fmt), ##__VA_ARGS__) S_UI_CTRL_DATA s_ui_ctrl; #if 1 //界面跳转 typedef struct { E_UI_ID_TYPE e_ui_type_id; //UI界面 类型ID S8_T s8_language_A_id; //语言A 索引 -1代表不存在 S8_T s8_language_B_id; //语言B 索引 -1代表不存在 S8_T s8_language_C_id; //语言C }S_UI_ID_MAPP_TABLE; /** * ************************************************************************ * @brief - UI 界面地址映射结构体数组 默认为常量不可修改 * * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ const S_UI_ID_MAPP_TABLE s_ui_id_mapp[] = { //界面ID 语言一对应界面地址 语言二对应界面地址 语言三对应界面地址 {E_UI_ID_NULL , -1, -1, -1}, //空 {E_UI_ID_HOME_PAGE , 0, 35, 80}, //首页-待机界面 {E_UI_ID_STANDBY_TWIN_GUN_NO_WORK , 1, 36, 81}, //双枪待机界面 {E_UI_ID_STANDBY_TWIN_GUN_A_WORK , 10, 44, 89}, //A枪充电-双枪待机界面 {E_UI_ID_STANDBY_TWIN_GUN_B_WORK , 11, 45, 90}, //B枪充电-双枪待机界面 {E_UI_ID_STANDBY_TWIN_GUN_AB_WORK , 12, 46, 91}, //AB枪充电-双枪待机界面 {E_UI_ID_STANDBY_SINGLE_GUN_NO_WORK , 2, 37, 82}, //单枪待机界面 {E_UI_ID_STANDBY_SINGLE_GUN_WORK , 13, 47, 92}, //单枪充电-待机界面、 {E_UI_ID_CHAR_METHOD_SELE , 3, 38, 83}, //充电方式选择界面 {E_UI_ID_GUN_NO_LINK , 4, 39, 84}, //枪未连接提示界面 {E_UI_ID_CHAR_CARD , 9, 43, 88}, //充电刷卡等待界面 {E_UI_ID_CHAR_STARTING_UP , 5, 40, 85}, //充电启动中界面 {E_UI_ID_CHAR_IN_REAL_DATA , 6, 41, 86}, //充电中实时信息 {E_UI_ID_CHAR_IN_BATT_DATA , 7, 42, 87}, //充电中电池信息 {E_UI_ID_CHAR_STOP_ING , 14, 48, 93}, //充电停止中提示界面 {E_UI_ID_CHAR_SETTLEMENT , 15, 49, 94}, //充电结算界面 {E_UI_ID_FAULT_INFO , 18, 52, 98}, //故障显示界面 {E_UI_ID_SYS_UPDATE , 51, 51, 97}, //系统升级显示界面 {E_UI_ID_MAINTENANCE , 22, 59, 104}, //维护界面 {E_UI_ID_BASIC_PARAM_SET , 23, 60, 60}, //基本参数设置界面 {E_UI_ID_PROT_PARAM_SET , 24, 61, 61}, //保护参数设置界面 {E_UI_ID_NET_PARAM_SET , 25, 62, 62}, //网络参数设置界面 {E_UI_ID_MODULE_PARAM_SET , 26, 63, 63}, //模块参数设置界面 {E_UI_ID_RESERVE_PARAM_SET , 27, 64, 64}, //预留参数设置界面 {E_UI_ID_OTHER_PARAM_SET , 28, 65, 65}, //其他参数设置界面 {E_UI_ID_HISTORY_ALARM , 30, 58, 103}, //历史告警界面 {E_UI_ID_CHARGE_RECORD , 29, 57, 102}, //充电记录界面 {E_UI_ID_VERSION_INFO , 20, 54, 100}, //版本信息界面 {E_UI_ID_CONFIRM_OPERATION , 56, 56, 56}, //请确认操作界面 }; /** * ************************************************************************ * @brief - 传入ui界面类型 返回对应界面id号 * * @param[in] e_id_type - 界面ui类型 * * @return S8_T - -1 不存在 0-N ID地址号 * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static S8_T s8_ui_get_mapp_index(E_UI_ID_TYPE e_id_type) { S8_T s8_ret = -1; U8_T i,u8_mapp_size = sizeof(s_ui_id_mapp) / sizeof(S_UI_ID_MAPP_TABLE); //获取mapp 数量 if(e_id_type > u8_mapp_size) return s8_ret; //传入数据超过最大值 不执行 for (i = 0; i < u8_mapp_size; i++) { if(s_ui_id_mapp[i].e_ui_type_id == e_id_type) { if(s_ui_ctrl.u8_lalanguage_type == 0) s8_ret = s_ui_id_mapp[i].s8_language_A_id; else if(s_ui_ctrl.u8_lalanguage_type == 1) s8_ret = s_ui_id_mapp[i].s8_language_B_id; else s8_ret = s_ui_id_mapp[i].s8_language_C_id; break; } } return s8_ret; } /** * ************************************************************************ * @brief - 传入UI界面 id地址 获取对应的界面类型 * * @param[in] u8_id - ui界面id地址 * * @return E_UI_ID_TYPE - 对应的界面类型 E_UI_ID_NULL未空 * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static E_UI_ID_TYPE e_ui_get_mapp_type(U8_T u8_id) { E_UI_ID_TYPE e_ret = E_UI_ID_NULL; U8_T i,u8_mapp_size = sizeof(s_ui_id_mapp) / sizeof(S_UI_ID_MAPP_TABLE); //获取mapp 数量 S8_T s8_mapp_id; for (i = 0; i < u8_mapp_size; i++) { if(s_ui_ctrl.u8_lalanguage_type == 0) s8_mapp_id = s_ui_id_mapp[i].s8_language_A_id; else if(s_ui_ctrl.u8_lalanguage_type == 1) s8_mapp_id = s_ui_id_mapp[i].s8_language_B_id; else s8_mapp_id = s_ui_id_mapp[i].s8_language_C_id; if(s8_mapp_id == u8_id) { e_ret = s_ui_id_mapp[i].e_ui_type_id; break; } } return e_ret; } /** * ************************************************************************ * @brief - 切换界面 传入界面id类型 查找映射表对应的实际界面id 并发送切换命令 * * @param[in] e_id_type - 界面id类型 * * @return U8_T - 0不存在 1存在且成功跳转 * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static U8_T u8_ui_switch_interface(E_UI_ID_TYPE e_id_type) { U8_T u8_ret = 0; S8_T s8_ui_id; s8_ui_id = s8_ui_get_mapp_index(e_id_type); //获取 数据对应映射表地址 if(s8_ui_id != -1) { v_ui_id_change(s8_ui_id); //发送界面跳转命令 u8_ret = 1; } return u8_ret; } /** * ************************************************************************ * @brief - 检查界面是否需要切换 - 获取设置界面对应id 与接收id判断 不一致则设置跳转界面 * * @return U8_T - 0不跳转 1跳转 * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static U8_T u8_ui_cheak_id_change() { S8_T s8_ui_id; s8_ui_id = s8_ui_get_mapp_index(s_ui_ctrl.e_set_pic_id); //获取 数据对应映射表地址 if(s8_ui_id == -1) { s_ui_ctrl.e_set_pic_id = E_UI_ID_HOME_PAGE; //如果设置界面不存在 则默认恢复到初始界面 return 0; } if(s8_ui_id != s_ui_ctrl.u8_ret_pic_id) //读取界面和设置界面不一致 则设置切换界面 { u8_ui_switch_interface(s_ui_ctrl.e_set_pic_id); return 1; } return 0; } /** * ************************************************************************ * @brief - 界面跳转控制函数 周期查询当前界面数值 检查界面切换操作 * * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static void v_ui_jump_ctrl() { if(s_ui_ctrl.u16_timer_cnt % NUM_1000 == 0) //1s查询一次当前界面id v_ui_read_id_reg(); if(u8_ui_cheak_id_change()) //界面切换检查 { v_ui_read_id_reg(); } } #endif #if 1 //数据接收控制 /** * ************************************************************************ * @brief - 解析控制寄存器返回数据 * * @param[in] command - 接收数据 * * * @author jiankalka * @date 2025-09-05 * ************************************************************************ */ void v_reg_data_handler(UICOMM_CMD_T *command) //数据解析:界面id { if(command->u16_addr == UI_ID_ADDR) //界面数据 { s_ui_ctrl.u8_ret_pic_id = command->u32_data; //更新界面图片id } } /** * ************************************************************************ * @brief - 解析数据寄存器返回\下发数据 * * @param[in] command - 接收数据 * * * @author jiankalka * @date 2025-09-05 * ************************************************************************ */ void v_var_data_handler(UICOMM_CMD_T *t_cmd) //数据解析: 变量 { U16_T addr_base; addr_base = t_cmd->u16_addr & UI_DATA_ADDR_MASK; //高位,用于区分变量类型 //printf("UI recv addr %x\r\n",t_cmd->u16_addr); switch(addr_base) { case UI_TCH_ADDR: //触控 { v_set_recv_data(t_cmd->u16_addr,t_cmd->u32_data); //设置触控信息 break; } case UI_CFG_ADDR: //可读写变量(配置变量) { v_ui_param_set_value(t_cmd->u16_addr,t_cmd->u32_data); //设置配置参数数值 break; } case UI_STR_ADDR: //字符串 case UI_STR_ADDR_2: case UI_STR_APN: case UI_QR_CODE_GUN_A: case UI_QR_CODE_GUN_B: { v_set_recv_str_data(t_cmd->u16_addr,t_cmd->u8_str,t_cmd->u8_str_len); //设置字符串信息 break; } default: break; } } /************************************************************* 函数名称: s32_uicomm_unpacket 函数功能: 迪文人机界面通信协议解包函数 输入参数: 无 输出参数: cmd -- 返回解包的结果 返回值 :返回0表示解包成功,返回-1表示解包失败 **************************************************************/ static S32_T s32_uicomm_unpacket(UICOMM_CMD_T *cmd , U8_T *g_u8_ui_rx_buf ,U16_T len) //驱动层解析 { U32_T i,j, n, h; S32_T ret = -1; n = len; //此次接收总数据长度 h = 0; /*查找头尾标志以便取得一完整的数据包*/ while (n >= 8) { /*地址不相符*/ if(g_u8_ui_rx_buf[h] != FRAME_HEAD_H || g_u8_ui_rx_buf[h+1] != FRAME_HEAD_L)/*帧头不相符,头指针前移一个位置*/ { h++; n--; continue; } if(n < g_u8_ui_rx_buf[h+2]+3) { break; } /*功能码不相符,头指针前移一个位置, 功能码既不是读控制寄存器应答,也不是读数据寄存器应答*/ if(g_u8_ui_rx_buf[h+3] != UI_RD_REG_CODE && g_u8_ui_rx_buf[h+3] != UI_RD_DATA_CODE) { h++; n--; continue; } cmd->u8_func_code = g_u8_ui_rx_buf[h+3]; //功能码 if(cmd->u8_func_code == UI_RD_DATA_CODE) //读数据寄存器的应答帧 { cmd->u16_addr = (g_u8_ui_rx_buf[h+4]<<8) + g_u8_ui_rx_buf[h+5]; //变量地址 高位在前低位在后,即正常顺序 cmd->u16_cnt = g_u8_ui_rx_buf[h+6]*2; //迪文一个字,两个字节长度,所以*2 //从变量地址开始读cnt个字长度数据 if(cmd->u16_cnt == 2) //长度为2 { cmd->u32_data = (g_u8_ui_rx_buf[h+7]<<8) + g_u8_ui_rx_buf[h+8]; } else if(cmd->u16_cnt == 4) //长度为4 { cmd->u32_data = ((U32_T)g_u8_ui_rx_buf[h+7]<<24) + (g_u8_ui_rx_buf[h+8]<<16) + (g_u8_ui_rx_buf[h+9]<<8) + (g_u8_ui_rx_buf[h+10]); if((g_u8_ui_rx_buf[h+8]==0xFF)&&(g_u8_ui_rx_buf[h+9]==0xFF)) { cmd->u8_str_len = 1; cmd->u8_str[0] = g_u8_ui_rx_buf[h+7]; cmd->u8_str[1] = 0x00; } else if((g_u8_ui_rx_buf[h+9]==0xFF)&&(g_u8_ui_rx_buf[h+10]==0xFF)) { cmd->u8_str_len = 2; cmd->u8_str[0] = g_u8_ui_rx_buf[h+7]; cmd->u8_str[1] = g_u8_ui_rx_buf[h+8]; cmd->u8_str[2] = 0x00; } } else if((cmd->u16_cnt > 4)&&(cmd->u16_cnt <= NUM_32)) { for(i=h+7; iu16_cnt+h+7-1; i++) { if((g_u8_ui_rx_buf[i]==0xFF)&&(g_u8_ui_rx_buf[i+1]==0xFF)) { cmd->u8_str_len = i-h-7; for(j=0; ju8_str_len; j++) { cmd->u8_str[j] = g_u8_ui_rx_buf[j+h+7]; } break; } } } } else if(cmd->u8_func_code == UI_RD_REG_CODE) //读控制寄存器 { cmd->u16_addr = g_u8_ui_rx_buf[h+4]; //控制寄存器地址 cmd->u16_cnt = g_u8_ui_rx_buf[h+5]; //字节数 if(cmd->u16_addr == UI_ID_ADDR) //读当前界面地址 { cmd->u32_data = (g_u8_ui_rx_buf[h+6]<<8) + g_u8_ui_rx_buf[h+7]; } else { cmd->u32_data = g_u8_ui_rx_buf[h+6]; } } ret = 0; break; } return ret; } static void v_ui_recv_data() { UICOMM_CMD_T command; U8_T u8_readLen,u8_recvBuf[UI_RX_BUF_SIZE] = {0}; //接收缓存 u8_readLen = u16_ui_recv_data(u8_recvBuf , UI_RX_BUF_SIZE); if(u8_readLen == 0) return; s_ui_ctrl.u16_outtime_cnt = 0; //清空通信超时计数 memset(&command , 0,sizeof(UICOMM_CMD_T)); if(s32_uicomm_unpacket(&command, u8_recvBuf , u8_readLen) == 0) { switch(command.u8_func_code) { case UI_RD_REG_CODE: v_reg_data_handler(&command); break; case UI_RD_DATA_CODE: v_var_data_handler(&command); break; default: break; } } } #endif #if 1 //内部使用 公共函数 /** * ************************************************************************ * @brief - 控制跳转界面 * * @param[in] e_set_id - 跳转界面类型 * @param[in] u8_jump_para - 跳转界面 传递信息 * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static void v_ui_set_jump(E_UI_ID_TYPE e_set_id , U8_T u8_jump_para) //界面跳转接口 { if(e_set_id == s_ui_ctrl.e_set_pic_id) //跳转界面 未变化 return; s_ui_ctrl.e_previous_id = s_ui_ctrl.e_set_pic_id; //赋值上一界面地址 s_ui_ctrl.e_set_pic_id = e_set_id; //赋值跳转标签 s_ui_ctrl.u8_jump_remark = u8_jump_para; //跳转传递信息 s_ui_ctrl.ulong_timer = get_current_seconds(); //跳转时间戳 s_ui_ctrl.u8_first_jump = 1; //界面跳转标志 v_ui_ctrl_var_clear(); //printf("界面跳转 %d -> %d 时间戳 %ld\r\n",s_ui_ctrl.e_previous_id,s_ui_ctrl.e_set_pic_id,s_ui_ctrl.ulong_timer); UI_LOG("UI JUMP: prev=%d -> cur=%d\n",s_ui_ctrl.e_previous_id,s_ui_ctrl.e_set_pic_id); } /** * ************************************************************************ * @brief - 返回待机界面-根据枪数量 选择是单枪界面还是双枪界面 * * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static void v_ui_jump_standby_show() { U8_T u8_gunCnt = s_ui_ctrl.u8_gunCnt; U8_T u8_workA = u8_ui_gun_work_state(GUN_A); //0空闲 1启动中 2充电中 U8_T u8_workB = u8_ui_gun_work_state(GUN_B); //判断界面跳转 if(u8_gunCnt == 1) { if(u8_workA == 0) v_ui_set_jump(E_UI_ID_STANDBY_SINGLE_GUN_NO_WORK,0); //跳转单枪界面 else { s_ui_ctrl.u8_gunNo = 0; v_ui_set_jump(E_UI_ID_STANDBY_SINGLE_GUN_WORK,0); //跳转单枪待机界面 } } else { if(u8_workA == 0 && u8_workB == 0) //都空闲 v_ui_set_jump(E_UI_ID_STANDBY_TWIN_GUN_NO_WORK,0); //跳转双枪界面 else if(u8_workA != 0 && u8_workB == 0) //A枪充电 v_ui_set_jump(E_UI_ID_STANDBY_TWIN_GUN_A_WORK,0); //A枪充电-双枪待机界面 else if(u8_workA == 0 && u8_workB != 0) //B枪充电 v_ui_set_jump(E_UI_ID_STANDBY_TWIN_GUN_B_WORK,0); //B枪充电-双枪待机界面 else if(u8_workA != 0 && u8_workB != 0) //都充电 v_ui_set_jump(E_UI_ID_STANDBY_TWIN_GUN_AB_WORK,0); //AB枪充电-双枪待机界面 } } /** * flow 经 v_flow_request_ui_idle_recover(内部 v_ui_request_idle_screen_recover)置位:本处清标志并回待机界面。 */ static void v_ui_flow_plat_auth_idle_recover_poll(void) { if (s_ui_ctrl.u8_flow_idle_recover_req != 0U) { s_ui_ctrl.u8_flow_idle_recover_req = 0U; v_ui_jump_standby_show(); } } /** * ************************************************************************ * @brief - 获取界面首次跳转标志 * * * @return U8_T - 0非首次跳转 1首次跳转 * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static U8_T u8_ui_get_first_jump_flag() { U8_T ret = 0; if(s_ui_ctrl.u8_first_jump == 1 /*&& u16_pcu_put_host_data(E_PCU_PUT_HOST_DATA_SERIAL_LONG) != 0*/) //界面首次跳转且桩编号下发完成 { s_ui_ctrl.u8_first_jump = 0; ret = 1; } return ret; } /** * ************************************************************************ * @brief - UI 桩编号信息发送 * * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static void v_ui_set_pile_no_info() { U8_T u8_mag[NUM_64]; U8_T u8_len = u8_ui_get_sys_str(0,E_UI_GET_STR_PILE_NO,0,u8_mag,NUM_64); if(u8_len == 0) return; v_disp_string_handler(UI_PILE_NO,u8_mag ,u8_len); } /** * ************************************************************************ * @brief - 设置版本信息 * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static void v_ui_set_version_info() { U8_T u8_mag[NUM_64]; U8_T u8_len = u8_ui_get_sys_str(0,E_UI_GET_STR_VERSION_INFO,0,u8_mag,NUM_64); if(u8_len == 0) return; v_disp_string_handler(UI_VERSION_INFO,u8_mag ,u8_len); u8_len = u8_ui_get_sys_str(0,E_UI_GET_STR_VERSION_INFO,1,u8_mag,NUM_64); if(u8_len == 0) return; v_disp_string_handler(UI_VERSION_INFO2,u8_mag ,u8_len); } /** * ************************************************************************ * @brief - 枪状态信息发送 * * * * @author jiankalka * @date 2026-01-23 * ************************************************************************ */ static void v_ui_set_gun_state_info() { U8_T u8_gunNo ; U32_T u32_addr ; E_CHARGE_STATUS e_charge_status ; //获取充电状态 for (u8_gunNo = 0; u8_gunNo < GUN_MAX_CNT; u8_gunNo++) { u32_addr = (u8_gunNo == GUN_A) ? UI_GUN_A_STATE_ID : UI_GUN_B_STATE_ID; e_charge_status = e_ui_get_charge_status(u8_gunNo); //获取充电状态 v_disp_text_clear(u32_addr); //清空 v_disp_string_handler(u32_addr, (U8_T *)c_charge_status[e_charge_status], strlen(c_charge_status[e_charge_status])); //枪状态文本显示地址 } } /** * ************************************************************************ * @brief - 设置抢号信息 -- 多次调用 因此统一做成函数 * * @param[in] u8_gunNo - 抢号 0-N * * * @author jiankalka * @date 2025-09-09 * ************************************************************************ */ static void v_ui_set_gun_id_info(U8_T u8_gunNo) { U8_T gun_mag[2] = {'A','B'}; v_disp_text_clear(UI_GUN_ID); //清空 v_disp_string_handler(UI_GUN_ID, &gun_mag[u8_gunNo], 1);//枪号文本显示地址 } /** * ************************************************************************ * @brief - 屏幕点击停止充电执行函数 * * @param[in] u8_gunNo - 抢号 0-N * * * @author jiankalka * @date 2025-09-09 * ************************************************************************ */ static void v_ui_stop_char_ctrl(U8_T u8_gunNo) { START_REASON e_type = e_ui_get_charge_way(u8_gunNo); //获取启动方式 if(e_type == CTR_CMD_ONCARD_START) //在线卡 { s_ui_ctrl.u8_gunNo = u8_gunNo; v_ui_set_jump(E_UI_ID_CHAR_CARD,0xFF); //跳转请刷卡提示界面 : 0xFF 停止操作 return; } else if(e_type == CTR_CMD_BS_START ) //后台启动 不允许停止 { return; } U8_T u8_stop_res = u8_ui_ctrl_charge(u8_gunNo, CMD_OFF, E_START_DEBUG); //控制停止充电 if(u8_stop_res) { s_ui_ctrl.u8_gunNo = u8_gunNo; v_ui_set_jump(E_UI_ID_CHAR_STOP_ING,0); //充电停止 } } /** * ************************************************************************ * @brief -故障信息检查,检测到故障 跳转到故障界面 - 多个界面调用 因此统一做成接口函数 * * @param[in] u8_type - 0正常判断故障 1故障判断恢复 * * * @author jiankalka * @date 2025-09-09 * ************************************************************************ */ static void v_ui_fault_chaek(U8_T u8_type) { U8_T u8_fault_num = u16_ui_get_sys_data(GUN_A,E_UI_GET_DATA_FAULT_NUM,0); //故障数量 if(u8_type == 0 && u8_fault_num != 0) //正常时 判断故障信息 { v_ui_set_jump(E_UI_ID_FAULT_INFO,0); //跳转故障显示界面 } else if(u8_type == 1 && u8_fault_num == 0) //故障时 判断恢复 { v_ui_jump_standby_show(); } } /** * ************************************************************************ * @brief - 程序更细标志 升级时跳转升级界面 * * * * @author jiankalka * @date 2026-01-22 * ************************************************************************ */ static void v_ui_update_cheak() { U8_T u8_bs_update_flag = u16_ui_get_sys_data(GUN_B,E_UI_GET_DATA_BS_UPDATE_FLAG,0); //程序更新标志 if(u8_bs_update_flag) { v_ui_set_jump(E_UI_ID_SYS_UPDATE,0); //系统升级显示界面 } } /** * ************************************************************************ * @brief - 待机界面跳转检查 触屏操作或者维护密码输入完成 跳转对应界面 * * * * @author jiankalka * @date 2026-03-13 * ************************************************************************ */ static void v_ui_standby_jump_check() { //触控跳转 if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_other_change_A) { s_ui_ctrl.u8_gunNo = 0; v_ui_set_jump(E_UI_ID_CHAR_METHOD_SELE,0); //跳转充电方式选择界面 } else if (s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_other_change_B) { s_ui_ctrl.u8_gunNo = 1; v_ui_set_jump(E_UI_ID_CHAR_METHOD_SELE,1); //跳转充电方式选择界面 } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_charge_info_A) { s_ui_ctrl.u8_gunNo = 0; v_ui_set_jump(E_UI_ID_CHAR_IN_REAL_DATA,0); //跳转枪充电中实时信息 } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_charge_info_B) { s_ui_ctrl.u8_gunNo = 1; v_ui_set_jump(E_UI_ID_CHAR_IN_REAL_DATA,0); //跳转枪充电中实时信息 } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_charge_state_A) { U8_T u8_fault_num = u16_ui_get_sys_data(GUN_A,E_UI_GET_DATA_FAULT_NUM,1); //故障数量 if(u8_fault_num != 0) { s_ui_ctrl.u8_gunNo = 0; v_ui_set_jump(E_UI_ID_FAULT_INFO,0); //跳转故障显示界面 return; } } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_charge_state_B) { U8_T u8_fault_num = u16_ui_get_sys_data(GUN_B,E_UI_GET_DATA_FAULT_NUM,1); //故障数量 if(u8_fault_num != 0) { s_ui_ctrl.u8_gunNo = 1; v_ui_set_jump(E_UI_ID_FAULT_INFO,0); //跳转故障显示界面 return; } } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_fee_info) { } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_card_info) { } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_type == 1) //维护密码输入完成 跳转维护界面 { if(s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_len != 0) { if(strcmp((char *)s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_str, UI_MAINTENANCE_PWD) == 0) { v_ui_set_jump(E_UI_ID_MAINTENANCE,0); //跳转维护界面 } } s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_type = 0; //重置维护密码输入标志 } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_maintain) //维护界面返回标志 { s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_maintain = 0; //重置维护界面返回标志 if(++s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_maintain_cnt >= NUM_5) //重置维护界面返回计数 { s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_maintain_cnt = 0; //重置维护界面返回计数 v_ui_set_jump(E_UI_ID_MAINTENANCE,0); //跳转维护界面 } } else { } } #endif #if 1 //UI 界面数据显示控制 /** * ************************************************************************ * @brief - 界面异常时执行 强制设置到正常界面 * * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static void v_ui_show_null() { s_ui_ctrl.e_set_pic_id = E_UI_ID_HOME_PAGE; } /** * ************************************************************************ * @brief - 待机界面-屏保界面 执行函数--屏幕点击或者插枪 立即跳转首页 * * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static void v_ui_show_home_page() { U8_T u8_gunLinkA = u16_ui_get_sys_data(GUN_A,E_UI_GET_DATA_GUN_LINK,0); U8_T u8_gunLinkB = u16_ui_get_sys_data(GUN_B,E_UI_GET_DATA_GUN_LINK,0); U8_T u8_screen_saver_en = u16_ui_get_sys_data(0, E_UI_GET_DATA_SCREEN_SAVER_EN, 0); //屏保使能标志 0未使能 1使能 //屏保使能 且 当前界面为屏保界面 且 (插枪或者触控跳转待机界面) if(!u8_screen_saver_en || u8_gunLinkA || u8_gunLinkB || s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_frist_page) { v_ui_jump_standby_show(); } v_ui_fault_chaek(0); //故障信息监测 v_ui_update_cheak(); //程序升级检查 } /** * ************************************************************************ * @brief - 双枪待机时显示 -二维码、联网标志、空闲跳转屏保 * * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static void v_ui_show_standby_twin_gun() { U8_T u8_gunLinkA = u16_ui_get_sys_data(GUN_A,E_UI_GET_DATA_GUN_LINK,0); U8_T u8_gunLinkB = u16_ui_get_sys_data(GUN_B,E_UI_GET_DATA_GUN_LINK,0); U8_T u8_msg[NUM_256] ={0}; U8_T u8_qr_code_len; U8_T u8_bs_comm_flag = u16_ui_get_sys_data(GUN_B,E_UI_GET_DATA_BS_COMM_FLAG,0); //平台连接标志 0未连接 1已连接 U8_T u8_screen_saver_en = u16_ui_get_sys_data(0, E_UI_GET_DATA_SCREEN_SAVER_EN, 0); //屏保使能标志 0未使能 1使能 v_ui_fault_chaek(0); //故障信息监测 v_ui_update_cheak(); //程序升级检查 //数据发送 if(u8_ui_get_first_jump_flag() || //是否为首次跳转 (s_ui_ctrl.u16_timer_cnt % NUM_10000 == 0)) //10miao { //发送二维码信息 //发送二维码信息 u8_qr_code_len = u8_ui_get_sys_str(GUN_A,E_UI_GET_STR_QRcode,0,u8_msg ,NUM_256); if(u8_qr_code_len != 0) { v_disp_string_handler(UI_QR_CODE_GUN_A,u8_msg ,u8_qr_code_len); } u8_qr_code_len = u8_ui_get_sys_str(GUN_B,E_UI_GET_STR_QRcode,0,u8_msg ,NUM_256); if(u8_qr_code_len != 0) { v_disp_string_handler(UI_QR_CODE_GUN_B,u8_msg ,u8_qr_code_len); } v_ui_set_pile_no_info(); //桩编号 } //周期显示 if(s_ui_ctrl.u16_timer_cnt % NUM_1000 == 0 ) //一秒 { //联网标志 v_wr_var_data(UI_WIFI_FLAG,u8_bs_comm_flag); v_ui_set_gun_state_info(); //枪状态显示 } //空闲时跳转屏保时间 if(u8_screen_saver_en && u8_gunLinkA == 0 && u8_gunLinkB == 0 && u32_safe_seconds_since(s_ui_ctrl.ulong_timer) > UI_FREE_CHANGE_TIME) { v_ui_set_jump(E_UI_ID_HOME_PAGE,0); //跳转屏保界面 } //触控跳转 - 双枪待机界面点击区域较多 因此单独拿出来 v_ui_standby_jump_check(); } /** * ************************************************************************ * @brief - 充电时 双枪待机界面显示 -充电枪显示充电信息 - 未充电枪显示二维码信息 * * @param[in] u8_type - 0 A枪充电B枪空闲 1B枪充电A枪空闲 2AB枪充电 * * * @author jiankalka * @date 2025-09-11 * ************************************************************************ */ static void v_ui_show_standbu_twin_gun_work(U8_T u8_type) { U8_T u8_bs_comm_flag = u16_ui_get_sys_data(GUN_B,E_UI_GET_DATA_BS_COMM_FLAG,0); //平台连接标志 0未连接 1已连接 U8_T u8_msg[NUM_256] ={0}; U8_T u8_qr_code_len; //数据发送 if(u8_ui_get_first_jump_flag()) //是否为首次跳转 { //发送二维码信息 //发送二维码信息 u8_qr_code_len = u8_ui_get_sys_str(GUN_A,E_UI_GET_STR_QRcode,0,u8_msg ,NUM_256); if(u8_type == 1 && u8_qr_code_len != 0) { v_disp_string_handler(UI_QR_CODE_GUN_A,u8_msg ,u8_qr_code_len); } u8_qr_code_len = u8_ui_get_sys_str(GUN_B,E_UI_GET_STR_QRcode,0,u8_msg ,NUM_256); if(u8_type == 0 && u8_qr_code_len != 0) { v_disp_string_handler(UI_QR_CODE_GUN_B,u8_msg ,u8_qr_code_len); } v_ui_set_pile_no_info(); //桩编号 } //周期显示 if(s_ui_ctrl.u16_timer_cnt % NUM_1000 == 0 ) //一秒 { //联网标志 v_wr_var_data(UI_WIFI_FLAG,u8_bs_comm_flag); //充电信息显示 if(u8_type == 2 || u8_type == 0) v_ui_standby_char_real_info(GUN_A); if(u8_type == 2 || u8_type == 1) v_ui_standby_char_real_info(GUN_B); //v_ui_jump_standby_show(); //待机界面更新显示 v_show_AnimationIcon(UI_ANIMATION_ICON, 88); //动画图标 v_ui_set_gun_state_info(); //枪状态显示 } //触控跳转 - 双枪待机界面点击区域较多 因此单独拿出来 v_ui_standby_jump_check(); } /** * ************************************************************************ * @brief - 单枪待机时显示 -二维码、联网标志、空闲跳转屏保 * * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static void v_ui_show_standby_single_gun() { U8_T u8_gunLinkA = u16_ui_get_sys_data(GUN_A,E_UI_GET_DATA_GUN_LINK,0); U8_T u8_msg[NUM_256] ={0}; U8_T u8_qr_code_len; U8_T u8_bs_comm_flag = u16_ui_get_sys_data(GUN_B,E_UI_GET_DATA_BS_COMM_FLAG,0); //平台连接标志 0未连接 1已连接 U8_T u8_screen_saver_en = u16_ui_get_sys_data(0, E_UI_GET_DATA_SCREEN_SAVER_EN, 0); //屏保使能标志 0未使能 1使能 v_ui_fault_chaek(0); //故障信息监测 //数据发送 if(u8_ui_get_first_jump_flag()) //是否为首次跳转 { //发送二维码信息 u8_qr_code_len = u8_ui_get_sys_str(GUN_A,E_UI_GET_STR_QRcode,0,u8_msg ,NUM_256); if(u8_qr_code_len != 0) { v_disp_string_handler(UI_QR_CODE_GUN_A,u8_msg ,u8_qr_code_len); } v_ui_set_pile_no_info(); //桩编号 } //周期显示 if(s_ui_ctrl.u16_timer_cnt % NUM_1000 == 0) //一秒 { //联网标志 v_wr_var_data(UI_WIFI_FLAG,u8_bs_comm_flag); v_ui_set_gun_state_info(); //枪状态显示 } //空闲时跳转屏保时间 if(u8_screen_saver_en && u8_gunLinkA == 0 && u32_safe_seconds_since(s_ui_ctrl.ulong_timer) > UI_FREE_CHANGE_TIME) { v_ui_set_jump(E_UI_ID_HOME_PAGE,0); //跳转屏保界面 } //触控跳转 - 单枪待机界面点击区域较少 因此直接放在一起 v_ui_standby_jump_check(); } /** * ************************************************************************ * @brief - 充电时 单枪待机界面显示 -充电枪显示充电信息 * * @param[in] * @author jiankalka * @date 2025-09-11 * ************************************************************************ */ static void v_ui_show_single_gun_work() { U8_T u8_bs_comm_flag = u16_ui_get_sys_data(GUN_B,E_UI_GET_DATA_BS_COMM_FLAG,0); //平台连接标志 0未连接 1已连接 //U8_T u8_msg[NUM_256] ={0}; //周期显示 if(s_ui_ctrl.u16_timer_cnt % NUM_1000 == 0 ) //一秒 { //联网标志 v_wr_var_data(UI_WIFI_FLAG,u8_bs_comm_flag); //充电信息显示 v_ui_standby_char_real_info(GUN_A); v_show_AnimationIcon(UI_ANIMATION_ICON, 88); //动画图标 v_ui_set_gun_state_info(); //枪状态显示 } //触控跳转 待机界面点击区域较多 因此单独拿出来 v_ui_standby_jump_check(); } /** * ************************************************************************ * @brief - 充电方式选择 * * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static void v_ui_show_char_method_sele() { U8_T u8_gunNo = s_ui_ctrl.u8_gunNo; //获取枪号 U8_T u8_gunLink = u16_ui_get_sys_data(u8_gunNo,E_UI_GET_DATA_GUN_LINK,0); U8_T u8_state = u8_ui_gun_work_state(u8_gunNo); //0空闲 1启动中 2充电中 U8_T u8_start_res; if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_vin_start) { if(u8_gunLink == 0) { s_ui_ctrl.u8_gunNo = u8_gunNo; v_ui_set_jump(E_UI_ID_GUN_NO_LINK,0); //跳转枪未连接 提示界面 } else if(u8_state == 2) //充电中 { s_ui_ctrl.u8_gunNo = u8_gunNo; v_ui_set_jump(E_UI_ID_CHAR_IN_REAL_DATA,0); //跳转枪充电中实时信息 } else { u8_start_res = u8_ui_ctrl_charge(u8_gunNo , CMD_ON , E_START_VIN); if(u8_start_res) { s_ui_ctrl.u8_gunNo = u8_gunNo; v_ui_set_jump(E_UI_ID_CHAR_STARTING_UP,0); //跳转启动中 } } } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_card_start) { if(u8_gunLink == 0) { s_ui_ctrl.u8_gunNo = u8_gunNo; v_ui_set_jump(E_UI_ID_GUN_NO_LINK,0); //跳转枪未连接 提示界面 } else if(u8_state == 2) //充电中 { s_ui_ctrl.u8_gunNo = u8_gunNo; v_ui_set_jump(E_UI_ID_CHAR_IN_REAL_DATA,0); //跳转枪充电中实时信息 } else { s_ui_ctrl.u8_gunNo = u8_gunNo; v_ui_set_jump(E_UI_ID_CHAR_CARD,0); //跳转请刷卡提示界面 : } } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_account_start) { } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_return) { v_ui_jump_standby_show(); } } /** * ************************************************************************ * @brief - 未插枪提示 * * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static void v_ui_show_gun_on_link() { U8_T u8_gunNo = s_ui_ctrl.u8_gunNo; //获取枪号 //数据发送 if(u8_ui_get_first_jump_flag()) //是否为首次跳转 { v_ui_set_gun_id_info(u8_gunNo); //显示枪号 } //跳转监听 if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_return) { v_ui_jump_standby_show(); } } /** * ************************************************************************ * @brief - 充电启动中显示 - 倒计时 * * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static void v_ui_show_char_starting_up() { U8_T u8_gunNo = s_ui_ctrl.u8_gunNo; //获取枪号 U8_T u8_gunLink = u16_ui_get_sys_data(u8_gunNo,E_UI_GET_DATA_GUN_LINK,0); U8_T u8_state = u16_ui_get_sys_data(u8_gunNo,E_UI_GET_DATA_FLOW_STAET,0); //0空闲 1充电启动 2绝缘启动 3绝缘计算完成 4绝缘检测模块停止 5开始预充 6预充完成 7充电中 8BMS通讯超时 9充电停止 10充电停止完成 U8_T u8_timer = u32_safe_seconds_since(s_ui_ctrl.ulong_timer); //数据发送 if(u8_ui_get_first_jump_flag()) //是否为首次跳转 { v_ui_set_gun_id_info(u8_gunNo); //显示枪号 } //周期发送显示 倒计时 和当前充电流程 if(s_ui_ctrl.u16_timer_cnt % NUM_1000 == 0) { if(s_ui_ctrl.u8_lalanguage_type == 0) v_disp_string_handler(UI_START_STATE_ID, (U8_T *)ui_flow_real_mag[u8_state], sizeof(ui_flow_real_mag[u8_state])); else v_disp_string_handler(UI_START_STATE_ID, (U8_T *)ui_flow_real_mag_e[u8_state], sizeof(ui_flow_real_mag_e[u8_state])); //倒计时 if(u8_timer <= UI_STATE_TIMEOUT) v_wr_var_data(UI_TIMER_ADDR, UI_STATE_TIMEOUT - u8_timer); else v_wr_var_data(UI_TIMER_ADDR, 0); } //状态超时检查 if(u8_timer >= UI_STATE_TIMEOUT) { v_ui_jump_standby_show(); //首页 } //跳转检查 if(u8_state == 7) //充电中 { s_ui_ctrl.u8_gunNo = u8_gunNo; v_ui_set_jump(E_UI_ID_CHAR_IN_REAL_DATA,0); //跳转枪充电中实时信息 } else if(u8_state >= 9) //充电停止 { s_ui_ctrl.u8_gunNo = u8_gunNo; v_ui_set_jump(E_UI_ID_CHAR_STOP_ING,0); //充电停止 } else if(u8_gunLink == 0) { v_ui_jump_standby_show(); //首页 } } /** * ************************************************************************ * @brief - 请刷卡提示界面 * * * * @author jiankalka * @date 2025-12-04 * ************************************************************************ */ static void v_ui_show_char_card_cheak() { U8_T u8_gunNo = s_ui_ctrl.u8_gunNo; //获取枪号 U8_T u8_timer = u32_safe_seconds_since(s_ui_ctrl.ulong_timer); char show_mag[64] = {0}; U8_T u8_start_res; if(s_ui_ctrl.u16_timer_cnt % NUM_1000 == 0) { if(u8_timer <= UI_STATE_TIMEOUT) //倒计时 { if(s_ui_ctrl.u8_lalanguage_type == 0) snprintf(show_mag ,64, "%s [%d]",c_wait_mag,UI_STATE_TIMEOUT - u8_timer ); else snprintf(show_mag ,64, "%s [%d]",p_wait_mag,UI_STATE_TIMEOUT - u8_timer ); if(s_ui_ctrl.u8_jump_remark == 0xFF) //如果是停止充电 { u8_start_res = u8_ui_ctrl_charge(u8_gunNo , CMD_OFF ,E_START_CARD); //刷卡停止 //E_START_DEBUG E_START_CARD if(u8_start_res) { s_ui_ctrl.u8_gunNo = u8_gunNo; v_ui_set_jump(E_UI_ID_CHAR_STARTING_UP,0); //跳转启动中 } } else { u8_start_res = u8_ui_ctrl_charge(u8_gunNo , CMD_ON ,E_START_CARD); //刷卡启动 //E_START_DEBUG E_START_CARD if(u8_start_res) { s_ui_ctrl.u8_gunNo = u8_gunNo; v_ui_set_jump(E_UI_ID_CHAR_STARTING_UP,0); //跳转启动中 } } } else { //Время ожидания считывания карты истекло! //Card swipe timeout ! if(s_ui_ctrl.u8_lalanguage_type == 0) snprintf(show_mag ,64, "%s",c_card_timeout_mag); else snprintf(show_mag ,64, "%s",p_card_timeout_mag); mSleep(2000); s_ui_ctrl.u8_gunNo = u8_gunNo; v_ui_set_jump(E_UI_ID_CHAR_METHOD_SELE,1); //跳转单枪界面 } //printf("ui %s\r\n",show_mag); v_disp_text_clear(UI_CARD_SHOW_ID); //清空 v_disp_string_handler(UI_CARD_SHOW_ID, (U8_T *)show_mag, strlen(show_mag));//枪号文本显示地址 } if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_exit) { v_ui_jump_standby_show(); } } /** * ************************************************************************ * @brief - 充电中实时信息显示 * * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static void v_ui_show_char_in_real_data() { U8_T u8_gunNo = s_ui_ctrl.u8_gunNo; U8_T u8_timer = u32_safe_seconds_since(s_ui_ctrl.ulong_timer); U8_T u8_state = u8_ui_gun_work_state(u8_gunNo); //0空闲 1启动中 2充电中 //周期显示 if(s_ui_ctrl.u16_timer_cnt % NUM_1000 == 0) //一秒 { v_ui_char_real_info(u8_gunNo); v_show_AnimationIcon(UI_ANIMATION_ICON, 88); //动画图标 } //跳转监测 if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_batt_data) { s_ui_ctrl.u8_gunNo = u8_gunNo; v_ui_set_jump(E_UI_ID_CHAR_IN_BATT_DATA,0); //跳转枪充电中电池实时信息 } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_stop_charge) //停止充电 { v_ui_stop_char_ctrl(u8_gunNo); } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_return) //返回 { v_ui_jump_standby_show(); //首页 } //跳转检查 if(u8_state == 0) //不为充电中 { s_ui_ctrl.u8_gunNo = u8_gunNo; v_ui_set_jump(E_UI_ID_CHAR_STOP_ING,0); //充电停止 } //超时跳转 if(s_ui_ctrl.u8_gunCnt != 1 && u8_timer >= UI_STATE_TIMEOUT) { v_ui_jump_standby_show(); //首页 } } /** * ************************************************************************ * @brief - 充电中电池信息显示 * * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static void v_ui_show_char_in_batt_data() { U8_T u8_gunNo = s_ui_ctrl.u8_gunNo; U8_T u8_timer = u32_safe_seconds_since(s_ui_ctrl.ulong_timer); U8_T u8_state = u8_ui_gun_work_state(u8_gunNo); //0空闲 1启动中 2充电中 //周期显示 if(s_ui_ctrl.u16_timer_cnt % NUM_1000 == 0) //一秒 { v_ui_char_batt_info(u8_gunNo); v_show_AnimationIcon(UI_ANIMATION_ICON, 88); //动画图标 } //跳转监测 if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_real_data) { s_ui_ctrl.u8_gunNo = u8_gunNo; v_ui_set_jump(E_UI_ID_CHAR_IN_REAL_DATA,0); //跳转枪充电中实时信息 } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_stop_charge) //停止充电 { v_ui_stop_char_ctrl(u8_gunNo); } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_return) //返回 { v_ui_jump_standby_show(); //首页 } //跳转检查 if(u8_state == 0) //不为充电中 { s_ui_ctrl.u8_gunNo = u8_gunNo; v_ui_set_jump(E_UI_ID_CHAR_STOP_ING,0); //充电停止 } //超时跳转 if(s_ui_ctrl.u8_gunCnt != 1 && u8_timer >= UI_STATE_TIMEOUT) { v_ui_jump_standby_show(); //首页 } } /** * ************************************************************************ * @brief - 停止充电中 - 倒计时 * * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static void v_ui_show_char_stop_ing() { U8_T u8_gunNo = s_ui_ctrl.u8_gunNo; //获取枪号 U8_T u8_timer = u32_safe_seconds_since(s_ui_ctrl.ulong_timer); U8_T u8_state = u16_ui_get_sys_data(u8_gunNo,E_UI_GET_DATA_FLOW_STAET,0); //0空闲 1充电启动 2绝缘启动 3绝缘计算完成 4绝缘检测模块停止 5开始预充 6预充完成 7充电中 8BMS通讯超时 9充电停止 10充电停止完成 //周期发送显示 倒计时 和当前充电流程 if(s_ui_ctrl.u16_timer_cnt % NUM_1000 == 0) { //倒计时 if(u8_timer <= UI_STATE_TIMEOUT) v_wr_var_data(UI_TIMER_ADDR_2, UI_STATE_TIMEOUT - u8_timer); else v_wr_var_data(UI_TIMER_ADDR_2, 0); } //跳转检查 if(u8_state == 0 || u8_state >= 10) //停止充电 { s_ui_ctrl.u8_gunNo = u8_gunNo; v_ui_set_jump(E_UI_ID_CHAR_SETTLEMENT,0); //跳转枪结算 } if(u8_timer >= UI_STATE_TIMEOUT) { v_ui_jump_standby_show(); //首页 } } /** * ************************************************************************ * @brief - 充电订单结算信息 * * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static void v_ui_show_char_settlement() { U8_T u8_gunNo = s_ui_ctrl.u8_gunNo; U8_T u8_timer = u32_safe_seconds_since(s_ui_ctrl.ulong_timer); //周期发送显示 订单信息 if(s_ui_ctrl.u16_timer_cnt % NUM_1000 == 0) { v_ui_char_log_info(u8_gunNo); //倒计时 if(u8_timer <= UI_STATE_TIMEOUT) v_wr_var_data(UI_TIMER_ADDR_2, UI_STATE_TIMEOUT - u8_timer); else v_wr_var_data(UI_TIMER_ADDR_2, 0); } if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_return) //返回 { v_ui_jump_standby_show(); //首页 } //状态超时跳转 if(u8_timer >= UI_STATE_TIMEOUT) { v_ui_jump_standby_show(); //首页 } } /** * ************************************************************************ * @brief - 故障信息显示 * * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static void v_ui_show_fault_info() { v_ui_fault_chaek(1); //故障 判断恢复 if(s_ui_ctrl.u16_timer_cnt % NUM_1000 == 0) //故障信息显示 v_ui_fault_info_show() ; if(s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_type == 1) //维护密码输入完成 跳转维护界面 { if(s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_len != 0) { char p_input_pwd[32] = {0}; u8_ui_get_sys_str(0, E_UI_GET_STR_MAINTENANCE_PWD, 0, (U8_T *)p_input_pwd, sizeof(p_input_pwd)); if(strcmp((char *)s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_str, p_input_pwd) == 0) { v_ui_set_jump(E_UI_ID_BASIC_PARAM_SET,0); //跳转 参数设置界面 } } s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_type = 0; //重置维护密码输入标志 } } /** * ************************************************************************ * @brief - 系统升级显示界面 * * * * @author jiankalka * @date 2026-01-22 * ************************************************************************ */ static void v_ui_show_sys_update_info() { U32_T u32_timer = u32_safe_seconds_since(s_ui_ctrl.ulong_timer); U8_T u8_bs_update_flag = u16_ui_get_sys_data(GUN_B,E_UI_GET_DATA_BS_UPDATE_FLAG,0); //程序更新标志 if(u8_bs_update_flag == 0) { v_ui_jump_standby_show(); //返回待机界面 } //状态超时检查 if(u32_timer >= UI_UPDATE_TIMEOUT) { v_ui_jump_standby_show(); //首页 } } /** * ************************************************************************ * @brief - 维护界面显示 * * * * @author jiankalka * @date 2026-03-13 * ************************************************************************ */ static void v_ui_show_maintenance_info() { if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_exit) //返回 { v_ui_jump_standby_show(); //首页 } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_type == 1) //维护密码输入完成 跳转维护界面 { if(s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_len != 0) { char p_input_pwd[32] = {0}; u8_ui_get_sys_str(0, E_UI_GET_STR_MAINTENANCE_PWD, 0, (U8_T *)p_input_pwd, sizeof(p_input_pwd)); if(strcmp((char *)s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_str, p_input_pwd) == 0) { v_ui_set_jump(E_UI_ID_BASIC_PARAM_SET,0); //跳转 参数设置界面 } } s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_type = 0; //重置维护密码输入标志 } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_type == 2) //管理员密码输入 { if(s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_len != 0) { if(strcmp((char *)s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_str, UI_ADMIN_PWD) == 0) { // v_ui_set_jump(E_UI_ID_BASIC_PARAM_SET,0); //跳转 参数设置界面 } } s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_type = 0; //重置维护密码输入标志 } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_param_set) //参数设置 { //v_ui_set_jump(E_UI_ID_BASIC_PARAM_SET,0); //跳转 参数设置界面 } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_history_alarm) //历史告警 { v_ui_set_jump(E_UI_ID_HISTORY_ALARM,0); //跳转 历史告警界面 } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_charge_record) //充电记录 { v_ui_set_jump(E_UI_ID_CHARGE_RECORD,0); //跳转 充电记录界面 } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_version_info) //版本信息 { v_ui_set_jump(E_UI_ID_VERSION_INFO,0); //跳转 版本信息界面 } } /** * ************************************************************************ * @brief - 显示版本信息 * * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static void v_ui_show_version_info() { //数据发送 if(u8_ui_get_first_jump_flag()) //是否为首次跳转 { v_ui_set_version_info(); //版本信息显示 v_ui_set_pile_no_info(); //桩编号 } if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_exit) //返回 { v_ui_set_jump(E_UI_ID_MAINTENANCE,0); //跳转维护界面 } } static void v_ui_show_history_alarm() { U8_T u8_need_refresh = 0; U8_T line_buf[220]; U16_T total = u16_ui_get_his_fault_count(); U16_T base = (U16_T)(s_ui_ctrl.u16_his_page * 3u); U16_T i; U16_T line_addr[3] = {UI_HIS_ALARM_LINE1, UI_HIS_ALARM_LINE2, UI_HIS_ALARM_LINE3}; if(u8_ui_get_first_jump_flag() || s_ui_ctrl.u8_his_inited == 0) { s_ui_ctrl.u16_his_page = 0; s_ui_ctrl.u8_his_inited = 1; u8_need_refresh = 1; } if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_page_down) //下一页(更早) { if((U32_T)(base + 3u) < total) { s_ui_ctrl.u16_his_page++; u8_need_refresh = 1; } s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_page_down = 0; } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_page_up) //上一页(更新) { if(s_ui_ctrl.u16_his_page > 0) { s_ui_ctrl.u16_his_page--; u8_need_refresh = 1; } s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_page_up = 0; } if(u8_need_refresh) { v_wr_var_data(UI_HIS_ALARM_TOTAL_ID, total); base = (U16_T)(s_ui_ctrl.u16_his_page * 3u); for(i = 0; i < 3; i++) { v_disp_text_clear(line_addr[i]); memset(line_buf, 0, sizeof(line_buf)); if((base + i) < total) { U8_T len = u8_ui_get_his_fault_line((U16_T)(base + i), line_buf, (U16_T)sizeof(line_buf)); if(len > 0) v_disp_string_handler(line_addr[i], line_buf, len); } else if(i == 0 && total == 0) { const U8_T no_data[] = "No history alarm"; v_disp_string_handler(line_addr[i], (U8_T *)no_data, (U16_T)strlen((const char *)no_data)); } } } if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_return) //返回 { s_ui_ctrl.u8_his_inited = 0; v_ui_set_jump(E_UI_ID_MAINTENANCE,0); //跳转维护界面 } } static void v_ui_show_charge_record() { U8_T u8_need_refresh = 0; U8_T line_buf[220]; U16_T total = u16_ui_get_his_charge_count(); U16_T base = (U16_T)(s_ui_ctrl.u16_his_page * 3u); U16_T i; U16_T line_addr[3] = {UI_HIS_CHARGE_LINE1, UI_HIS_CHARGE_LINE2, UI_HIS_CHARGE_LINE3}; if(u8_ui_get_first_jump_flag() || s_ui_ctrl.u8_his_inited == 0) { s_ui_ctrl.u16_his_page = 0; s_ui_ctrl.u8_his_inited = 1; u8_need_refresh = 1; } if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_page_down) //下一页(更早) { if((U32_T)(base + 3u) < total) { s_ui_ctrl.u16_his_page++; u8_need_refresh = 1; } s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_page_down = 0; } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_page_up) //上一页(更新) { if(s_ui_ctrl.u16_his_page > 0) { s_ui_ctrl.u16_his_page--; u8_need_refresh = 1; } s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_page_up = 0; } if(u8_need_refresh) { v_wr_var_data(UI_HIS_CHARGE_TOTAL_ID, total); base = (U16_T)(s_ui_ctrl.u16_his_page * 3u); for(i = 0; i < 3; i++) { v_disp_text_clear(line_addr[i]); memset(line_buf, 0, sizeof(line_buf)); if((base + i) < total) { U8_T len = u8_ui_get_his_charge_line((U16_T)(base + i), line_buf, (U16_T)sizeof(line_buf)); if(len > 0) v_disp_string_handler(line_addr[i], line_buf, len); } else if(i == 0 && total == 0) { const U8_T no_data[] = "No charge record"; v_disp_string_handler(line_addr[i], (U8_T *)no_data, (U16_T)strlen((const char *)no_data)); } } } if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_return) //返回 { s_ui_ctrl.u8_his_inited = 0; v_ui_set_jump(E_UI_ID_MAINTENANCE,0); //跳转维护界面 } } static void v_ui_show_param_set(E_UI_ID_TYPE e_id_type) { E_UI_PARAM_TYPE_T e_ui_param_type = E_UI_PARAM_TYPE_INVALID; //参数类型 switch (e_id_type) { case E_UI_ID_BASIC_PARAM_SET: //基本参数设置界面 e_ui_param_type = E_UI_PARAM_TYPE_SYSTEM; break; case E_UI_ID_PROT_PARAM_SET: //保护参数设置界面 e_ui_param_type = E_UI_PARAM_TYPE_PILE_PROTECT; break; case E_UI_ID_NET_PARAM_SET: //网络参数设置界面 e_ui_param_type = E_UI_PARAM_TYPE_NETWORK; break; case E_UI_ID_MODULE_PARAM_SET: //模块参数设置界面 e_ui_param_type = E_UI_PARAM_TYPE_MODULE; break; case E_UI_ID_RESERVE_PARAM_SET: //预留参数设置界面 e_ui_param_type = E_UI_PARAM_TYPE_RESERVE; break; case E_UI_ID_OTHER_PARAM_SET: //其他参数设置界面 e_ui_param_type = E_UI_PARAM_TYPE_OTHER; break; default: return; } v_ui_set_param_type(e_ui_param_type); //设置参数类型 显示界面共用 if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_exit) //返回 { v_ui_set_jump(E_UI_ID_MAINTENANCE,0); //跳转维护界面 } else if (s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_return) //返回 { v_ui_set_jump(E_UI_ID_MAINTENANCE,0); //跳转维护界面 } else if (s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_confirm) //确认 { v_ui_set_jump(E_UI_ID_CONFIRM_OPERATION,(U8_T)e_ui_param_type); //跳转确认界面 //保存当前参数类型 用于确认后保存参数 } else if (s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_cfg_system) //系统参数配置 { v_ui_set_jump(E_UI_ID_BASIC_PARAM_SET,0); //跳转基本参数设置界面 s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_cfg_system = 0; //清除标志位 避免重复跳转 } else if (s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_cfg_pile_protect) //充电桩保护参数配置 { v_ui_set_jump(E_UI_ID_PROT_PARAM_SET,0); //跳转保护参数设置界面 s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_cfg_pile_protect = 0; //清除标志位 避免重复跳转 } else if (s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_cfg_network) //网络参数配置 { v_ui_set_jump(E_UI_ID_NET_PARAM_SET,0); //跳转网络参数设置界面 s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_cfg_network = 0; //清除标志位 避免重复跳转 } else if (s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_cfg_module) //模块参数配置 { v_ui_set_jump(E_UI_ID_MODULE_PARAM_SET,0); //跳转模块参数设置界面 s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_cfg_module = 0; //清除标志位 避免重复跳转 } else if (s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_cfg_reserve) //预留参数配置 { v_ui_set_jump(E_UI_ID_RESERVE_PARAM_SET,0); //跳转预留参数设置界面 s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_cfg_reserve = 0; //清除标志位 避免重复跳转 } else if (s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_cfg_other) //其他参数配置 { v_ui_set_jump(E_UI_ID_OTHER_PARAM_SET,0); //跳转其他参数设置界面 s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_cfg_other = 0; //清除标志位 避免重复跳转 } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_type != 0) //维护密码输入完成 跳转确认界面 { if(s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_len != 0) { if(strcmp((char *)s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_str, UI_MAINTENANCE_PWD) == 0) { if(s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_type == 3) { v_ui_set_jump(E_UI_ID_CONFIRM_OPERATION,E_UI_PARAM_INIT_FLAG); //跳转确认界面 参数恢复出厂设置 } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_type == 4) { v_ui_set_jump(E_UI_ID_CONFIRM_OPERATION,E_UI_SYSTEM_RESTART_FLAG); //跳转确认界面 系统重启 } } } s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_type =0; //重置维护密码输入标志 } } static void v_ui_show_confirm_operation() { if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_return || s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_exit) //返回 { v_ui_set_jump(s_ui_ctrl.e_previous_id,0); // 返回上一界面 } else if(s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_confirm) //确认 { if(s_ui_ctrl.u8_jump_remark >= E_UI_PARAM_TYPE_SYSTEM && s_ui_ctrl.u8_jump_remark <= E_UI_PARAM_TYPE_OTHER) //确认保存参数 { u8_ui_save_param((E_UI_PARAM_TYPE_T)s_ui_ctrl.u8_jump_remark); //保存参数 } else if(s_ui_ctrl.u8_jump_remark == E_UI_PARAM_INIT_FLAG) //参数初始化标志 { v_ui_param_init(); //参数恢复出厂设置 } else if(s_ui_ctrl.u8_jump_remark == E_UI_SYSTEM_RESTART_FLAG) //系统重启标志 { v_ui_system_reboot(); //系统重启 } v_ui_set_jump(s_ui_ctrl.e_previous_id,0); // 返回上一界面 } } /** * ************************************************************************ * @brief - 充电流程检查 主动跳转-例如启动充电时 * * * * @author jiankalka * @date 2025-09-11 * ************************************************************************ */ static void v_ui_show_flow_cheak() { static U8_T u8_old_workState[GUN_MAX_CNT] = {0}; U8_T i,u8_state; const char c_gun_state_str[][20] = {"IDLE/STOP", "STARTING", "CHARGING"}; for (i = 0; i < s_ui_ctrl.u8_gunCnt; i++) { u8_state = u8_ui_gun_work_state(i); //0空闲 1启动中 2充电中 if(u8_state != u8_old_workState[i]) { if(u8_old_workState[i] == 0 && u8_state == 1) //空闲跳转到启动中, 强制跳转到启动中界面 { s_ui_ctrl.u8_gunNo = i; v_ui_set_jump(E_UI_ID_CHAR_STARTING_UP,0); //跳转枪启动中实时信息 } else if((u8_old_workState[i] == 1 || u8_old_workState[i] == 2) && u8_state == 0) //充电中 跳转到停止, 强制跳转到停止中界面 { s_ui_ctrl.u8_gunNo = i; v_ui_set_jump(E_UI_ID_CHAR_STOP_ING,0); //跳转枪停止中实时信息 } UI_LOG("[G%d] CHG_ST_CHG: %s -> %s\n",i,c_gun_state_str[u8_old_workState[i]],c_gun_state_str[u8_state]); u8_old_workState[i] = u8_state; } } } /** * ************************************************************************ * @brief - 根据接收当前界面类型 分别发送对应界面数据和监听跳转命令 * * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static void v_ui_data_show_ctrl() { E_UI_ID_TYPE e_id_type = e_ui_get_mapp_type(s_ui_ctrl.u8_ret_pic_id); // s_ui_ctrl.e_set_pic_id = E_UI_ID_STANDBY_TWIN_GUN_NO_WORK; //测试使用 // static E_UI_ID_TYPE e_old_id_type = E_UI_ID_NULL; // if(e_id_type != e_old_id_type) // { // printf("UI jump pic change: %d -> %d\r\n",e_old_id_type, e_id_type); // e_old_id_type = e_id_type; // } v_ui_show_flow_cheak(); //充电流程 主动跳转 switch (e_id_type) { case E_UI_ID_NULL : //不存在界面 不执行内容 { v_ui_show_null(); //空界面数据操作 break; } case E_UI_ID_HOME_PAGE : //首页-待机界面 { v_ui_show_home_page(); break; } case E_UI_ID_STANDBY_TWIN_GUN_NO_WORK : //双枪待机界面 { v_ui_show_standby_twin_gun(); break; } case E_UI_ID_STANDBY_TWIN_GUN_A_WORK: //A枪充电-双枪待机界面 { v_ui_show_standbu_twin_gun_work(0); break; } case E_UI_ID_STANDBY_TWIN_GUN_B_WORK: //B枪充电-双枪待机界面 { v_ui_show_standbu_twin_gun_work(1); break; } case E_UI_ID_STANDBY_TWIN_GUN_AB_WORK: //AB枪充电-双枪待机界面 { v_ui_show_standbu_twin_gun_work(2); break; } case E_UI_ID_STANDBY_SINGLE_GUN_NO_WORK : //单枪待机界面 { v_ui_show_standby_single_gun(); break; } case E_UI_ID_STANDBY_SINGLE_GUN_WORK: //单枪充电-待机界面 { v_ui_show_single_gun_work(); break; } case E_UI_ID_CHAR_METHOD_SELE : //充电方式选择界面 { v_ui_show_char_method_sele(); break; } case E_UI_ID_GUN_NO_LINK : //枪未连接提示界面 { v_ui_show_gun_on_link(); break; } case E_UI_ID_CHAR_STARTING_UP : //充电启动中界面 { v_ui_show_char_starting_up(); break; } case E_UI_ID_CHAR_CARD: //充电刷卡等待界面 { v_ui_show_char_card_cheak(); break; } case E_UI_ID_CHAR_IN_REAL_DATA : //充电中实时信息 { v_ui_show_char_in_real_data(); break; } case E_UI_ID_CHAR_IN_BATT_DATA : //充电中电池信息 { v_ui_show_char_in_batt_data(); break; } case E_UI_ID_CHAR_STOP_ING : //充电停止中提示界面 { v_ui_show_char_stop_ing(); break; } case E_UI_ID_CHAR_SETTLEMENT : //充电结算界面 { v_ui_show_char_settlement(); break; } case E_UI_ID_FAULT_INFO : //故障显示界面 { v_ui_show_fault_info(); break; } case E_UI_ID_SYS_UPDATE : //系统升级中 { v_ui_show_sys_update_info(); break; } case E_UI_ID_MAINTENANCE : //维护界面 { v_ui_show_maintenance_info(); break; } case E_UI_ID_BASIC_PARAM_SET: //参数设置界面 case E_UI_ID_PROT_PARAM_SET: //保护参数设置界面 case E_UI_ID_NET_PARAM_SET: //网络参数设置界面 case E_UI_ID_MODULE_PARAM_SET: //模块参数设置界面 case E_UI_ID_RESERVE_PARAM_SET: //预留参数设置界面 case E_UI_ID_OTHER_PARAM_SET: //其他参数设置界面 { v_ui_show_param_set(e_id_type); break; } case E_UI_ID_HISTORY_ALARM: //历史告警界面 { v_ui_show_history_alarm(); break; } case E_UI_ID_CHARGE_RECORD: //充电记录界面 { v_ui_show_charge_record(); break; } case E_UI_ID_VERSION_INFO: //版本信息界面 { v_ui_show_version_info(); break; } case E_UI_ID_CONFIRM_OPERATION: //操作确认界面 { v_ui_show_confirm_operation(); break; } default: break; } //s_ui_ctrl.e_set_pic_id = E_UI_ID_CHAR_IN_REAL_DATA; //测试使用 if(s_ui_ctrl.u16_timer_cnt % (NUM_60 * NUM_5) == 0) //5分钟 v_set_LCD_rtc(); //屏幕校时 } #endif #if 1 //超时判断和周期计数累加 static void v_ui_timer_add(U16_T u16_sleep_time) { if(s_ui_ctrl.u16_timer_cnt < 0xFF00) s_ui_ctrl.u16_timer_cnt += u16_sleep_time; else s_ui_ctrl.u16_timer_cnt = 0; } static void v_ui_comm_timeout_cheak(U16_T u16_sleep_time) { if(s_ui_ctrl.u16_outtime_cnt > UI_COMM_TIME_OUT_TIME) //技术值大于超时值 { v_ui_set_comm_timeout(1); } else { s_ui_ctrl.u16_outtime_cnt += u16_sleep_time; v_ui_set_comm_timeout(0); } } #endif void v_ui_data_init(void) { memset(&s_ui_ctrl , 0 ,sizeof(S_UI_CTRL_DATA)); s_ui_ctrl.e_set_pic_id = E_UI_ID_HOME_PAGE; s_ui_ctrl.u8_enable_flag = u16_ui_get_sys_data(0,E_UI_GET_DATA_UI_EN,0); s_ui_ctrl.u8_gunCnt = u16_ui_get_sys_data(0,E_UI_GET_DATA_GUN_CNT,0); s_ui_ctrl.u8_lalanguage_type = u16_ui_get_sys_data(0,E_UI_GET_DATA_LALANGGUAGE_TYPE,0); } void v_ui_task(void *argument) { uint16_t sleep_time_ms; uint32_t last_send_time; uint32_t current_time; (void)argument; (void)UITASK_LOCK_INIT(); sleep_time_ms = UITASK_SLEEP_TIME_MS(); last_send_time = get_current_seconds(); v_ui_data_init(); while (1) { UITASK_FEED_DOG(); current_time = get_current_seconds(); if ((TASK_RUN_PRINT_TIME != 0U) && (u32_safe_seconds_since(last_send_time) >= TASK_RUN_PRINT_TIME)) { if (UITASK_LOCK_TAKE() == 1U) { UI_LOG("ui task is runing, sleep time is %ums", sleep_time_ms); (void)UITASK_LOCK_GIVE(); } last_send_time = current_time; } if(s_ui_ctrl.u8_send_cnt *UI_SEND_SLEEP < sleep_time_ms) mSleep(sleep_time_ms - s_ui_ctrl.u8_send_cnt*UI_SEND_SLEEP); else mSleep(sleep_time_ms); s_ui_ctrl.u8_send_cnt = 0; if(s_ui_ctrl.u8_enable_flag == 0) //不使能 不执行屏幕 continue; v_ui_timer_add((U16_T)sleep_time_ms); //计数累加 v_ui_recv_data(); //UI 数据接收 v_ui_jump_ctrl(); //UI界面跳转控制 v_ui_flow_plat_auth_idle_recover_poll(); v_ui_data_show_ctrl(); //UI界面数据显示 控制 v_ui_comm_timeout_cheak((U16_T)sleep_time_ms); //UI界面超时检查 } }