#include "sys_config.h" #if PRODUCT_SS #include "sys_processor.h" #include "UWater_eeprom_driver.h" #include "UWater_valve_driver.h" #include "UWater_Valve_app.h" #include "UWater_rtcc_app.h" #include "UWater_power_app.h" #include "UWater_gp22_app.h" #include "UWater_pt_app.h" #include "UWater_DataTools_App.h" #include "UWater_QZ_Store_App.h" #include "nb_upload_monitor.h" #include "UWater_frame_func_ReplyNB.h" #include "UWater_frame_func_ReplyShenShui.h" static u8 s_eep_complete_ShenShui=0; static u8 task_complete_ShenShui = PTL_PACK_BUSY; static u8 g_frame_temp_buf_ShenShui[UP_BUF_SIZE]; //数据部分缓冲区 static u16 g_frame_temp_len_ShenShui=0; static DateTime shenshui_rtcc_time; static STRUCT_FRAME_IES frame_struct_ShenShui; //规约信息 static u8 *new_message_data_rev_ShenShui; static u8 up_deal_stat_ShenShui = UP_DEAL_S0;//规约处理状态机 /*******主动上传数据相关变量*****************************************/ static u16 upload_serial_num_ShenShui=0; static STRUCT_FRAME_IES upload_struct_ShenShui; //规约信息 static u8 upload_frame_stat_ShenShui=0; //主动上报组帧状态 static u8 upload_task_complete_ShenShui = PTL_PACK_FAIL; static u16 upload_temp_len_ShenShui=0;//主动上报数据长度 static UNION_SIGNAL signal_val; static u8 upload_frame_retry_times=0; static u8 temp_upload_step=0; //static u8 temp_Supplemental_send_NO; static u8 temp_store_msg=0; //积成规约上报缓存 static STRU_UPLOAD_FRAME upload_frame;//长帧上报数据 static STRU_UPLOAD_FRAME store_frame;//长帧存储数据,和上报帧缓存独立,防止上报期间存储数据 static STRU_SHORT_UPLOAD_FRAME short_upload_frame;//短帧数据 //新补报规约 static u8 supplement_data_frame_state = SUPPLEMENT_DATA_FRAME_S0; static u8 supplement_cnt = 0; static u8 supplement_buf[300]; //补报数据,间隔流量存储 static TYP_STATE_SS step_save_supplt=SS_STATE_S0; static RTCC_To_Float old_jiange_total_flow; static RTCC_To_Float new_jiange_total_flow; static RTCC_UNION_2U8TOU16 jiange_data; //补报标志存储 static TYP_STATE_SS step_clear_flag=SS_STATE_S0; static u32 temp_supplement_bit; //主动上传帧------------------------判断的应答控制字,返回PTL_PACK_FAIL //深水和江水上传应答处理统一 static void frame_func_reply_NB_AckUpload(void) { g_frame_temp_len_ShenShui =0; u8 sernum0 = upload_serial_num_ShenShui&0xFF; u8 sernum1 = (upload_serial_num_ShenShui>>8)&0xFF; if(*(new_message_data_rev_ShenShui + 6) == 1)//上报数据格式异常 { if(frame_struct_ShenShui.serial_num0 == sernum0)//江西水务产线生产测试返回格式异常,应判断过 { if(frame_struct_ShenShui.serial_num1 == sernum1) { NB_SS_Control_SetPara(NB_SS_FormatError, 1);//置起上报格式异常标志 FrameSetMsgApp(MsgNbUplaod_AckOk);//放宽限制,防止异常数据导致一直补报 } } } else { if(frame_struct_ShenShui.serial_num0 == sernum0) { if(frame_struct_ShenShui.serial_num1 == sernum1) { FrameSetMsgApp(MsgNbUplaod_AckOk); } } NB_SS_Control_SetPara(NB_SS_FormatError, 0);//清除上报格式异常标志 } task_complete_ShenShui = PTL_PACK_FAIL;//这是上报应答帧,返回错误,表计不应答 } //短帧上报应答 static void frame_func_reply_NB_AckUploadShort(void) { frame_func_reply_NB_AckUpload(); } //新补报规约应答 static void frame_func_reply_NB_AckNewSupplement(void) { frame_func_reply_NB_AckUpload(); } //登录帧------------------------判断的应答控制字,返回PTL_PACK_FAIL static void frame_func_reply_NB_AckLogin(void) { FrameSetMsgApp(MsgNbUplaod_AckLoginOk); } static void ies_ack_upload_valve_frame(void) { g_frame_temp_len_ShenShui =0; #if defined(VALVE) u8 sernum0 = upload_serial_num_ShenShui&0xFF; u8 sernum1 = (upload_serial_num_ShenShui>>8)&0xFF; u8 rcv_state = 0; rcv_state = *(new_message_data_rev_ShenShui + 6); if(*(new_message_data_rev_ShenShui + 6) == 1)//上报数据格式异常 { NB_SS_Control_SetPara(NB_SS_FormatError, 1);//置起上报格式异常标志 } else { if(frame_struct_ShenShui.serial_num0 == sernum0) { if(frame_struct_ShenShui.serial_num1 == sernum1) { FrameSetMsgApp(MsgNbUplaod_AckOk); } } NB_SS_Control_SetPara(NB_SS_FormatError, 0);//清除上报格式异常标志 } if(0x00 == (rcv_state & 0x06)) //阀控内容-开阀 { ValveDealAppStart(VALVE_STATE_OPEN); } else if(0x02 == (rcv_state & 0x06)) //阀控内容-普关 { ValveDealAppStart(VALVE_STATE_CLOSE); } else if(0x04 == (rcv_state & 0x06)) //阀控内容-权关 { ValveDealAppStart(VALVE_STATE_CLOSE_LOCK); } else if(0x06 == (rcv_state & 0x06)) //阀控内容-应急关 { ValveDealAppStart(VALVE_STATE_CLOSE_EMERGENCY); } #endif task_complete_ShenShui = PTL_PACK_FAIL;//这是上报应答帧,返回错误,表计不应答 } //读历史数据 static void frame_func_reply_NB_ReadHistoryData(void) { u8 temp = 0; u8 temp_read_index = 0; u8 temp_read_code = *new_message_data_rev_ShenShui; switch(up_deal_stat_ShenShui) { case UP_DEAL_S0: { if(TASK_IDLE == EepIfIdle())//读取历史数据 { g_frame_temp_len_ShenShui =0; temp_read_index = NB_SS_Control_GetPara(NB_HistroyReadIndex); if (temp_read_index >= temp_read_code) { temp = temp_read_index - temp_read_code; } else { temp = 32 - (temp_read_code - temp_read_index); } EepRead((FRAME_NBIot_HISTORY_READ_ADD +(temp*PACK_NUM_GPRS)), g_frame_temp_buf_ShenShui, 155, &s_eep_complete_ShenShui); up_deal_stat_ShenShui = UP_DEAL_S1; } } break; case UP_DEAL_S1: { if(TASK_IDLE == EepIfIdle())//读取历史数据完成 { g_frame_temp_len_ShenShui = PACK_NUM_GPRS; task_complete_ShenShui = PTL_PACK_SUCCESS; up_deal_stat_ShenShui = UP_DEAL_S0; } } break; default: { up_deal_stat_ShenShui = UP_DEAL_S0; task_complete_ShenShui = PTL_PACK_FAIL; } break; } } //清除失败次数 static void frame_func_s3_NB_ClearFailTimes(void) { if(TASK_IDLE == EepIfIdle()) { g_frame_temp_len_ShenShui = 0; NB_SS_Control_SetPara(NB_SS_FormatError, 0); NB_SS_Control_SetPara(NB_UploadFailTimes, 0); task_complete_ShenShui = PTL_PACK_SUCCESS; } } /************************************************************************************************************/ //解深水规约 u8 crack_frame_ShenShui(u16 frame_lenth,u8 *frame_buffer) { u8 temp_res = crack_frame_IES_Base(frame_lenth, frame_buffer, &frame_struct_ShenShui); if(temp_res == SUCCESS_IES) { new_message_data_rev_ShenShui = frame_buffer + frame_struct_ShenShui.head_site + 16; return SUCCESS_IES; } return ERROR_IES; } //深水规约处理 u8 up_deal_code_ShenShui(void) { task_complete_ShenShui = PTL_PACK_BUSY; switch(frame_struct_ShenShui.ctrl) { case SS_ACK_UPLOAD_CTRL: { frame_func_reply_NB_AckUpload(); } break; case SHORT_ACK_UPLOAD_CTRL: { frame_func_reply_NB_AckUploadShort(); } break; case SS_ACK_SIGN_IN_CTRL: { frame_func_reply_NB_AckLogin(); } break; case ACK_UPLOAD_WITH_VAVLE_CTRL://携带控阀指令的应答帧 { ies_ack_upload_valve_frame(); } break; case SUPP_ACK_UPLOAD_CTRL://新补报规约应答 { frame_func_reply_NB_AckNewSupplement(); } break; case SS_CLEAR_FAIL_TIMES_CTRL: { frame_func_s3_NB_ClearFailTimes(); frame_struct_ShenShui.ack_ctrl = SS_ACK_CLEAR_FAIL_TIMES_CTRL; } break; case SS_READ_HIS_CTRL: { switch(frame_struct_ShenShui.DI1) { case SS_READ_HIS_CTRL_ID1://深水规约读历史数据 { frame_func_reply_NB_ReadHistoryData(); } break; default: { up_deal_stat_ShenShui = UP_DEAL_S0; task_complete_ShenShui = PTL_PACK_FAIL; } } frame_struct_ShenShui.ack_ctrl = SS_ACK_READ_HIS_CTRL; } break; default: { up_deal_stat_ShenShui = UP_DEAL_S0; task_complete_ShenShui = PTL_PACK_FAIL; } break; } return task_complete_ShenShui; } void Frame_ResetDealState_ShenShui(void) { up_deal_stat_ShenShui = UP_DEAL_S0;//基线扩展规约处理状态复位 } //应答数据组帧 void Frame_ack_ShenShui(u8* p_send_buf, u16* p_send_len) { STRUCT_FRAME_IES temp_struct; temp_struct.ack_ctrl = frame_struct_ShenShui.ack_ctrl; temp_struct.DI0 = frame_struct_ShenShui.DI0; temp_struct.DI1 = frame_struct_ShenShui.DI1; temp_struct.sta = frame_struct_ShenShui.sta; temp_struct.serial_num0 = frame_struct_ShenShui.serial_num0; temp_struct.serial_num1 = frame_struct_ShenShui.serial_num1; Frame_ack_IesBase(temp_struct,g_frame_temp_buf_ShenShui, g_frame_temp_len_ShenShui, p_send_buf, p_send_len); } /****************************************************************以下主动上报数据的处理*********************************************/ static void setStoreMsg(SS_StoreMsgType msg, boolean_t bFlag) { if(TRUE == bFlag) { temp_store_msg |= (1<data.CurrentFlow.datas = (u32)(tmp_float.gp22_float*10);//当前累计流量 temp_frame->data.CurrentFlowForward.datas = temp_frame->data.CurrentFlow.datas;//当前累计正向流量 tmp_float.gp22_u32 = Gp30CheckDataApp(3);//当前累积逆向流量 temp_frame->data.CurrentFlowReverse.datas = (u32)(tmp_float.gp22_float*10); //获取:日最高流量(4字节),日最高流量持续时间(2字节),日最高流量开始时间(8字节,预留) RtccCheck_Hight_Flow(&hight_flow); for(temp1 = 0; temp1 <14 ;temp1++) { temp_frame->data.DailyHighestFlowAndTime[temp1] = *(hight_flow+temp1); } //获取:rsrp(2B),电池电压(2B),信噪比(2B),无线信号覆盖等级ecl(2B),CSQ(1B),电压阈值(1B) temp_frame->data.UploadInfo = UploadGetInfo_Base(); //获取间隔流量:2B(间隔流量)X2(次/h)X24h=96B /* 上报时通过UPLOAD_DATA_READ_HIS获取,0点存储时通过UPLOAD_DATA_STEP_FLOW获取 */ //上报时间 RtccGetDateTime(&tempRtcc_time);//上报时间 temp_frame->data.UploadTime[0] = tempRtcc_time.s.second; temp_frame->data.UploadTime[1] = tempRtcc_time.s.minute; temp_frame->data.UploadTime[2] = tempRtcc_time.s.hour; temp_frame->data.UploadTime[3] = tempRtcc_time.s.day; temp_frame->data.UploadTime[4] = tempRtcc_time.s.month; temp_frame->data.UploadTime[5] = tempRtcc_time.s.year; temp_frame->data.UploadTime[6] = 0x20; //状态字 temp_state = FrameGetByte(); temp_frame->data.StateBytes[0] = temp_state.stat0; temp_frame->data.StateBytes[1] = temp_state.stat1; temp_frame->data.StateBytes[2] = temp_state.stat2; temp_frame->data.StateBytes[3] = temp_state.stat3; temp_frame->data.StateBytes[4] = temp_state.stat4; //累计活跃时间 temp_frame->data.DailyActiveTime.datas = GetEventUploadType();//上报类型 } //短帧上报数据整理 static void Upload_RenewShortFrameData(void) { DateTime tempRtcc_time; //流量 short_upload_frame.data.null_buf.datas = 0; short_upload_frame.data.CurrentFlow_short.datas = upload_frame.data.CurrentFlow.datas;//当前累计流量 //信号\电池相关 upload_frame.data.UploadInfo = UploadGetInfo_Base(); short_upload_frame.data.RSRP_val = (u8)(upload_frame.data.UploadInfo.metinfo.RSRP_val/10); short_upload_frame.data.bat_voltage = PowerCheckValueSys(); short_upload_frame.data.mode_snr = upload_frame.data.UploadInfo.metinfo.snr_val; short_upload_frame.data.mode_ecl = upload_frame.data.UploadInfo.metinfo.ecl_val; //上报时间 RtccGetDateTime(&tempRtcc_time); short_upload_frame.data.UploadTime[0] = tempRtcc_time.s.minute; short_upload_frame.data.UploadTime[1] = tempRtcc_time.s.hour; short_upload_frame.data.UploadTime[2] = tempRtcc_time.s.day; short_upload_frame.data.UploadTime[3] = tempRtcc_time.s.month; short_upload_frame.data.UploadTime[4] = tempRtcc_time.s.year; //状态字 short_upload_frame.data.StateBytes[0] = upload_frame.data.StateBytes[0]; short_upload_frame.data.StateBytes[1] = upload_frame.data.StateBytes[1]; short_upload_frame.data.StateBytes[2] = upload_frame.data.StateBytes[2]; short_upload_frame.data.StateBytes[3] = 0x02; short_upload_frame.data.StateBytes[3] |= getUploadControlPara(UP_BAT_STATE);//剩余电池电量 //软件版本 short_upload_frame.data.soft_ver.datas_map.data1 =(FrameCheckParaApp(FramePara_ProgVersion)>>16)&0xFF; short_upload_frame.data.soft_ver.datas_map.data0 =(FrameCheckParaApp(FramePara_ProgVersion)>>24)&0xFF; short_upload_frame.data.temp_value.datas = (u16)TempCheckValueApp(); } //启动补报数据组帧 void StartSupplementFrame(void) { supplement_data_frame_state = SUPPLEMENT_DATA_FRAME_S1; } u8 SupplementFrameMachineIfIdle(void) { if(SUPPLEMENT_DATA_FRAME_S0 == supplement_data_frame_state) { return TASK_IDLE; } else { return TASK_BUSY; } } //新补报数据组帧 void SupplementFrameMachine(void) { switch(supplement_data_frame_state) { case SUPPLEMENT_DATA_FRAME_S0: break; case(SUPPLEMENT_DATA_FRAME_S1): { supplement_cnt = 0; temp_supplement_bit = Sys_data_object.P1.Supplemental_send_flag.datas; supplement_data_frame_state = SUPPLEMENT_DATA_FRAME_S2; } break; case(SUPPLEMENT_DATA_FRAME_S2): { if(EepIfIdle()) { //根据补报标志计算补报指针,日期从新往老排列 Sys_data_object.P1.histroy_r = 0xFF; for (int i = Sys_data_object.P1.histroy_w; i >0; i--) { if (Sys_data_object.P1.Supplemental_send_flag.datas &(0x00000001<(Sys_data_object.P1.histroy_w-1); i--) { if (Sys_data_object.P1.Supplemental_send_flag.datas &(0x00000001<= PERIOD_DATA_NUM) { Sys_data_object.P1.histroy_w = 0; } if(0 == Sys_data_object.P1.histroy_w) { Sys_data_object.P1.histroy_r = PERIOD_DATA_NUM - 1; } else { Sys_data_object.P1.histroy_r = Sys_data_object.P1.histroy_w-1; } setStoreMsg(SS_StoreMsg4,TRUE);//更新当前包数据 upload_frame_stat_ShenShui = UP_DEAL_S1; } else if(data_step == UPLOAD_FRAME_UPLOAD_OK)//发送成功 { if(temp_upload_step == UP_DEAL_S1)//当前包发送成功 { SystemClearUploadAgain();//重传清0 setStoreMsg(SS_StoreMsg2, TRUE);//当前包发送成功,清除补报位置(当天失败的情况) upload_frame_retry_times = 0; if(Sys_data_object.P1.func_cfg_bytes[7]==0x55)//需要补报 { if(((FrameCheckParaApp(FramePara_FuncCfg8_11)>>8)&0xFF) == 0xAA)//新补报规约 { upload_frame_stat_ShenShui = UP_DEAL_S30;//新补报流程 } else { upload_frame_stat_ShenShui = UP_DEAL_S10;//获取补报数据 } } else//不需要补报 { NB_SS_Control_SetPara(NB_UploadFailTimes, 0);//清除失败标志 upload_task_complete_ShenShui = PTL_PACK_FAIL;// 失败,上报结束 upload_frame_stat_ShenShui = UP_DEAL_S0; } } else if(temp_upload_step == UP_DEAL_S10)//补报发送成功 { setStoreMsg(SS_StoreMsg2, TRUE);//清除补报位置 upload_frame_retry_times = 0; upload_frame_stat_ShenShui = UP_DEAL_S10;//获取补报数据 } else if(temp_upload_step == UP_DEAL_S30)//新补报规约 { upload_frame_retry_times = 0; upload_frame_stat_ShenShui = UP_DEAL_S33; } } else if(data_step == UPLOAD_FRAME_UPLOAD_RETRY)//请求重新发送 { upload_frame_stat_ShenShui = UP_DEAL_S21; /*山西订单无应答修改( 改为ACK判断,不再使用下面两句) upload_task_complete_ShenShui = PTL_PACK_FAIL; upload_frame_stat_ShenShui = UP_DEAL_S0;*/ } else if(data_step == UPLOAD_FRAME_ONLINE_FAIL) //联网失败 { //计算要读取的上报数据存储位置(用于补报记录) if(Sys_data_object.P1.histroy_w >= PERIOD_DATA_NUM) { Sys_data_object.P1.histroy_w = 0; } if(0 == Sys_data_object.P1.histroy_w) { Sys_data_object.P1.histroy_r = PERIOD_DATA_NUM - 1; } else { Sys_data_object.P1.histroy_r = Sys_data_object.P1.histroy_w-1; } if( (UPLOAD_TYPE_TOUCH_KEY == GetEventUploadType()) || (UPLOAD_TYPE_HAND_KEY == GetEventUploadType()))//按键上报 { setStoreMsg(SS_StoreMsg1, TRUE);//标记补报位置 } else if(UPLOAD_TYPE_FIX_TIME == GetEventUploadType())//定时上传 { setStoreMsg(SS_StoreMsg1, TRUE);//标记补报位置 SystemAddUploadAgain();//重传增加 } else if(UPLOAD_TYPE_RETRY_AGAIN == GetEventUploadType())//重传 { SystemAddUploadAgain();//重传增加 } upload_task_complete_ShenShui = PTL_PACK_FAIL; upload_frame_stat_ShenShui = UP_DEAL_S0; } else { upload_task_complete_ShenShui = PTL_PACK_FAIL; upload_frame_stat_ShenShui = UP_DEAL_S0; } } break; case UP_DEAL_S1://获取最新周期数据 { if(step_save_supplt == SS_STATE_S0)//数据更新完成 { if(EepIfIdle()) { EepRead(FRAME_NBIot_HISTORY_READ_ADD+(Sys_data_object.P1.histroy_r*PACK_NUM_GPRS), &upload_frame.buf[0], PACK_NUM_GPRS, &s_eep_complete_ShenShui); temp_upload_step = UP_DEAL_S1;//记录当前状态 upload_frame_stat_ShenShui = UP_DEAL_S2; } } } break; case UP_DEAL_S2: { if(EepIfIdle()) { Date g_date_miji; u8* miji_buf; //当天数据包可上传密集采集数据 if(RtccCheckMsgApp(RtccMsg_MiJiCaiJi))//查询密集采集是否在周期内且已采集完成 { //密集采样开始时间 upload_frame.data.MiJiCaiJiStartTime[0]= Sys_data_object.P1.report_start_time[6]; upload_frame.data.MiJiCaiJiStartTime[1]= Sys_data_object.P1.report_start_time[7]; upload_frame.data.MiJiCaiJiStartTime[2]= Sys_data_object.P1.report_start_time[8]; upload_frame.data.MiJiCaiJiStartTime[3]= g_date_miji.s.day; upload_frame.data.MiJiCaiJiStartTime[4]= g_date_miji.s.month; upload_frame.data.MiJiCaiJiStartTime[5]= g_date_miji.s.year; upload_frame.data.MiJiCaiJiStartTime[6]= 0x20; RtccGetDate(&g_date_miji); //周期上传时间作为密集采样开始时间 Gp30CheckMiJiDataApp(&miji_buf); for(int tmp_j = 0; tmp_j <192;tmp_j++) { upload_frame.data.MiJiCaiJiFlow[tmp_j] = *(miji_buf + tmp_j); } upload_temp_len_ShenShui = PACK_NUM_GPRS_TOTAL; } else { upload_temp_len_ShenShui = PACK_NUM_GPRS;//无密集上报数据长度 } upload_frame_stat_ShenShui = UP_DEAL_S20; } } break; case UP_DEAL_S10://获取补报数据 { if(step_clear_flag == SS_STATE_S0) { if(EepIfIdle()) { s_eep_complete_ShenShui = 0; //根据补报标志计算补报指针,日期从新往老排列 Sys_data_object.P1.histroy_r = 0xFF; for (int i = Sys_data_object.P1.histroy_w; i >=0; i--) { if(Sys_data_object.P1.Supplemental_send_flag.datas &(0x00000001<(Sys_data_object.P1.histroy_w-1); i--) { if (Sys_data_object.P1.Supplemental_send_flag.datas &(0x00000001<>8)&0xFF; upload_temp_len_ShenShui = STRU_DATA_LEN_IES_SHORT; Upload_RenewShortFrameData();//组短帧数据 Frame_ack_IesBase(upload_struct_ShenShui, short_upload_frame.buf, upload_temp_len_ShenShui, p_send_buf, p_send_len); } else { upload_struct_ShenShui.ack_ctrl = SS_UPLOAD_CTRL; upload_struct_ShenShui.DI0 = SS_UPLOAD_CTRL_ID0; upload_struct_ShenShui.DI1 = SS_UPLOAD_CTRL_ID1; upload_struct_ShenShui.sta = 0x03;//加密主动上传 upload_serial_num_ShenShui++; upload_struct_ShenShui.serial_num0 = upload_serial_num_ShenShui&0xFF; upload_struct_ShenShui.serial_num1 = (upload_serial_num_ShenShui>>8)&0xFF; Frame_ack_IesBase(upload_struct_ShenShui, upload_frame.buf, upload_temp_len_ShenShui, p_send_buf, p_send_len); } upload_task_complete_ShenShui = PTL_PACK_SUCCESS;// 成功 upload_frame_stat_ShenShui = UP_DEAL_S0; } } break; case UP_DEAL_S21://重试 { if(upload_frame_retry_times < 1) //改为重发1次 { upload_frame_retry_times++; if(temp_upload_step == UP_DEAL_S30)//新补报规约 { upload_frame_stat_ShenShui = UP_DEAL_S32; } else { upload_frame_stat_ShenShui = UP_DEAL_S20; } } else//重新发送失败3次的处理 { if(temp_upload_step == UP_DEAL_S1)//当前包发送失败,判断是否补报 { if( (UPLOAD_TYPE_TOUCH_KEY == GetEventUploadType()) || (UPLOAD_TYPE_HAND_KEY == GetEventUploadType()))//非阀门关闭上报或者重传 { setStoreMsg(SS_StoreMsg1, TRUE);//temp_store_msg |= 0x02;//当前包进位置,且记录需要补报 } else if(UPLOAD_TYPE_FIX_TIME == GetEventUploadType())//定时上传 { setStoreMsg(SS_StoreMsg1, TRUE);//temp_store_msg |= 0x02;//当前包进位置,且记录需要补报 SystemAddUploadAgain();//重传增加 } else if(UPLOAD_TYPE_RETRY_AGAIN == GetEventUploadType())//重传 { SystemAddUploadAgain();//重传增加 } } upload_task_complete_ShenShui = PTL_PACK_FAIL; upload_frame_stat_ShenShui = UP_DEAL_S0; } } break; case UP_DEAL_S30://新补报规约,组帧初始化 { if(EepIfIdle()) { temp_upload_step = UP_DEAL_S30; StartSupplementFrame(); upload_frame_stat_ShenShui = UP_DEAL_S31; } } break; case UP_DEAL_S31://等待读取补报数据完成 { SupplementFrameMachine(); if(TASK_IDLE == SupplementFrameMachineIfIdle()) { if(supplement_cnt)//不为0,说明有补报的日冻结 { upload_frame_stat_ShenShui = UP_DEAL_S32; } else { upload_task_complete_ShenShui = PTL_PACK_FAIL; upload_frame_stat_ShenShui = UP_DEAL_S0; } } } break; case UP_DEAL_S32://组帧 { if(EepIfIdle()) { upload_struct_ShenShui.ack_ctrl = SUPP_UPLOAD_CTRL; upload_struct_ShenShui.DI0 = SUPP_UPLOAD_CTRL_ID0; upload_struct_ShenShui.DI1 = SUPP_UPLOAD_CTRL_ID1; upload_struct_ShenShui.sta = 0x03;//加密主动上传 upload_serial_num_ShenShui++; upload_struct_ShenShui.serial_num0 = upload_serial_num_ShenShui&0xFF; upload_struct_ShenShui.serial_num1 = (upload_serial_num_ShenShui>>8)&0xFF; upload_temp_len_ShenShui = supplement_cnt*12 + 1; Frame_ack_IesBase(upload_struct_ShenShui, supplement_buf, upload_temp_len_ShenShui, p_send_buf, p_send_len); upload_task_complete_ShenShui = PTL_PACK_SUCCESS; upload_frame_stat_ShenShui = UP_DEAL_S0; } } break; case UP_DEAL_S33://更新补报标志 { if(EepIfIdle()) { Sys_data_object.P1.Supplemental_send_flag.datas = temp_supplement_bit; EepWrite(&Sys_data_object.P1.Supplemental_send_flag.datas_map.data0, FRAME_NBIot_BUBAO_FLAG, 6, &s_eep_complete_ShenShui); upload_frame_stat_ShenShui = UP_DEAL_S30;//继续获取补报数据 } } break; default: { upload_task_complete_ShenShui = PTL_PACK_FAIL; upload_frame_stat_ShenShui = UP_DEAL_S0; } break; } } /*************************************************规约数据存储部分****************************/ //计算往前几天的日期和时间,不带周 static DateTime_noweek getBackDateTimeNoWeek(u8 backDays) { DateTime cdt; DateTime_noweek cdt_noweek; struct tm tmdt; struct tm *ldt; time_t ctt; RtccGetDateTime(&cdt);//获取当前时间 tmdt.tm_year = (cdt.s.year >> 4) * 10 + (cdt.s.year & 0x0F) + 100; tmdt.tm_mon = (cdt.s.month >> 4) * 10 + (cdt.s.month & 0x0F) - 1; tmdt.tm_mday = (cdt.s.day >> 4) * 10 + (cdt.s.day & 0x0F); tmdt.tm_hour = (cdt.s.hour >> 4) * 10 + (cdt.s.hour & 0x0F); tmdt.tm_min = (cdt.s.minute >> 4) * 10 + (cdt.s.minute & 0x0F); tmdt.tm_sec = (cdt.s.second >> 4) * 10 + (cdt.s.second & 0x0F); tmdt.tm_isdst = 0; ctt = mktime(&tmdt); //时间往前 ctt -= backDays*24*3600; ldt = localtime(&ctt); cdt_noweek.s.year = ((*ldt).tm_year - 100) / 10 * 16 + ((*ldt).tm_year - 100) % 10; cdt_noweek.s.month = ((*ldt).tm_mon + 1) / 10 * 16 + ((*ldt).tm_mon + 1) % 10; cdt_noweek.s.day = ((*ldt).tm_mday) / 10 * 16 + ((*ldt).tm_mday) % 10; cdt_noweek.s.hour = ((*ldt).tm_hour) / 10 * 16 + ((*ldt).tm_hour) % 10; cdt_noweek.s.minute = ((*ldt).tm_min) / 10 * 16 + ((*ldt).tm_min) % 10; cdt_noweek.s.second = ((*ldt).tm_sec) / 10 * 16 + ((*ldt).tm_sec) % 10; return cdt_noweek; } //补报标志存储 static void SS_Store_SuppleFlagMachine(void) { switch(step_clear_flag) { case SS_STATE_S0: { if(getStoreMsg(SS_StoreMsg1) == TRUE)//保存补报标志 { setStoreMsg(SS_StoreMsg1,FALSE); if((Sys_data_object.P1.func_cfg_bytes[0]>0)&&NbiotIfOnline())//厂区上报时间,如果有信号值,则不报故障 { NB_SS_Control_SetPara(NB_UploadFailTimes, 0); step_clear_flag = SS_STATE_S0; } else { Sys_data_object.P1.Supplemental_send_flag.datas |=(0x00001<=PERIOD_DATA_NUM) { Sys_data_object.P1.histroy_w=0; } Sys_data_object.P1.Supplemental_send_flag.datas &=(~(0x0001<<(Sys_data_object.P1.histroy_w)));//清该位置补报标志 EepWrite(&Sys_data_object.P1.Supplemental_send_flag.datas_map.data0, FRAME_NBIot_BUBAO_FLAG, 6, &s_eep_complete_ShenShui); step_save_supplt = SS_STATE_WAIT; } break; } /*间隔流量存储*/ case SS_STATE_S20://半小时间隔流量时间判断:防止首次上电,日期变更 { if(EepIfIdle()) { if( (shenshui_rtcc_time.s.year == store_frame.data.StepFlowStartTime[5])&& (shenshui_rtcc_time.s.month == store_frame.data.StepFlowStartTime[4])&& (shenshui_rtcc_time.s.day == store_frame.data.StepFlowStartTime[3])) { step_save_supplt = SS_STATE_S22; } else { EepRead(FRAME_NBIot_HISTORY_READ_ADD+(Sys_data_object.P1.histroy_w*PACK_NUM_GPRS)+STEP_FLOW_TIME_ADDR, &store_frame.data.StepFlowStartTime[0], 7, &s_eep_complete_ShenShui); step_save_supplt = SS_STATE_S21; } } } break; case SS_STATE_S21: { if(EepIfIdle()) { if( (shenshui_rtcc_time.s.year == store_frame.data.StepFlowStartTime[5])&& (shenshui_rtcc_time.s.month == store_frame.data.StepFlowStartTime[4])&& (shenshui_rtcc_time.s.day == store_frame.data.StepFlowStartTime[3])) { step_save_supplt = SS_STATE_S22; } else//间隔流量无效,进行当前区域初始化 { //获取表计数据和表计状态 Upload_RenewCurrentData(&store_frame); //上报信号参数清除 store_frame.data.UploadInfo.metinfo.ecl_val =0; store_frame.data.UploadInfo.metinfo.RSRP_val =0; store_frame.data.UploadInfo.metinfo.single_val =0; store_frame.data.UploadInfo.metinfo.snr_val =0; //保存间隔流量起始时间 store_frame.data.StepFlowStartTime[0]= 0x00; store_frame.data.StepFlowStartTime[1]= 0x00; store_frame.data.StepFlowStartTime[2]= 0x00; store_frame.data.StepFlowStartTime[3]= shenshui_rtcc_time.s.day; store_frame.data.StepFlowStartTime[4]= shenshui_rtcc_time.s.month; store_frame.data.StepFlowStartTime[5]= shenshui_rtcc_time.s.year; store_frame.data.StepFlowStartTime[6]= 0x20; //间隔流量清除:2B(间隔流量)X2(次/h)X24h=96B for(int i = 0; i <96 ;i++)//间隔流量清除 { store_frame.data.StepFlow[i] = 0; } if(Sys_data_object.P1.histroy_w>=PERIOD_DATA_NUM) { Sys_data_object.P1.histroy_w=0; } EepWrite(store_frame.buf, (FRAME_NBIot_HISTORY_READ_ADD+(Sys_data_object.P1.histroy_w*PACK_NUM_GPRS)), PACK_NUM_GPRS, &s_eep_complete_ShenShui); } } } break; case SS_STATE_S22://存储某半点间隔流量 { if(EepIfIdle()) { u16 temp_step_flow_addr=0; //计算间隔流量 new_jiange_total_flow.gp22_u32 = Gp30CheckDataApp(2); jiange_data.datas = (u16)((new_jiange_total_flow.gp22_float - old_jiange_total_flow.gp22_float)*10); old_jiange_total_flow.gp22_u32 = new_jiange_total_flow.gp22_u32; //计算本时刻间隔流量存储位置 temp_step_flow_addr = FRAME_NBIot_HISTORY_READ_ADD+(Sys_data_object.P1.histroy_w*PACK_NUM_GPRS)+STEP_FLOW_START_ADDR + BCD2HEX(shenshui_rtcc_time.s.hour)*4 + (BCD2HEX(shenshui_rtcc_time.s.minute)/30)*2; EepWrite(&jiange_data.datas_map.data0, temp_step_flow_addr, 2, &s_eep_complete_ShenShui); step_save_supplt = SS_STATE_WAIT; //RtccAdjustDateTime(1,1800-10);//往后校时半小时//debug----------------- } } break; /*上报前更新并保存要读取的上报数据*/ case SS_STATE_S30: { if(TASK_IDLE == EepIfIdle()) { EepRead(FRAME_NBIot_HISTORY_READ_ADD+(Sys_data_object.P1.histroy_r*PACK_NUM_GPRS), &store_frame.buf[0], PACK_NUM_GPRS, &s_eep_complete_ShenShui); step_save_supplt = SS_STATE_S31; } } break; case SS_STATE_S31://更新并保存上报时间 { if(TASK_IDLE == EepIfIdle()) { DateTime_noweek tempTime; tempTime = getBackDateTimeNoWeek(1); RtccGetDateTime(&shenshui_rtcc_time); //间隔流量有效性判断 if( (tempTime.s.year != store_frame.data.StepFlowStartTime[5])|| (tempTime.s.month != store_frame.data.StepFlowStartTime[4])|| (tempTime.s.day != store_frame.data.StepFlowStartTime[3])) { //保存间隔流量起始时间 store_frame.data.StepFlowStartTime[0]= 0x00; store_frame.data.StepFlowStartTime[1]= 0x00; store_frame.data.StepFlowStartTime[2]= 0x00; store_frame.data.StepFlowStartTime[3]= shenshui_rtcc_time.s.day;//修改为当前时间,防止误判 store_frame.data.StepFlowStartTime[4]= shenshui_rtcc_time.s.month; store_frame.data.StepFlowStartTime[5]= shenshui_rtcc_time.s.year; store_frame.data.StepFlowStartTime[6]= 0x20; //间隔流量清除:2B(间隔流量)X2(次/h)X24h=96B for(int i = 0; i <96 ;i++)//间隔流量清除 { store_frame.data.StepFlow[i] = 0; } } Upload_RenewCurrentData(&store_frame); EepWrite(store_frame.buf, (FRAME_NBIot_HISTORY_READ_ADD+ Sys_data_object.P1.histroy_r*PACK_NUM_GPRS), PACK_NUM_GPRS, &s_eep_complete_ShenShui); step_save_supplt = SS_STATE_WAIT; } } break; /*清表数据初始化读写指针*/ case SS_STATE_S40: { if(TASK_IDLE == EepIfIdle()) { //间隔流量初始化 new_jiange_total_flow.gp22_u32 = Gp30CheckDataApp(2); old_jiange_total_flow.gp22_u32 = new_jiange_total_flow.gp22_u32; for(int i=0;i<7;i++) { store_frame.data.StepFlowStartTime[i]= 0x00; } Sys_data_object.P1.histroy_w = 0; Sys_data_object.P1.histroy_r = 0; Sys_data_object.P1.Supplemental_send_flag.datas = 0;//补报也清0 EepWrite(&Sys_data_object.P1.Supplemental_send_flag.datas_map.data0, FRAME_NBIot_BUBAO_FLAG, 6, &s_eep_complete_ShenShui); step_save_supplt = SS_STATE_WAIT; } break; } case SS_STATE_WAIT: { if(TASK_IDLE == EepIfIdle()) { step_save_supplt = SS_STATE_S0; } break; } default: { break; } } } /******************************************************************************* * @fun_name:NB_SS_Control_GetPara * @brief : * @param[in] :读取上报控制相关参数 * @param[out]: None * @retval : None * @other : ******************************************************************************/ u8 NB_SS_Control_GetPara(NB_SS_ControlParaTypeDef paraType) { switch(paraType) { case NB_HistroyReadIndex://历史数据的读指针 { return Sys_data_object.P1.histroy_w; } case NB_UploadFailTimes://失败次数 { u8 temp_fail_times=0; if(Sys_data_object.P3.ProductUpoadFailFlag) { temp_fail_times = Sys_data_object.P3.ProductUpoadFailFlag; } else { for(int i = 0; i < 32; i++) { if(((Sys_data_object.P1.Supplemental_send_flag.datas >> i) & 0x00000001) == 0x00000001) { temp_fail_times += 1; } } } return temp_fail_times; } case NB_SS_FormatError://上报数据格式错误 { return signal_val.SignalStruct.format_error; } default: break; } return 0; } /******************************************************************************* * @fun_name:NB_SS_Control_SetPara * @param[in] :设置上报控制相关参数 ******************************************************************************/ void NB_SS_Control_SetPara(NB_SS_ControlParaTypeDef paraType, u8 data) { switch(paraType) { case NB_HistroyReadIndex://历史数据的读指针 { Sys_data_object.P1.histroy_w = data; break; } case NB_UploadFailTimes://失败次数 { SystemClearUploadAgain(); Sys_data_object.P1.Supplemental_send_flag.datas = data; Sys_data_object.P3.ProductUpoadFailFlag = 0; setStoreMsg(SS_StoreMsg5,TRUE);//temp_store_msg |= 0x20;//保存EEPROM break; } case NB_SS_FormatError://上报数据格式错误 { signal_val.SignalStruct.format_error = data; break; } default: break; } } //规约数据存储部分初始化 void DataStoreInit(void) { Quanzhou_Store_InitApp(); if(Sys_data_object.P1.histroy_w>=PERIOD_DATA_NUM) { Sys_data_object.P1.histroy_w=0; } if(Sys_data_object.P1.histroy_r>=PERIOD_DATA_NUM) { Sys_data_object.P1.histroy_r=0; } old_jiange_total_flow.gp22_u32 = Gp30CheckDataApp(GP30_APP_TOTAL_FLOW);//间隔流量计算初始化 } //规约数据存储状态机 void DataStoreMachine(void) { SS_Store_SuppleFlagMachine();//补报标志存储 SS_Store_CircleDataMachine();//周期数据存储 Quanzhou_Store_Machine();//冻结数据存储 } //规约数据存储休眠判断 u8 DataStoreIfIdle(void) { if((step_save_supplt == SS_STATE_S0)&&(step_clear_flag == SS_STATE_S0)&&(QuanzhouStore_IfSleep()==TRUE)) { return TRUE; } else { return FALSE; } } #endif