#include "sys_config.h" #if UPLOAD_MODE_1 #include "UWater_frame_app.h" #include "UWater_eeprom_driver.h" #include "UWater_Timer1us_driver.h" #include "UWater_lptimer_driver.h" #include "UWater_rtcc_driver.h" #include "UWater_valve_driver.h" #include "eeprom_app.h" #include "UWater_rtcc_app.h" #include "UWater_power_app.h" #include "UWater_gp22_app.h" #include "sys_processor.h" #include "UWater_DataTools_App.h" #include "UWater_key_app.h" #include "UWater_pt_app.h" #include "UWater_DebugPrint.h" #include "UWater_Valve_app.h" #include #include "UWater_sys.h" #include "soe.h" #include "nb_upload_monitor.h" //数据发送缓存 static u8 upload_send_buf[UPLOAD_BUF_SIZE]; static u16 upload_send_len; static u8 upload_send_state; static DateTime upload_skew; static TYP_MAIN_STATE_UPLOAD main_upload_state = UPLOAD_S0; static TYP_STATE_UPLOAD time_upload_state=TIME_UPLOAD_S0; static EVENT_UPLOAD_ event_upload; //事件记录 static u32 g_delay_upload_time; static u8 g_jingge_time_para; static u8 upload_delay_flag = 0; static u16 g_activity_times=0; static u8 upload_frame_data_step = 0; //上行数据组帧步骤 static u8 s_upload_ack_fail_times=0;//记录连续多天无应答次数 static u16 valve_close_upload_time_cnt; static u8 s_upload_eep_complete=0; static u8 save_freeze_sate = SAVE_FREEZE_S0; //数据冻结类状态机 static u8 data_save_judge_flag = FALSE; //保存冻结类数据 static u8 sys_deal_judge_flag = FALSE; //系统处理 static DateTime sys_rtcc_time; //用于获取系统当前时间 static u16 sys_temp_min_hex;//分钟转16进制格式 //RTC故障超时时间 static u32 rtcc_err_check_time=0; static u8 rtcc_err_check_count=0; static u8 sys_rtcc_clk_source=0; static u8 sys_rtcc_check_flag=FALSE; //系统初始化标志 static u8 sys_inite_flag=FALSE; //离散和补传机制变量 #define __no_init __attribute__((zero_init)) __no_init volatile u8 upload_again_cnt_copy __attribute__((section(".ARM.__at_0x20007F34"))); static u8 up_delay_count_flag=0; //防护,顺延20分钟每天只执行一次 static u8 up_time_check_2hour=120;//防护,防止NB校时连续上报,2小时内不允许 /****************************************时间扫描、消息分发**********************/ void MinuteEventScan(void) { if (0x02 == (RtccCheckMsg() & 0x02))//分钟消息 { RtccClearMsg(1); RtccSetMsgApp(RtccMsg_UploadInTime); //RTCC定时上报 RtccSetMsgApp(RtccMsg_OtherProtl); //抛给其他规约的分钟消息 FrameSetMsgApp(Msg_FrozenStore); //冻结数据 data_save_judge_flag = TRUE; //保存冻结类数据 sys_deal_judge_flag = TRUE; //系统处理 RtccSetMsgApp(RtccMsg_ValveActive); } } //系统处理 void SysDealAppMachine(void) { if(sys_deal_judge_flag) { sys_deal_judge_flag = FALSE; rtcc_err_check_count=0; RtccGetDateTime(&sys_rtcc_time); if(0 == sys_rtcc_time.s.minute) //整点时间 { FrameSetMsgApp(MsgTouchKeyReset);//复位触摸按键消息 if(PSM_STATE_SLEEP == getPsmState()) { FrameSetMsgApp(Msg_PsmPowerCheck);//PSM模式电压检测 } if (sys_rtcc_time.s.hour == 0x00)//0点清除触摸次数 { FrameSetMsgApp(MsgTchKey_ClearKeyLimit);//清除触摸按键限制次数 sys_rtcc_check_flag = TRUE;//检测一下时钟 up_delay_count_flag=0; } if(sys_rtcc_time.s.hour == 0x02) //每天2点置换能器检测标志 { RtccSetMsgApp(RtccMsg_Transducer_Check); if(TRUE == CheckDiftofCalibrationFlag()) { RtccSetMsgApp(RtccMsg_DiftofCalibration);//每天2点置校准零流量标志 } } } //非检定超时不休眠防护 if (10 == LcdCheckStateApp()) //非检定状态 { PowerUnSleepSumAddSys(); } } /** 外部32768晶振失效防护: 1、main函数休眠期间收不到RTC秒中断唤醒,看门狗复位表计使表计重新选择RTC时钟。 2、检定或唤醒期间通过1us定时器计算时间超过2分钟而收不到分钟消息,则复位表计重新选择RTC时钟。 3、如果时钟已经切换到内部低速时钟,则每天重新检查一次是否外部时钟又恢复正常。 */ if(Timer1usGetTick() - rtcc_err_check_time > 1000000)//1秒,防止检定和唤醒 { rtcc_err_check_time = Timer1usGetTick(); rtcc_err_check_count++; if(rtcc_err_check_count > 120) { rtcc_err_check_count = 0; Meter_ResetCountAdd(0x08); NVIC_SystemReset(); } } if((sys_rtcc_check_flag==TRUE)&&(LcdCheckStateApp() == 10))//非检定状态 { sys_rtcc_check_flag = FALSE; if(RTC_ClkSource() == 1)//如果是内部RC { sys_rtcc_clk_source = RtccInit(); if(sys_rtcc_clk_source == 0)//如果切换成了外部RC { LPTimer1Init(sys_rtcc_clk_source); } } } } void SysDealAppPreSleep(void) { rtcc_err_check_count = 0; if(sys_inite_flag==FALSE) { sys_inite_flag = TRUE; if(Sys_data_object.P1.func_cfg_bytes[0] > 0)//如果在厂区时段,复位第一次休眠唤醒后执行一次厂区上报 { FrameSetMsgApp(Msg_FactoryUpload);//厂区上报消息 } } } /******************************************************************************* * @fun_name: UploadSkewTimeCount * @brief :错峰时间计算 包括补报机制 定时上传错峰方案:定时上传时间 + 表号后3位 ×错峰时间间隔 + 60秒。 * @param[in] : None * @param[out]: None * @retval : * @other : ******************************************************************************/ void UploadSkewTimeCount(void) { if((0 == sys_rtcc_time.s.hour) && (0 == sys_rtcc_time.s.minute))//0点重试次数清0 { upload_again_cnt_copy = 0; } if(UPLOAD_MODE_HOUR == Sys_data_object.P1.Time_upload_2006.s.type) //小时模式 { g_delay_upload_time = 0; if(upload_again_cnt_copy > Sys_data_object.P1.report_retry_times) { upload_again_cnt_copy = 0; } g_delay_upload_time = (Sys_data_object.P1.met_addr[0] >> 4) * 10 + (Sys_data_object.P1.met_addr[0] & 0x0F); g_delay_upload_time *= Sys_data_object.P1.report_step_len.datas;//表计后两位x估长值 g_delay_upload_time += (u32)MINUTE_TO_SECOND * BCD2HEX(Sys_data_object.P1.Time_upload_2006.s.period); //上传设定的分 g_delay_upload_time += (u32)MINUTE_TO_SECOND * 20 * upload_again_cnt_copy;//重传计算 g_delay_upload_time %= HOUR_TO_SECOND; //离散到1h内 upload_skew.s.minute = g_delay_upload_time / MINUTE_TO_SECOND; upload_skew.s.minute = HEX2BCD(upload_skew.s.minute); //频繁上报测试,设置小时模式大于50分钟时,上报间隔为(5x-50) if(Sys_data_object.P1.Time_upload_2006.s.period>0x52) { upload_skew.s.minute = (BCD2HEX(sys_rtcc_time.s.minute)/(Sys_data_object.P1.Time_upload_2006.s.period - 0x50))*(Sys_data_object.P1.Time_upload_2006.s.period - 0x50); upload_skew.s.minute = HEX2BCD(upload_skew.s.minute); } } else //其他上报模式,天、周、月 { // #if defined(VALVE) // if(ValveGetUploadStateApp()==VALVE_CLOSE_UPLOAD_TIME)//阀门关闭的处理 // { // return; // } // #endif if((BCD2HEX(sys_rtcc_time.s.day) % getUploadControlPara(UP_DAY_COUNT))!=0) { return; } g_delay_upload_time = (Sys_data_object.P1.met_addr[0]&0x0F)*100 + (Sys_data_object.P1.met_addr[0] >> 4)*10+(Sys_data_object.P1.met_addr[1]&0x0F); if(Sys_data_object.P1.report_step_len.datas < 15) //离散系数有效性判断 { Sys_data_object.P1.report_step_len.datas = 15; } else if(Sys_data_object.P1.report_step_len.datas > 43) { Sys_data_object.P1.report_step_len.datas = 43; } if(Sys_data_object.P1.report_retry_times > 3) //重传次数有效性判断 { Sys_data_object.P1.report_retry_times = 2; //默认2次 } if(upload_again_cnt_copy > Sys_data_object.P1.report_retry_times) { upload_again_cnt_copy = 0; } //补传间隔时间处理 /*if((Sys_data_object.P1.Upload_again_interval_time.datas < 600)||(Sys_data_object.P1.Upload_again_interval_time.datas > 43200))//小于3小时=3*3600=10800,大于12小时=12*3600=43200 { Sys_data_object.P1.Upload_again_interval_time.datas = 18000; //默认5小时=5*3600=18000 }转成小时判断*/ g_jingge_time_para = Sys_data_object.P1.Upload_again_interval_time.datas/3600; if(g_jingge_time_para < 1) // 重传间隔时间有效性判断 { g_jingge_time_para = 5; //默认5小时,有效值为1-9,当该参数为1时,表示间隔20min重传,其余为相应数字的小时 } else if(g_jingge_time_para >= 10) { g_jingge_time_para = 5; } g_delay_upload_time *= Sys_data_object.P1.report_step_len.datas; //乘离散系数 if(upload_again_cnt_copy==0) { if(0 == up_delay_count_flag)//每天第一次上报时置起,每天只执行一次 { g_delay_upload_time += MINUTE_TO_SECOND + getUploadControlPara(UP_DELAY_COUNT)*1200; //增加1min和偏移时间 } } else//偏移参数不改变重试时间 { g_delay_upload_time += MINUTE_TO_SECOND; } g_delay_upload_time += (u32) HOUR_TO_SECOND * BCD2HEX(Sys_data_object.P1.Time_upload_2006.s.hour); //上传设定的时 g_delay_upload_time += (u32) MINUTE_TO_SECOND * BCD2HEX(Sys_data_object.P1.Time_upload_2006.s.minute); //上传设定的分 if(JIANGE_20_MIN == g_jingge_time_para) //按20min后重传 { g_delay_upload_time += (u32)MINUTE_TO_SECOND * 20 * upload_again_cnt_copy;//重传计算 } else //按小时重传 { g_delay_upload_time += (u32)HOUR_TO_SECOND * (g_jingge_time_para) * upload_again_cnt_copy;//重传计算 } g_delay_upload_time %= DAY_TO_SECOND; //离散到1天内 upload_skew.s.hour = g_delay_upload_time / HOUR_TO_SECOND; upload_skew.s.minute = (g_delay_upload_time % HOUR_TO_SECOND) / MINUTE_TO_SECOND; upload_skew.s.hour = HEX2BCD(upload_skew.s.hour); upload_skew.s.minute = HEX2BCD(upload_skew.s.minute); } } //查询真实上报时间点 void SystemGetUploadTime(DateTime *pDT) { pDT->s.second = (Sys_data_object.P1.ies_valve_up_times.valve_up_times_pre * 30) - valve_close_upload_time_cnt;//关阀上报 pDT->s.minute = upload_skew.s.minute; pDT->s.hour = upload_skew.s.hour; pDT->s.day = HEX2BCD(valve_close_upload_time_cnt%100); pDT->s.month = HEX2BCD((valve_close_upload_time_cnt/100)%100); pDT->s.year = HEX2BCD(Sys_data_object.P1.ies_valve_up_times.valve_up_times_realtime); pDT->s.weekday = 0x00; } //设置事件上报 static void SetEventUploadFlag(u8 type) { if(type == UPLOAD_TYPE_FRAME_ORDER||type == UPLOAD_TYPE_FACTORY)//规约或厂区上报 { event_upload.event_cnt = 0; event_upload.upload_cnt =0; main_upload_state = UPLOAD_S1;//生产上报流程 } else { main_upload_state = UPLOAD_S2;//其他上报流程 } event_upload.event_cnt++; event_upload.event_cnt %= UPLOAD_EVENT_NUM; event_upload.upload_type[event_upload.event_cnt] = type; } //查询事件上报 static u8 GetEventUploadFlag(void) { if(event_upload.event_cnt != event_upload.upload_cnt) { return TRUE; } else { return FALSE; } } //清除事件上报,(下线时清除,防止超时复位表计) static void ClearEventUploadFlag(void) { event_upload.event_cnt = 0; event_upload.upload_cnt =0; } //查询事件上报类型 u8 GetEventUploadType(void) { return event_upload.upload_type[event_upload.upload_cnt]; } //判空闲 u8 FixedTimeNbIoTUploadIfIdle(void) { if(TIME_UPLOAD_S0 == time_upload_state) { return TASK_IDLE; } else { return TASK_BUSY; } } //上传消息的判断 static void UploadConditionJuge(void) { //定时上报: if(RtccCheckMsgApp(RtccMsg_UploadInTime)) { if(up_time_check_2hour<200) { up_time_check_2hour++; } DateTime sys_rtcc_time; RtccClearMsgApp(RtccMsg_UploadInTime); RtccGetDateTime(&sys_rtcc_time); UploadSkewTimeCount();//定时上报错峰时间\补报时间计算 #if defined(VALVE) //获取阀门状态--关闭,关阀状态下频繁上报以及时开阀 if((VALVE_STATE_CLOSE_EMERGENCY == Sys_data_object.P1.ies_valve_paras.valve_state) || (VALVE_STATE_CLOSE_LOCK == Sys_data_object.P1.ies_valve_paras.valve_state) || (VALVE_STATE_CLOSE == Sys_data_object.P1.ies_valve_paras.valve_state)) { if(0 == Sys_data_object.P1.ies_valve_up_times.valve_up_times_total) //为0时,默认关闭该功能 { Sys_data_object.P1.func_cfg_bytes[12] &=~ 0x01;//清除PSM上报 } else { valve_close_upload_time_cnt++;//分钟计时 if(0 == Sys_data_object.P1.ies_valve_up_times.valve_up_times_pre) { Sys_data_object.P1.ies_valve_up_times.valve_up_times_pre = 2; //默认按1h } if(valve_close_upload_time_cnt >= (Sys_data_object.P1.ies_valve_up_times.valve_up_times_pre * 30))//大于上报间隔时间,最小30分钟 { valve_close_upload_time_cnt = 0; if(Sys_data_object.P1.ies_valve_up_times.valve_up_times_total > VALVE_CLOSE_UPLOAD_MAX) { Sys_data_object.P1.ies_valve_up_times.valve_up_times_total = VALVE_CLOSE_UPLOAD_MAX; } if(Sys_data_object.P1.ies_valve_up_times.valve_up_times_realtime < Sys_data_object.P1.ies_valve_up_times.valve_up_times_total) { Sys_data_object.P1.ies_valve_up_times.valve_up_times_realtime++; FrameSetMsgApp(MsgChangcha_ValveUploadCnts);//上报次数存EE SetEventUploadFlag(UPLOAD_TYPE_VALVE_CLOSE);//置起关阀上报消息 SaveNewSoe(SOE_MANUAL_UPLOAD,0x20); //存SOE Sys_data_object.P1.func_cfg_bytes[12] |= 0x01;//使用PSM上报 } else { Sys_data_object.P1.func_cfg_bytes[12] &=~ 0x01;//清除PSM上报 } } } } else { valve_close_upload_time_cnt = 0; Sys_data_object.P1.ies_valve_up_times.valve_up_times_realtime = 0; Sys_data_object.P1.func_cfg_bytes[12] &=~ 0x01;//清除PSM上报 } #endif if(UPLOAD_MODE_HOUR == Sys_data_object.P1.Time_upload_2006.s.type) //小时模式 { if(sys_rtcc_time.s.minute == upload_skew.s.minute) //离散时间 { upload_delay_flag = 1; } } else { if((sys_rtcc_time.s.hour == upload_skew.s.hour) && (sys_rtcc_time.s.minute == upload_skew.s.minute)) //离散时间 { if(up_time_check_2hour < 120)//离上次定时上报不到2小时 { return; } if(UPLOAD_MODE_WEEK == Sys_data_object.P1.Time_upload_2006.s.type)//周模式 { if(Sys_data_object.P1.Time_upload_2006.s.period == sys_rtcc_time.s.weekday) { upload_delay_flag = 1; up_time_check_2hour=0;//重新计时 } } else if(UPLOAD_MODE_MONTH == Sys_data_object.P1.Time_upload_2006.s.type)//月模式 { if(Sys_data_object.P1.Time_upload_2006.s.period == sys_rtcc_time.s.day) { upload_delay_flag = 1; up_time_check_2hour=0;//重新计时 } } else//天模式 { if((BCD2HEX(sys_rtcc_time.s.day) % getUploadControlPara(UP_DAY_COUNT))!=0) { return; } up_delay_count_flag =1; upload_delay_flag = 1; up_time_check_2hour=0;//重新计时 } } } } if(upload_delay_flag==1)//等待离散时间到达 { if(01 != LcdCheckStateApp())//非检定状态 { upload_delay_flag = 0; if(0 == upload_again_cnt_copy) { SetEventUploadFlag(UPLOAD_TYPE_FIX_TIME); //RTCC定时上报 SaveNewSoe(SOE_MANUAL_UPLOAD,0x10); //存SOE } else { SetEventUploadFlag(UPLOAD_TYPE_RETRY_AGAIN); //重传上报 SaveNewSoe(SOE_MANUAL_UPLOAD,0x11); //存SOE } } } //主动上报: if(FrameCheckMsgApp(MsgNbUartSend))//判断串口发起上传消息 { FrameClearMsgApp(MsgNbUartSend); SetEventUploadFlag(UPLOAD_TYPE_FRAME_ORDER); SaveNewSoe(SOE_MANUAL_UPLOAD,0x01); //存SOE } else if(KeyCheckLcdMsgApp(MENU_ACTIVE_RF))//按键发起上传消息 { KeyClearLcdMsgApp(MENU_ACTIVE_RF);//清按键消息 SetEventUploadFlag(UPLOAD_TYPE_HAND_KEY); SaveNewSoe(SOE_MANUAL_UPLOAD,0x02); //存SOE } else if(FrameCheckMsgApp(MsgNbUploadByValveStateChange))//阀门状态改变发起上报 { FrameClearMsgApp(MsgNbUploadByValveStateChange); SetEventUploadFlag(UPLOAD_TYPE_VALVE_ACTIVE); SaveNewSoe(SOE_MANUAL_UPLOAD,0x03); //存SOE } //设置IP:工装用于获取IMEI if(FrameCheckMsgApp(MsgNbIpPortChange))//ip及端口号发生改变 { FrameClearMsgApp(MsgNbIpPortChange); SetEventUploadFlag(UPLOAD_TYPE_SET_IP); SaveNewSoe(SOE_MANUAL_UPLOAD,0x04); //存SOE } //即时报警上传 if(FrameCheckMsgApp(MsgShenYang_NbUploadWarning)) { FrameClearMsgApp(MsgShenYang_NbUploadWarning); SetEventUploadFlag(UPLOAD_TYPE_WARNING); SaveNewSoe(SOE_MANUAL_UPLOAD,0x05); //存SOE } //厂区上传,只进行到附网成功 if(FrameCheckMsgApp(Msg_FactoryUpload)) { FrameClearMsgApp(Msg_FactoryUpload); SetEventUploadFlag(UPLOAD_TYPE_FACTORY); SaveNewSoe(SOE_MANUAL_UPLOAD,0x06); //存SOE } } /******************************************************************************* * @fun_name: FixedTimeNbIoTUpload * @brief : ******************************************************************************/ static void FixedTimeNbIoTUpload_Ies(void) { switch(time_upload_state) { case(TIME_UPLOAD_S0): { if(TRUE == GetEventUploadFlag()) //是否有上报任务 { event_upload.upload_cnt++; event_upload.upload_cnt %= UPLOAD_EVENT_NUM; Set100msTimer(TIMER_100MS_WAIT_SLEEP_GPRS, NB_TOTAL_WORK_TIME); //总时长6min g_activity_times++; //有上报任务,活跃次数即累加 if(((FrameCheckParaApp(FramePara_FuncCfg0_3)>>16)&0xFF) == 0xAA) { OpenPrintNbDataSwitch();//打开红外调试功能 } Sys_data_object.P3.ProductUploadFlag = 0x55; FrameClearMsgApp(MsgNbUplaod_AckOk);//清收到应答消息 FrameClearMsgApp(MsgNb_FlagRcvNbFrame); NbUploadParaSet(); time_upload_state = TIME_UPLOAD_S1; } } break; case(TIME_UPLOAD_S1): { if (NbiotIfOnline())//已在线 { time_upload_state = TIME_UPLOAD_S2; } else //不在线 启动模块上线任务 { if (NbiotIfIdle()) { NbiotOnlineTask(&upload_send_state); Set100msTimer(TIMER_100MS_ERROR_UPLOAD,NB_LAUNCH_TIME); //最长时间登录任务处理 5min time_upload_state = TIME_UPLOAD_S2; } } } break; case(TIME_UPLOAD_S2): { if (NbiotIfOnline()) //上线成功 上线流程中读出IMEI,ICCID,ECL,SNR,RSRP等参数 { if(UPLOAD_TYPE_FACTORY == GetEventUploadType()) //是厂区上传测试 { upload_frame_data_step = UPLOAD_FRAME_UPLOAD_OK;//厂区测试期间,符网成功则认为成功 time_upload_state = TIME_UPLOAD_S3;//上报成功,清失败次数 } else { NB_NetConnectStart(Sys_data_object.P1.server_ip, Sys_data_object.P1.server_port.datas, MAIN_CONNECT_TYPE); time_upload_state = TIME_UPLOAD_S20; } } else if((upload_send_state == NBIOT_ERROR)||(0 == Check100msTimer(TIMER_100MS_ERROR_UPLOAD)))//登录超时,本次上传失败 { upload_frame_data_step = UPLOAD_FRAME_ONLINE_FAIL; time_upload_state = TIME_UPLOAD_S3; } } break; case(TIME_UPLOAD_S20)://主连接 { if (ConncetIfOnline(MAIN_CONNECT_TYPE)) //上线成功 上线流程中读出IMEI,ICCID,ECL,SNR,RSRP等参数 { upload_frame_data_step = UPLOAD_FRAME_REQUEST_NEW; time_upload_state = TIME_UPLOAD_S3; } else if((upload_send_state == NBIOT_ERROR)||(0 == Check100msTimer(TIMER_100MS_ERROR_UPLOAD)))//登录超时,本次上传失败 { upload_frame_data_step = UPLOAD_FRAME_ONLINE_FAIL; time_upload_state = TIME_UPLOAD_S3; } } break; case(TIME_UPLOAD_S3): //上报数据组帧状态复位 { GetUploadDataResetState(); time_upload_state = TIME_UPLOAD_S4; } break; case(TIME_UPLOAD_S4): //等上报数据组帧完成 { GetUploadDataMachineProduction(upload_frame_data_step, upload_send_buf, &upload_send_len); if(GetUploadDataCheckIdleProduction() == TASK_IDLE) { if(GetUploadDataCheckTaskProduction() == PTL_PACK_SUCCESS) { time_upload_state = TIME_UPLOAD_S5; } else { Set100msTimer(TIMER_100MS_NBIOT_20, NB_WAIT_5S);//5秒等待 time_upload_state = TIME_UPLOAD_S7; } } } break; case(TIME_UPLOAD_S5): //等待数据发送 { if (TASK_IDLE == NbiotIfIdle()) { NbiotSendTask(upload_send_buf, upload_send_len, MAIN_SEND_TYPE, &upload_send_state); Set100msTimer(TIMER_100MS_NBIOT_20, COAP_UPLOAD_WAIT_ACK_TIME);//等待应答 time_upload_state = TIME_UPLOAD_S6; } } break; case(TIME_UPLOAD_S6): //等待上报应答 { if((FrameCheckMsgApp(MsgNbUplaod_AckOk) == 1)||(Check100msTimer(TIMER_100MS_NBIOT_20) == 0))//收到上传应答帧或等待应答时间到,判为上报成功 { FrameClearMsgApp(MsgNbUplaod_AckOk);//清消息 upload_frame_data_step = UPLOAD_FRAME_UPLOAD_OK; Sys_data_object.P3.ProductUpoadFailFlag = 0; NB_SS_Control_SetPara(NB_UploadFailTimes, 0);//生产上报成功,清除失败次数 time_upload_state = TIME_UPLOAD_S4; } else if(upload_send_state == NBIOT_ERROR)//数据发送失败,请求重新发送 { Sys_data_object.P3.ProductUpoadFailFlag = 50; upload_frame_data_step = UPLOAD_FRAME_UPLOAD_RETRY; time_upload_state = TIME_UPLOAD_S4; } } break; case(TIME_UPLOAD_S7)://处理下行指令和上报队列 { if(FrameCheckMsgApp(MsgNb_FlagRcvNbFrame))//是否收到nb数据 { FrameClearMsgApp(MsgNb_FlagRcvNbFrame); Set100msTimer(TIMER_100MS_NBIOT_20, NB_WAIT_5S); } if (Check100msTimer(TIMER_100MS_NBIOT_20) == 0)//5s超时时间到 { if(TRUE == GetNbiotRevHandleOverFlag()) //无NB数据在处理 { time_upload_state = TIME_UPLOAD_PowerDown; } } } break; //模组断电流程 case TIME_UPLOAD_PowerDown: { if(NbiotIfIdle()) { StartPowerOffTask(); time_upload_state = TIME_UPLOAD_PowerDownWait; } } break; case TIME_UPLOAD_PowerDownWait: { if(NbiotIfIdle()) { time_upload_state = TIME_UPLOAD_PowerDownEnd; } } break; case TIME_UPLOAD_PowerDownEnd: { if(TASK_IDLE == EepIfIdle()) { if(((FrameCheckParaApp(FramePara_FuncCfg0_3)>>16)&0xFF) == 0xAA)//如果红外调试开启,则关闭红外调试 { Sys_data_object.P1.func_cfg_bytes[2] = 0; s_upload_eep_complete = 0; EepWrite(&Sys_data_object.P1.func_cfg_bytes[2], (EEP_FRAME_FUNCCFGBYTES_ADDR+2), 1, &s_upload_eep_complete); Frame_Para_Init(); } NbForcePowerOff();//NB强制关机 UdpEndCheckData(); ClosePrintNbDataSwitch(); ClearEventUploadFlag(); Sys_data_object.P3.ProductUploadFlag = 0; time_upload_state = TIME_UPLOAD_S0; main_upload_state = UPLOAD_S0; } } break; default: { time_upload_state = TIME_UPLOAD_S0; } break; } //NB活跃时间超时处理,超时不空闲,则强制关机 if(TASK_BUSY == FixedTimeNbIoTUploadIfIdle()) { if(0 == Check100msTimer(TIMER_100MS_WAIT_SLEEP_GPRS)) { time_upload_state = TIME_UPLOAD_PowerDownEnd; } } } static void FixedTimeNbIoTUpload_Other(void) { switch(time_upload_state) { case(TIME_UPLOAD_S0): { if(TRUE == GetEventUploadFlag()) //是否有上报任务 { event_upload.upload_cnt++; event_upload.upload_cnt %= UPLOAD_EVENT_NUM; Set100msTimer(TIMER_100MS_WAIT_SLEEP_GPRS, NB_TOTAL_WORK_TIME); //总时长6min g_activity_times++; //有上报任务,活跃次数即累加 if(((FrameCheckParaApp(FramePara_FuncCfg0_3)>>16)&0xFF) == 0xAA) { OpenPrintNbDataSwitch();//打开红外调试功能 } FrameClearMsgApp(MsgNbUplaod_AckOk);//清收到应答消息 FrameClearMsgApp(MsgNb_FlagRcvNbFrame); NbUploadParaSet();//根据功耗配置上报参数 time_upload_state = TIME_UPLOAD_S1; } } break; case(TIME_UPLOAD_S1): { if(NbiotIfOnline())//已在线 { if(PSM_STATE_OUT != getPsmState())//如果在PSM状态,正常在PSM_STATE_SLEEP状态开始,阀门动作会在PSM_STATE_WAKE状态继续上报 { NbiotPsmWakeupTask(); //psm模式唤醒 time_upload_state = TIME_UPLOAD_S10; } else { time_upload_state = TIME_UPLOAD_S2; } } else //不在线 启动模块上线任务 { if (NbiotIfIdle()) { NbiotOnlineTask(&upload_send_state); Set100msTimer(TIMER_100MS_ERROR_UPLOAD,NB_LAUNCH_TIME); //最长时间登录任务处理 5min time_upload_state = TIME_UPLOAD_S2; } } } break; case TIME_UPLOAD_S10://等待模组PSM唤醒任务完成 { if(NbiotIfIdle()==TASK_IDLE) { if(PSM_STATE_WAKE == getPsmState())//唤醒成功 { time_upload_state = TIME_UPLOAD_S20; } else//唤醒失败,模组重新联网 { NbiotOnlineTask(&upload_send_state); Set100msTimer(TIMER_100MS_ERROR_UPLOAD,NB_LAUNCH_TIME); //最长时间登录任务处理 2min time_upload_state = TIME_UPLOAD_S2; } } } break; case(TIME_UPLOAD_S2): { if (NbiotIfOnline()) //上线成功 上线流程中读出IMEI,ICCID,ECL,SNR,RSRP等参数 { setUploadControlPara(UP_CGATT_FAIL, FALSE);//附网成功 NB_NetConnectStart(Sys_data_object.P1.server_ip, Sys_data_object.P1.server_port.datas, MAIN_CONNECT_TYPE); time_upload_state = TIME_UPLOAD_S20; } else if((upload_send_state == NBIOT_ERROR)||(0 == Check100msTimer(TIMER_100MS_ERROR_UPLOAD)))//登录超时,本次上传失败 { setUploadControlPara(UP_CGATT_FAIL, TRUE);//附网失败 upload_frame_data_step = UPLOAD_FRAME_ONLINE_FAIL; time_upload_state = TIME_UPLOAD_S3; } } break; case(TIME_UPLOAD_S20)://主连接 { if (ConncetIfOnline(MAIN_CONNECT_TYPE)) //上线成功 上线流程中读出IMEI,ICCID,ECL,SNR,RSRP等参数 { if(PSM_STATE_WAKE == getPsmState())//唤醒成功 { upload_frame_data_step = UPLOAD_FRAME_REQUEST_NEW; time_upload_state = TIME_UPLOAD_S3; } else if(getUploadControlPara(UP_ONLY_REV)==TRUE) { setUploadControlPara(UP_ONLY_REV, FALSE); Set100msTimer(TIMER_100MS_NBIOT_20, getUploadControlPara(UP_DELAY_TIME1)); time_upload_state = TIME_UPLOAD_S7; } else { upload_frame_data_step = UPLOAD_FRAME_REQUEST_NEW; time_upload_state = TIME_UPLOAD_S3; } } else if((upload_send_state == NBIOT_ERROR)||(0 == Check100msTimer(TIMER_100MS_ERROR_UPLOAD)))//登录超时,本次上传失败 { upload_frame_data_step = UPLOAD_FRAME_ONLINE_FAIL; time_upload_state = TIME_UPLOAD_S3; } } break; case(TIME_UPLOAD_S3): //上报数据组帧状态复位 { GetUploadDataResetState(); time_upload_state = TIME_UPLOAD_S4; } break; case(TIME_UPLOAD_S4): //等上报数据组帧完成 { GetUploadDataMachine(upload_frame_data_step, upload_send_buf, &upload_send_len); if(GetUploadDataCheckIdle() == TASK_IDLE) { if(GetUploadDataCheckTask() == PTL_PACK_SUCCESS) { time_upload_state = TIME_UPLOAD_S5; } else { Set100msTimer(TIMER_100MS_NBIOT_20, getUploadControlPara(UP_DELAY_TIME1)); time_upload_state = TIME_UPLOAD_S7; } } } break; case(TIME_UPLOAD_S5): //等待数据发送 { if (TASK_IDLE == NbiotIfIdle()) { NbiotSendTask(upload_send_buf, upload_send_len, MAIN_SEND_TYPE, &upload_send_state); Set100msTimer(TIMER_100MS_NBIOT_20, COAP_UPLOAD_WAIT_ACK_TIME);//等待应答 time_upload_state = TIME_UPLOAD_S6; } } break; case(TIME_UPLOAD_S6): //等待上报应答 { if((FrameCheckMsgApp(MsgNbUplaod_AckOk) == 1)||(Check100msTimer(TIMER_100MS_NBIOT_20) == 0))//收到上传应答帧或等待应答时间到,判为上报成功 { FrameClearMsgApp(MsgNbUplaod_AckOk);//清消息 s_upload_ack_fail_times = 0;//多天无应答记录清0 upload_frame_data_step = UPLOAD_FRAME_UPLOAD_OK; Sys_data_object.P3.ProductUpoadFailFlag = 0; time_upload_state = TIME_UPLOAD_S4; } else if(upload_send_state == NBIOT_ERROR)//数据发送失败,请求重新发送 { upload_frame_data_step = UPLOAD_FRAME_UPLOAD_RETRY; time_upload_state = TIME_UPLOAD_S4; } } break; case(TIME_UPLOAD_S7)://处理下行指令和上报队列 { if(FrameCheckMsgApp(MsgNb_FlagRcvNbFrame))//是否收到nb数据 { FrameClearMsgApp(MsgNb_FlagRcvNbFrame); Set100msTimer(TIMER_100MS_NBIOT_20, getUploadControlPara(UP_DELAY_TIME1)); } else if (Check100msTimer(TIMER_100MS_NBIOT_20) == 0)//10s超时时间到 { if(TRUE == GetNbiotRevHandleOverFlag()) //无NB数据在处理 { if(TRUE == GetEventUploadFlag()) //是否还有上报任务 { event_upload.upload_cnt++; event_upload.upload_cnt %= UPLOAD_EVENT_NUM; time_upload_state = TIME_UPLOAD_S20; } else { if(PSM_STATE_WAKE == getPsmState())//如果在PSM唤醒状态 { if((Sys_data_object.P1.func_cfg_bytes[12]&0x80)&&(Sys_data_object.P1.func_cfg_bytes[12]&0x03)) //PSM模式上报判断 { time_upload_state = TIME_UPLOAD_PsmSleep; } else { time_upload_state = TIME_UPLOAD_UDP_S1; } } else { if((getUploadControlPara(UP_WITH_UDP)==TRUE)&&(getUploadControlPara(UP_CGATT_FAIL)==FALSE))//附网成功才UDP上报 { time_upload_state = TIME_UPLOAD_UDP_S1; } else { time_upload_state = TIME_UPLOAD_PowerDown; } } } } } } break; //UDP上报流程 case TIME_UPLOAD_UDP_S1: { if(TRUE == GetNbiotRevHandleOverFlag()) //无NB数据在处理 { if(NbiotIfIdle()) { upload_frame_data_step=0; NB_NetConnectStart(Sys_data_object.P2.server_ip, Sys_data_object.P2.server_port.datas, SLAVE_CONNECT_TYPE); Set100msTimer(TIMER_100MS_NBIOT_20, getUploadControlPara(UP_DELAY_TIME1)); time_upload_state = TIME_UPLOAD_UDP_S2; } } } break; case TIME_UPLOAD_UDP_S2://上报数据组帧状态复位 { if(ConncetIfOnline(SLAVE_CONNECT_TYPE)) { upload_frame_data_step = UPLOAD_FRAME_REQUEST_NEW; time_upload_state = TIME_UPLOAD_UDP_S3; } else if (Check100msTimer(TIMER_100MS_NBIOT_20) == 0)//5s超时时间到 { upload_frame_data_step = UPLOAD_FRAME_ONLINE_FAIL; time_upload_state = TIME_UPLOAD_UDP_S3; } } break; case(TIME_UPLOAD_UDP_S3): //等上报数据组帧完成 { GetUploadDataResetState_UDP(); time_upload_state = TIME_UPLOAD_UDP_S4; } break; case(TIME_UPLOAD_UDP_S4): //等上报数据组帧完成 { GetUploadDataMachine_UDP(upload_frame_data_step, upload_send_buf, &upload_send_len); if(GetUploadDataCheckIdle_UDP() == TASK_IDLE) { if(GetUploadDataCheckTask_UDP() == PTL_PACK_SUCCESS) { time_upload_state = TIME_UPLOAD_UDP_S5; } else { Set100msTimer(TIMER_100MS_NBIOT_20, getUploadControlPara(UP_DELAY_TIME1)); time_upload_state = TIME_UPLOAD_UDP_S7; } } } break; case TIME_UPLOAD_UDP_S5://等待UDP数据发送 { if (TASK_IDLE == NbiotIfIdle()) { NbiotSendTask(upload_send_buf, upload_send_len, SLAVE_SEND_TYPE, &upload_send_state); Set100msTimer(TIMER_100MS_NBIOT_20, UDP_UPLOAD_WAIT_ACK_TIME);//等待应答时间 time_upload_state = TIME_UPLOAD_UDP_S6; } } break; case(TIME_UPLOAD_UDP_S6): //等待UDP应答 { if(FrameCheckMsgApp(MsgNbUplaod_AckOk) == 1)//收到上传应答帧 { FrameClearMsgApp(MsgNbUplaod_AckOk);//清消息 upload_frame_data_step = UPLOAD_FRAME_UPLOAD_OK; time_upload_state = TIME_UPLOAD_UDP_S4; } else if (Check100msTimer(TIMER_100MS_NBIOT_20) == 0)//超时无应答 { upload_frame_data_step = UPLOAD_FRAME_UPLOAD_RETRY; time_upload_state = TIME_UPLOAD_UDP_S4; } } break; case TIME_UPLOAD_UDP_S7: { if(FrameCheckMsgApp(MsgNb_FlagRcvNbFrame)||(TRUE == UdpIfNeedReadData()))//收到下行指令再延长5s在线时间 { FrameClearMsgApp(MsgNb_FlagRcvNbFrame); Set100msTimer(TIMER_100MS_NBIOT_20, getUploadControlPara(UP_DELAY_TIME1)); } if(Check100msTimer(TIMER_100MS_NBIOT_20) == 0) { if(TRUE == GetNbiotRevHandleOverFlag()) //无NB数据在处理 { time_upload_state = TIME_UPLOAD_PowerDown; } } } break; case TIME_UPLOAD_PsmSleep: { if(NbiotIfIdle()==TASK_IDLE) { NbiotPsmSleepTask(); time_upload_state = TIME_UPLOAD_PsmSleepWait; } } break; case TIME_UPLOAD_PsmSleepWait: { if(NbiotIfIdle()==TASK_IDLE) { if(PSM_STATE_SLEEP == getPsmState())//如果进入PSM休眠成功 { Sys_data_object.P3.NBSleepMode = 1; UdpEndCheckData(); ClosePrintNbDataSwitch(); ClearEventUploadFlag(); time_upload_state = TIME_UPLOAD_S0; main_upload_state = UPLOAD_S0; } else { time_upload_state= TIME_UPLOAD_PowerDown; } } } break; //模组断电流程 case TIME_UPLOAD_PowerDown: { if(NbiotIfIdle()) { StartPowerOffTask(); time_upload_state = TIME_UPLOAD_PowerDownWait; } } break; case TIME_UPLOAD_PowerDownWait: { if(NbiotIfIdle()) { time_upload_state = TIME_UPLOAD_PowerDownEnd; } } break; case TIME_UPLOAD_PowerDownEnd: { if(TASK_IDLE == EepIfIdle()) { if(((FrameCheckParaApp(FramePara_FuncCfg0_3)>>16)&0xFF) == 0xAA)//如果红外调试开启,则关闭红外调试 { Sys_data_object.P1.func_cfg_bytes[2] = 0; s_upload_eep_complete = 0; EepWrite(&Sys_data_object.P1.func_cfg_bytes[2], (EEP_FRAME_FUNCCFGBYTES_ADDR+2), 1, &s_upload_eep_complete); Frame_Para_Init(); } NbForcePowerOff();//NB强制关机 UdpEndCheckData(); ClosePrintNbDataSwitch(); ClearEventUploadFlag(); Sys_data_object.P3.NBSleepMode = 0; //NB模组休眠选择标志 time_upload_state = TIME_UPLOAD_S0; main_upload_state = UPLOAD_S0; } } break; default: { time_upload_state = TIME_UPLOAD_S0; } break; } //NB活跃时间超时处理,超时不空闲,则强制关机 if(TASK_BUSY == FixedTimeNbIoTUploadIfIdle()) { if(0 == Check100msTimer(TIMER_100MS_WAIT_SLEEP_GPRS)) { time_upload_state = TIME_UPLOAD_PowerDownEnd; } } } void FixedTimeNbIoTUpload(void) { UploadConditionJuge(); switch(main_upload_state) { case UPLOAD_S0: { } break; case UPLOAD_S1://生产上报流程 { FixedTimeNbIoTUpload_Ies(); } break; case UPLOAD_S2://其他规约上报流程 { FixedTimeNbIoTUpload_Other(); } break; default: { main_upload_state = UPLOAD_S0; } break; } } void SystemClearUploadAgain(void) { upload_again_cnt_copy = 0; } void SystemAddUploadAgain(void) { if(UPLOAD_TYPE_FIX_TIME == GetEventUploadType())//定时上传 { s_upload_ack_fail_times++;//多天无应答记录增加 } if(s_upload_ack_fail_times<10) { upload_again_cnt_copy++; } } /*******************************数据存储******************************/ IES_PULSE_DAY_MAX_FLOW ies_pulse_day_max_flow; static void SysCheckFlowMinMax(DateTime alarm_time) { static u16 pulse_day_max_flow_time_temp; static u32 old_total_speed = 0; static u32 new_total_speed = 0; static u8 date_flag = 0; RTCC_To_Float temp_to_gloat;//数据转换专用 if((0 == alarm_time.s.hour) && (0 == alarm_time.s.minute)) //每天0点刷新上传数据 { old_total_speed = 0; pulse_day_max_flow_time_temp =0; date_flag = 0; RtccGetDateTime(&alarm_time); ies_pulse_day_max_flow.pulse_flow_time[0] = alarm_time.s.second; ies_pulse_day_max_flow.pulse_flow_time[1] = alarm_time.s.minute; ies_pulse_day_max_flow.pulse_flow_time[2] = alarm_time.s.hour; ies_pulse_day_max_flow.pulse_flow_time[3] = alarm_time.s.weekday; ies_pulse_day_max_flow.pulse_flow_time[4] = alarm_time.s.day; ies_pulse_day_max_flow.pulse_flow_time[5] = alarm_time.s.month; ies_pulse_day_max_flow.pulse_flow_time[6] = alarm_time.s.year; ies_pulse_day_max_flow.pulse_flow_time[7] = 0x20; } //流量更新 new_total_speed = Gp30CheckDataApp(GP30_APP_INS_FLOW); if((0.9*old_total_speed) < new_total_speed < (1.1*old_total_speed)) { pulse_day_max_flow_time_temp++;//持续时间增加 ies_pulse_day_max_flow.pulse_continue_time.to_uint16 = pulse_day_max_flow_time_temp*60; temp_to_gloat.gp22_float = new_total_speed; //瞬时流量 瞬时流量单位为0.01L/H,4字节无符号整数。 ies_pulse_day_max_flow.pulse_max_flow.to_uint32 = (u32)(temp_to_gloat.gp22_float / (float)65536.00)/60; //平台转换成每小时用水量 //判断开始时间是否更新 if(date_flag==1) { date_flag = 0; RtccGetDateTime(&alarm_time); ies_pulse_day_max_flow.pulse_flow_time[0] = alarm_time.s.second; ies_pulse_day_max_flow.pulse_flow_time[1] = alarm_time.s.minute; ies_pulse_day_max_flow.pulse_flow_time[2] = alarm_time.s.hour; ies_pulse_day_max_flow.pulse_flow_time[3] = alarm_time.s.weekday; ies_pulse_day_max_flow.pulse_flow_time[4] = alarm_time.s.day; ies_pulse_day_max_flow.pulse_flow_time[5] = alarm_time.s.month; ies_pulse_day_max_flow.pulse_flow_time[6] = alarm_time.s.year; ies_pulse_day_max_flow.pulse_flow_time[7] = 0x20; } } else if(new_total_speed <= (0.9*old_total_speed))//流量变小 { pulse_day_max_flow_time_temp = 0; date_flag = 1; } else if(new_total_speed >= (1.1*old_total_speed))//流量变大 { old_total_speed = new_total_speed; pulse_day_max_flow_time_temp =0; date_flag = 0; ies_pulse_day_max_flow.pulse_flow_time[0] = alarm_time.s.second; ies_pulse_day_max_flow.pulse_flow_time[1] = alarm_time.s.minute; ies_pulse_day_max_flow.pulse_flow_time[2] = alarm_time.s.hour; ies_pulse_day_max_flow.pulse_flow_time[3] = alarm_time.s.weekday; ies_pulse_day_max_flow.pulse_flow_time[4] = alarm_time.s.day; ies_pulse_day_max_flow.pulse_flow_time[5] = alarm_time.s.month; ies_pulse_day_max_flow.pulse_flow_time[6] = alarm_time.s.year; ies_pulse_day_max_flow.pulse_flow_time[7] = 0x20; } } //获取日最高流量数据 void RtccCheck_Hight_Flow(u8 **addr) { *addr = ies_pulse_day_max_flow.byte; } void SaveFreezeData(void) { switch(save_freeze_sate) { case SAVE_FREEZE_S0: { if(data_save_judge_flag) { data_save_judge_flag = FALSE; RtccGetDateTime(&sys_rtcc_time); sys_temp_min_hex = (sys_rtcc_time.s.minute >> 4)*10 + (sys_rtcc_time.s.minute & 0x0F); if(0 ==(sys_temp_min_hex % 5))//5分钟间隔 { RtccAppCheckMiJi(sys_rtcc_time); } if(0 == sys_rtcc_time.s.minute) //整点时间 { save_freeze_sate = SAVE_FREEZE_S1; } SysCheckFlowMinMax(sys_rtcc_time); } } break; case SAVE_FREEZE_S1: { if (EepIfIdle()) { Sys_data_object.ee_data.data.work_hour++;//累计工作时间增加 EepWrite(Sys_data_object.ee_data.byte, EE_FIRST_USE_ADDR, sizeof (RTCC_EE_DATA), &s_upload_eep_complete); save_freeze_sate = SAVE_FREEZE_S2; } } break; case SAVE_FREEZE_S2://厂区时间判断 { if(0 == sys_rtcc_time.s.hour) //每天0点 { if (EepIfIdle()) { if(Sys_data_object.P1.func_cfg_bytes[0] > 0)//厂区15天时间还没有到 { Sys_data_object.P1.func_cfg_bytes[0]--;//厂区时间减一天 EepWrite(&Sys_data_object.P1.func_cfg_bytes[0],ee_addr_compute((u8*)(&Sys_data_object.P1.func_cfg_bytes[0])),1,&s_upload_eep_complete); } save_freeze_sate = SAVE_FREEZE_S3; } } else { save_freeze_sate = SAVE_FREEZE_S0; } } break; case SAVE_FREEZE_S3://小时模式0点恢复天模式 { if (EepIfIdle()) { if(UPLOAD_MODE_HOUR == Sys_data_object.P1.Time_upload_2006.s.type) //小时模式 { Sys_data_object.P1.Time_upload_2006.s.type = UPLOAD_MODE_DAY; 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秒 EepWrite(&Sys_data_object.P1.Time_upload_2006.buf[0], FRAME_NBIot_FREQVAL, 5, &s_upload_eep_complete); } save_freeze_sate = SAVE_FREEZE_S7; } } break; case SAVE_FREEZE_S7: { if (EepIfIdle()) { save_freeze_sate = SAVE_FREEZE_S0; } } break; default: { save_freeze_sate = SAVE_FREEZE_S0; } break; } } u8 GetMcuResetSouce(void) { u8 reset_souce; reset_souce = Reset_GetFlag(ResetFlagMskRstb);//RESET脚复位 reset_souce <<= 1; reset_souce |= Reset_GetFlag(ResetFlagMskSysreq);//软件复位 reset_souce <<= 1; reset_souce |= Reset_GetFlag(ResetFlagMskLockup);//系统异常复位 reset_souce <<= 1; reset_souce |= Reset_GetFlag(ResetFlagMskPca);//PCA复位 reset_souce <<= 1; reset_souce |= Reset_GetFlag(ResetFlagMskWdt);//看门狗复位 reset_souce <<= 1; reset_souce |= Reset_GetFlag(ResetFlagMskLvd);//低电压检测复位 reset_souce <<= 1; reset_souce |= Reset_GetFlag(ResetFlagMskPor1_5V);//1.5V启动复位 reset_souce <<= 1; reset_souce |= Reset_GetFlag(ResetFlagMskPor5V);//5V启动复位 reset_souce <<= 1; return reset_souce; } /******************************************************************************* * @fun_name: FrameGsmMsgManage * @brief : 上传和上传数据存储 * @param[in] : None * @param[out]: None * @retval : None * @other : ******************************************************************************/ void SystemProcessor(void) { MinuteEventScan(); SysDealAppMachine(); SaveFreezeData(); FixedTimeNbIoTUpload(); DataStoreMachine(); } void SystemProcessorInit(void) { upload_delay_flag = 0; upload_send_state=0; if(upload_again_cnt_copy >3) { upload_again_cnt_copy = 0; } SaveNewSoe(SOE_SY_SYS_RESET, GetMcuResetSouce());//系统重启记录 if(Reset_GetFlag(ResetFlagMskWdt))//看门狗复位 { FrameSetMsgApp(Msg_WdtReset); //用于复位补偿 } if(Reset_GetFlag(ResetFlagMskPor5V))//欠压或硬复位 { FrameSetMsgApp(Msg_Por5VReset); //GP30复位 } Reset_ClearFlagAll();//清复位标识寄存器 DataStoreInit(); NbUploadParaSet(); //KeySetLcdMsgApp(MENU_ACTIVE_RF);//天线测试,按键上传 } u8 SystemProcessorIfSleep(void) { if((FixedTimeNbIoTUploadIfIdle() == TASK_IDLE) && (DataStoreIfIdle() == TRUE)) { return TRUE; } return FALSE; } #endif