#include "ui/ui_comm_impl.h" #include "ui/ui_task.h" #include "ui/ui_interface.h" #include "app_rtc/app_rtc.h" #include "ui/ui_info.h" #include "fault_cheak/fault_interface.h" #include #define D_Print_flag 0 extern S_UI_CTRL_DATA s_ui_ctrl; #if 1 //数据 typedef enum { TE_TYPE_U8 = 0, TE_TYPE_U16, TE_TYPE_S16, TE_TYPE_F32, TE_TYPE_U32, }E_DATA_TYPE; typedef struct { U32_T u32_addr; //变量地址 U32_T u32_coeff; //系数 U8_T u8_type; //类型 void *pv_val; //值 }UI_ASSEMBLE_T; //界面信息 //界面上按钮触控 -- 顺序跟地址对应,从0x00开始 const static UI_ASSEMBLE_T t_ui_tch_assemble[] = { //屏幕地址 系数 数据类型 对应数据地址 {0x0000, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_frist_page }, //0x0000 首页跳转按钮 {0x0001, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_other_change_A }, //0x0001 A枪其他充电方式选择 {0x0002, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_other_change_B }, //0x0002 B枪其他充电方式选择 {0x0003, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_vin_start }, //0x0003 vin启动 {0x0004, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_card_start }, //0x0004 刷卡启动 {0x0005, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_account_start }, //0x0005 账户启动 {0x0006, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_stop_charge }, //0x0006 停止充电按钮 {0x0007, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_auxpower_12v }, //0x0007 辅源选择 12V {0x0008, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_auxpower_24v }, //0x0008 辅源选择 24V {0x000B, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_maintain }, //0x000B 维护密码点击按钮 {0x000C, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_charge_state_A }, //0x000C A枪充电状态点击按钮 {0x000D, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_charge_state_B }, //0x000D B枪充电状态点击按钮 {0x0011, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_param_set }, //0x0011 参数设置按钮 {0x0012, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_history_alarm }, //0x0012 历史告警 {0x0013, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_charge_record }, //0x0013 充电记录 {0x0014, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_version_info }, //0x0014 版本信息 {0x0015, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_cfg_system }, //0x0015 系统参数配置 {0x0016, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_cfg_pile_protect }, //0x0016 充电桩保护参数配置 {0x0017, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_cfg_network }, //0x0017 网络参数配置 {0x0018, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_cfg_module }, //0x0018 模块参数配置 {0x0019, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_cfg_reserve }, //0x0019 预留参数配置 {0x001A, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_cfg_other }, //0x001A 其他参数配置 {0x0020, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_exit }, //0x0020 退出 {0x0021, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_return }, //0x0021 返回 {0x0022, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_page_up }, //0x0022 上一页 {0x0023, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_page_down }, //0x0023 下一页 {0x002C, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_real_data }, //0x002C 充电实时信息 {0x002D, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_batt_data }, //0x002D 电池信息 {0x002E, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_card_info }, //0x002E 卡信息显示 {0x0030, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_fee_info }, //0x0030 费率信息显示 {0x0031, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_card_retry }, //0x0031 刷卡重试按钮 {0x0032, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_charge_info_A }, //0x0032 A枪充电中实时信息界面 {0x0033, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_charge_info_B }, //0x0033 B枪充电中实时信息界面 {0x0034, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_card_return }, //0x0034 刷卡强制退出按钮 {0x0024, 1, TE_TYPE_U8 ,&s_ui_ctrl.s_ui_ctrl_var.s_ui_touch_ctrl.u8_confirm }, //0x0024 确认 }; /** * ************************************************************************ * @brief - 设置变量数据 * * @param[in] data - 变量地址 * @param[in] u8_type - 变了类型 * @param[in] u32_coeff - 变量系数 * @param[in] u32_data - 变量数据 * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ static void v_ui_set_recv_data(void *data ,U8_T u8_type, U32_T u32_coeff, U32_T u32_data) { if (u8_type == TE_TYPE_U8) { *(U8_T *)(data) = (U8_T)(u32_data/u32_coeff); } else if (u8_type == TE_TYPE_U16) { *(U16_T *)(data) = (U16_T)(u32_data/u32_coeff); } else if (u8_type == TE_TYPE_F32) { *(F32_T *)(data) = (F32_T)u32_data/u32_coeff; } else if (u8_type == TE_TYPE_S16) { *(S16_T *)(data) = (S16_T)u32_data/u32_coeff; } else if (u8_type == TE_TYPE_U32) { *(U32_T *)(data) = (U32_T)u32_data/u32_coeff; } } /** * ************************************************************************ * @brief - 设置接收数据信息 触控、变量等 * * @param[in] u16_addr - 数据地址 * @param[in] u32_data - 数据内容 * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ void v_set_recv_data(U16_T u16_addr , U32_T u32_data) // { U8_T i; U16_T size = sizeof(t_ui_tch_assemble) / sizeof(t_ui_tch_assemble[0]); //printf("recv data,addr is [0x%x],data is [%d]\r\n", u16_addr,u32_data); for(i=0;i sizeof(s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_str)) u8_str_len = sizeof(s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_str); memcpy(s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_str, u8_str, u8_str_len); s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_len = u8_str_len; s_ui_ctrl.s_ui_ctrl_var.s_ui_str_data.u8_type = u8_type; } break; case UI_PLATFORM1_PILE_NO: //0x0540 //平台1桩编号参数 32字节 0x0540~0x055F case UI_PLATFORM2_PILE_NO: //0x0560 //平台2桩编号参数 32字节 0x0560~0x057F case UI_PLATFORM1_DOMAIN: //0x0580 //平台1域名地址 64字节 0x0580~0x05BF case UI_PLATFORM2_DOMAIN: //0x05C0 //平台2域名地址 64字节 0x05C0~0x05FF case UI_QR_CODE_GUN_A: //0x0A00 //二维码 case UI_QR_CODE_GUN_B: //0x0B00 //二维码 case UI_STR_APN: //0x0C00 apn1 case UI_STR_OCPP_AUTH_KEY : //0x0C40 预留2 case UI_STR_R2 : //0x0C80 预留3 { v_ui_para_str_update(u16_addr, u8_str, u8_str_len); //更新参数到系统数据中 } default: break; } } /** * ************************************************************************ * @brief - 清空控制数据 界面跳转后 清空 * * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ void v_ui_ctrl_var_clear(void) //清空控制数据 { memset(&(s_ui_ctrl.s_ui_ctrl_var), 0, sizeof(s_ui_ctrl.s_ui_ctrl_var)); } #endif #if 1 //配置参数 UI_PARAM_T s_ui_param; typedef struct { U16_T u16_addr; //参数地址 void *pv_param; //数据地址 } UI_PARAM_ADDR_MAP_T; const UI_PARAM_ADDR_MAP_T s_ui_param_addr_map[] = { // 系统参数 {0x0200, &s_ui_param.s_ui_param_union.s_ui_system_param.number_of_guns}, // 枪数量 {0x0201, &s_ui_param.s_ui_param_union.s_ui_system_param.pile_type}, // 桩类型 {0x0202, &s_ui_param.s_ui_param_union.s_ui_system_param.terminal_address_1}, // 终端地址1 {0x0203, &s_ui_param.s_ui_param_union.s_ui_system_param.terminal_address_2}, // 终端地址2 {0x0204, &s_ui_param.s_ui_param_union.s_ui_system_param.gun_type_1}, // 枪类型1 {0x0205, &s_ui_param.s_ui_param_union.s_ui_system_param.gun_type_2}, // 枪类型2 {0x0206, &s_ui_param.s_ui_param_union.s_ui_system_param.light_panel_type}, // 灯光面板类型 {0x0207, &s_ui_param.s_ui_param_union.s_ui_system_param.lcd_enable}, // LCD使能 {0x0208, &s_ui_param.s_ui_param_union.s_ui_system_param.system_time_zone}, // 系统时区 {0x0209, &s_ui_param.s_ui_param_union.s_ui_system_param.language_type}, // 语言类型 {0x020A, &s_ui_param.s_ui_param_union.s_ui_system_param.liquid_cooling_enable}, // 液冷使能 {0x020B, &s_ui_param.s_ui_param_union.s_ui_system_param.host_comm_type}, // 主机通信类型 {0x020C, &s_ui_param.s_ui_param_union.s_ui_system_param.screensaver_enable}, // 屏幕保护使能 {0x020D, &s_ui_param.s_ui_param_union.s_ui_system_param.card_type}, // 卡类型 // 充电桩保护参数 {0x0220, &s_ui_param.s_ui_param_union.s_ui_pile_protect_param.min_out_vol}, // 最小输出电压 {0x0221, &s_ui_param.s_ui_param_union.s_ui_pile_protect_param.max_out_vol}, // 最大输出电压 {0x0222, &s_ui_param.s_ui_param_union.s_ui_pile_protect_param.max_out_cur}, // 最大输出电流 {0x0223, &s_ui_param.s_ui_param_union.s_ui_pile_protect_param.pile_rated_power}, // 整桩功率 {0x0224, &s_ui_param.s_ui_param_union.s_ui_pile_protect_param.fan_start_temp}, // 风扇启动温度 {0x0225, &s_ui_param.s_ui_param_union.s_ui_pile_protect_param.fan_stop_temp}, // 风扇停止温度 {0x0226, &s_ui_param.s_ui_param_union.s_ui_pile_protect_param.gun_temp_thresh}, // 枪温度阈值 {0x0227, &s_ui_param.s_ui_param_union.s_ui_pile_protect_param.pile_temp_thresh}, // 整桩温度阈值 {0x0228, &s_ui_param.s_ui_param_union.s_ui_pile_protect_param.gun1_power_limit}, // 枪1功率限制 {0x0229, &s_ui_param.s_ui_param_union.s_ui_pile_protect_param.gun2_power_limit}, // 枪2功率限制 {0x022A, &s_ui_param.s_ui_param_union.s_ui_pile_protect_param.soc_thresh}, // SOC阈值 // 网络参数 {0x0240, &s_ui_param.s_ui_param_union.s_ui_net_param.local_ip_1}, // 本地IP1 {0x0241, &s_ui_param.s_ui_param_union.s_ui_net_param.local_ip_2}, // 本地IP2 {0x0242, &s_ui_param.s_ui_param_union.s_ui_net_param.local_ip_3}, // 本地IP3 {0x0243, &s_ui_param.s_ui_param_union.s_ui_net_param.local_ip_4}, // 本地IP4 {0x0244, &s_ui_param.s_ui_param_union.s_ui_net_param.gateway_ip_1}, // 网关IP1 {0x0245, &s_ui_param.s_ui_param_union.s_ui_net_param.gateway_ip_2}, // 网关IP2 {0x0246, &s_ui_param.s_ui_param_union.s_ui_net_param.gateway_ip_3}, // 网关IP3 {0x0247, &s_ui_param.s_ui_param_union.s_ui_net_param.gateway_ip_4}, // 网关IP4 {0x0248, &s_ui_param.s_ui_param_union.s_ui_net_param.mac_addr_1}, // MAC地址1 {0x0249, &s_ui_param.s_ui_param_union.s_ui_net_param.mac_addr_2}, // MAC地址2 {0x024A, &s_ui_param.s_ui_param_union.s_ui_net_param.mac_addr_3}, // MAC地址3 {0x024B, &s_ui_param.s_ui_param_union.s_ui_net_param.mac_addr_4}, // MAC地址4 {0x024C, &s_ui_param.s_ui_param_union.s_ui_net_param.mac_addr_5}, // MAC地址5 {0x024D, &s_ui_param.s_ui_param_union.s_ui_net_param.mac_addr_6}, // MAC地址6 {0x024E, &s_ui_param.s_ui_param_union.s_ui_net_param.apn_type}, // APN类型 {0x024F, &s_ui_param.s_ui_param_union.s_ui_net_param.plat1_enable}, // 平台1使能 {0x0250, &s_ui_param.s_ui_param_union.s_ui_net_param.plat1_net_type}, // 平台1网络类型 {0x0251, &s_ui_param.s_ui_param_union.s_ui_net_param.plat1_plat_type}, // 平台1平台类型 {0x0252, &s_ui_param.s_ui_param_union.s_ui_net_param.plat2_enable}, // 平台2使能 {0x0253, &s_ui_param.s_ui_param_union.s_ui_net_param.plat2_net_type}, // 平台2网络类型 {0x0254, &s_ui_param.s_ui_param_union.s_ui_net_param.plat2_plat_type}, // 平台2平台类型 // 模块参数(0x0260 开始) {0x0260, &s_ui_param.s_ui_param_union.s_ui_module_param.module_rated_power}, // 模块额定功率 {0x0261, &s_ui_param.s_ui_param_union.s_ui_module_param.module_rated_volt}, // 模块额定电压 {0x0262, &s_ui_param.s_ui_param_union.s_ui_module_param.module_rated_cur}, // 模块额定电流 {0x0263, &s_ui_param.s_ui_param_union.s_ui_module_param.module_count}, // 模块数量 {0x0264, &s_ui_param.s_ui_param_union.s_ui_module_param.module_type}, // 模块类型 // 预留参数(0x0280 开始,12 个 U16,默认 0) {0x0280, &s_ui_param.s_ui_param_union.s_ui_reserve_param.reserve_1}, {0x0281, &s_ui_param.s_ui_param_union.s_ui_reserve_param.reserve_2}, {0x0282, &s_ui_param.s_ui_param_union.s_ui_reserve_param.reserve_3}, {0x0283, &s_ui_param.s_ui_param_union.s_ui_reserve_param.reserve_4}, {0x0284, &s_ui_param.s_ui_param_union.s_ui_reserve_param.reserve_5}, {0x0285, &s_ui_param.s_ui_param_union.s_ui_reserve_param.reserve_6}, {0x0286, &s_ui_param.s_ui_param_union.s_ui_reserve_param.reserve_7}, {0x0287, &s_ui_param.s_ui_param_union.s_ui_reserve_param.reserve_8}, {0x0288, &s_ui_param.s_ui_param_union.s_ui_reserve_param.reserve_9}, {0x0289, &s_ui_param.s_ui_param_union.s_ui_reserve_param.reserve_10}, {0x028A, &s_ui_param.s_ui_param_union.s_ui_reserve_param.reserve_11}, {0x028B, &s_ui_param.s_ui_param_union.s_ui_reserve_param.reserve_12}, }; void v_ui_param_init_to_screen(E_UI_PARAM_TYPE_T e_type); //设置参数类型 void v_ui_set_param_type(E_UI_PARAM_TYPE_T e_type) { if(s_ui_param.e_ui_param_type != e_type) //不相等时 更新参数数据 { s_ui_param.e_ui_param_type = e_type; //根据参数类型 初始化参数数据 v_ui_param_init_by_type(e_type); v_ui_param_init_to_screen(e_type); //将参数数据发送到屏幕显示 } } U8_T u8_ui_save_param(E_UI_PARAM_TYPE_T e_type) { //根据参数类型 保存参数数据 if(s_ui_param.e_ui_param_type != e_type || e_type == E_UI_PARAM_TYPE_INVALID) //参数类型不匹配 不保存 return 0; v_ui_param_save_by_type(e_type); return 1; } /** * ************************************************************************ * @brief - 配置参数写入(根据屏幕地址写入对应内部变量) * * @param[in] u16_addr - 参数对应的屏幕寄存器地址(0x0200~0x020C, 0x0220~0x022A) * @param[in] u32_data - 屏幕传入的数据值 * * 说明: * - 所有目标参数为 U16_T 类型 * ************************************************************************ */ void v_ui_param_set_value(U16_T u16_addr, U32_T u32_data) { U16_T i; U16_T map_cnt = (U16_T)(sizeof(s_ui_param_addr_map) / sizeof(s_ui_param_addr_map[0])); //printf("set param,addr is [0x%x],data is [%d]\r\n", u16_addr,u32_data); for (i = 0; i < map_cnt; i++) { if (s_ui_param_addr_map[i].u16_addr == u16_addr) { U16_T *p_val = (U16_T *)s_ui_param_addr_map[i].pv_param; if (p_val == NULL) return; *p_val = (U16_T)u32_data; break; } } } // UI 协议端序:按常见屏协议使用大端(高字节在前) static void v_ui_pack_u16_to_be_u8(const U16_T *src_u16, U16_T u16_cnt, U8_T *dst_u8, U16_T dst_len) { if (src_u16 == NULL || dst_u8 == NULL) return; if ((U16_T)(u16_cnt * 2u) > dst_len) return; for (U16_T i = 0; i < u16_cnt; i++) { U16_T v = src_u16[i]; dst_u8[i * 2u] = (U8_T)((v >> 8) & 0xFFu); dst_u8[i * 2u + 1] = (U8_T)(v & 0xFFu); } } /** * @brief - 将参数数据初始化并发送到屏幕显示 * @param[in] e_type - 参数类型 */ void v_ui_param_init_to_screen(E_UI_PARAM_TYPE_T e_type) { U8_T g_u8_ui_tx_buf[NUM_64] = {0}; U16_T u16_param_cnt = 0; U16_T u16_base_addr = 0; switch (e_type) { case E_UI_PARAM_TYPE_SYSTEM: u16_param_cnt = UI_SYSTEM_PARAM_COUNT; u16_base_addr = UI_CFG_ADDR_SYSTEM_PARAM; break; case E_UI_PARAM_TYPE_PILE_PROTECT: u16_param_cnt = UI_PILE_PROTECT_PARAM_COUNT; u16_base_addr = UI_CFG_ADDR_PROTECTION_PARAM; break; case E_UI_PARAM_TYPE_NETWORK: u16_param_cnt = UI_NETWORK_PARAM_COUNT; u16_base_addr = UI_CFG_ADDR_NETWORK_PARAM; break; case E_UI_PARAM_TYPE_MODULE: u16_param_cnt = UI_MODULE_PARAM_COUNT; u16_base_addr = UI_CFG_ADDR_MODULE_PARAM; break; case E_UI_PARAM_TYPE_RESERVE: u16_param_cnt = UI_RESERVE_PARAM_COUNT; u16_base_addr = UI_CFG_ADDR_RESERVE_PARAM; break; case E_UI_PARAM_TYPE_OTHER: // 其他参数类型暂不处理 break; default: return; } // 按协议固定端序打包,避免大小端问题(大端:高字节在前) v_ui_pack_u16_to_be_u8(&s_ui_param.s_ui_param_union.u16_data[0], u16_param_cnt, g_u8_ui_tx_buf, sizeof(g_u8_ui_tx_buf)); v_wr_var_datas(u16_base_addr, g_u8_ui_tx_buf, (U8_T)(u16_param_cnt * 2u)); if(e_type == E_UI_PARAM_TYPE_NETWORK || e_type == E_UI_PARAM_TYPE_OTHER) // { #define STR_LEN 128 U8_T str_info[STR_LEN]; if(e_type == E_UI_PARAM_TYPE_NETWORK) { u8_ui_get_sys_str(0, E_UI_GET_STR_PILENO, 0,str_info, STR_LEN); // 获取平台1桩编号字符串 v_disp_string_handler(UI_PLATFORM1_PILE_NO, (U8_T *)str_info, (U8_T)strlen((char *)str_info)); // 将平台1桩编号字符串发送到屏幕显示 u8_ui_get_sys_str(1, E_UI_GET_STR_PILENO, 0,str_info, STR_LEN); // 获取平台2桩编号字符串 v_disp_string_handler(UI_PLATFORM2_PILE_NO, (U8_T *)str_info, (U8_T)strlen((char *)str_info)); // 将平台2桩编号字符串发送到屏幕显示 u8_ui_get_sys_str(0, E_UI_GET_STR_DOMAIN, 0,str_info, STR_LEN); // 获取平台1域名字符串 v_disp_string_handler(UI_PLATFORM1_DOMAIN, (U8_T *)str_info, (U8_T)strlen((char *)str_info)); // 将平台1域名字符串发送到屏幕显示 u8_ui_get_sys_str(1, E_UI_GET_STR_DOMAIN, 0,str_info, STR_LEN); // 获取平台2域名字符串 v_disp_string_handler(UI_PLATFORM2_DOMAIN, (U8_T *)str_info, (U8_T)strlen((char *)str_info)); // 将平台2域名字符串发送到屏幕显示 } else if(e_type == E_UI_PARAM_TYPE_OTHER) { u8_ui_get_sys_str(0, E_UI_GET_STR_QR, 0,str_info,STR_LEN); // if(strlen((char *)str_info) == 0) //如果二维码字符串为空 则显示默认提示语 strcpy((char *)str_info, "null"); v_disp_string_handler(UI_QR_CODE_GUN_A, (U8_T *)str_info, (U8_T)strlen((char *)str_info)); u8_ui_get_sys_str(1, E_UI_GET_STR_QR, 0,str_info,STR_LEN); // if(strlen((char *)str_info) == 0) //如果二维码字符串为空 则显示默认提示语 strcpy((char *)str_info, "null"); v_disp_string_handler(UI_QR_CODE_GUN_B, (U8_T *)str_info, (U8_T)strlen((char *)str_info)); u8_ui_get_sys_str(0, E_UI_GET_STR_APN, 0,str_info,STR_LEN); // if(strlen((char *)str_info) == 0) //如果二维码字符串为空 则显示默认提示语 strcpy((char *)str_info, "null"); v_disp_string_handler(UI_STR_APN, (U8_T *)str_info, (U8_T)strlen((char *)str_info)); u8_ui_get_sys_str(0, E_UI_GET_STR_OCPP_AUTH_KEY, 0,str_info,STR_LEN); if(strlen((char *)str_info) == 0) strcpy((char *)str_info, "null"); v_disp_string_handler(UI_STR_OCPP_AUTH_KEY, (U8_T *)str_info, (U8_T)strlen((char *)str_info)); } } } #endif // 配置参数 #if 1 //接口函数 /** * ************************************************************************ * @brief - 数据发送接口函数 发送 * * @param[in] u8_sendBuf - 发送数据地址 * @param[in] u16_len - 发送数据长度 * * * @author jiankalka * @date 2025-08-07 * ************************************************************************ */ void v_ui_send_data(U8_T *u8_sendBuf , U16_T u16_len) { u16_usart_send(UI_COM_ID,u8_sendBuf, u16_len); s_ui_ctrl.u8_send_cnt++; mSleep(1); #if D_Print_flag //调试打印 printf("ui send,len is [%d]\r\n", u16_len); printf_hex("--",u8_sendBuf,u16_len); #endif } /** * ************************************************************************ * @brief - 数据接收接口函数 接收 * * @param[in] u8_recvBuf - 接收数据地址 * @param[in] u16_len - 预期接收数据长度 * * @return U16_T - 已接收数据长度 * * @author jiankalka * @date 2025-08-07 * ************************************************************************ */ U16_T u16_ui_recv_data(U8_T *u8_recvBuf ,U16_T u16_len) { U16_T recv_len; recv_len = u16_usart_recv(UI_COM_ID,u8_recvBuf,u16_len); #if D_Print_flag //调试打印 if(recv_len == 0) return 0; printf("ui recv,len is [%d]\r\n", recv_len); printf_hex("--",u8_recvBuf,recv_len); #endif return recv_len; } #endif #if 1 //界面操作函数 /** * ************************************************************************ * @brief - 发送切换界面图片报文 - 修改界面图片控制寄存器数值 * * @param[in] id - 切换图片id * * * @author jiankalka * @date 2025-09-05 * ************************************************************************ */ void v_ui_id_change(U16_T id) // { U8_T g_u8_ui_tx_buf[NUM_64]; memset(g_u8_ui_tx_buf, 0, sizeof(g_u8_ui_tx_buf)); g_u8_ui_tx_buf[0] = FRAME_HEAD_H; g_u8_ui_tx_buf[1] = FRAME_HEAD_L; g_u8_ui_tx_buf[2] = 0x04; g_u8_ui_tx_buf[3] = UI_WR_REG_CODE; g_u8_ui_tx_buf[4] = UI_ID_ADDR; g_u8_ui_tx_buf[5] = 0x00; g_u8_ui_tx_buf[6] = id; v_ui_send_data(g_u8_ui_tx_buf, 7); //切界面 } /** * ************************************************************************ * @brief - 发送读取当前界面id报文 - 读取界面图片控制寄存器数值 * * * * @author jiankalka * @date 2025-09-05 * ************************************************************************ */ void v_ui_read_id_reg(void) // { U8_T g_u8_ui_tx_buf[NUM_64]; memset(g_u8_ui_tx_buf, 0, sizeof(g_u8_ui_tx_buf)); g_u8_ui_tx_buf[0] = FRAME_HEAD_H; g_u8_ui_tx_buf[1] = FRAME_HEAD_L; g_u8_ui_tx_buf[2] = 0x03; g_u8_ui_tx_buf[3] = UI_RD_REG_CODE; g_u8_ui_tx_buf[4] = UI_ID_ADDR; g_u8_ui_tx_buf[5] = 0x02; v_ui_send_data(g_u8_ui_tx_buf, 6); } #endif #if 1 // 数据组帧发送 void v_set_LCD_rtc() //设定液晶rtc时间 { Comm_Time st_Time; U8_T g_u8_ui_tx_buf[NUM_64]; GetCurrentTime(&st_Time); // 获取当前东八区时间 // 计算偏移:存储时区 - 20(因为东八区对应20) U8_T g_timezone = u16_ui_get_sys_data(0,E_UI_GET_DATA_TIME_ZONE,0); int8_t actual_offset = (int8_t)g_timezone - TIMEZONE_UTC_PLUS_8; // 调整时间 v_adjust_time_with_timezone(&st_Time, actual_offset, 0); memset(g_u8_ui_tx_buf, 0, sizeof(g_u8_ui_tx_buf)); g_u8_ui_tx_buf[0] = FRAME_HEAD_H; g_u8_ui_tx_buf[1] = FRAME_HEAD_L; g_u8_ui_tx_buf[2] = 0x0A; g_u8_ui_tx_buf[3] = UI_WR_REG_CODE; g_u8_ui_tx_buf[4] = 0x1F; g_u8_ui_tx_buf[5] = 0x5A; g_u8_ui_tx_buf[6] = st_Time.iYear%100/10*16+st_Time.iYear%1000%100%10; g_u8_ui_tx_buf[7] = st_Time.ucMonth%100/10*16+st_Time.ucMonth%1000%100%10; g_u8_ui_tx_buf[8] = st_Time.ucDay%100/10*16+st_Time.ucDay%1000%100%10; g_u8_ui_tx_buf[9] = 0x00; g_u8_ui_tx_buf[10] = st_Time.ucHour%100/10*16+st_Time.ucHour%1000%100%10; g_u8_ui_tx_buf[11] = st_Time.ucMin%100/10*16+st_Time.ucMin%1000%100%10; g_u8_ui_tx_buf[12] = st_Time.ucSec%100/10*16+st_Time.ucSec%1000%100%10; v_ui_send_data(g_u8_ui_tx_buf, 13); //切界面 } void v_wr_var_data(U16_T addr,U16_T data) //发送2字节数据 { U8_T g_u8_ui_tx_buf[NUM_64]; memset(g_u8_ui_tx_buf, 0, sizeof(g_u8_ui_tx_buf)); g_u8_ui_tx_buf[0] = FRAME_HEAD_H; g_u8_ui_tx_buf[1] = FRAME_HEAD_L; g_u8_ui_tx_buf[2] = 0x05; g_u8_ui_tx_buf[3] = UI_WR_DATA_CODE; g_u8_ui_tx_buf[4] = (unsigned char)(addr>>8); g_u8_ui_tx_buf[5] = (unsigned char)addr; g_u8_ui_tx_buf[6] = (unsigned char)(data>>8); g_u8_ui_tx_buf[7] = (unsigned char)data; v_ui_send_data(g_u8_ui_tx_buf, 8); } void v_wr_32var_data(U16_T addr,U32_T data) //发送4字节数据 { U8_T g_u8_ui_tx_buf[NUM_64]; memset(g_u8_ui_tx_buf, 0, sizeof(g_u8_ui_tx_buf)); g_u8_ui_tx_buf[0] = FRAME_HEAD_H; g_u8_ui_tx_buf[1] = FRAME_HEAD_L; g_u8_ui_tx_buf[2] = 0x07; g_u8_ui_tx_buf[3] = UI_WR_DATA_CODE; g_u8_ui_tx_buf[4] = (unsigned char)(addr>>8); g_u8_ui_tx_buf[5] = (unsigned char)addr; g_u8_ui_tx_buf[6] = (unsigned char)(data>>24); g_u8_ui_tx_buf[7] = (unsigned char)(data>>16); g_u8_ui_tx_buf[8] = (unsigned char)(data>>8); g_u8_ui_tx_buf[9] = (unsigned char)data; v_ui_send_data(g_u8_ui_tx_buf, 10); } void v_show_AnimationIcon(U16_T addr, U16_T value) //动画图标显示 { U8_T g_u8_ui_tx_buf[NUM_64]; //5A A5 05 82 addr addr value value memset(g_u8_ui_tx_buf, 0, sizeof(g_u8_ui_tx_buf)); g_u8_ui_tx_buf[0] = FRAME_HEAD_H; g_u8_ui_tx_buf[1] = FRAME_HEAD_L; g_u8_ui_tx_buf[2] = 0x05; g_u8_ui_tx_buf[3] = UI_WR_DATA_CODE; g_u8_ui_tx_buf[4] = (unsigned char)(addr>>8); g_u8_ui_tx_buf[5] = (unsigned char)addr; g_u8_ui_tx_buf[6] = (unsigned char)(value>>8); g_u8_ui_tx_buf[7] = (unsigned char)value; v_ui_send_data(g_u8_ui_tx_buf, 8); //切界面 } void v_wr_var_datas(U16_T addr, U8_T* data_buf, U8_T u8_len) //连续发送多个数据 -- 同一界面 { U8_T g_u8_ui_tx_buf[NUM_256]; memset(g_u8_ui_tx_buf, 0, sizeof(g_u8_ui_tx_buf)); g_u8_ui_tx_buf[0] = FRAME_HEAD_H; g_u8_ui_tx_buf[1] = FRAME_HEAD_L; g_u8_ui_tx_buf[2] = u8_len+3; g_u8_ui_tx_buf[3] = UI_WR_DATA_CODE; g_u8_ui_tx_buf[4] = (unsigned char)(addr>>8); g_u8_ui_tx_buf[5] = (unsigned char)addr; memcpy(&g_u8_ui_tx_buf[6], data_buf, u8_len); v_ui_send_data(g_u8_ui_tx_buf, u8_len+6); } /************************************************************* 函数名称: v_disp_text_clear(U16_T addr) 函数功能: 清空一个文本显示区域 输入参数: addr:文本显示区地址 输出参数: 无 返回值 :无 **************************************************************/ void v_disp_text_clear(U16_T addr) { U8_T g_u8_ui_tx_buf[NUM_64]; memset(g_u8_ui_tx_buf, 0, sizeof(g_u8_ui_tx_buf)); g_u8_ui_tx_buf[0] = FRAME_HEAD_H; g_u8_ui_tx_buf[1] = FRAME_HEAD_L; g_u8_ui_tx_buf[2] = 0x05; g_u8_ui_tx_buf[3] = UI_WR_DATA_CODE; g_u8_ui_tx_buf[4] = (unsigned char)(addr>>8); g_u8_ui_tx_buf[5] = (unsigned char)addr; g_u8_ui_tx_buf[6] = 0xFF; g_u8_ui_tx_buf[7] = 0xFF; v_ui_send_data(g_u8_ui_tx_buf, 8); } /************************************************************* 函数名称: void v_disp_string_handler(U16_T addr,U8_T len) 函数功能: 字符串内容显示 输入参数:addr 写入的地址,p_str 字符串地址 输出参数: 返回值 :无 **************************************************************/ void v_disp_string_handler(U16_T addr,U8_T* p_str,U8_T str_len) { U8_T cnt; U8_T copy_len; U8_T g_u8_ui_tx_buf[NUM_256]; v_disp_text_clear(addr); //先清空 memset(g_u8_ui_tx_buf, 0, sizeof(g_u8_ui_tx_buf)); g_u8_ui_tx_buf[0] = FRAME_HEAD_H; g_u8_ui_tx_buf[1] = FRAME_HEAD_L; g_u8_ui_tx_buf[3] = UI_WR_DATA_CODE; g_u8_ui_tx_buf[4] = (unsigned char)(addr>>8); g_u8_ui_tx_buf[5] = (unsigned char)addr; // 注意:p_str 不一定以 '\0' 结尾(上层按长度传入),这里必须按长度拷贝,避免越界读/卡死 copy_len = str_len; if (copy_len > (U8_T)(sizeof(g_u8_ui_tx_buf) - 7u)) { // 预留 '\0' 和头部 copy_len = (U8_T)(sizeof(g_u8_ui_tx_buf) - 7u); } if (p_str != NULL && copy_len != 0) { memcpy(&g_u8_ui_tx_buf[6], p_str, copy_len); } g_u8_ui_tx_buf[6 + copy_len] = '\0'; cnt = copy_len; g_u8_ui_tx_buf[2] = cnt + 4;//字符串长度cnt + 地址2 +功能码1 + 结束符'\0'长度1 mSleep(2); v_ui_send_data(g_u8_ui_tx_buf, cnt+7);//cnt+7:字符串长度cnt + 地址2 +功能码1 + 结束符'\0'长度1 + 帧头2 + 长度值1字节 mSleep(2); } #endif #if 1 //实时数据显示 /** * ************************************************************************ * @brief - 充电实时信息 * * @param[in] u8_gunNo - * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ void v_ui_char_real_info(U8_T u8_gunNo) { U16_T u16_real_vol = u16_ui_get_sys_data(u8_gunNo, E_UI_GET_DATA_CHAR_VOL, 0); //充电电压 精度 0.1V U16_T u16_real_cur = u16_ui_get_sys_data(u8_gunNo, E_UI_GET_DATA_CHAR_CUR, 0); //充电电流 精度 0.1A U16_T u16_real_money = u16_ui_get_sys_data(u8_gunNo, E_UI_GET_DATA_CHAR_MONEY,0); //充电金额 0.01元 U16_T u16_real_time = u16_ui_get_sys_data(u8_gunNo, E_UI_GET_DATA_CHAR_TIME, 0); //充电时间 min U16_T u16_real_soc = u16_ui_get_sys_data(u8_gunNo, E_UI_GET_DATA_CHAR_SOC, 0); //充电soc % U32_T u32_power = u32_ui_get_charge_power(u8_gunNo); U32_T u32_data; U8_T g_u8_ui_tx_buf[NUM_64] = {0}; U8_T u8_cnt=0; //充电电压 0.01 u32_data = u16_real_vol*10; g_u8_ui_tx_buf[u8_cnt++] = GetHigh24Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetHigh16Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetHigh8Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetLow8Bits(u32_data); //充电电流 0.01 u32_data = u16_real_cur*10; g_u8_ui_tx_buf[u8_cnt++] = GetHigh8Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetLow8Bits(u32_data); if(s_ui_ctrl.u8_lalanguage_type == 0) //中文界面显示 { //充电电量 0.0001 u32_data = u32_power/10; g_u8_ui_tx_buf[u8_cnt++] = GetHigh24Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetHigh16Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetHigh8Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetLow8Bits(u32_data); //充电金额 0.01 u32_data = u16_real_money; g_u8_ui_tx_buf[u8_cnt++] = GetHigh24Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetHigh16Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetHigh8Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetLow8Bits(u32_data); } else { //充电功率 0.0001 u32_data = (u16_real_vol * u16_real_cur) / 100; // 0.001w g_u8_ui_tx_buf[u8_cnt++] = GetHigh24Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetHigh16Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetHigh8Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetLow8Bits(u32_data); //充电电量 0.0001 u32_data = u32_power/10; g_u8_ui_tx_buf[u8_cnt++] = GetHigh24Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetHigh16Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetHigh8Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetLow8Bits(u32_data); } //充电时长 min u32_data = u16_real_time; g_u8_ui_tx_buf[u8_cnt++] = GetHigh8Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetLow8Bits(u32_data); //充电SOC u32_data = u16_real_soc; g_u8_ui_tx_buf[u8_cnt++] = GetHigh8Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetLow8Bits(u32_data); v_wr_var_datas(UI_CHARGE_DATA_ID, g_u8_ui_tx_buf, u8_cnt); } /** * ************************************************************************ * @brief - 充电电池信息 * * @param[in] u8_gunNo - * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ void v_ui_char_batt_info(U8_T u8_gunNo) { U16_T u16_batt_soc = u16_ui_get_sys_data(u8_gunNo,E_UI_GET_DATA_CHAR_SOC, 0); //充电soc % U16_T u16_batt_need_vol = u16_ui_get_sys_data(u8_gunNo,E_UI_GET_DATA_NEED_VOL, 0); //需求电压 精度 0.1V U16_T u16_batt_need_cur = u16_ui_get_sys_data(u8_gunNo,E_UI_GET_DATA_NEED_CUR, 0); //需求电流 精度 0.1A U8_T g_u8_ui_tx_buf[NUM_64] = {0}; U8_T u8_cnt=0; U32_T u32_data; if(s_ui_ctrl.u8_lalanguage_type == 0) //中文界面显示 { U16_T u16_batt_type = u16_ui_get_sys_data(u8_gunNo,E_UI_GET_DATA_BAAT_TYPE, 0); //电池类型 01H,铅酸电池;02H:镍氢电池;03H:磷酸铁锂电池;04H:锰酸锂电池;05H:钴酸锂电池; U16_T u16_batt_max_temp = u16_ui_get_sys_data(u8_gunNo,E_UI_GET_DATA_BATT_ONE_MAX_TEMP,0); //最高单体温度 度 U16_T u16_batt_max_vol = u16_ui_get_sys_data(u8_gunNo,E_UI_GET_DATA_BATT_ONE_MAX_VOL, 0); //最高单体电压 0.1V //电池类型 if(u16_batt_type <= 5) v_disp_string_handler(UI_BATT_RATED_DATA_ID, (U8_T *)c_batt_type[u16_batt_type], sizeof(c_batt_type[u16_batt_type])); else v_disp_string_handler(UI_BATT_RATED_DATA_ID, (U8_T *)c_batt_type[0], sizeof(c_batt_type[0])); //需求电压 0.01 u32_data = u16_batt_need_vol*10; g_u8_ui_tx_buf[u8_cnt++] = GetHigh24Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetHigh16Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetHigh8Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetLow8Bits(u32_data); //需求电流 0.01 u32_data = u16_batt_need_cur*10; g_u8_ui_tx_buf[u8_cnt++] = GetHigh8Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetLow8Bits(u32_data); //最高单体温度 0.01 u32_data = (u16_batt_max_temp)*100; g_u8_ui_tx_buf[u8_cnt++] = GetHigh8Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetLow8Bits(u32_data); //最高单体电压 0.01 u32_data = u16_batt_max_vol*10; g_u8_ui_tx_buf[u8_cnt++] = GetHigh8Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetLow8Bits(u32_data); //充电soc u32_data = u16_batt_soc; g_u8_ui_tx_buf[u8_cnt++] = GetHigh8Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetLow8Bits(u32_data); } else { U16_T u16_batt_rated_c10 = u16_ui_get_sys_data(u8_gunNo,E_UI_GET_DATA_BATT_RATED_C10,0); //电池容量 0.1 U16_T u16_batt_max_vol = u16_ui_get_sys_data(u8_gunNo,E_UI_GET_DATA_RATED_VOL, 0); //额定电压 0.1 U16_T u16_batt_max_cur = u16_ui_get_sys_data(u8_gunNo,E_UI_GET_DATA_MAX_OUT_CUR, 0); //最大充电电流 0.1 //电池容量 char c_batt_rated_c10[32] = {0}; snprintf(c_batt_rated_c10 , 32 , "%0.2f A.h",(F32_T)(u16_batt_rated_c10/100.0)); v_disp_string_handler(UI_BATT_RATED_DATA_ID, (U8_T *)&c_batt_rated_c10[0], strlen(&c_batt_rated_c10[0])); //printf("%d %d %d %d\r\n",u16_batt_need_vol,u16_batt_need_cur,u16_batt_max_vol,u16_batt_max_cur); //需求电压 0.01 u32_data = u16_batt_need_vol; // g_u8_ui_tx_buf[u8_cnt++] = GetHigh24Bits(u32_data); // g_u8_ui_tx_buf[u8_cnt++] = GetHigh16Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetHigh8Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetLow8Bits(u32_data); //需求电流 0.01 u32_data = u16_batt_need_cur; g_u8_ui_tx_buf[u8_cnt++] = GetHigh8Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetLow8Bits(u32_data); //额定电压 0.01 u32_data = (u16_batt_max_vol); g_u8_ui_tx_buf[u8_cnt++] = GetHigh8Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetLow8Bits(u32_data); //最大充电电流 0.01 u32_data = u16_batt_max_cur; g_u8_ui_tx_buf[u8_cnt++] = GetHigh8Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetLow8Bits(u32_data); //充电soc u32_data = u16_batt_soc; g_u8_ui_tx_buf[u8_cnt++] = GetHigh8Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetLow8Bits(u32_data); } v_wr_var_datas(UI_BATT_DATA_ID, g_u8_ui_tx_buf, u8_cnt); } /** * ************************************************************************ * @brief - 充电订单结算信息 * * @param[in] u8_gunNo - * * * @author jiankalka * @date 2025-09-08 * ************************************************************************ */ void v_ui_char_log_info(U8_T u8_gunNo) { U16_T u16_real_money = u16_ui_get_sys_data(u8_gunNo, E_UI_GET_DATA_CHAR_MONEY,0)/10; //充电金额 0.01元 U16_T u16_real_time = u16_ui_get_sys_data(u8_gunNo, E_UI_GET_DATA_CHAR_TIME, 0); //充电时间 min U16_T u16_log_stop_res = u16_ui_get_sys_data(u8_gunNo, E_UI_GET_DATA_STOP_INFO, 0); //充电停止原因 U32_T u32_power = u32_ui_get_charge_power(u8_gunNo); char mag[60]; v_wr_32var_data(UI_CHARGE_POWER_ID, u32_power/10); //充电电量 v_wr_var_data(UI_CHARGE_MONEY_ID, u16_real_money); //总消费金额 v_wr_var_data(UI_CHARGE_TIME_ID, u16_real_time); //已充时间min v_ui_get_fault_info(u16_log_stop_res, mag); mag[strlen(mag)] = '\0'; v_disp_string_handler(UI_STOP_REASON_ID ,(U8_T *)mag , strlen(mag)); } /** * ************************************************************************ * @brief - 待机界面 充电信息显示 * * @param[in] u8_gunNo - 抢号 0-N * * * @author jiankalka * @date 2025-09-11 * ************************************************************************ */ void v_ui_standby_char_real_info(U8_T u8_gunNo) { U16_T u16_real_vol = u16_ui_get_sys_data(u8_gunNo, E_UI_GET_DATA_CHAR_VOL, 0); //充电电压 精度 0.1V U16_T u16_real_cur = u16_ui_get_sys_data(u8_gunNo, E_UI_GET_DATA_CHAR_CUR, 0); //充电电流 精度 0.1A U16_T u16_real_soc = u16_ui_get_sys_data(u8_gunNo, E_UI_GET_DATA_CHAR_SOC, 0); //充电soc % U32_T u32_power = u32_ui_get_charge_power(u8_gunNo); U32_T u32_data; U8_T g_u8_ui_tx_buf[NUM_64] = {0}; U8_T u8_cnt=0; //充电电压 0.01 u32_data = u16_real_vol*10; g_u8_ui_tx_buf[u8_cnt++] = GetHigh24Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetHigh16Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetHigh8Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetLow8Bits(u32_data); //充电电流 0.01 u32_data = u16_real_cur*10; g_u8_ui_tx_buf[u8_cnt++] = GetHigh8Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetLow8Bits(u32_data); //充电电量 0.001 u32_data = u32_power/10; g_u8_ui_tx_buf[u8_cnt++] = GetHigh24Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetHigh16Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetHigh8Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetLow8Bits(u32_data); //充电SOC u32_data = u16_real_soc; g_u8_ui_tx_buf[u8_cnt++] = GetHigh24Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetHigh16Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetHigh8Bits(u32_data); g_u8_ui_tx_buf[u8_cnt++] = GetLow8Bits(u32_data); if(u8_gunNo == 0) v_wr_var_datas(UI_STANDBY_CHARGE_INFO_A_ID, g_u8_ui_tx_buf, u8_cnt); else v_wr_var_datas(UI_STANDBY_CHARGE_INFO_B_ID, g_u8_ui_tx_buf, u8_cnt); } /** * ************************************************************************ * @brief - 故障信息显示 * * * * @author jiankalka * @date 2025-09-09 * ************************************************************************ */ void v_ui_fault_info_show() { REAL_FAULT_DATA_T fault_data; char fault_text[220]; int written; U8_T i; (void)memset(&fault_data, 0, sizeof(fault_data)); (void)memset(fault_text, 0, sizeof(fault_text)); v_get_fault_data(&fault_data); /* 仅显示故障:格式 [pos-code],例如 [0-13000][1-13069] */ written = snprintf(fault_text, sizeof(fault_text), "F:"); if (written < 0) { written = 0; } for (i = 0U; i < CURR_FAULT_MAX_CNT; i++) { if (fault_data.fault_data[i].e_mag != E_FAULT_NULL) { written += snprintf(&fault_text[written], (size_t)(sizeof(fault_text) - (size_t)written), "[%u-%u]", (unsigned)fault_data.fault_data[i].e_ingun, (unsigned)fault_data.fault_data[i].e_mag); if (written >= (int)sizeof(fault_text) - 1) { break; } } } #if 0 /* 告警显示(预留):如需恢复,打开本段并按 [pos-code] 追加 */ if (written < (int)sizeof(fault_text) - 1) { written += snprintf(&fault_text[written], (size_t)(sizeof(fault_text) - (size_t)written), " W:"); } for (i = 0U; i < CURR_ALARM_MAX_CNT; i++) { if (fault_data.warn_data[i].e_mag != E_FAULT_NULL) { written += snprintf(&fault_text[written], (size_t)(sizeof(fault_text) - (size_t)written), "[%u-%u]", (unsigned)fault_data.warn_data[i].e_ingun, (unsigned)fault_data.warn_data[i].e_mag); if (written >= (int)sizeof(fault_text) - 1) { break; } } } #endif if ((fault_data.u8_fault_cnt == 0U) && (fault_data.u8_warn_cnt == 0U)) { (void)snprintf(fault_text, sizeof(fault_text), "No active fault"); } v_disp_text_clear(UI_FAULT_INFO_ID); v_disp_string_handler(UI_FAULT_INFO_ID, (U8_T *)fault_text, (U8_T)strlen(fault_text)); } #endif