#include "sys_config.h" #include "Uwater_frame_app.h" #include "sys_processor.h" #include "nb_upload_monitor.h" #include "UWater_DataTools_App.h" #include "UWater_ir_app.h" #include "UWater_eeprom_driver.h" #include "UWater_power_app.h" #include "UWater_valve_driver.h" #include #if UPLOAD_MODE_1 static u8 s_eep_complete_up_monitor=0; //ee存储标志 static u8 up_monitor_para_buf[UP_PARA_NUM];//上报参数缓存 static ENUM_APP_LIFE_CNT nb_life_time_state=APP_LIFE_CNT_S0;//NB电量计算状态机 static ENUM_APP_LIFE_CNT ir_life_time_state=APP_LIFE_CNT_S0;//红外电量计算状态机 static u32 nb_life_time_start_time=0;//NB激活开始时间 static u32 ir_life_time_start_time=0;//红外激活开始时间 static u32 total_wake_time = 0;//红外唤醒时长 static u16 life_time_cnt = 0;//秒钟数 static u8 life_time_minute_cnt = 0;//分钟数 static u16 tmp_life_time = 0;//计算时长临时变量 //剩余电量和寿命比值 static float remain_percent_use_life; static float remain_percent_use_energy; static float remain_para_energy_life; //上报偏移时间参数 static u8 up_delay_para_cnt=0; static ENUM_APP_LIFE_CNT valve_life_time_state=APP_LIFE_CNT_S0;//阀控电量计算状态机 #if defined(VALVE) static u32 valve_life_time_start_time=0;//阀控开始工作时间 #endif //设置上报控制参数 void setUploadControlPara(ENUM_UPLOAD_CONTROL paraId, u8 paraData) { if(paraId=60) { life_time_minute_cnt=0; Sys_data_object.P1.run_information_object.total_use_sum_times_sec.to_uint32 += HOUR_TO_SECOND;//累计使用时间 Sys_data_object.P1.run_information_object.bat_surplus.to_uint32 -= ONE_HOUR_STATIC_ENERGY; } } //NB功耗计算 switch(nb_life_time_state) { case(APP_LIFE_CNT_S0): { if(TASK_BUSY == FixedTimeNbIoTUploadIfIdle()) { nb_life_time_start_time = life_time_cnt; nb_life_time_state = APP_LIFE_CNT_S1; } } break; case(APP_LIFE_CNT_S1): { if(TASK_IDLE == FixedTimeNbIoTUploadIfIdle()) { s16 s_temp_snr=0; s16 s_temp_rsrp=0; if(life_time_cnt >= nb_life_time_start_time) { tmp_life_time = life_time_cnt - nb_life_time_start_time; } else { tmp_life_time = HOUR_TO_SECOND + life_time_cnt - nb_life_time_start_time; } //如果收到有效升级指令,则加上升级时间 if(getUploadControlPara(UP_BOOT_MSG) == UPDATE_MODE_DIFF) { tmp_life_time += 600;//增加10分钟 } else if(getUploadControlPara(UP_BOOT_MSG) == UPDATE_MODE_NORMAL) { tmp_life_time += 1800;//增加30分钟 } setUploadControlPara(UP_BOOT_MSG,0); //记录NB工作时间和NB活跃次数 Sys_data_object.P1.run_information_object.nb_use_sum_times_sec.to_uint32 += tmp_life_time; Sys_data_object.P1.run_information_object.nb_upload_happen_num++; //根据本次信号值以及时间减去相应的电量消耗 NbiotGetSNR(&s_temp_snr); NbiotGetRSRP(&s_temp_rsrp); s_temp_snr /=10; s_temp_rsrp /=10; if(getUploadControlPara(UP_CGATT_FAIL)==TRUE)//本次符网失败 { Sys_data_object.P1.run_information_object.bat_surplus.to_uint32 -= NB_UPLOAD_RSRP_FAIL_ONE_SECOND_ENERGY*tmp_life_time; //上报偏移时间参数修改 if(GetEventUploadType()==UPLOAD_TYPE_FIX_TIME)//定时上报 { up_delay_para_cnt++; up_delay_para_cnt = (up_delay_para_cnt%7); setUploadControlPara(UP_DELAY_COUNT,up_delay_para_cnt); setUploadControlPara(UP_AT_ALL_MSG,TRUE); //上报失败,下次上报使用全指令上报消息 } } else if(s_temp_snr < 0)//负值,信号很差 { Sys_data_object.P1.run_information_object.bat_surplus.to_uint32 -= NB_UPLOAD_RSRP_WEAK_ONE_SECOND_ENERGY*tmp_life_time; } else if(s_temp_rsrp < -120)//120 { Sys_data_object.P1.run_information_object.bat_surplus.to_uint32 -= NB_UPLOAD_RSRP_WEAK_ONE_SECOND_ENERGY*tmp_life_time; } else if(s_temp_rsrp < -115)//115~120 { Sys_data_object.P1.run_information_object.bat_surplus.to_uint32 -= NB_UPLOAD_RSRP_120_ONE_SECOND_ENERGY*tmp_life_time; } else if(s_temp_rsrp < -105)//105~115 { Sys_data_object.P1.run_information_object.bat_surplus.to_uint32 -= NB_UPLOAD_RSRP_115_ONE_SECOND_ENERGY*tmp_life_time; } else if(s_temp_rsrp < -90)//90~105 { Sys_data_object.P1.run_information_object.bat_surplus.to_uint32 -= NB_UPLOAD_RSRP_105_ONE_SECOND_ENERGY*tmp_life_time; } else//> -90 { Sys_data_object.P1.run_information_object.bat_surplus.to_uint32 -= NB_UPLOAD_RSRP_90_ONE_SECOND_ENERGY*tmp_life_time; } nb_life_time_state = APP_LIFE_CNT_S2; } } break; case APP_LIFE_CNT_S2://EE存储 { if (TASK_IDLE == EepIfIdle()) { EepWrite(&(Sys_data_object.P1.run_information_object.total_use_sum_times_sec.to_uint8[0]), EEP_FRMAE_BATTERY_ENERGY, sizeof(Sys_data_object.P1.run_information_object), &s_eep_complete_up_monitor); nb_life_time_state = APP_LIFE_CNT_S0; } } break; default: nb_life_time_state = APP_LIFE_CNT_S0; break; } //红外功耗计算 switch(ir_life_time_state) { case(APP_LIFE_CNT_S0): { if(FALSE == IrIfSleepApp()) { ir_life_time_start_time = life_time_cnt; ir_life_time_state = APP_LIFE_CNT_S1; } } break; case(APP_LIFE_CNT_S1): { if(TRUE == IrIfSleepApp()) { if(life_time_cnt >= ir_life_time_start_time) { tmp_life_time = life_time_cnt - ir_life_time_start_time; } else { tmp_life_time = HOUR_TO_SECOND + life_time_cnt - ir_life_time_start_time; } total_wake_time += tmp_life_time; if(total_wake_time > MINITE_TO_SECOND) //唤醒时间 { total_wake_time -= MINITE_TO_SECOND; Sys_data_object.P1.run_information_object.use_sum_times_sec.to_uint32 += 60;//红外累计非休眠时间增加1分钟 Sys_data_object.P1.run_information_object.bat_surplus.to_uint32 -= ONE_MIN_WAKE_ENERGY; //减少1分钟的唤醒功耗 } ir_life_time_state = APP_LIFE_CNT_S0; } } break; default: { ir_life_time_state = APP_LIFE_CNT_S0; } break; } #if defined(VALVE) //阀控功耗计算 switch(valve_life_time_state) { case(APP_LIFE_CNT_S0): { if(FALSE == ValveIfIdle()) { valve_life_time_start_time = life_time_cnt; valve_life_time_state = APP_LIFE_CNT_S1; } } break; case(APP_LIFE_CNT_S1): { if(TRUE == ValveIfIdle()) { if(life_time_cnt >= valve_life_time_start_time) { tmp_life_time = life_time_cnt - valve_life_time_start_time; } else { tmp_life_time = HOUR_TO_SECOND + life_time_cnt - valve_life_time_start_time; } Sys_data_object.P1.run_information_object.valve_use_sum_times_sec += tmp_life_time;//阀门累计工作时间 Sys_data_object.P1.run_information_object.bat_surplus.to_uint32 -= VAVLE_WORK_ENERGY*tmp_life_time; //减少阀门活动的功耗 valve_life_time_state = APP_LIFE_CNT_S0; } } break; default: { valve_life_time_state = APP_LIFE_CNT_S0; } break; } #endif } //NB上报控制参数调整 void NbUploadParaSet(void) { char imei_buf[16]; DateTime temp_rtcc_time; RtccGetDateTime(&temp_rtcc_time); //计算剩余使用寿命占比 if(HOURS_OF_7YEARS > Sys_data_object.ee_data.data.work_hour) { //remain_percent_use_life = (float)(HOURS_OF_7YEARS-Sys_data_object.ee_data.data.work_hour)/(float)HOURS_OF_7YEARS; remain_percent_use_life = (float)(HOURS_OF_7YEARS-Sys_data_object.P1.run_information_object.total_use_sum_times_sec.to_uint32/HOUR_TO_SECOND)/(float)HOURS_OF_7YEARS; } else { remain_percent_use_life = 0; } //计算剩余电量占比 remain_percent_use_energy = (float)Sys_data_object.P1.run_information_object.bat_surplus.to_uint32/(float)ENERGY_OF_26500; setUploadControlPara(UP_BAT_STATE, remain_percent_use_energy*15);//状态字显示电量 //计算剩余电量和剩余使用时间比值 if(PowerCheckStatusSys() == LOW_POWER)//电池欠压 { remain_para_energy_life = 0.1; } else { if(remain_percent_use_life == 0)//已经用了7年 { remain_para_energy_life = 1; } else { if(Sys_data_object.P1.run_information_object.bat_surplus.to_uint32>(remain_percent_use_life*ENERGY_OF_IDLE))//待机预留电量 { remain_para_energy_life = (float)(remain_percent_use_energy/remain_percent_use_life)*NB_BAT_PARA; } else//无法满足待机需求 { remain_para_energy_life = 0.1; } } } //比值切换判断 if((Sys_data_object.P1.run_information_object.ee_remain_para_energy_life>0)&&(Sys_data_object.P1.run_information_object.ee_remain_para_energy_life<=1.5)) { if(remain_para_energy_life < Sys_data_object.P1.run_information_object.ee_remain_para_energy_life) { Sys_data_object.P1.run_information_object.ee_remain_para_energy_life = remain_para_energy_life; } } else { Sys_data_object.P1.run_information_object.ee_remain_para_energy_life = remain_para_energy_life; } //根据电量和剩余时间比值调整上报频率 if(Sys_data_object.P1.run_information_object.ee_remain_para_energy_life>1.5) { setUploadControlPara(UP_RETRY_NUM, Sys_data_object.P1.report_retry_times);//重试1次 setUploadControlPara(UP_DELAY_TIME1, NB_WAIT_TIME_5S);//等指令时间3s setUploadControlPara(UP_DAY_COUNT,(Sys_data_object.P1.func_cfg_bytes[13]>>4)&0x0F);//上报间隔天数1 } else if(Sys_data_object.P1.run_information_object.ee_remain_para_energy_life>1) { setUploadControlPara(UP_RETRY_NUM,0);//重试0次 setUploadControlPara(UP_DELAY_TIME1, NB_WAIT_TIME_5S); setUploadControlPara(UP_DAY_COUNT,Sys_data_object.P1.func_cfg_bytes[13]&0x0F);//上报间隔天数1 } else if(Sys_data_object.P1.run_information_object.ee_remain_para_energy_life>0.8) { setUploadControlPara(UP_RETRY_NUM,0);//重试0次 setUploadControlPara(UP_DELAY_TIME1, NB_WAIT_TIME_5S); setUploadControlPara(UP_DAY_COUNT,(Sys_data_object.P1.func_cfg_bytes[14]>>4)&0x0F);//上报间隔天数2 } else if(Sys_data_object.P1.run_information_object.ee_remain_para_energy_life>0.5) { setUploadControlPara(UP_RETRY_NUM,0);//重试0次 setUploadControlPara(UP_DELAY_TIME1,NB_WAIT_TIME_5S); setUploadControlPara(UP_DAY_COUNT,Sys_data_object.P1.func_cfg_bytes[14]&0x0F);//上报间隔天数3 } else { setUploadControlPara(UP_RETRY_NUM,0);//重试0次 setUploadControlPara(UP_DELAY_TIME1,NB_WAIT_TIME_5S); setUploadControlPara(UP_DAY_COUNT,(Sys_data_object.P1.func_cfg_bytes[15]>>4)&0x0F);//上报间隔天数7 setUploadControlPara(UP_WITH_UDP,TRUE);//开启UDP上报 } Sys_data_object.P1.report_retry_times = getUploadControlPara(UP_RETRY_NUM);//重试次数 //设置上报是否精简 NbiotGetIMEI(imei_buf); if(strlen(imei_buf)<15)//先判断IMEI缓存 { setUploadControlPara(UP_AT_SIMPLE, AT_SIMPLE_NULL);//不精简AT指令 setUploadControlPara(UP_DELAY_TIME1,NB_WAIT_TIME_5S); setUploadControlPara(UP_WITH_UDP,TRUE);//开启UDP上报 } else { if((GetEventUploadType()==UPLOAD_TYPE_HAND_KEY)|| (GetEventUploadType()==UPLOAD_TYPE_FRAME_ORDER)|| (GetEventUploadType()==UPLOAD_TYPE_SET_IP)|| (getUploadControlPara(UP_AT_ALL_MSG)==TRUE)) { setUploadControlPara(UP_AT_ALL_MSG,FALSE);//清除使用全指令上报消息 setUploadControlPara(UP_AT_SIMPLE, AT_SIMPLE_NULL);//不精简AT指令 setUploadControlPara(UP_DELAY_TIME1,NB_WAIT_TIME_5S); setUploadControlPara(UP_WITH_UDP,TRUE);//开启UDP上报 } else { if((GetEventUploadType()==UPLOAD_TYPE_FIX_TIME)||(GetEventUploadType()==UPLOAD_TYPE_RETRY_AGAIN))//定时\重传上报 { setUploadControlPara(UP_AT_SIMPLE, AT_SIMPLE_M1);//AT精简1 setUploadControlPara(UP_DELAY_TIME1, NB_WAIT_TIME_5S); if((BCD2HEX(temp_rtcc_time.s.day)%3)==0) { setUploadControlPara(UP_WITH_UDP, TRUE);//开启UDP上报 } else { setUploadControlPara(UP_WITH_UDP,FALSE);//关闭UDP上报 } } else if(GetEventUploadType()==UPLOAD_TYPE_VALVE_CLOSE)//关阀频繁上报 { setUploadControlPara(UP_AT_SIMPLE, AT_SIMPLE_M2);//AT精简2 setUploadControlPara(UP_DELAY_TIME1, NB_WAIT_TIME_5S); setUploadControlPara(UP_WITH_UDP,FALSE);//关闭UDP上报 } } } } //各功能生命周期记录是否空闲 u8 AppLifeTimeCountMachineIfIdle(void) { if((APP_LIFE_CNT_S0 == nb_life_time_state)&&(APP_LIFE_CNT_S0 == ir_life_time_state)&&(APP_LIFE_CNT_S0 == valve_life_time_state)) { return TASK_IDLE; } else { return TASK_BUSY; } } #elif UPLOAD_MODE_2 static u8 up_monitor_para_buf[UP_PARA_NUM];//上报参数缓存 static ENUM_APP_LIFE_CNT ble_life_time_state=APP_LIFE_CNT_S0;//蓝牙电量计算状态机 static ENUM_APP_LIFE_CNT ir_life_time_state=APP_LIFE_CNT_S0;//红外电量计算状态机 static u32 ble_life_time_start_time=0;//蓝牙激活开始时间 static u32 ble_total_wake_time = 0;//蓝牙唤醒时长 static u32 ir_life_time_start_time=0;//红外激活开始时间 static u32 ir_total_wake_time = 0;//红外唤醒时长 static u16 life_time_cnt = 0;//秒钟数 static u8 life_time_minute_cnt = 0;//分钟数 static u16 tmp_life_time = 0;//计算时长临时变量 static ENUM_APP_LIFE_CNT valve_life_time_state=APP_LIFE_CNT_S0;//阀控电量计算状态机 #if defined(VALVE) static u32 valve_life_time_start_time=0;//阀控开始工作时间 #endif //设置上报控制参数 void setUploadControlPara(ENUM_UPLOAD_CONTROL paraId, u8 paraData) { if(paraId=60) { life_time_minute_cnt=0; Sys_data_object.P1.run_information_object.total_use_sum_times_sec.to_uint32 += HOUR_TO_SECOND;//累计使用时间 Sys_data_object.P1.run_information_object.bat_surplus.to_uint32 -= ONE_HOUR_STATIC_ENERGY; } } //蓝牙功耗计算 switch(ble_life_time_state) { case(APP_LIFE_CNT_S0): { if((BleConnectIfIdle() == TASK_BUSY)||(BleIfSleep()==TASK_BUSY)) { ble_life_time_start_time = life_time_cnt; ble_life_time_state = APP_LIFE_CNT_S1; } } break; case(APP_LIFE_CNT_S1): { if((BleConnectIfIdle() == TASK_IDLE)&&(BleIfSleep()==TASK_IDLE)) { if(life_time_cnt >= ble_life_time_start_time) { tmp_life_time = life_time_cnt - ble_life_time_start_time; } else { tmp_life_time = HOUR_TO_SECOND + life_time_cnt - ble_life_time_start_time; } ble_total_wake_time += tmp_life_time; if(ble_total_wake_time > MINITE_TO_SECOND) //唤醒时间 { ble_total_wake_time -= MINITE_TO_SECOND; //记录NB工作时间和NB活跃次数 Sys_data_object.P1.run_information_object.nb_use_sum_times_sec.to_uint32 += 60;//蓝牙累计非休眠时间增加1分钟 Sys_data_object.P1.run_information_object.bat_surplus.to_uint32 -= BLE_ONE_MIN_ENERGY; //减少1分钟的蓝牙激活功耗 } Sys_data_object.P1.run_information_object.nb_upload_happen_num++; ble_life_time_state = APP_LIFE_CNT_S0; } } break; default: { ble_life_time_state = APP_LIFE_CNT_S0; } break; } //红外功耗计算 switch(ir_life_time_state) { case(APP_LIFE_CNT_S0): { if(FALSE == IrIfSleepApp()) { ir_life_time_start_time = life_time_cnt; ir_life_time_state = APP_LIFE_CNT_S1; } } break; case(APP_LIFE_CNT_S1): { if(TRUE == IrIfSleepApp()) { if(life_time_cnt >= ir_life_time_start_time) { tmp_life_time = life_time_cnt - ir_life_time_start_time; } else { tmp_life_time = HOUR_TO_SECOND + life_time_cnt - ir_life_time_start_time; } ir_total_wake_time += tmp_life_time; if(ir_total_wake_time > MINITE_TO_SECOND) //唤醒时间 { ir_total_wake_time -= MINITE_TO_SECOND; Sys_data_object.P1.run_information_object.use_sum_times_sec.to_uint32 += 60;//红外累计非休眠时间增加1分钟 Sys_data_object.P1.run_information_object.bat_surplus.to_uint32 -= ONE_MIN_WAKE_ENERGY; //减少1分钟的唤醒功耗 } ir_life_time_state = APP_LIFE_CNT_S0; } } break; default: { ir_life_time_state = APP_LIFE_CNT_S0; } break; } #if defined(VALVE) //阀控功耗计算 switch(valve_life_time_state) { case(APP_LIFE_CNT_S0): { if(FALSE == ValveIfIdle()) { valve_life_time_start_time = life_time_cnt; valve_life_time_state = APP_LIFE_CNT_S1; } } break; case(APP_LIFE_CNT_S1): { if(TRUE == ValveIfIdle()) { if(life_time_cnt >= valve_life_time_start_time) { tmp_life_time = life_time_cnt - valve_life_time_start_time; } else { tmp_life_time = HOUR_TO_SECOND + life_time_cnt - valve_life_time_start_time; } Sys_data_object.P1.run_information_object.valve_use_sum_times_sec += tmp_life_time;//阀门累计工作时间 Sys_data_object.P1.run_information_object.bat_surplus.to_uint32 -= VAVLE_WORK_ENERGY*tmp_life_time; //减少阀门活动的功耗 valve_life_time_state = APP_LIFE_CNT_S0; } } break; default: { valve_life_time_state = APP_LIFE_CNT_S0; } break; } #endif } //各功能生命周期记录是否空闲 u8 AppLifeTimeCountMachineIfIdle(void) { if((APP_LIFE_CNT_S0 == ble_life_time_state)&&(APP_LIFE_CNT_S0 == ir_life_time_state)&&(APP_LIFE_CNT_S0 == valve_life_time_state)) { return TASK_IDLE; } else { return TASK_BUSY; } } #endif