Files
CCU621M/app/ui/ui_comm_impl.c
T

1071 lines
42 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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 <stdio.h>
#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<size;i++)
{
if(u16_addr == t_ui_tch_assemble[i].u32_addr)
{
v_ui_set_recv_data(t_ui_tch_assemble[i].pv_val,t_ui_tch_assemble[i].u8_type,
t_ui_tch_assemble[i].u32_coeff, u32_data);
break;
}
}
}
/**
* ************************************************************************
* @brief - 设置接收字符串数据
*
* @param[in] u16_addr - 数据地址
* @param[in] u8_str - 字符串数据
* @param[in] u8_str_len - 字符串长度
*
* @author jiankalka
* @date 2025-09-08
* ************************************************************************
*/
void v_set_recv_str_data(U16_T u16_addr , U8_T *u8_str , U8_T u8_str_len) //
{
// printf("recv str data,addr is [%04x],len is [%d]\r\n", u16_addr,u8_str_len);
// printf("recv str data is [%s]\r\n", u8_str);
if (u8_str == NULL || u8_str_len == 0) {
return;
}
switch (u16_addr)
{
case UI_MAINTENANCE_PWD_ID: //0x0420维护密码输入
case UI_ADMIN_PWD_ID: //0x0430管理后台维护密码输入
case UI_PARAM_INIT_PWD_ID: //0x0440 参数初始化密码输入地址
case UI_SYSTEM_RESTART_PWD_ID: //0x0450 系统重启密码输入地址
{
U8_T u8_type = 0;
if (u16_addr == UI_MAINTENANCE_PWD_ID) {
u8_type = 1; //维护密码
} else if (u16_addr == UI_ADMIN_PWD_ID) {
u8_type = 2; //管理后台维护密码
} else if (u16_addr == UI_PARAM_INIT_PWD_ID) {
u8_type = 3; //参数初始化密码
} else {
u8_type = 4; //系统重启密码
}
if(u8_str_len > 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