9ceb218f80
Co-authored-by: Cursor <cursoragent@cursor.com>
1071 lines
42 KiB
C
1071 lines
42 KiB
C
#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 |