Files

2088 lines
62 KiB
C

#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; i<cmd->u16_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; j<cmd->u8_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界面超时检查
}
}