/*********************************************************************************** * @Copyright (c) :(C)2013, Qindao ieslab Co., Ltd * @FileName :new_gsm_EEPROM_processor.c * @Author :Intelligent gas team * @Version :V1.0 * @Date :2013-11-29 * @Description :the function of the entity of system processor ************************************************************************************/ #ifdef __cplusplus extern "C" { #endif /*--------------------------------Including-------------------------------------------*/ #include "UWater_sys.h" #include "UWater_frame_app.h" #include "UWater_eeprom_driver.h" #include "UWater_encryption_driver.h" #include "UWater_valve_driver.h" #include "UWater_uart_driver.h" #include "UWater_timer1uS_driver.h" #include "UWater_valve_app.h" #include "UWater_rtcc_app.h" #include "UWater_gp22_app.h" #include "SOE.h" #include "nb_upload_monitor.h" #include "eeprom_app.h" /*------------------------------ Variable Define -------------------------------------*/ //static u8 ee_package_rd_num; //读包号 //static u8 ee_package_wr_num; //写包号 //static u8 ee_package_erase_num; //擦除包号 static IMPORTANT_DATA_OP important_data_rd_state = IMPORTANT_DATA_OP_S0; //static IMPORTANT_DATA_OP important_data_wr_state = IMPORTANT_DATA_OP_S0; //static IMPORTANT_DATA_OP important_data_erase_state = IMPORTANT_DATA_OP_S0; static u8 important_data_rd_msg; static TYPE_EE_INIT_STATE tmp_init_stat = EE_INIT_STATE_S0;//各类参数初始化状态 static u8 task_init_complete = FALSE;//各类参数初始化任务完成标志 static u32 frame_para_buf[FRAME_PARA_BUF_LEN];//系统参数 Data_object Sys_data_object;//系统参数缓存 DateTime rtcc_tmp_ee_app; static void SysData_Init(void);//系统参数初始化 static void Coefficient_Init(void); //多项式参数初始化 static void Flow_coef_Init(void);//流量系数初始化 static void UDP_Update_Init(void);//UDP ip初始化 static void SOE_Pint_Init(void); static void RtccInitApp(void); //根据要写的变量地址,计算ee地址,主要用于Sys_data_object结构体变量 u16 ee_addr_compute(u8 *data_addr) { u16 addr_result; if(data_addr >= (u8*)(&Sys_data_object.P1)) { if( data_addr < ((u8*)(&Sys_data_object.P1) + sizeof(Sys_data_object.P1)) ) { addr_result = EEP_FRAME_BASE_ADDR + data_addr - (u8*)(&Sys_data_object.P1); return addr_result; } else { return 0; } } else { return 0; } } //首次上电初始化部分变量 void FirstPowerOnInit(void) { //Sys_data_object.P1.first_power_flg = FRAME_FIRST_POWER_FLG;//u8 first_power_flg---第一次上电标志,置起 Sys_data_object.P1.start_using_flg = 0x00; //0x00,//u8 start_using_flg---出厂启用标志,默认不出厂启用 /*上报频率u8 report_freq_val[5]*/ Sys_data_object.P1.Time_upload_2006.s.type = 0x02; //0x02,//report_freq_val[0]---天模式 Sys_data_object.P1.Time_upload_2006.s.period = 0x00; //0x00,//report_freq_val[1]---天模式无效 Sys_data_object.P1.Time_upload_2006.s.hour = 0x06; //0x06,//report_freq_val[2]---6点 Sys_data_object.P1.Time_upload_2006.s.minute = 0x00; //0x00,//report_freq_val[3]---0分 Sys_data_object.P1.Time_upload_2006.s.second = 0x00; //0x00,//report_freq_val[4]---0秒 /*ip地址:117.60.157.137*/ Sys_data_object.P1.server_ip[0] =221;//117; //117,//server_ip[0] Sys_data_object.P1.server_ip[1] = 229;//60; //60,//server_ip[1] Sys_data_object.P1.server_ip[2] =214;//157; //157,//server_ip[2] Sys_data_object.P1.server_ip[3] =202;//137; //137,//server_ip[3] /*端口号:5683=0x1633*/ Sys_data_object.P1.server_port.datas = 5683; //0x33,//server_port.datas_map.data0 //0x16,//server_port.datas_map.data1 /*周期上报起始时间:19-7-1-00-00-00*/ Sys_data_object.P1.report_period_start[0]=0x00; //0x00,//report_period_start[0]---秒 Sys_data_object.P1.report_period_start[1]=0x00; //0x00,//report_period_start[1]---分 Sys_data_object.P1.report_period_start[2]=0x00; //0x00,//report_period_start[2]---时 Sys_data_object.P1.report_period_start[3]=0x01; //0x01,//report_period_start[3]---日 Sys_data_object.P1.report_period_start[4]=0x07; //0x07,//report_period_start[4]---月 Sys_data_object.P1.report_period_start[5]=0x19; //0x19,//report_period_start[5]---年 /*周期上报结束时间:29-7-1-00-00-00*/ Sys_data_object.P1.report_period_end[0]=0x00; //0x00,//report_period_end[0]---秒 Sys_data_object.P1.report_period_end[1]=0x00; //0x00,//report_period_end[1]---分 Sys_data_object.P1.report_period_end[2]=0x00; //0x00,//report_period_end[2]---时 Sys_data_object.P1.report_period_end[3]=0x01; //0x01,//report_period_end[3]---日 Sys_data_object.P1.report_period_end[4]=0x07; //0x07,//report_period_end[4]---月 Sys_data_object.P1.report_period_end[5]=0x99; //0x99,//report_period_end[5]---年 /*周期上报最小估长值:15*/ Sys_data_object.P1.report_step_len.datas =15;// 15,//report_step_len.datas_map.data0 //估长值改为15s /*重试次数*/ Sys_data_object.P1.report_retry_times =0; //默认重试次数改为0 /*密集上报开始时间*/ Sys_data_object.P1.report_start_time[0] = 0x01; //0x01,//report_start_time[0]---起始日 Sys_data_object.P1.report_start_time[1] = 0x07; //0x07,//report_start_time[1]---起始月 Sys_data_object.P1.report_start_time[2] = 0x19; //0x19,//report_start_time[2]---起始年 Sys_data_object.P1.report_start_time[3] = 0x00; //0x00,//report_start_time[3]---结束日 Sys_data_object.P1.report_start_time[4] = 0x30; //0x30,//report_start_time[4]---结束月 Sys_data_object.P1.report_start_time[5] = 0x01; //0x01,//report_start_time[5]---结束年 /*密集上报结束时间*/ Sys_data_object.P1.report_start_time[6] = 0x02; //0x02,//report_start_time[6]---开始采集时间秒 Sys_data_object.P1.report_start_time[7] = 0x07; //0x07,//report_start_time[7]---开始采集时间分 Sys_data_object.P1.report_start_time[8] = 0x19; //0x19,//report_start_time[8]---开始采集时间时 /*大流量报警门限值:3000L/h=0x00000BB8*/ Sys_data_object.P1.high_flow_alarm.datas = 3000; //0xB8,//high_flow_alarm.datas_map.data0 //0x0B,//high_flow_alarm.datas_map.data1 //0x00,//high_flow_alarm.datas_map.data2 //0x00,//high_flow_alarm.datas_map.data3 /*阀控参数 6个字节*/ Sys_data_object.P1.ies_valve_paras.valve_state = VALVE_STATE_OPEN;//阀门状态 Sys_data_object.P1.ies_valve_paras.valve_err = 0; //阀门是否异常 Sys_data_object.P1.ies_valve_paras.valve_total_time = 20; //阀控最大时间 Sys_data_object.P1.ies_valve_paras.valve_AD = VALVE_HOGH_ADC_VALUE;//阀控AD默认值 Sys_data_object.P1.ies_pulse_emergency.datas = 5; //应急用水量 5方 /*通信频点:850=0x352*/ Sys_data_object.P1.report_fre.datas =850; //0x52,//report_fre.datas_map.data0 //0x03,//report_fre.datas_map.data1 /*APN20字节:ctnb*/ Sys_data_object.P1.apn[0] = 0x01; //APN使能 Sys_data_object.P1.apn[1] = 0x04; //0x05,//apn[1]APN长度 Sys_data_object.P1.apn[2] = 'c'; Sys_data_object.P1.apn[3] = 't'; Sys_data_object.P1.apn[4] = 'n'; Sys_data_object.P1.apn[5] = 'b'; /*普通密钥---16字节:QINGDAOJICHE-GNB*/ Sys_data_object.P1.key[0] = 81; Sys_data_object.P1.key[1] = 73; Sys_data_object.P1.key[2] = 78; Sys_data_object.P1.key[3] = 71; Sys_data_object.P1.key[4] = 68; Sys_data_object.P1.key[5] = 65; Sys_data_object.P1.key[6] = 79; Sys_data_object.P1.key[7] = 74; Sys_data_object.P1.key[8] = 73; Sys_data_object.P1.key[9] = 67; Sys_data_object.P1.key[10] = 72; Sys_data_object.P1.key[11] = 45; Sys_data_object.P1.key[12] = 78; Sys_data_object.P1.key[13] = 71; Sys_data_object.P1.key[14] = 78; Sys_data_object.P1.key[15] = 66; /*物理地址---7字节*/ Sys_data_object.P1.mac_addr[0] = 0; Sys_data_object.P1.mac_addr[1] = 0; Sys_data_object.P1.mac_addr[2] = 0; Sys_data_object.P1.mac_addr[3] = 0; Sys_data_object.P1.mac_addr[4] = 0; Sys_data_object.P1.mac_addr[5] = 0; Sys_data_object.P1.mac_addr[6] = 0; /*序列号---7字节*/ Sys_data_object.P1.ser_num[0] =0; Sys_data_object.P1.ser_num[1] =0; Sys_data_object.P1.ser_num[2] =0; Sys_data_object.P1.ser_num[3] =0; Sys_data_object.P1.ser_num[4] =0; Sys_data_object.P1.ser_num[5] =0; Sys_data_object.P1.ser_num[6] =0; /*通信地址---7字节*/ Sys_data_object.P1.met_addr[0] =0x01; Sys_data_object.P1.met_addr[1] =0; Sys_data_object.P1.met_addr[2] =0; Sys_data_object.P1.met_addr[3] =0; Sys_data_object.P1.met_addr[4] =0; Sys_data_object.P1.met_addr[5] =0x33; Sys_data_object.P1.met_addr[6] =0x78; /*固化物理地址标识---1字节*/ Sys_data_object.P1.solidify_mac_addr_flg = 0x00; /*关阀后,上报参数---5字节,*/ Sys_data_object.P1.ies_valve_up_times.valve_up_times_pre = 4; //关阀后上报间隔(4*30) Sys_data_object.P1.ies_valve_up_times.valve_up_times_total = 24; Sys_data_object.P1.ies_valve_up_times.valve_up_times_realtime = 0; Sys_data_object.P1.ies_valve_up_times.valve_auto_check = VALVE_AUTO_CHECK_OPEN;//VALVE_AUTO_CHECK_CLOSE;//阀门每月初自检是否开启,=0xAA表示开启,默认关闭 Sys_data_object.P1.ies_valve_up_times.reserv = 0x00; /*启用备份密钥---1字节*/ Sys_data_object.P1.enable_bak_key = 0x00; /*下次通讯的密钥num---1字节*/ Sys_data_object.P1.last_key_num = 0x00; /*温度系数0---4字节*/ Sys_data_object.P1.temperature_coefficient0.datas = 0x00000000;//0x00,0x00,0x00,0x00,//temperature_coefficient0 /*温度系数1---4字节*/ Sys_data_object.P1.temperature_coefficient1.datas = 0x00000000;//0x00,0x00,0x00,0x00,//temperature_coefficient1 /*小流量系数---4字节*/ Sys_data_object.P1.flow_coefficient_small.datas = 0x00010000;//0x00,0x00,0x01,0x00,//flow_coefficient_small 0x00010000 /*中流量系数0---4字节*/ Sys_data_object.P1.flow_coefficient_middle0.datas = 0x00010000;//0x00,0x00,0x01,0x00,//flow_coefficient_middle0 0x00010000 /*中流量系数1---4字节*/ Sys_data_object.P1.flow_coefficient_middle1.datas = 0x00010000;//0x00,0x00,0x01,0x00,//flow_coefficient_middle1 0x00010000 /*中流量系数2---4字节*/ Sys_data_object.P1.flow_coefficient_middle2.datas = 0x00010000;//0x00,0x00,0x01,0x00,//flow_coefficient_middle2 0x00010000 /*中流量系数3---4字节*/ Sys_data_object.P1.flow_coefficient_middle3.datas = 0x00010000;//0x00,0x00,0x01,0x00,//flow_coefficient_middle3 0x00010000 /*大流量系数---4字节*/ Sys_data_object.P1.flow_coefficient_large.datas = 0x00010000;//0x00,0x00,0x01,0x00,//flow_coefficient_large 0x00010000 /*启用检定功能---1字节*/ Sys_data_object.P1.enable_verification_function =0x5A;// 0x5A,//enable_verification_function /*启用红外功能---1字节*/ Sys_data_object.P1.enable_infrared_function = 0x5A;// 0x5A,//enable_infrared_function /*功能配置字---32字节*/ for(int i=0;i<32;i++) { Sys_data_object.P1.func_cfg_bytes[i] = 0x00; } Sys_data_object.P1.func_cfg_bytes[0]=15;//func_cfg_bytes[0]---厂区工作时间,默认15天 //0x00,//func_cfg_bytes[1]---红外按键阈值:0x10=16 ---单板删除 //0x00,//func_cfg_bytes[2]远红外调试功能默认关闭,(0xAA打开) //0x00,//func_cfg_bytes[3]触摸按键功能默认关闭(0xAA打开) ////func_cfg_bytes[4~5]原-阀控过流ADC默认值 //0x00,//[6]原---关阀上报次数 //0x00,//[7]0x55需要补报,默认不补报 Sys_data_object.P1.func_cfg_bytes[8]=0xAA,//[8]短帧上报标志(0xAA为短帧) //Sys_data_object.P1.func_cfg_bytes[9]=0xAA,//[9]0XAA新补报规约 Sys_data_object.P1.func_cfg_bytes[10]=0x55;//[10]0x55开启ACK判断上报成功 //Sys_data_object.P1.func_cfg_bytes[11]=0x55;//[11]0x55,MN316降低发射功率 //Sys_data_object.P1.func_cfg_bytes[12]=0x80,//[12]使用PSM模式进行上报,0x80关阀使用PSM,0x82一直使用PSM Sys_data_object.P1.func_cfg_bytes[13]=0x11;//剩余电量对应上报频率设置1 Sys_data_object.P1.func_cfg_bytes[14]=0x23;//剩余电量对应上报频率设置2 Sys_data_object.P1.func_cfg_bytes[15]=0x7F;//剩余电量对应上报频率设置3 //func_cfg_bytes[15]---原---定时活动阀门默认开启 Sys_data_object.P1.func_cfg_bytes[16]=2;//[16]蓝牙:广播间隔2s,单位秒, Sys_data_object.P1.func_cfg_bytes[17]=50;//[17]蓝牙:连接间隔50ms,单位ms Sys_data_object.P1.func_cfg_bytes[18]=0x00;//[18]蓝牙:发射功率,0:2.5dbm;1:0dbm;2:-5dbm;3:-10dbm Sys_data_object.P1.func_cfg_bytes[19]=5;//[19]蓝牙:扫描次数5 Sys_data_object.P1.func_cfg_bytes[20]=5;//应急用水量默认5方 Sys_data_object.P1.func_cfg_bytes[21]=0;//密码配对功能,默认0关闭 Sys_data_object.P1.func_cfg_bytes[22]=7;//蓝牙复位间隔,默认7天 Sys_data_object.P1.func_cfg_bytes[23]=20;//蓝牙每天允许复位次数,默认20 /*使动流量---2字节:默认600ps=0x0258*/ //(DEFAULT_START_FLOW&0xFF),((DEFAULT_START_FLOW>>8)&0xFF), //#define DEFAULT_START_FLOW 0x00D1 //DN20铜63KPA时的使动流量数值 Sys_data_object.P1.start_flow.datas = DEFAULT_START_FLOW; /*逆流计量方式---2字节:默认方式1*/ Sys_data_object.P1.counter_current_flow.datas = 0x2B1A;//0x1A,0x2B, /*采样频率---1字节:默认8*/ Sys_data_object.P1.sampling_frequency = 0x08;// 0x08, /*采样缓冲区大小---1字节:默认16*/ Sys_data_object.P1.buf_length = 0x10;// 0x10, /*默认密集存储间隔0:30s*/ Sys_data_object.P1.storage_frequency = 15;//江西改为默认15分钟存储间隔 /*默认最低采样频率4(8Hz),最高采样频率5(16Hz)*/ Sys_data_object.P1.jx_sampling_frequency[0] = 0x04; //0x04,0x05, Sys_data_object.P1.jx_sampling_frequency[1] = 0x05; /*默认NB工作模式为断电模式*/ Sys_data_object.P1.jx_psm_pwdown =0x01; //0x01, /*默认NB上报失败后4小时重试,符网时间查询cereg 40次*/ //0x40,0x38,60,0x00 #if PRODUCT_SY /*沈阳规约默认NB上报失败后30分钟重试,符网时间查询cereg 60次*/ Sys_data_object.P1.Upload_again_interval_time.datas = 1800;//1800=30x60 #else Sys_data_object.P1.Upload_again_interval_time.datas = 14400;//14400=4x3600 #endif Sys_data_object.P1.nb_para_login_ask_times.datas = 40;//CGATT查询次数 //补报相关参数 Sys_data_object.P1.Supplemental_send_flag.datas = 0; Sys_data_object.P1.histroy_r = 0; Sys_data_object.P1.histroy_w = 0; // Sys_data_object.P1.ies_pulse_remain.datas = 0;//已使用量的应急用水量 //电池电量相关参数 //#if UPLOAD_MODE_1 Sys_data_object.P1.run_information_object.total_use_sum_times_sec.to_uint32 = 0;//表计工作总时间 Sys_data_object.P1.run_information_object.bat_surplus.to_uint32 = ENERGY_OF_26500;//电池电量uAH Sys_data_object.P1.run_information_object.use_sum_times_sec.to_uint32 = 0;//红外累计工作时间 Sys_data_object.P1.run_information_object.nb_use_sum_times_sec.to_uint32 = 0;//nb累计工作时间 Sys_data_object.P1.run_information_object.nb_upload_happen_num = 0;//nb激活次数 Sys_data_object.P1.run_information_object.valve_use_sum_times_sec = 0;//阀门工作时间 Sys_data_object.P1.run_information_object.ee_remain_para_energy_life = 3;//比值 //#endif //蓝牙参数 Sys_data_object.P3.function_switch.ble_adv_fre = Sys_data_object.P1.func_cfg_bytes[16];//广播间隔2秒 Sys_data_object.P3.function_switch.ble_con_para = Sys_data_object.P1.func_cfg_bytes[17];//连接间隔50ms Sys_data_object.P3.function_switch.ble_tx_power = Sys_data_object.P1.func_cfg_bytes[18];//发射功率 Sys_data_object.P3.function_switch.ble_scan_times = Sys_data_object.P1.func_cfg_bytes[19];//扫描次数 Sys_data_object.P1.ies_pulse_emergency.datas = Sys_data_object.P1.func_cfg_bytes[20];//应急用水量 Sys_data_object.P3.function_switch.password_enable = Sys_data_object.P1.func_cfg_bytes[21];//使能密码配对 } //从EE中读重要数据 void set_important_data_rd_state (void) { important_data_rd_state = IMPORTANT_DATA_OP_S1; } u8 get_important_data_rd_state (void) { return important_data_rd_state; } void LoadEepromImportantData(void) { set_important_data_rd_state(); while(get_important_data_rd_state()) { EeReadImportantDataMachine(); EepMachineDriver(); } Meter_BootVersionInit();//获取boot版本号 Sys_data_object.P3.NBSleepMode = 0;//非PSM模式上报 } //读取重要参数 void EeReadImportantDataMachine(void) { switch(important_data_rd_state) { case IMPORTANT_DATA_OP_S0: { } break; case IMPORTANT_DATA_OP_S1: { task_init_complete = FALSE; tmp_init_stat = EE_INIT_STATE_S1; important_data_rd_state=IMPORTANT_DATA_OP_S2; } break; case IMPORTANT_DATA_OP_S2://系统参数初始化 { SysData_Init(); if(task_init_complete == TRUE) { task_init_complete = FALSE; tmp_init_stat = EE_INIT_STATE_S1; important_data_rd_state=IMPORTANT_DATA_OP_S3; } } break; case IMPORTANT_DATA_OP_S3://多项式系数初始化 { Coefficient_Init(); if(task_init_complete == TRUE) { task_init_complete = FALSE; tmp_init_stat = EE_INIT_STATE_S1; important_data_rd_state=IMPORTANT_DATA_OP_S4; } } break; case IMPORTANT_DATA_OP_S4://流量系数初始化 { Flow_coef_Init(); if(task_init_complete == TRUE) { task_init_complete = FALSE; tmp_init_stat = EE_INIT_STATE_S1; important_data_rd_state=IMPORTANT_DATA_OP_S5; } } break; case IMPORTANT_DATA_OP_S5://UDP ip初始化 { UDP_Update_Init(); if(task_init_complete == TRUE) { task_init_complete = FALSE; tmp_init_stat = EE_INIT_STATE_S1; important_data_rd_state=IMPORTANT_DATA_OP_S6; } } break; case IMPORTANT_DATA_OP_S6://SOE指针初始化 { SOE_Pint_Init(); if(task_init_complete == TRUE) { task_init_complete = FALSE; tmp_init_stat = EE_INIT_STATE_S1; important_data_rd_state=IMPORTANT_DATA_OP_S7; } } break; case IMPORTANT_DATA_OP_S7://RTCC初始化 { RtccInitApp(); if(task_init_complete == TRUE) { task_init_complete = FALSE; tmp_init_stat = EE_INIT_STATE_S1; important_data_rd_state=IMPORTANT_DATA_OP_S8; } } break; case IMPORTANT_DATA_OP_S8://其他参数保存完成,再保存第一次上电标志 { if(TASK_IDLE == EepIfIdle()) { if(FRAME_FIRST_POWER_FLG != Sys_data_object.P1.first_power_flg)//是第一次上电 { Sys_data_object.P1.first_power_flg = FRAME_FIRST_POWER_FLG;//保存第一次上电标志 EepWrite(&Sys_data_object.P1.first_power_flg, EEP_FRAME_BASE_ADDR, 1, &important_data_rd_msg); } important_data_rd_state = IMPORTANT_DATA_OP_S9; } } break; case IMPORTANT_DATA_OP_S9: { if(TASK_IDLE == EepIfIdle()) { important_data_rd_state = IMPORTANT_DATA_OP_S0; } } break; default: { important_data_rd_state = IMPORTANT_DATA_OP_S0; } break; } } //读状态机是否空闲 u8 EeReadImportantDataIfIdle(void) { if(TASK_IDLE == EepIfIdle()) { if(IMPORTANT_DATA_OP_S0 == important_data_rd_state) { return TASK_IDLE; } else { return TASK_BUSY; } } else { return TASK_BUSY; } } void StartEeReadImportantData(void) { important_data_rd_state = IMPORTANT_DATA_OP_S1; } /******************************************************************************* * @fun_name: SysData_Init * @brief : 系统参数初始化函数 * @param[in] : None * @param[out]: None * @retval : None * @other : ******************************************************************************/ static void SysData_Init(void) { switch (tmp_init_stat) { case EE_INIT_STATE_S0: { break; } case EE_INIT_STATE_S1://读取第一次上电标志 { if (TASK_IDLE == EepIfIdle()) { EepRead(EEP_FRAME_FIRST_POWER_ADDR, &Sys_data_object.P1.first_power_flg, sizeof(Sys_data_object.P1), &important_data_rd_msg); tmp_init_stat = EE_INIT_STATE_S2; } break; } case EE_INIT_STATE_S2://判断是否第一次上电 { if (TASK_IDLE == EepIfIdle()) { if(FRAME_FIRST_POWER_FLG != Sys_data_object.P1.first_power_flg)//是第一次上电,其他参数初始化成功再保存第一次上电标志 { Sys_data_object.P3.FirstPowerOnFlag = FIRST_POWER_ON_FLAG; FirstPowerOnInit(); EepWrite(&(Sys_data_object.P1.start_using_flg), (EEP_FRAME_FIRST_POWER_ADDR+1), (sizeof(Sys_data_object.P1)-1), &important_data_rd_msg); } else { Sys_data_object.P3.FirstPowerOnFlag = 0; } Sys_data_object.P3.ProductUpoadFailFlag =0; tmp_init_stat = EE_INIT_STATE_S3; } break; } case EE_INIT_STATE_S3://重要参数合法判断:反向计量标志 { if (TASK_IDLE == EepIfIdle()) { if((0x2B1A !=Sys_data_object.P1.counter_current_flow.datas) &&(0x4D3C !=Sys_data_object.P1.counter_current_flow.datas)) { Sys_data_object.P1.counter_current_flow.datas = 0x2B1A; EepWrite(&Sys_data_object.P1.counter_current_flow.datas_map.data0,EEP_FRAME_COUNTER_CURRENT_FLOW_ADDR, sizeof (Sys_data_object.P1.counter_current_flow.datas), &important_data_rd_msg); } tmp_init_stat = EE_INIT_STATE_S4; } break; } case EE_INIT_STATE_S4://重要参数合法判断:始动流量 { if (TASK_IDLE == EepIfIdle()) { if((Sys_data_object.P1.start_flow.datas < MIN_START_FLOW)||(Sys_data_object.P1.start_flow.datas > MAX_START_FLOW)) { Sys_data_object.P1.start_flow.datas = DEFAULT_START_FLOW;//默认值 EepWrite(&Sys_data_object.P1.start_flow.datas_map.data0, EEP_FRAME_START_FLOW_ADDR, 2, &important_data_rd_msg); } tmp_init_stat = EE_INIT_STATE_S5; } break; } case EE_INIT_STATE_S5: { if (TASK_IDLE == EepIfIdle()) { Frame_Para_Init();//系统参数初始化 task_init_complete = TRUE; tmp_init_stat = EE_INIT_STATE_S0; } break; } default: { tmp_init_stat = EE_INIT_STATE_S0; break; } } } /******************************************************************************* * @fun_name: Coefficient_Init * @brief : 多项式系数上电初始化函数 * @param[in] : None * @param[out]: None * @retval : None * @other : ******************************************************************************/ static void Coefficient_Init(void) { switch (tmp_init_stat) { case EE_INIT_STATE_S0: { } break; case EE_INIT_STATE_S1: { if (TASK_IDLE == EepIfIdle()) { if(FRAME_FIRST_POWER_FLG != Sys_data_object.P1.first_power_flg)//是第一次上电 { memcpy(&cal_coefficient[0].flt, default_coefficient,sizeof(default_coefficient));//多项式建模系数初始化 EepWrite(&cal_coefficient[0].value[0], FRAME_FLOW_COEFFICIENT_ADDR, sizeof (cal_coefficient), &important_data_rd_msg); tmp_init_stat = EE_INIT_STATE_S3; } else//非第一次上电 { EepRead(FRAME_FLOW_COEFFICIENT_ADDR, &cal_coefficient[0].value[0], sizeof (cal_coefficient), &important_data_rd_msg); tmp_init_stat = EE_INIT_STATE_S20; } } } break; case EE_INIT_STATE_S20: { if (TASK_IDLE == EepIfIdle()) { u8 flow_coef_ok_flg = 0; //多项式系数异常flag for(u8 i=0;i