#include "publicdata/publicdata.h" #include "flash_external_data.h" #include "app_init/task_lock.h" #include #include SHARE_DATA_T g_t_share_data; // 全局共享数据定义 static SemaphoreHandle_t g_mut_share_data = NULL; // publicdata独立互斥锁 /* 欧标CAN转PLC 运行时使能:u8_gun_type[gun_no]==0 为欧标使能返回1,否则国标返回0 */ U8_T u8_can_plc_enabled(U8_T gun_no) { if (gun_no >= GUN_MAX_CNT) return 0; return (CAN_PLC_FLAG && g_t_share_data.t_sys_fix_cfg.u8_gun_type[gun_no] == 0) ? 1 : 0; } // 设备型号(字符串常量) const U8_T Device_Model[] = "IES-M"; const U8_T Software_Version[] = "M_01.00.01"; //主程序版本号用于現場驗收 const U8_T Hardware_Version[] = "CCU621M" ; // const U8_T Mcu_model[] = "STM32H563IG"; const U8_T Parameter_Version[] = "P_00.00.01" ; //参数版本号 /*************************************** * 函数说明: 线程锁 初始化 * * * ****************************************/ U8_T u8_osMutexNew() { return u8_task_lock_handle_ctrl(&g_mut_share_data, TASK_LOCK_OP_INIT); } /*************************************** * 函数说明: 线程锁 上锁 * * * ****************************************/ U8_T u8_mutex_Lock(void) { return u8_task_lock_handle_ctrl(&g_mut_share_data, TASK_LOCK_OP_TAKE); } /*************************************** * 函数说明: 线程锁 释放锁 * * * ****************************************/ void v_mutex_unlock() { (void)u8_task_lock_handle_ctrl(&g_mut_share_data, TASK_LOCK_OP_GIVE); } /************************************************************* 函数名称: v_fetch_save_var_cfg_data 函数功能: 保存可变配置数据到dataflash,保存三份,具体格式见文件:DATAFLASH空间地址定义 头8字节:魔数+CFG_DATA_VERSION_H/L+长度+CRC 输入参数: 无 输出参数: 无 返回值 :无 **************************************************************/ void v_flash_save_var_cfg_data(void) { U8_T u8_head[8]; U16_T u16_len, u16_crc, i, j; U32_T u32_addr[3] = { DATAFLASH_VAR_CFG_DATA1_ADDR, DATAFLASH_VAR_CFG_DATA2_ADDR, DATAFLASH_VAR_CFG_DATA3_ADDR }; u16_len = sizeof(SYS_VAR_CFG_T); u8_head[0] = 0x55; u8_head[1] = 0xAA; u8_head[2] = CFG_DATA_VERSION_H; u8_head[3] = CFG_DATA_VERSION_L; u8_head[4] = (U8_T)(u16_len >> 8); u8_head[5] = (U8_T)u16_len; if(u8_mutex_Lock() == 0) //上锁 return; for(i=0; i<3; i++) s32_flash_dataflash_erase_sector(u32_addr[i]); //清空扇区 u16_crc = u16_crc_checksum((U8_T *)(&(g_t_share_data.t_sys_var_cfg)), u16_len); u8_head[6] = (U8_T)(u16_crc >> 8); u8_head[7] = (U8_T)u16_crc; for (i=0; i<3; i++) //写3份数据 { for (j=0; j<3; j++) //如果写失败,则重试3次 { if ((s32_flash_dataflash_write(u32_addr[i], u8_head, 8) != 0) || (s32_flash_dataflash_write(u32_addr[i]+8, (U8_T *)(&(g_t_share_data.t_sys_var_cfg)), u16_len) != 0)) { continue; } else { break; } } } v_mutex_unlock(); //解锁 } /************************************************************* 函数名称: s32_fetch_read_var_cfg_data 函数功能: 从dataflash读取可变配置数据,从三份数据中读取正确的数据,并用正确的数据重写不正确的数据 读取时检查 CFG_DATA_VERSION_H/L 版本号 输入参数: 无 输出参数: 无 返回值 :读取成功则返回0,失败返回-1 **************************************************************/ S32_T s32_flash_read_var_cfg_data(void) { U8_T u8_head[8]; U16_T u16_len, i, j, k; U32_T u32_addr[3] = { DATAFLASH_VAR_CFG_DATA1_ADDR, DATAFLASH_VAR_CFG_DATA2_ADDR, DATAFLASH_VAR_CFG_DATA3_ADDR }; u16_len = sizeof(SYS_VAR_CFG_T); if(u8_mutex_Lock() == 0) //上锁 return 0; for (i=0; i<3; i++) { if ((s32_flash_dataflash_read(u32_addr[i], u8_head, 8) == 0) && (s32_flash_dataflash_read(u32_addr[i]+8, (U8_T *)(&(g_t_share_data.t_sys_var_cfg)), u16_len) == 0)) { if ((u8_head[0] == 0x55) && (u8_head[1] == 0xAA) && (u8_head[2] == CFG_DATA_VERSION_H) && (u8_head[3] == CFG_DATA_VERSION_L) && (u16_len == ((u8_head[4]<<8) | u8_head[5])) && (((u8_head[6]<<8) | u8_head[7]) == u16_crc_checksum((U8_T *)(&(g_t_share_data.t_sys_var_cfg)), u16_len))) { break; } } } if (i >= 3) //三份配置数据都没有读取成功,则退出 { v_mutex_unlock(); //解锁 //释放互斥锁 return -1; } else if (i == 0) //第一份就读取成功,则退出 { v_mutex_unlock(); //解锁 //释放互斥锁 return 0; } //程序跑到这里,说明己经读取成功,且不是第一份读取成功,需要对读取失败的数据重写(先擦除再写) for (j=0; j> 8); u8_head[5] = (U8_T)u16_len; if(u8_mutex_Lock() == 0) //上锁 return; for(i=0; i<3; i++) s32_flash_dataflash_erase_sector(u32_addr[i]); //清空扇区 u16_crc = u16_crc_checksum((U8_T *)(&(g_t_share_data.t_sys_fix_cfg)), u16_len); u8_head[6] = (U8_T)(u16_crc >> 8); u8_head[7] = (U8_T)u16_crc; for (i=0; i<3; i++) //写3份数据 { for (j=0; j<3; j++) //如果写失败,则重试3次 { if ((s32_flash_dataflash_write(u32_addr[i], u8_head, 8) != 0) || (s32_flash_dataflash_write(u32_addr[i]+8, (U8_T *)(&(g_t_share_data.t_sys_fix_cfg)), u16_len) != 0)) { continue; } else { break; } } } v_mutex_unlock(); //解锁 //释放互斥锁 } /************************************************************* 函数名称: s32_fetch_read_fix_cfg_data 函数功能: 从dataflash读取固定配置数据,从三份数据中读取正确的数据,并用正确的数据重写不正确的数据 读取时检查 CFG_DATA_VERSION_H/L 版本号 输入参数: 无 输出参数: 无 返回值 :读取成功则返回0,失败返回-1 **************************************************************/ S32_T s32_flash_read_fix_cfg_data(void) { U8_T u8_head[8]; U16_T u16_len, i, j, k; U32_T u32_addr[3] = { DATAFLASH_FIX_CFG_DATA1_ADDR, DATAFLASH_FIX_CFG_DATA2_ADDR, DATAFLASH_FIX_CFG_DATA3_ADDR }; u16_len = sizeof(SYS_FIX_CFG_T); if(u8_mutex_Lock() == 0) //上锁 return 0; for (i=0; i<3; i++) { if ((s32_flash_dataflash_read(u32_addr[i], u8_head, 8) == 0) && (s32_flash_dataflash_read(u32_addr[i]+8, (U8_T *)(&(g_t_share_data.t_sys_fix_cfg)), u16_len) == 0)) { if ((u8_head[0] == 0x55) && (u8_head[1] == 0xAA) && (u8_head[2] == CFG_DATA_VERSION_H) && (u8_head[3] == CFG_DATA_VERSION_L) && (u16_len == ((u8_head[4]<<8) | u8_head[5])) && (((u8_head[6]<<8) | u8_head[7]) == u16_crc_checksum((U8_T *)(&(g_t_share_data.t_sys_fix_cfg)), u16_len))) { break; } } } if (i >= 3) //三份配置数据都没有读取成功,则退出 { v_mutex_unlock(); //解锁 //释放互斥锁 return -1; } else if (i == 0) //第一份就读取成功,则退出 { v_mutex_unlock(); //解锁 //释放互斥锁 return 0; } //程序跑到这里,说明己经读取成功,且不是第一份读取成功,需要对读取失败的数据重写(先擦除再写) for (j=0; ju16_pile_power_limit = 0; //整桩限制功率,(0表示不限制) strcpy((char *)t_sys_fix_cfg->u8_pwd, "880180"); //维护密码,字符串类型 t_sys_fix_cfg->u8_gunCnt = 2; t_sys_fix_cfg->u8_terminal[0] = 1; //终端地址 t_sys_fix_cfg->u8_terminal[1] = 2; //终端地址 t_sys_fix_cfg->e_ledType = E_LED_TYPE_1; //灯板类型 t_sys_fix_cfg->e_timeZone = TIMEZONE_UTC_PLUS_8; //系统时区 0-25 默认20 东八区 t_sys_fix_cfg->u8_gun_type[0] = (CAN_PLC_FLAG ? 0 : 1); /* 欧标仅CAN_PLC使能时有效 */ //枪类型 0欧标枪 1国标枪 t_sys_fix_cfg->u8_gun_type[1] = (CAN_PLC_FLAG ? 0 : 1); t_sys_fix_cfg->u8_gun_power_limit[0] = 0; //枪充电功率限制 0表示不限制 单位kW t_sys_fix_cfg->u8_gun_power_limit[1] = 0; //充电桩保护参数设置 t_sys_fix_cfg->u8_threshold_gunTemp = 90; //枪温阈值 90 t_sys_fix_cfg->u8_soc_limit = 100; //SOC上限100 t_sys_fix_cfg->u16_ratePow = 120; //额定功率 t_sys_fix_cfg->u16_min_volt = 200*10; //电压范围-下值 t_sys_fix_cfg->u16_max_volt = 1000*10; //模块/充电机的调压上值/电压上限 t_sys_fix_cfg->u16_max_cur = 250*10; //最大电流 t_sys_fix_cfg->u16_trickle_limit = 10* 10; //涓流停机阈值 10A //整流模块参数 -- t_sys_fix_cfg->u8_mdu_num = 6; //充电模块数量 t_sys_fix_cfg->u8_MduType = 0; //模块类型 暂未使用 t_sys_fix_cfg->u8_mduTemp_flag = 1; //模块温度获取使能 t_sys_fix_cfg->u8_mdu_rated_pow = 40; //模块额定功率 kw t_sys_fix_cfg->u16_mdu_max_vol = 1000*10; //模块最大电压 0.1V t_sys_fix_cfg->u16_mdu_max_cur = 130*10; //模块最大电流 0.1A //网络参数配置 const U8_T u8_eth_ip[4] = {192,168,1,100}; memcpy(t_sys_fix_cfg->s_net_cfg.u8_eth_ip , u8_eth_ip , 4); //本地IP地址, 默认192.168.1.140 const U8_T u8_eth_mask[4] = {255,255,255,0}; memcpy(t_sys_fix_cfg->s_net_cfg.u8_eth_mask , u8_eth_mask , 4); //地址掩码, 默认255.255.255.0 const U8_T u8_eth_gate[4] = {192,168,1,1}; memcpy(t_sys_fix_cfg->s_net_cfg.u8_eth_gate , u8_eth_gate , 4); //网关, 默认192.168.1.1 const U8_T u8_eth_mac[6] = {0x00,0x0E,0xEA,0x03,0xA0,0x01}; memcpy(t_sys_fix_cfg->s_net_cfg.u8_eth_mac , u8_eth_mac , 6); //MAC地址,默认00:0E:EA:03:A5:01 前3字节:组织唯一标识符​代表设备厂商(00:0E:EA->属于ASUSTek(华硕))。后3字节:设备标识符厂商自主分配,确保同一厂商的产品中不重复。 const U8_T u8_platA_IP[] = "39.104.96.26,8897"; //注意 域名和ip之间使用,分隔 例如39.104.96.26,8897 memcpy(t_sys_fix_cfg->s_net_cfg.u8_serverA_domain_name , u8_platA_IP , strlen((char *)u8_platA_IP)); //服务器A域名(IP+端口号) - 最大字符50字节 const U8_T u8_platB_IP[] = "121.89.205.240,41004"; //注意 域名和ip之间使用,分隔 例如39.104.96.26,8897 memcpy(t_sys_fix_cfg->s_net_cfg.u8_serverB_domain_name , u8_platB_IP , strlen((char *)u8_platB_IP)); //服务器B域名(IP+端口号) - 最大字符50字节 const U8_T u8_platA_pileNum[] = "2025090200010001";//"12345678"; // memcpy(t_sys_fix_cfg->s_net_cfg.u8_platA_pileNum , u8_platA_pileNum , strlen((char *)u8_platA_pileNum)); //平台1桩编号 const U8_T u8_platB_pileNum[] = "12345678"; // memcpy(t_sys_fix_cfg->s_net_cfg.u8_platB_pileNum , u8_platB_pileNum , strlen((char *)u8_platB_pileNum)); //平台2桩编号 t_sys_fix_cfg->s_net_cfg.u_net_comm_para.bits.bit_program_type = 0; //程序类型 0社会 1sdk t_sys_fix_cfg->s_net_cfg.u_net_comm_para.bits.bit_netA_type = 0; //联网方式 0:GPRS 1:以太网 t_sys_fix_cfg->s_net_cfg.u_net_comm_para.bits.bit_netB_type = 0; //联网方式 0:GPRS 1:以太网 t_sys_fix_cfg->s_net_cfg.u_net_comm_para.bits.bit_platA_en = 1; //平台1使能 默认第三方平台 0不使能 1使能 t_sys_fix_cfg->s_net_cfg.u_net_comm_para.bits.bit_platB_en = 0; //平台2使能 默认积成平台 0不使能 1使能 t_sys_fix_cfg->s_net_cfg.u_net_comm_para.bits.bit_platA_type = 0; //平台1类型 0积成 云快充 1... t_sys_fix_cfg->s_net_cfg.u_net_comm_para.bits.bit_platB_type = 0; //平台1类型 默认积成平台 --非SDK平台时有效,SDK平台时 仅连接SDK t_sys_fix_cfg->s_net_cfg.u_net_comm_para.bits.bit_sim_anp_type = 0; //SIM卡 APN类型- 0公网卡 1国网移动 2国网联通 3国网电信 //电表数据初始 t_sys_fix_cfg->s_memter.u8_meter_num = 2; t_sys_fix_cfg->s_memter.s_data[0].u8_inGun = 1; //归属枪号 0无效,不存在; 1A枪 2B枪 t_sys_fix_cfg->s_memter.s_data[0].u8_highPrec = 1; //是否支持高精度 0 不支持 1支持 t_sys_fix_cfg->s_memter.s_data[0].u8_isAC = 0; //是否为交流电表 0直流表 1交流表 memset(&t_sys_fix_cfg->s_memter.s_data[0].u8_meterAddr[0] , 0xAA, 6); //电表地址 t_sys_fix_cfg->s_memter.s_data[1].u8_inGun = 2; //归属枪号 0无效,不存在; 1A枪 2B枪 t_sys_fix_cfg->s_memter.s_data[1].u8_highPrec = 1; //是否支持高精度 0 不支持 1支持 t_sys_fix_cfg->s_memter.s_data[1].u8_isAC = 0; //是否为交流电表 0直流表 1交流表 memset(&t_sys_fix_cfg->s_memter.s_data[1].u8_meterAddr[0] , 0xAA, 6); //电表地址 t_sys_fix_cfg->u_enable.bit_enable.bit_doorEnable = 1; //门禁使能 t_sys_fix_cfg->u_enable.bit_enable.bit_gunLockEna = 1; // 枪锁使能 t_sys_fix_cfg->u_enable.bit_enable.bit_gunLockNeg = 0; // 枪锁信号取反 t_sys_fix_cfg->u_enable.bit_enable.bit_AcContactEna = 0; // 交流接触器使能 t_sys_fix_cfg->u_enable.bit_enable.bit_gunHoming = 0; // 枪归位信号有无 t_sys_fix_cfg->u_enable.bit_enable.bit_GBEnable = 0; // 国标使能(0:兼容 1:国标) t_sys_fix_cfg->u_enable.bit_enable.bit_LcdEnable = 1; // 液晶使能,0不使能,1使能 t_sys_fix_cfg->u_enable.bit_enable.bit_auxpower = 0; // 辅助电压返回状态使能 t_sys_fix_cfg->u_enable.bit_enable.bit_reliefen = 1; // 泄放使能 t_sys_fix_cfg->u_enable.bit_enable.bit_YeLenEn = 0; // 液冷通讯使能 t_sys_fix_cfg->u_enable.bit_enable.bit_ABcommEn = 0; // 主副班通讯使能 0 1使能且为1枪 2使能且为2枪 t_sys_fix_cfg->u_enable.bit_enable.bit_ScreenSaverEn = 1; // UI界面屏保使能 0不使能 1使能 2使能轮播 t_sys_fix_cfg->u_enable.bit_enable.bit_PlugEn = 1; //即插即充使能 t_sys_fix_cfg->u_enable.bit_enable.bit_uiEnglishEn = 0; //UI界面 英语使能 0 中文 1英文 t_sys_fix_cfg->u_enable.bit_enable.bit_dcBusEn = 0; // 直流母联接触器使能 0 不使能 1使能 t_sys_fix_cfg->u_enable.bit_enable.bit_gunFanEn = 0; // 枪风扇使能 0 不使能 1使能 t_sys_fix_cfg->u_enable.bit_enable.bit_mduzeropowEn = 0; t_sys_fix_cfg->u_enable.bit_enable.bit_ledGbEn = 0; //国标指示灯使能 0 待机黄,充电绿,故障红;1 待机绿,充电红,故障黄 v_mutex_unlock(); v_flash_save_fix_cfg_data(); //保存参数到DATAFLASH } /************************************************************* 函数名称: v_public_var_cfg_data_restore 函数功能: 恢复默认数据,将设置参数恢复到默认值 输入参数: 无 输出参数: 无 返回值 :无 **************************************************************/ void v_public_var_cfg_data_restore(void) { U8_T i; if(u8_mutex_Lock() == 0) //上锁 return ; memset(&(g_t_share_data.t_sys_var_cfg), 0, sizeof(g_t_share_data.t_sys_var_cfg)); //计费模型 g_t_share_data.t_sys_var_cfg.s_fee_model.u8_feeCnt = FEE_MODEL_CNT; g_t_share_data.t_sys_var_cfg.s_fee_model.s_fee_data[0].u32_rate = 1; //电费 g_t_share_data.t_sys_var_cfg.s_fee_model.s_fee_data[0].u32_sevice = 1; //服务费 for(i=0;iu8_gun_type[0] = 1; t_sys_fix_cfg->u8_gun_type[1] = 1; //本系统都是国标枪 #if 0 //ocpp 测试 const U8_T u8_platA_IP[] = "ws://182.92.157.86:8088/steve/websocket/CentralSystemService"; //注意 域名和ip之间使用,分隔 例如39.104.96.26,8897 memset(t_sys_fix_cfg->s_net_cfg.u8_serverA_domain_name , 0, sizeof(t_sys_fix_cfg->s_net_cfg.u8_serverA_domain_name)); memcpy(t_sys_fix_cfg->s_net_cfg.u8_serverA_domain_name , u8_platA_IP , strlen((char *)u8_platA_IP)); //服务器A域名(IP+端口号) - 最大字符50字节 const U8_T u8_platA_pileNum[] = "abcd1234"; // memset(t_sys_fix_cfg->s_net_cfg.u8_platA_pileNum , 0, sizeof(t_sys_fix_cfg->s_net_cfg.u8_platA_pileNum)); memcpy(t_sys_fix_cfg->s_net_cfg.u8_platA_pileNum , u8_platA_pileNum , strlen((char *)u8_platA_pileNum)); //平台1桩编号 g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_uiEnglishEn = 1; #endif #if 0 //sdk测试参数 //接入调试平台 8枪测试桩 strcpy((char *)g_t_share_data.t_sys_var_cfg.s_sdk_data.product_key, "a1q5OZTEiYV"); //产品秘钥 strcpy((char *)g_t_share_data.t_sys_var_cfg.s_sdk_data.device_name, "961758611348789658931728");//资产码 strcpy((char *)g_t_share_data.t_sys_var_cfg.s_sdk_data.device_secret, "5d70d9e838e144e75b4d55ba3b7fe9c7");//设备密钥 strcpy((char *)g_t_share_data.t_sys_var_cfg.s_sdk_data.device_uid, "1049250923019699");//出厂编码 #endif }