#include "publicdata/public_define.h" #include "publicdata/publicdata.h" #include "tcp_ser/system_paracfg.h" #if TCP_DEBUG_EN /* 位字段参数类型标识变量 */ static const uint32_t g_enable_bit_param_marker = 0xE1A2B3C4; /* 使能参数位字段标识 */ static const uint32_t g_netcomm_bit_param_marker = 0xE2A3B4C5; /* 网络参数位字段标识 */ /* 基本参数映射表 */ static const param_map_item_t basic_param_map[] = { {PARAM_BASIC_GUN_COUNT, "gunCount", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.u8_gunCnt, sizeof(g_t_share_data.t_sys_fix_cfg.u8_gunCnt), "枪数量 1/2"}, {PARAM_BASIC_RATE_POW, "ratePow", PARAM_TYPE_UINT16, (void*)&g_t_share_data.t_sys_fix_cfg.u16_ratePow, sizeof(g_t_share_data.t_sys_fix_cfg.u16_ratePow), "整桩功率 kW"}, {PARAM_BASIC_MAX_VOLT, "maxVolt", PARAM_TYPE_UINT16, (void*)&g_t_share_data.t_sys_fix_cfg.u16_max_volt, sizeof(g_t_share_data.t_sys_fix_cfg.u16_max_volt), "最大输出电压 0.1V"}, {PARAM_BASIC_MAX_CUR, "maxCur", PARAM_TYPE_UINT16, (void*)&g_t_share_data.t_sys_fix_cfg.u16_max_cur, sizeof(g_t_share_data.t_sys_fix_cfg.u16_max_cur), "最大输出电流 0.1A"}, {PARAM_BASIC_PWD, "pwd", PARAM_TYPE_STRING, (void*)g_t_share_data.t_sys_fix_cfg.u8_pwd, sizeof(g_t_share_data.t_sys_fix_cfg.u8_pwd), "屏幕维护密码"}, {PARAM_BASIC_PILE_TYPE, "pileType", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.u8_pile_type, sizeof(g_t_share_data.t_sys_fix_cfg.u8_pile_type), "Unused"}, {PARAM_BASIC_TERMINAL_0, "terminal0", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.u8_terminal[0], sizeof(g_t_share_data.t_sys_fix_cfg.u8_terminal[0]), "枪1地址 1~N"}, {PARAM_BASIC_TERMINAL_1, "terminal1", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.u8_terminal[1], sizeof(g_t_share_data.t_sys_fix_cfg.u8_terminal[1]), "枪2地址 1~N"}, {PARAM_BASIC_LED_TYPE, "ledType", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.e_ledType, sizeof(g_t_share_data.t_sys_fix_cfg.e_ledType), "指示灯类型 0/1"}, {PARAM_BASIC_TIME_ZONE, "timeZone", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.e_timeZone, sizeof(g_t_share_data.t_sys_fix_cfg.e_timeZone), "系统时区 0-25 20为东八区"}, {PARAM_BASIC_THRESHOLD_GUN_TEMP, "thresholdGunTemp", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.u8_threshold_gunTemp, sizeof(g_t_share_data.t_sys_fix_cfg.u8_threshold_gunTemp), "Gun temp threshold degC"}, {PARAM_BASIC_SOC_LIMIT, "socLimit", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.u8_soc_limit, sizeof(g_t_share_data.t_sys_fix_cfg.u8_soc_limit), "Unused"}, {PARAM_BASIC_MIN_VOLT, "minVolt", PARAM_TYPE_UINT16, (void*)&g_t_share_data.t_sys_fix_cfg.u16_min_volt, sizeof(g_t_share_data.t_sys_fix_cfg.u16_min_volt), "最低输出电压 0.1V"}, {PARAM_BASIC_TRICKLE_LIMIT, "trickleLimit", PARAM_TYPE_UINT16, (void*)&g_t_share_data.t_sys_fix_cfg.u16_trickle_limit, sizeof(g_t_share_data.t_sys_fix_cfg.u16_trickle_limit), "Unused"}, {PARAM_BASIC_MDU_NUM, "mduNum", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.u8_mdu_num, sizeof(g_t_share_data.t_sys_fix_cfg.u8_mdu_num), "模块数量 1~N"}, {PARAM_BASIC_MDU_TYPE, "mduType", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.u8_MduType, sizeof(g_t_share_data.t_sys_fix_cfg.u8_MduType), "模块协议类型 0国网 1其他"}, {PARAM_BASIC_MDU_TEMP_FLAG, "mduTempFlag", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.u8_mduTemp_flag, sizeof(g_t_share_data.t_sys_fix_cfg.u8_mduTemp_flag), "模块温度获取使能 0/1"}, {PARAM_BASIC_MDU_RATED_POW, "mduRatedPow", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.u8_mdu_rated_pow, sizeof(g_t_share_data.t_sys_fix_cfg.u8_mdu_rated_pow), "模块额定功率 kW"}, {PARAM_BASIC_MDU_MAX_VOL, "mduMaxVol", PARAM_TYPE_UINT16, (void*)&g_t_share_data.t_sys_fix_cfg.u16_mdu_max_vol, sizeof(g_t_share_data.t_sys_fix_cfg.u16_mdu_max_vol), "模块最高输出电压 0.1V"}, {PARAM_BASIC_MDU_MAX_CUR, "mduMaxCur", PARAM_TYPE_UINT16, (void*)&g_t_share_data.t_sys_fix_cfg.u16_mdu_max_cur, sizeof(g_t_share_data.t_sys_fix_cfg.u16_mdu_max_cur), "模块最高输出电流 0.1A"}, {PARAM_BASIC_GUN_TYPE_0, "gunType0", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.u8_gun_type[0], sizeof(g_t_share_data.t_sys_fix_cfg.u8_gun_type[0]), "枪1类型 0欧标枪 1国标枪"}, {PARAM_BASIC_GUN_TYPE_1, "gunType1", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.u8_gun_type[1], sizeof(g_t_share_data.t_sys_fix_cfg.u8_gun_type[1]), "枪2类型 0欧标枪 1国标枪"}, {PARAM_BASIC_GUN_POWER_LIMIT_0, "gunPowerLimit0", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.u8_gun_power_limit[0], sizeof(g_t_share_data.t_sys_fix_cfg.u8_gun_power_limit[0]), "枪1充电功率限制 0表示不限制 单位kW"}, {PARAM_BASIC_GUN_POWER_LIMIT_1, "gunPowerLimit1", PARAM_TYPE_UINT8, (void *)&g_t_share_data.t_sys_fix_cfg.u8_gun_power_limit[1], sizeof(g_t_share_data.t_sys_fix_cfg.u8_gun_power_limit[1]), "Gun2 power limit kW, 0=unlimited"}, {PARAM_BASIC_PILE_POWER_LIMIT, "pilePowerLimit", PARAM_TYPE_UINT16, (void *)&g_t_share_data.t_sys_fix_cfg.u16_pile_power_limit, sizeof(g_t_share_data.t_sys_fix_cfg.u16_pile_power_limit), "Pile power limit kW, 0=unlimited"}, }; /* 基本参数映射表大小 */ #define BASIC_PARAM_MAP_SIZE (sizeof(basic_param_map) / sizeof(basic_param_map[0])) /* 网络参数映射表 */ static const param_map_item_t network_param_map[] = { /* 参数ID, 参数名称, 数据类型, 数据地址, 数据大小, 描述 */ {PARAM_NETWORK_ETH_IP, "ethIp", PARAM_TYPE_ARRAY, (void*)g_t_share_data.t_sys_fix_cfg.s_net_cfg.u8_eth_ip, sizeof(g_t_share_data.t_sys_fix_cfg.s_net_cfg.u8_eth_ip), "本地IP"}, {PARAM_NETWORK_ETH_GATE, "ethGate", PARAM_TYPE_ARRAY, (void*)g_t_share_data.t_sys_fix_cfg.s_net_cfg.u8_eth_gate, sizeof(g_t_share_data.t_sys_fix_cfg.s_net_cfg.u8_eth_gate), "网关"}, {PARAM_NETWORK_ETH_MASK, "ethMask", PARAM_TYPE_ARRAY, (void*)g_t_share_data.t_sys_fix_cfg.s_net_cfg.u8_eth_mask, sizeof(g_t_share_data.t_sys_fix_cfg.s_net_cfg.u8_eth_mask), "地址掩码"}, {PARAM_NETWORK_ETH_MAC, "ethMac", PARAM_TYPE_ARRAY, (void*)g_t_share_data.t_sys_fix_cfg.s_net_cfg.u8_eth_mac, sizeof(g_t_share_data.t_sys_fix_cfg.s_net_cfg.u8_eth_mac), "MAC地址"}, {PARAM_NETWORK_SERVER_A_DOMAIN, "serverADomain", PARAM_TYPE_STRING, (void*)g_t_share_data.t_sys_fix_cfg.s_net_cfg.u8_serverA_domain_name, sizeof(g_t_share_data.t_sys_fix_cfg.s_net_cfg.u8_serverA_domain_name), "平台1服务器域名"}, {PARAM_NETWORK_SERVER_B_DOMAIN, "serverBDomain", PARAM_TYPE_STRING, (void*)g_t_share_data.t_sys_fix_cfg.s_net_cfg.u8_serverB_domain_name, sizeof(g_t_share_data.t_sys_fix_cfg.s_net_cfg.u8_serverB_domain_name), "平台2服务器域名"}, {PARAM_NETWORK_PLAT_A_PILENUM, "platAPileNum", PARAM_TYPE_STRING, (void*)g_t_share_data.t_sys_fix_cfg.s_net_cfg.u8_platA_pileNum, sizeof(g_t_share_data.t_sys_fix_cfg.s_net_cfg.u8_platA_pileNum), "平台1桩编号"}, {PARAM_NETWORK_PLAT_B_PILENUM, "platBPileNum", PARAM_TYPE_STRING, (void*)g_t_share_data.t_sys_fix_cfg.s_net_cfg.u8_platB_pileNum, sizeof(g_t_share_data.t_sys_fix_cfg.s_net_cfg.u8_platB_pileNum), "平台1桩编号"}, /* U_NET_COMM_PARA 位字段参数 */ {PARAM_NETWORK_PROGRAM_TYPE, "programType", PARAM_TYPE_BIT, (void*)&g_netcomm_bit_param_marker, sizeof(uint32_t), "程序类型 "}, {PARAM_NETWORK_NET_A_TYPE, "netAType", PARAM_TYPE_BIT, (void*)&g_netcomm_bit_param_marker, sizeof(uint32_t), "平台1联网方式 0:4G 1:网线"}, {PARAM_NETWORK_NET_B_TYPE, "netBType", PARAM_TYPE_BIT, (void*)&g_netcomm_bit_param_marker, sizeof(uint32_t), "平台2联网方式 0:4G 1:网线"}, {PARAM_NETWORK_PLAT_A_EN, "platAEn", PARAM_TYPE_BIT, (void*)&g_netcomm_bit_param_marker, sizeof(uint32_t), "平台1使能"}, {PARAM_NETWORK_PLAT_B_EN, "platBEn", PARAM_TYPE_BIT, (void*)&g_netcomm_bit_param_marker, sizeof(uint32_t), "平台2使能"}, {PARAM_NETWORK_PLAT_A_TYPE, "platAType", PARAM_TYPE_BIT, (void*)&g_netcomm_bit_param_marker, sizeof(uint32_t), "平台1类型"}, {PARAM_NETWORK_PLAT_B_TYPE, "platBType", PARAM_TYPE_BIT, (void*)&g_netcomm_bit_param_marker, sizeof(uint32_t), "平台2类型"}, {PARAM_NETWORK_SIM_ANP_TYPE, "simAnpType", PARAM_TYPE_BIT, (void*)&g_netcomm_bit_param_marker, sizeof(uint32_t), "SIM 卡APN类型 0公网卡 1国网移动 2国网联通 3国网电信"}, }; /* 网络参数映射表大小 */ #define NETWORK_PARAM_MAP_SIZE (sizeof(network_param_map) / sizeof(network_param_map[0])) /* 电表参数映射表 */ static const param_map_item_t meter_param_map[] = { /* 参数ID, 参数名称, 数据类型, 数据地址, 数据大小, 描述 */ {PARAM_METER_METER_NUM, "meterNum", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.s_memter.u8_meter_num, sizeof(g_t_share_data.t_sys_fix_cfg.s_memter.u8_meter_num), "电表数量 1~4"}, {PARAM_METER_0_IN_GUN, "meter0InGun", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.s_memter.s_data[0].u8_inGun, sizeof(g_t_share_data.t_sys_fix_cfg.s_memter.s_data[0].u8_inGun), "归属枪号 0不存在; 1A枪 2B枪"}, {PARAM_METER_0_HIGH_PREC, "meter0HighPrec", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.s_memter.s_data[0].u8_highPrec, sizeof(g_t_share_data.t_sys_fix_cfg.s_memter.s_data[0].u8_highPrec), "是否支持高精度 0/1"}, {PARAM_METER_0_IS_AC, "meter0IsAC", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.s_memter.s_data[0].u8_isAC, sizeof(g_t_share_data.t_sys_fix_cfg.s_memter.s_data[0].u8_isAC), "是否为交流表 0直流表 1交流表"}, {PARAM_METER_0_ADDR, "meter0Addr", PARAM_TYPE_ARRAY, (void*)g_t_share_data.t_sys_fix_cfg.s_memter.s_data[0].u8_meterAddr, sizeof(g_t_share_data.t_sys_fix_cfg.s_memter.s_data[0].u8_meterAddr), "电表地址"}, {PARAM_METER_1_IN_GUN, "meter1InGun", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.s_memter.s_data[1].u8_inGun, sizeof(g_t_share_data.t_sys_fix_cfg.s_memter.s_data[1].u8_inGun), "归属枪号 0不存在; 1A枪 2B枪"}, {PARAM_METER_1_HIGH_PREC, "meter1HighPrec", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.s_memter.s_data[1].u8_highPrec, sizeof(g_t_share_data.t_sys_fix_cfg.s_memter.s_data[1].u8_highPrec), "是否支持高精度 0/1"}, {PARAM_METER_1_IS_AC, "meter1IsAC", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.s_memter.s_data[1].u8_isAC, sizeof(g_t_share_data.t_sys_fix_cfg.s_memter.s_data[1].u8_isAC), "是否为交流表 0直流表 1交流表"}, {PARAM_METER_1_ADDR, "meter1Addr", PARAM_TYPE_ARRAY, (void*)g_t_share_data.t_sys_fix_cfg.s_memter.s_data[1].u8_meterAddr, sizeof(g_t_share_data.t_sys_fix_cfg.s_memter.s_data[1].u8_meterAddr), "电表地址"}, {PARAM_METER_2_IN_GUN, "meter2InGun", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.s_memter.s_data[2].u8_inGun, sizeof(g_t_share_data.t_sys_fix_cfg.s_memter.s_data[2].u8_inGun), "归属枪号 0不存在; 1A枪 2B枪"}, {PARAM_METER_2_HIGH_PREC, "meter2HighPrec", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.s_memter.s_data[2].u8_highPrec, sizeof(g_t_share_data.t_sys_fix_cfg.s_memter.s_data[2].u8_highPrec), "是否支持高精度 0/1"}, {PARAM_METER_2_IS_AC, "meter2IsAC", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.s_memter.s_data[2].u8_isAC, sizeof(g_t_share_data.t_sys_fix_cfg.s_memter.s_data[2].u8_isAC), "是否为交流表 0直流表 1交流表"}, {PARAM_METER_2_ADDR, "meter2Addr", PARAM_TYPE_STRING, (void*)g_t_share_data.t_sys_fix_cfg.s_memter.s_data[2].u8_meterAddr, sizeof(g_t_share_data.t_sys_fix_cfg.s_memter.s_data[2].u8_meterAddr), "电表地址"}, {PARAM_METER_3_IN_GUN, "meter3InGun", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.s_memter.s_data[3].u8_inGun, sizeof(g_t_share_data.t_sys_fix_cfg.s_memter.s_data[3].u8_inGun), "归属枪号 0不存在; 1A枪 2B枪"}, {PARAM_METER_3_HIGH_PREC, "meter3HighPrec", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.s_memter.s_data[3].u8_highPrec, sizeof(g_t_share_data.t_sys_fix_cfg.s_memter.s_data[3].u8_highPrec), "是否支持高精度 0/1"}, {PARAM_METER_3_IS_AC, "meter3IsAC", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_fix_cfg.s_memter.s_data[3].u8_isAC, sizeof(g_t_share_data.t_sys_fix_cfg.s_memter.s_data[3].u8_isAC), "是否为交流表 0直流表 1交流表"}, {PARAM_METER_3_ADDR, "meter3Addr", PARAM_TYPE_STRING, (void*)g_t_share_data.t_sys_fix_cfg.s_memter.s_data[3].u8_meterAddr, sizeof(g_t_share_data.t_sys_fix_cfg.s_memter.s_data[3].u8_meterAddr), "电表地址"}, }; /* 电表参数映射表大小 */ #define METER_PARAM_MAP_SIZE (sizeof(meter_param_map) / sizeof(meter_param_map[0])) /* 使能参数映射表 */ static const param_map_item_t enable_param_map[] = { /* 参数ID, 参数名称, 数据类型, 数据地址, 数据大小, 描述 */ {PARAM_ENABLE_DOOR_ENABLE, "doorEnable", PARAM_TYPE_BIT, (void*)&g_enable_bit_param_marker, sizeof(uint32_t), "门禁使能(2位)"}, {PARAM_ENABLE_GUN_LOCK_ENA, "gunLockEna", PARAM_TYPE_BIT, (void*)&g_enable_bit_param_marker, sizeof(uint32_t), "枪锁使能(2位)"}, {PARAM_ENABLE_GUN_LOCK_NEG, "gunLockNeg", PARAM_TYPE_BIT, (void*)&g_enable_bit_param_marker, sizeof(uint32_t), "枪锁信号取反(2位)"}, {PARAM_ENABLE_AC_CONTACT_ENA, "acContactEna", PARAM_TYPE_BIT, (void*)&g_enable_bit_param_marker, sizeof(uint32_t), "交流接触器使能(2位)"}, {PARAM_ENABLE_GUN_HOMING, "gunHoming", PARAM_TYPE_BIT, (void*)&g_enable_bit_param_marker, sizeof(uint32_t), "枪归位信号有无(2位)"}, {PARAM_ENABLE_GB_ENABLE, "gbEnable", PARAM_TYPE_BIT, (void*)&g_enable_bit_param_marker, sizeof(uint32_t), "国标使能(2位)"}, {PARAM_ENABLE_LCD_ENABLE, "lcdEnable", PARAM_TYPE_BIT, (void*)&g_enable_bit_param_marker, sizeof(uint32_t), "液晶使能(2位)"}, {PARAM_ENABLE_AUX_POWER, "auxPower", PARAM_TYPE_BIT, (void*)&g_enable_bit_param_marker, sizeof(uint32_t), "辅助电压返回状态使能(2位)"}, {PARAM_ENABLE_RELIEF_EN, "reliefEn", PARAM_TYPE_BIT, (void*)&g_enable_bit_param_marker, sizeof(uint32_t), "泄放使能(2位)"}, {PARAM_ENABLE_YE_LEN_EN, "yeLenEn", PARAM_TYPE_BIT, (void*)&g_enable_bit_param_marker, sizeof(uint32_t), "液冷通讯使能(2位)"}, {PARAM_ENABLE_AB_COMM_EN, "abCommEn", PARAM_TYPE_BIT, (void*)&g_enable_bit_param_marker, sizeof(uint32_t), "主副班通讯使能(2位)"}, {PARAM_ENABLE_SCREEN_SAVER_EN, "screenSaverEn", PARAM_TYPE_BIT, (void*)&g_enable_bit_param_marker, sizeof(uint32_t), "UI屏保显示使能(2位)"}, {PARAM_ENABLE_PLUG_EN, "plugEn", PARAM_TYPE_BIT, (void*)&g_enable_bit_param_marker, sizeof(uint32_t), "即插即充使能(2位)"}, {PARAM_ENABLE_UI_ENGLISH_EN, "uiEnglishEn", PARAM_TYPE_BIT, (void*)&g_enable_bit_param_marker, sizeof(uint32_t), "UI界面英语使能(2位)"}, {PARAM_ENABLE_DC_CONTACT_EN, "dcContactEn", PARAM_TYPE_BIT, (void *)&g_enable_bit_param_marker, sizeof(uint32_t), "母联接触器使能(2位)"}, {PARAM_ENABLE_GUN_FAN_EN, "gunFanEn", PARAM_TYPE_BIT, (void *)&g_enable_bit_param_marker, sizeof(uint32_t), "充电枪风扇使能(2位)"}, {PARAM_ENABLE_MDU_ZERO_POW_EN, "mduZeroPowEn", PARAM_TYPE_BIT, (void *)&g_enable_bit_param_marker, sizeof(uint32_t), "模块零功脉冲使能(2位)"}, {PARAM_ENABLE_LED_GB_EN, "ledGbEn", PARAM_TYPE_BIT, (void *)&g_enable_bit_param_marker, sizeof(uint32_t), "LED国标使能(2位)"}, }; /* 使能参数映射表大小 */ #define ENABLE_PARAM_MAP_SIZE (sizeof(enable_param_map) / sizeof(enable_param_map[0])) /* 费率参数映射表 */ static const param_map_item_t fee_param_map[] = { /* 参数ID, 参数名称, 数据类型, 数据地址, 数据大小, 描述 */ {PARAM_FEE_MODEL_NO, "feeModelNo", PARAM_TYPE_STRING, (void*)g_t_share_data.t_sys_var_cfg.s_fee_model.u8_model_no, sizeof(g_t_share_data.t_sys_var_cfg.s_fee_model.u8_model_no), "费率编号"}, {PARAM_FEE_FEE_CNT, "feeCnt", PARAM_TYPE_UINT8, (void*)&g_t_share_data.t_sys_var_cfg.s_fee_model.u8_feeCnt, sizeof(g_t_share_data.t_sys_var_cfg.s_fee_model.u8_feeCnt), "费率条数"}, /* 费率类型0-29的费率和服务费 */ {PARAM_FEE_TYPE_0_RATE, "feeType0Rate", PARAM_TYPE_UINT32, (void*)&g_t_share_data.t_sys_var_cfg.s_fee_model.s_fee_data[0].u32_rate, sizeof(g_t_share_data.t_sys_var_cfg.s_fee_model.s_fee_data[0].u32_rate), "费率1电费 0.00001"}, {PARAM_FEE_TYPE_0_SERVICE, "feeType0Service", PARAM_TYPE_UINT32, (void*)&g_t_share_data.t_sys_var_cfg.s_fee_model.s_fee_data[0].u32_sevice, sizeof(g_t_share_data.t_sys_var_cfg.s_fee_model.s_fee_data[0].u32_sevice), "费率1服务费 0.00001"}, {PARAM_FEE_TYPE_1_RATE, "feeType1Rate", PARAM_TYPE_UINT32, (void*)&g_t_share_data.t_sys_var_cfg.s_fee_model.s_fee_data[1].u32_rate, sizeof(g_t_share_data.t_sys_var_cfg.s_fee_model.s_fee_data[1].u32_rate), "费率2电费 0.00001"}, {PARAM_FEE_TYPE_1_SERVICE, "feeType1Service", PARAM_TYPE_UINT32, (void*)&g_t_share_data.t_sys_var_cfg.s_fee_model.s_fee_data[1].u32_sevice, sizeof(g_t_share_data.t_sys_var_cfg.s_fee_model.s_fee_data[1].u32_sevice), "费率2服务费 0.00001"}, {PARAM_FEE_TYPE_2_RATE, "feeType2Rate", PARAM_TYPE_UINT32, (void*)&g_t_share_data.t_sys_var_cfg.s_fee_model.s_fee_data[2].u32_rate, sizeof(g_t_share_data.t_sys_var_cfg.s_fee_model.s_fee_data[2].u32_rate), "费率3电费 0.00001"}, {PARAM_FEE_TYPE_2_SERVICE, "feeType2Service", PARAM_TYPE_UINT32, (void*)&g_t_share_data.t_sys_var_cfg.s_fee_model.s_fee_data[2].u32_sevice, sizeof(g_t_share_data.t_sys_var_cfg.s_fee_model.s_fee_data[2].u32_sevice), "费率3服务费 0.00001"}, {PARAM_FEE_TYPE_3_RATE, "feeType3Rate", PARAM_TYPE_UINT32, (void*)&g_t_share_data.t_sys_var_cfg.s_fee_model.s_fee_data[3].u32_rate, sizeof(g_t_share_data.t_sys_var_cfg.s_fee_model.s_fee_data[3].u32_rate), "费率4电费 0.00001"}, {PARAM_FEE_TYPE_3_SERVICE, "feeType3Service", PARAM_TYPE_UINT32, (void*)&g_t_share_data.t_sys_var_cfg.s_fee_model.s_fee_data[3].u32_sevice, sizeof(g_t_share_data.t_sys_var_cfg.s_fee_model.s_fee_data[3].u32_sevice), "费率4服务费 0.00001"}, {PARAM_FEE_TYPE_4_RATE, "feeType4Rate", PARAM_TYPE_UINT32, (void*)&g_t_share_data.t_sys_var_cfg.s_fee_model.s_fee_data[4].u32_rate, sizeof(g_t_share_data.t_sys_var_cfg.s_fee_model.s_fee_data[4].u32_rate), "费率5电费 0.00001"}, {PARAM_FEE_TYPE_4_SERVICE, "feeType4Service", PARAM_TYPE_UINT32, (void*)&g_t_share_data.t_sys_var_cfg.s_fee_model.s_fee_data[4].u32_sevice, sizeof(g_t_share_data.t_sys_var_cfg.s_fee_model.s_fee_data[4].u32_sevice), "费率5服务费 0.00001"}, /* 时段费率类型0-95 */ {PARAM_FEE_TYPE_1_24, "feeTimeType_1_24", PARAM_TYPE_ARRAY, (void*)&g_t_share_data.t_sys_var_cfg.s_fee_model.u8_fee_type[0], 24, "时段费率类型1-24"}, {PARAM_FEE_TYPE_25_48, "feeTimeType-25_48", PARAM_TYPE_ARRAY, (void*)&g_t_share_data.t_sys_var_cfg.s_fee_model.u8_fee_type[24], 24, "时段费率类型25-48"}, {PARAM_FEE_TYPE_49_72, "feeTimeType_49_72", PARAM_TYPE_ARRAY, (void*)&g_t_share_data.t_sys_var_cfg.s_fee_model.u8_fee_type[48], 24, "时段费率类型49-72"}, {PARAM_FEE_TYPE_73_96, "feeTimeType_73_96", PARAM_TYPE_ARRAY, (void*)&g_t_share_data.t_sys_var_cfg.s_fee_model.u8_fee_type[72], 24, "时段费率类型73-96"}, }; /* 费率参数映射表大小 */ #define FEE_PARAM_MAP_SIZE (sizeof(fee_param_map) / sizeof(fee_param_map[0])) /* SDK参数映射表 */ static const param_map_item_t sdk_param_map[] = { /* 参数ID, 参数名称, 数据类型, 数据地址, 数据大小, 描述 */ {PARAM_SDK_PRODUCT_KEY, "productKey", PARAM_TYPE_STRING, (void*)g_t_share_data.t_sys_var_cfg.s_sdk_data.product_key, sizeof(g_t_share_data.t_sys_var_cfg.s_sdk_data.product_key), "产品秘钥"}, {PARAM_SDK_DEVICE_NAME, "deviceName", PARAM_TYPE_STRING, (void*)g_t_share_data.t_sys_var_cfg.s_sdk_data.device_name, sizeof(g_t_share_data.t_sys_var_cfg.s_sdk_data.device_name), "资产码"}, {PARAM_SDK_DEVICE_SECRET, "deviceSecret", PARAM_TYPE_STRING, (void*)g_t_share_data.t_sys_var_cfg.s_sdk_data.device_secret, sizeof(g_t_share_data.t_sys_var_cfg.s_sdk_data.device_secret), "设备密钥"}, {PARAM_SDK_DEVICE_REG_CODE, "deviceRegCode", PARAM_TYPE_STRING, (void*)g_t_share_data.t_sys_var_cfg.s_sdk_data.device_reg_code, sizeof(g_t_share_data.t_sys_var_cfg.s_sdk_data.device_reg_code), "注册码"}, {PARAM_SDK_DEVICE_UID, "deviceUid", PARAM_TYPE_STRING, (void*)g_t_share_data.t_sys_var_cfg.s_sdk_data.device_uid, sizeof(g_t_share_data.t_sys_var_cfg.s_sdk_data.device_uid), "出厂编码"}, {PARAM_SDK_FIRMWARE_VERSION, "firmwareVersion", PARAM_TYPE_STRING, (void*)g_t_share_data.t_sys_var_cfg.s_sdk_data.firmware_version, sizeof(g_t_share_data.t_sys_var_cfg.s_sdk_data.firmware_version), "固件版本信息"}, }; /* SDK参数映射表大小 */ #define SDK_PARAM_MAP_SIZE (sizeof(sdk_param_map) / sizeof(sdk_param_map[0])) /* 二维码参数映射表 */ static const param_map_item_t qrcode_param_map[] = { /* 参数ID, 参数名称, 数据类型, 数据地址, 数据大小, 描述 */ {PARAM_QRCODE_GUN1, "gun1QRCode", PARAM_TYPE_STRING, (void*)g_t_share_data.t_sys_var_cfg.QRDisplay[0], sizeof(g_t_share_data.t_sys_var_cfg.QRDisplay[0]), "枪1二维码"}, {PARAM_QRCODE_GUN2, "gun2QRCode", PARAM_TYPE_STRING, (void*)g_t_share_data.t_sys_var_cfg.QRDisplay[1], sizeof(g_t_share_data.t_sys_var_cfg.QRDisplay[1]), "枪2二维码"}, {PARAM_QRCODE_CUSTOM_VER, "customVersion", PARAM_TYPE_STRING, (void*)g_t_share_data.t_sys_var_cfg.custom_ver, sizeof(g_t_share_data.t_sys_var_cfg.custom_ver), "定制版本信息"}, {PARAM_QRCODE_APN_STR, "apnStr", PARAM_TYPE_STRING, (void*)g_t_share_data.t_sys_var_cfg.apn_str, sizeof(g_t_share_data.t_sys_var_cfg.apn_str), "4G APN"}, {PARAM_QRCODE_OCPP_AUTH_KEY, "ocppAuthKey", PARAM_TYPE_STRING, (void*)g_t_share_data.t_sys_var_cfg.ocpp_auth_key, sizeof(g_t_share_data.t_sys_var_cfg.ocpp_auth_key), "OCPP鉴权密钥"}, }; /* 二维码参数映射表大小 */ #define QRCODE_PARAM_MAP_SIZE (sizeof(qrcode_param_map) / sizeof(qrcode_param_map[0])) /* 获取各参数类型映射表的函数 */ /** * @brief 获取基本参数映射表 * @retval 参数映射表指针 */ const param_map_item_t* param_get_basic_map(void) { return basic_param_map; } /** * @brief 获取基本参数映射表大小 * @retval 参数映射表大小 */ uint16_t param_get_basic_map_size(void) { return BASIC_PARAM_MAP_SIZE; } /** * @brief 获取网络参数映射表 * @retval 参数映射表指针 */ const param_map_item_t* param_get_network_map(void) { return network_param_map; } /** * @brief 获取网络参数映射表大小 * @retval 参数映射表大小 */ uint16_t param_get_network_map_size(void) { return NETWORK_PARAM_MAP_SIZE; } /** * @brief 获取电表参数映射表 * @retval 参数映射表指针 */ const param_map_item_t* param_get_meter_map(void) { return meter_param_map; } /** * @brief 获取电表参数映射表大小 * @retval 参数映射表大小 */ uint16_t param_get_meter_map_size(void) { return METER_PARAM_MAP_SIZE; } /** * @brief 获取使能参数映射表 * @retval 参数映射表指针 */ const param_map_item_t* param_get_enable_map(void) { return enable_param_map; } /** * @brief 获取使能参数映射表大小 * @retval 参数映射表大小 */ uint16_t param_get_enable_map_size(void) { return ENABLE_PARAM_MAP_SIZE; } /** * @brief 获取费率参数映射表 * @retval 参数映射表指针 */ const param_map_item_t* param_get_fee_map(void) { return fee_param_map; } /** * @brief 获取费率参数映射表大小 * @retval 参数映射表大小 */ uint16_t param_get_fee_map_size(void) { return FEE_PARAM_MAP_SIZE; } /** * @brief 获取SDK参数映射表 * @retval 参数映射表指针 */ const param_map_item_t* param_get_sdk_map(void) { return sdk_param_map; } /** * @brief 获取SDK参数映射表大小 * @retval 参数映射表大小 */ uint16_t param_get_sdk_map_size(void) { return SDK_PARAM_MAP_SIZE; } /** * @brief 获取二维码参数映射表 * @retval 参数映射表指针 */ const param_map_item_t* param_get_qrcode_map(void) { return qrcode_param_map; } /** * @brief 获取二维码参数映射表大小 * @retval 参数映射表大小 */ uint16_t param_get_qrcode_map_size(void) { return QRCODE_PARAM_MAP_SIZE; } /** * @brief 将参数类型枚举转换为字符串 * @param type 参数类型枚举 * @retval 类型字符串 */ const char* param_type_to_string(param_data_type_t type) { switch (type) { case PARAM_TYPE_STRING: return "string"; case PARAM_TYPE_UINT8: return "uint8"; case PARAM_TYPE_UINT16: return "uint16"; case PARAM_TYPE_UINT32: return "uint32"; case PARAM_TYPE_FLOAT: return "float"; case PARAM_TYPE_INT: return "int"; case PARAM_TYPE_ARRAY: return "array"; case PARAM_TYPE_BIT: return "bit"; default: return "unknown"; } } /** * @brief 根据参数ID获取或设置使能参数的位字段值 * @param param_id 参数ID(param_enable_enum_t枚举值) * @param op_flag 操作标志:0为获取数据,1为设置数据 * @param value 当op_flag=1时,要设置的值;当op_flag=0时,忽略此参数 * @retval 当op_flag=0时返回位字段值(0-3,因为每个位字段是2位),当op_flag=1时返回0表示成功,非0表示失败 */ uint32_t param_get_enable_bit_value(uint16_t param_id, uint8_t op_flag, uint32_t value) { /* 直接访问U_ENABLE_FALG结构体中的位字段成员 */ switch (param_id) { case PARAM_ENABLE_DOOR_ENABLE: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_doorEnable; } else { if (value > 3) return 1; /* 值超出范围(2位最大为3) */ g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_doorEnable = value; return 0; } case PARAM_ENABLE_GUN_LOCK_ENA: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_gunLockEna; } else { if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_gunLockEna = value; return 0; } case PARAM_ENABLE_GUN_LOCK_NEG: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_gunLockNeg; } else { if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_gunLockNeg = value; return 0; } case PARAM_ENABLE_AC_CONTACT_ENA: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_AcContactEna; } else { if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_AcContactEna = value; return 0; } case PARAM_ENABLE_GUN_HOMING: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_gunHoming; } else { if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_gunHoming = value; return 0; } case PARAM_ENABLE_GB_ENABLE: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_GBEnable; } else { if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_GBEnable = value; return 0; } case PARAM_ENABLE_LCD_ENABLE: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_LcdEnable; } else { if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_LcdEnable = value; return 0; } case PARAM_ENABLE_AUX_POWER: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_auxpower; } else { if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_auxpower = value; return 0; } case PARAM_ENABLE_RELIEF_EN: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_reliefen; } else { if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_reliefen = value; return 0; } case PARAM_ENABLE_YE_LEN_EN: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_YeLenEn; } else { if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_YeLenEn = value; return 0; } case PARAM_ENABLE_AB_COMM_EN: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_ABcommEn; } else { if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_ABcommEn = value; return 0; } case PARAM_ENABLE_SCREEN_SAVER_EN: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_ScreenSaverEn; } else { if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_ScreenSaverEn = value; return 0; } case PARAM_ENABLE_PLUG_EN: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_PlugEn; } else { if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_PlugEn = value; return 0; } case PARAM_ENABLE_UI_ENGLISH_EN: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_uiEnglishEn; } else { if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_uiEnglishEn = value; return 0; } case PARAM_ENABLE_DC_CONTACT_EN: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_dcBusEn; } else { if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_dcBusEn = value; return 0; } case PARAM_ENABLE_GUN_FAN_EN: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_gunFanEn; } else { if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_gunFanEn = value; return 0; } case PARAM_ENABLE_MDU_ZERO_POW_EN: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_mduzeropowEn; } else { if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_mduzeropowEn = value; return 0; } case PARAM_ENABLE_LED_GB_EN: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_ledGbEn; } else { if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_ledGbEn = value; return 0; } default: return 0; /* 未知参数ID */ } } /** * @brief 根据参数ID获取或设置网络连接参数的位字段值 * @param param_id 参数ID(param_network_enum_t枚举值) * @param op_flag 操作标志:0为获取数据,1为设置数据 * @param value 当op_flag=1时,要设置的值;当op_flag=0时,忽略此参数 * @retval 当op_flag=0时返回位字段值,当op_flag=1时返回0表示成功,非0表示失败 */ uint32_t param_get_netcomm_bit_value(uint16_t param_id, uint8_t op_flag, uint32_t value) { /* 直接访问U_NET_COMM_PARA结构体中的位字段成员 */ switch (param_id) { case PARAM_NETWORK_PROGRAM_TYPE: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.s_net_cfg.u_net_comm_para.bits.bit_program_type; } else { /* program_type是2位字段,最大值为3 */ if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.s_net_cfg.u_net_comm_para.bits.bit_program_type = value; return 0; } case PARAM_NETWORK_NET_A_TYPE: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.s_net_cfg.u_net_comm_para.bits.bit_netA_type; } else { /* netA_type是2位字段,最大值为3 */ if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.s_net_cfg.u_net_comm_para.bits.bit_netA_type = value; return 0; } case PARAM_NETWORK_NET_B_TYPE: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.s_net_cfg.u_net_comm_para.bits.bit_netB_type; } else { /* netB_type是2位字段,最大值为3 */ if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.s_net_cfg.u_net_comm_para.bits.bit_netB_type = value; return 0; } case PARAM_NETWORK_PLAT_A_EN: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.s_net_cfg.u_net_comm_para.bits.bit_platA_en; } else { /* platA_en是1位字段,最大值为1 */ if (value > 1) return 1; g_t_share_data.t_sys_fix_cfg.s_net_cfg.u_net_comm_para.bits.bit_platA_en = value; return 0; } case PARAM_NETWORK_PLAT_B_EN: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.s_net_cfg.u_net_comm_para.bits.bit_platB_en; } else { /* platB_en是1位字段,最大值为1 */ if (value > 1) return 1; g_t_share_data.t_sys_fix_cfg.s_net_cfg.u_net_comm_para.bits.bit_platB_en = value; return 0; } case PARAM_NETWORK_PLAT_A_TYPE: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.s_net_cfg.u_net_comm_para.bits.bit_platA_type; } else { /* platA_type是2位字段,最大值为3 */ if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.s_net_cfg.u_net_comm_para.bits.bit_platA_type = value; return 0; } case PARAM_NETWORK_PLAT_B_TYPE: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.s_net_cfg.u_net_comm_para.bits.bit_platB_type; } else { /* platB_type是2位字段,最大值为3 */ if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.s_net_cfg.u_net_comm_para.bits.bit_platB_type = value; return 0; } case PARAM_NETWORK_SIM_ANP_TYPE: if (op_flag == 0) { return g_t_share_data.t_sys_fix_cfg.s_net_cfg.u_net_comm_para.bits.bit_sim_anp_type; } else { /* sim_anp_type是2位字段,最大值为3 */ if (value > 3) return 1; g_t_share_data.t_sys_fix_cfg.s_net_cfg.u_net_comm_para.bits.bit_sim_anp_type = value; return 0; } default: return 0; /* 未知参数ID */ } } /** * @brief 根据参数映射表项获取参数值字符串 * @param item 参数映射表项 * @param buffer 输出缓冲区 * @param size 缓冲区大小 * @retval 0成功,-1失败 */ int param_get_value_as_string(const param_map_item_t *item, char *buffer, uint32_t size) { if (item == NULL || buffer == NULL || size == 0) { return -1; } switch (item->data_type) { case PARAM_TYPE_STRING: snprintf(buffer, size, "%s", (char*)item->data_addr); break; case PARAM_TYPE_UINT8: snprintf(buffer, size, "%u", *(uint8_t*)item->data_addr); break; case PARAM_TYPE_UINT16: snprintf(buffer, size, "%u", *(uint16_t*)item->data_addr); break; case PARAM_TYPE_UINT32: snprintf(buffer, size, "%u", *(uint32_t*)item->data_addr); break; case PARAM_TYPE_FLOAT: snprintf(buffer, size, "%.2f", *(float*)item->data_addr); break; case PARAM_TYPE_INT: snprintf(buffer, size, "%d", *(int*)item->data_addr); break; case PARAM_TYPE_ARRAY: { /* 数组类型:显示为十进制字节序列 */ uint8_t *data = (uint8_t*)item->data_addr; uint32_t data_size = item->data_size; uint32_t i; char *ptr = buffer; uint32_t remaining = size; if (data_size == 0) { snprintf(buffer, size, "[]"); break; } /* 开始构建数组字符串 */ *ptr++ = '['; remaining--; for (i = 0; i < data_size; i++) { /* 检查剩余空间是否足够 */ if (remaining < 10) { /* 预留空间给当前数字和可能的逗号、结束符 */ /* 如果空间不足,用"..."表示剩余内容 */ if (remaining >= 4) { strcpy(ptr, "..."); ptr += 3; remaining -= 3; } break; } if (i > 0) { *ptr++ = ','; remaining--; } /* 格式化当前数字 */ int written = snprintf(ptr, remaining, "%d", data[i]); if (written < 0 || written >= (int)remaining) { /* 格式化失败,用"..."表示剩余内容 */ if (remaining >= 4) { strcpy(ptr, "..."); ptr += 3; remaining -= 3; } break; } ptr += written; remaining -= written; } /* 添加结束括号 */ if (remaining >= 2) { *ptr++ = ']'; *ptr = '\0'; } else { /* 如果空间不足,确保字符串以空字符结尾 */ if (size > 0) { buffer[size - 1] = '\0'; } } break; } case PARAM_TYPE_BIT: { /* 检查是否为使能参数的位字段 */ if (item->data_addr == (void*)&g_enable_bit_param_marker) { /* 使用param_get_enable_bit_value函数获取值(操作标志为0) */ uint32_t bit_value = param_get_enable_bit_value(item->param_id, 0, 0); /* 显示为十进制 */ snprintf(buffer, size, "%u", bit_value); return 0; } /* 检查是否为网络连接参数的位字段 */ else if (item->data_addr == (void*)&g_netcomm_bit_param_marker) { /* 使用param_get_netcomm_bit_value函数获取值(操作标志为0) */ uint32_t bit_value = param_get_netcomm_bit_value(item->param_id, 0, 0); /* 显示为十进制 */ snprintf(buffer, size, "%u", bit_value); return 0; } else { /* data_addr为NULL且不是标记变量的位字段参数 */ snprintf(buffer, size, "N/A"); return -1; } break; } default: snprintf(buffer, size, "unknown"); return -1; } return 0; } /** * @brief 根据参数映射表项设置参数值(从字符串) * @param item 参数映射表项 * @param value_str 参数值字符串 * @retval 0成功,-1失败 */ int param_set_value_from_string(const param_map_item_t *item, const char *value_str) { if (item == NULL || value_str == NULL) { return -1; } switch (item->data_type) { case PARAM_TYPE_STRING: /* 字符串类型:直接复制,确保不超过缓冲区大小 */ if (item->data_addr == NULL) { printf("[PARAM] String parameter data_addr is NULL: %s\n", item->param_name); return -1; } strncpy((char*)item->data_addr, value_str, item->data_size - 1); ((char*)item->data_addr)[item->data_size - 1] = '\0'; break; case PARAM_TYPE_UINT8: { /* uint8类型:转换为整数 */ if (item->data_addr == NULL) { printf("[PARAM] UINT8 parameter data_addr is NULL: %s\n", item->param_name); return -1; } char *endptr; long value = strtol(value_str, &endptr, 0); if (endptr == value_str || *endptr != '\0') { return -1; /* 转换失败 */ } if (value < 0 || value > 255) { return -1; /* 超出范围 */ } *(uint8_t*)item->data_addr = (uint8_t)value; break; } case PARAM_TYPE_UINT16: { /* uint16类型:转换为整数 */ if (item->data_addr == NULL) { printf("[PARAM] UINT16 parameter data_addr is NULL: %s\n", item->param_name); return -1; } char *endptr; long value = strtol(value_str, &endptr, 0); if (endptr == value_str || *endptr != '\0') { return -1; /* 转换失败 */ } if (value < 0 || value > 65535) { return -1; /* 超出范围 */ } *(uint16_t*)item->data_addr = (uint16_t)value; break; } case PARAM_TYPE_UINT32: { /* uint32类型:转换为整数 */ if (item->data_addr == NULL) { printf("[PARAM] UINT32 parameter data_addr is NULL: %s\n", item->param_name); return -1; } char *endptr; unsigned long value = strtoul(value_str, &endptr, 0); if (endptr == value_str || *endptr != '\0') { return -1; /* 转换失败 */ } if (value > 0xFFFFFFFFUL) { return -1; /* 超出范围 */ } *(uint32_t*)item->data_addr = (uint32_t)value; break; } case PARAM_TYPE_FLOAT: { /* 浮点类型:转换为浮点数 */ if (item->data_addr == NULL) { printf("[PARAM] FLOAT parameter data_addr is NULL: %s\n", item->param_name); return -1; } char *endptr; float value = strtof(value_str, &endptr); if (endptr == value_str || *endptr != '\0') { return -1; /* 转换失败 */ } *(float*)item->data_addr = value; break; } case PARAM_TYPE_INT: { /* 整数类型:转换为整数 */ if (item->data_addr == NULL) { printf("[PARAM] INT parameter data_addr is NULL: %s\n", item->param_name); return -1; } char *endptr; long value = strtol(value_str, &endptr, 0); if (endptr == value_str || *endptr != '\0') { return -1; /* 转换失败 */ } *(int*)item->data_addr = (int)value; break; } case PARAM_TYPE_ARRAY: { /* 数组类型:解析逗号分隔的十进制整数数组 */ if (item->data_addr == NULL) { printf("[PARAM] ARRAY parameter data_addr is NULL: %s\n", item->param_name); return -1; } uint8_t *data = (uint8_t*)item->data_addr; uint32_t data_size = item->data_size; const char *ptr = value_str; uint32_t index = 0; /* 跳过开头的'['(如果有) */ if (*ptr == '[') { ptr++; } while (*ptr != '\0' && index < data_size) { /* 跳过空格 */ while (*ptr == ' ' || *ptr == '\t' || *ptr == '\n' || *ptr == '\r') { ptr++; } if (*ptr == '\0' || *ptr == ']') { break; } /* 解析数字 */ char *endptr; long value = strtol(ptr, &endptr, 0); if (endptr == ptr) { return -1; /* 转换失败 */ } if (value < 0 || value > 255) { return -1; /* 超出范围 */ } data[index++] = (uint8_t)value; ptr = endptr; /* 跳过逗号 */ //while (*ptr == ' ' || *ptr == '\t' || *ptr == '\n' || *ptr == '\r') { while (*ptr == '\t' || *ptr == '\n' || *ptr == '\r') { ptr++; } if (*ptr == ',') { ptr++; } } /* 填充剩余部分为0 */ while (index < data_size) { data[index++] = 0; } break; } case PARAM_TYPE_BIT: { /* 位字段类型:支持二进制(0b开头)或十进制格式 */ char *endptr; unsigned long value; /* 检查是否为二进制格式 */ if (value_str[0] == '0' && (value_str[1] == 'b' || value_str[1] == 'B')) { /* 二进制格式:解析二进制字符串 */ value = strtoul(value_str + 2, &endptr, 2); } else { /* 十进制格式 */ value = strtoul(value_str, &endptr, 0); } if (endptr == value_str || *endptr != '\0') { return -1; /* 转换失败 */ } /* 通过data_addr指向的全局变量来区分参数类型 */ if (item->data_addr == (void*)&g_enable_bit_param_marker) { /* 使能参数的位字段:使用param_get_enable_bit_value函数设置值(操作标志为1) */ uint32_t result = param_get_enable_bit_value(item->param_id, 1, (uint32_t)value); if (result != 0) { printf("[PARAM] Failed to set enable bit field %s to value %lu\n", item->param_name, value); return -1; } return 0; } /* 检查是否为网络连接参数的位字段 */ else if (item->data_addr == (void*)&g_netcomm_bit_param_marker) { /* 网络连接参数的位字段:使用param_get_netcomm_bit_value函数设置值(操作标志为1) */ uint32_t result = param_get_netcomm_bit_value(item->param_id, 1, (uint32_t)value); if (result != 0) { printf("[PARAM] Failed to set netcomm bit field %s to value %lu\n", item->param_name, value); return -1; } return 0; } /* 其他位字段参数(data_addr不为NULL且不是标记变量) */ else if (item->data_addr != NULL) { /* 普通位字段参数:直接设置内存中的值 */ /* 根据数据大小设置值 */ if (item->data_size == sizeof(uint8_t)) { if (value > 0xFF) { return -1; /* 超出范围 */ } *(uint8_t*)item->data_addr = (uint8_t)value; } else if (item->data_size == sizeof(uint16_t)) { if (value > 0xFFFF) { return -1; /* 超出范围 */ } *(uint16_t*)item->data_addr = (uint16_t)value; } else if (item->data_size == sizeof(uint32_t)) { if (value > 0xFFFFFFFFUL) { return -1; /* 超出范围 */ } *(uint32_t*)item->data_addr = (uint32_t)value; } else { return -1; /* 不支持的数据大小 */ } return 0; } else { /* data_addr为NULL且不是标记变量的位字段参数 */ printf("[PARAM] Unknown bit field parameter cannot be set: %s\n", item->param_name); return -1; } break; } default: return -1; /* 不支持的数据类型 */ } return 0; } /** * @brief 根据参数ID获取参数映射表项 * @param param_id 参数ID * @retval 参数映射表项指针,NULL表示未找到 */ const param_map_item_t* param_get_map_item_by_id(uint16_t param_id) { uint16_t i; for (i = 0; i < BASIC_PARAM_MAP_SIZE; i++) { if (basic_param_map[i].param_id == param_id) { return &basic_param_map[i]; } } return NULL; } #endif