#include "sys_config.h" #if PRODUCT_GS #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 "UWater_frame_func_ReplyNB.h" #include "UWater_frame_func_ReplyGuangShui.h" static u8 s_eep_complete_GuangShui=0; static u8 task_complete_GuangShui = PTL_PACK_BUSY; static u8 g_frame_temp_buf_GuangShui[UP_BUF_SIZE]; //数据部分缓冲区 static u16 g_frame_temp_len_GuangShui=0; static DateTime GuangShui_rtcc_time; static STRUCT_FRAME_IES frame_struct_GuangShui; //规约信息 static u8 *new_message_data_rev_GuangShui; static u8 up_deal_stat_GuangShui = UP_DEAL_S0;//规约处理状态机 static STRUCT_FRAME_GS frame_struct_JM; //广水规约信息 /*******主动上传数据相关变量*****************************************/ static STRUCT_FRAME_IES upload_struct_GuangShui; //规约信息 static u8 upload_frame_stat_GuangShui=0; //主动上报组帧状态 static u8 upload_task_complete_GuangShui = PTL_PACK_FAIL; static u16 upload_temp_len_GuangShui=0;//主动上报数据长度 static UNION_SIGNAL signal_val; static u8 *new_message_data_rev_jm; //接收数据指针 static DateTime rtcc_time_gs; static u8 upload_packet_count=0; //上传数据包数 static u8 gs_upload_fail_times=0;//上报失败次数 static u8 upload_frame_retry_times=0; //数据重发次数 static u8 temp_upload_step=0; //数据上报状态 static u8 temp_store_msg=0; //数据存储消息 //积成规约上报缓存 static STRU_UPLOAD_FRAME upload_frame;//长帧上报数据 static STRU_UPLOAD_FRAME store_frame;//长帧存储数据,和上报帧缓存独立,防止上报期间存储数据 //广水规约上报缓存 static STRU_UP_FRAME_GS upload_frame_gs; //补报数据,间隔流量存储 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 u8 ls_save= FALSE; static u8 ls_up= FALSE; static u8 ls_save_cnt=0; static STRU_UP_FRAME_GS ls_save_buf[6];//最长24小时,5分钟间隔存储 static RTCC_To_Float old_gs_total_flow; static RTCC_To_Float new_gs_total_flow; static u8 ls_upload_index=0; static u8 ls_upload_flag=0; //历史数据存储相关变量 static UNION_GS_STORE_INDEX his_save_para; static u16 save_his_interval_cnt=0; static TYP_STATE_SS his_save_step=SS_STATE_S0; static RTCC_To_Float his_save_flow_value; static u16 his_save_addr = EEP_ADDR_HIS_DATA; static u8 his_save_flow_buf[5]; //历史数据读取相关变量 static u16 his_read_start_count=0; static u16 his_read_end_count=0; static u8 his_read_count; static u16 his_read_addr = EEP_ADDR_HIS_DATA; static u8 his_read_flow_buf[5]; static u8 his_read_check; static DateTime his_read_start_time; static UNION_2U8TOU16 his_read_period; static RTCC_To_Float his_read_new_flow; static RTCC_To_Float his_read_old_flow; static SS_UNION_4U8TOU32 his_read_tempData; static u8 his_read_tempBuf[6]; static long temp_diff_time; //设置主动上报参数 static UNION_GS_UPLOAD_PARA linshi_jm; //临时存储和上报参数 static DateTime rtcc_linshi_jm; //记录设置临时上报的开始时间 static u8 linshi_data_eff=0; //记录临时存储和上报的标志 //数据格式转换 static void u32HEXtoBCDData(u32 uiHEXdata,u8*ucBCDdata ) { u8 ucHEXdata[10] = {0}; //2字节十六进制数转BCD码,2字节十六进制数最大值为0xffff=65535,所以转换出来的BCD码需要用3个字节装载 ucHEXdata[1] = uiHEXdata%100; ucBCDdata[0] = (ucHEXdata[1]/10)*0x10 + (ucHEXdata[1]%10); uiHEXdata = uiHEXdata/100; ucHEXdata[2] = uiHEXdata%100; ucBCDdata[1] = (ucHEXdata[2]/10)*0x10 + (ucHEXdata[2]%10); uiHEXdata = uiHEXdata/100; ucHEXdata[3] = uiHEXdata%100; ucBCDdata[2] = (ucHEXdata[3]/10)*0x10 + (ucHEXdata[3]%10); uiHEXdata = uiHEXdata/100; ucHEXdata[4] = uiHEXdata%100; ucBCDdata[3] = (ucHEXdata[4]/10)*0x10 + (ucHEXdata[4]%10); uiHEXdata = uiHEXdata/100; ucHEXdata[5] = uiHEXdata%100; ucBCDdata[4] = (ucHEXdata[5]/10)*0x10 + (ucHEXdata[5]%10); uiHEXdata = uiHEXdata/100; ucHEXdata[6] = uiHEXdata%100; ucBCDdata[5] = (ucHEXdata[6]/10)*0x10 + (ucHEXdata[6]%10); } //读历史数据 static void frame_func_reply_NB_ReadHistoryData(void) { u8 temp = 0; u8 temp_read_index = 0; u8 temp_read_code = *new_message_data_rev_GuangShui; switch(up_deal_stat_GuangShui) { case UP_DEAL_S0: { if(TASK_IDLE == EepIfIdle())//读取历史数据 { g_frame_temp_len_GuangShui =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((EEP_ADDR_CIRCLE_DATA +(temp*PACK_NUM_GPRS)), g_frame_temp_buf_GuangShui, 155, &s_eep_complete_GuangShui); up_deal_stat_GuangShui = UP_DEAL_S1; } } break; case UP_DEAL_S1: { if(TASK_IDLE == EepIfIdle())//读取历史数据完成 { g_frame_temp_len_GuangShui = PACK_NUM_GPRS; task_complete_GuangShui = PTL_PACK_SUCCESS; up_deal_stat_GuangShui = UP_DEAL_S0; } } break; default: { up_deal_stat_GuangShui = UP_DEAL_S0; task_complete_GuangShui = PTL_PACK_FAIL; } break; } } //清除失败次数 static void frame_func_s3_NB_ClearFailTimes(void) { static u8 temp_clear_buf[4]; if(TASK_IDLE == EepIfIdle()) { g_frame_temp_len_GuangShui = 0; NB_SS_Control_SetPara(NB_SS_FormatError, 0); NB_SS_Control_SetPara(NB_UploadFailTimes, 0); temp_clear_buf[0]=0; temp_clear_buf[1]=0; temp_clear_buf[2]=0; temp_clear_buf[3]=0; EepWrite(temp_clear_buf, FRAME_NBIot_BUBAO_FLAG, 4, &s_eep_complete_GuangShui); task_complete_GuangShui = PTL_PACK_SUCCESS; } } /*************************************广水规约*******************************************************/ /** 函数名:gs_ack_upload_frame 说明:主动上报数据的应答 功能码 01(主动上报数据指令) 下行数据段格式: 平台当前时间 6 字节 BCD 码: YYMMDDHHNNSS 2020-01-11 12:15:30 200111121530 */ void gs_ack_upload_frame(void) { DateTime rtcc_time_rcvjm; g_frame_temp_len_GuangShui = 0; RtccGetDateTime(&rtcc_time_gs); //获取当前时间 rtcc_time_rcvjm.s.second = *(new_message_data_rev_jm + 5); //second rtcc_time_rcvjm.s.minute = *(new_message_data_rev_jm + 4); //MIN rtcc_time_rcvjm.s.hour = *(new_message_data_rev_jm + 3); //Hour rtcc_time_rcvjm.s.day = *(new_message_data_rev_jm + 2); //day rtcc_time_rcvjm.s.month = *(new_message_data_rev_jm + 1); //mon rtcc_time_rcvjm.s.year = *(new_message_data_rev_jm ); //year long diff_time = 0; diff_time = RtccCalculateDiffTime(&rtcc_time_rcvjm, &rtcc_time_gs); if(diff_time < 0) { diff_time = 0 - diff_time; } if(diff_time < HOUR_TO_SECOND) //1h以内的应答判断为有效的 { FrameSetMsgApp(MsgNbUplaod_AckOk); } g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= rtcc_time_gs.s.year; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= rtcc_time_gs.s.month; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= rtcc_time_gs.s.day; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= rtcc_time_gs.s.hour; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= rtcc_time_gs.s.minute; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= rtcc_time_gs.s.second; up_deal_stat_GuangShui = UP_DEAL_S0; task_complete_GuangShui = PTL_PACK_FAIL; } /** 函数名:gs_read_history_frame 说明:向设备查询某一时间节点的历史数据或 实时数据 下行数据格式: 指令标识:2字节高; 字节在前,设备应原码返回该值 数据起始时间:6字节BCD, 200111121530 (当超始时间全部为0时,返回设备内存实时数据,并且上报数据段中的时间为设备当前时间) 时间段个数:1字节 时间间隔:2字节,高字节在前 上行数据格式: 指令标识:指令执行失败则 MID 后全部字节置 FF、并且不用上发数据类型数据 段 数据起始时间: 时间段个数: 时间间隔: 数据类型1数据,数据类型2数据... ...: */ static void gs_read_history_frame(void) { switch(up_deal_stat_GuangShui) { case UP_DEAL_S0: { g_frame_temp_len_GuangShui =11;//表数据开始位置 RtccGetDateTime(&rtcc_time_gs); //数据起始时间 his_read_start_time.s.year=new_message_data_rev_jm[2]; his_read_start_time.s.month=new_message_data_rev_jm[3]; his_read_start_time.s.day=new_message_data_rev_jm[4]; his_read_start_time.s.hour=new_message_data_rev_jm[5]; his_read_start_time.s.minute=new_message_data_rev_jm[6]; his_read_start_time.s.second=new_message_data_rev_jm[7]; //时间段个数 his_read_count=new_message_data_rev_jm[8]; //时间间隔 his_read_period.data_buf[0]=new_message_data_rev_jm[10]; his_read_period.data_buf[1]=new_message_data_rev_jm[9]; //判断时间间隔是否有效 if(his_read_period.datas != his_save_para.Data.Period.datas) { //返回异常 up_deal_stat_GuangShui = UP_DEAL_S4; } else { //判断请求起始时间是否有效 temp_diff_time = RtccCalculateDiffTime(&rtcc_time_gs, &his_read_start_time); if((temp_diff_time < (his_save_para.Data.Index_w.datas*his_save_para.Data.Period.datas*60))&&(temp_diff_time<(GS_HIS_STORE_MAX*his_save_para.Data.Period.datas*60))) { //判断请求时间段是否有效 if((his_read_count*his_save_para.Data.Period.datas*60)FLOW_BUF->FLOW_FLOAT->FLOW_U8BUF->BCD { if(TASK_IDLE == EepIfIdle()) { his_read_check = his_read_flow_buf[0]+his_read_flow_buf[1]+his_read_flow_buf[2]+his_read_flow_buf[3]; if(his_read_flow_buf[4] == his_read_check) { his_read_new_flow.buf[0] = his_read_flow_buf[0]; his_read_new_flow.buf[1] = his_read_flow_buf[1]; his_read_new_flow.buf[2] = his_read_flow_buf[2]; his_read_new_flow.buf[3] = his_read_flow_buf[3]; if(his_read_end_count==0) { his_read_tempData.datas = (u32)(his_read_new_flow.gp22_float*10); u32HEXtoBCDData(his_read_tempData.datas, &his_read_tempBuf[0]); g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= 0x20; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= his_read_tempBuf[5]; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= his_read_tempBuf[4]; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= his_read_tempBuf[3]; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= his_read_tempBuf[2]; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= his_read_tempBuf[1]; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= his_read_tempBuf[0]; //更新老数据 his_read_old_flow.gp22_float = his_read_new_flow.gp22_float; } else { his_read_tempData.datas = (u16)((his_read_new_flow.gp22_float - his_read_old_flow.gp22_float)*10); u32HEXtoBCDData(his_read_tempData.datas, &his_read_tempBuf[0]); g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= his_read_tempBuf[2]; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= his_read_tempBuf[1]; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= his_read_tempBuf[0]; //更新老数据 his_read_old_flow.gp22_float = his_read_new_flow.gp22_float; } if((his_read_end_count < (his_read_count-1))&&(his_read_end_count<47))//继续读下一条 { his_read_end_count++; up_deal_stat_GuangShui = UP_DEAL_S1; } else//读取完成 { up_deal_stat_GuangShui = UP_DEAL_S3; } } else//错误返回 { if(his_read_end_count == 0)//返回异常 { up_deal_stat_GuangShui = UP_DEAL_S4; } else { up_deal_stat_GuangShui = UP_DEAL_S3; } } } } break; case UP_DEAL_S3: { //MID g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = frame_struct_GuangShui.DI0; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = frame_struct_GuangShui.DI1; //应答:数据起始时间 g_frame_temp_buf_GuangShui[2]=his_read_start_time.s.year; g_frame_temp_buf_GuangShui[3]=his_read_start_time.s.month; g_frame_temp_buf_GuangShui[4]=his_read_start_time.s.day; g_frame_temp_buf_GuangShui[5]=his_read_start_time.s.hour; g_frame_temp_buf_GuangShui[6]=his_read_start_time.s.minute; g_frame_temp_buf_GuangShui[7]=his_read_start_time.s.second; //应答:时间段个数 g_frame_temp_buf_GuangShui[8]=his_read_end_count;//实际读取的个数 //应答:时间间隔 g_frame_temp_buf_GuangShui[9]=his_read_period.data_buf[1]; g_frame_temp_buf_GuangShui[10]=his_read_period.data_buf[0]; up_deal_stat_GuangShui = UP_DEAL_S0; task_complete_GuangShui = PTL_PACK_SUCCESS; } break; case UP_DEAL_S4://异常返回 { //指令执行失败则 MID 后全部字节置 FF、并且不用上发数据类型数据段 //MID g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = frame_struct_GuangShui.DI0; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = frame_struct_GuangShui.DI1; //应答:数据起始时间 g_frame_temp_buf_GuangShui[2]=0xFF; g_frame_temp_buf_GuangShui[3]=0xFF; g_frame_temp_buf_GuangShui[4]=0xFF; g_frame_temp_buf_GuangShui[5]=0xFF; g_frame_temp_buf_GuangShui[6]=0xFF; g_frame_temp_buf_GuangShui[7]=0xFF; //应答:时间段个数 g_frame_temp_buf_GuangShui[8]=0xFF; //应答:时间间隔 g_frame_temp_buf_GuangShui[9]=0xFF; g_frame_temp_buf_GuangShui[10]=0xFF; up_deal_stat_GuangShui = UP_DEAL_S0; task_complete_GuangShui = PTL_PACK_SUCCESS; } break; default: { up_deal_stat_GuangShui = UP_DEAL_S0; } break; } } //设置终端时钟 void jm_set_time() { switch(up_deal_stat_GuangShui) { case UP_DEAL_S0: { g_frame_temp_len_GuangShui = 0; rtcc_time_gs.s.year = *(new_message_data_rev_jm + 2); rtcc_time_gs.s.month = *(new_message_data_rev_jm + 3); rtcc_time_gs.s.day = *(new_message_data_rev_jm + 4); rtcc_time_gs.s.hour = *(new_message_data_rev_jm + 5); rtcc_time_gs.s.minute= *(new_message_data_rev_jm + 6); rtcc_time_gs.s.second= *(new_message_data_rev_jm + 7); if(SUCCESS_IES == Rtcc_Check_DateTime(&rtcc_time_gs))//日期合法 { RtccSetDateTime(&rtcc_time_gs); up_deal_stat_GuangShui = UP_DEAL_S1; } else { up_deal_stat_GuangShui = UP_DEAL_S2; } } break; case UP_DEAL_S1: { RtccGetDateTime(&rtcc_time_gs);//获取当前时间 //MID g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = frame_struct_GuangShui.DI0; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = frame_struct_GuangShui.DI1; //time g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = rtcc_time_gs.s.year; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = rtcc_time_gs.s.month; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = rtcc_time_gs.s.day; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = rtcc_time_gs.s.hour; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = rtcc_time_gs.s.minute; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = rtcc_time_gs.s.second; up_deal_stat_GuangShui = UP_DEAL_S0; task_complete_GuangShui = PTL_PACK_SUCCESS; } break; case UP_DEAL_S2: { //MID g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = frame_struct_GuangShui.DI0; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = frame_struct_GuangShui.DI1; //time g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = 0xFF; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = 0xFF; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = 0xFF; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = 0xFF; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = 0xFF; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = 0xFF; up_deal_stat_GuangShui = UP_DEAL_S0; task_complete_GuangShui = PTL_PACK_SUCCESS; } break; default: { up_deal_stat_GuangShui = UP_DEAL_S0; task_complete_GuangShui = PTL_PACK_FAIL; } break; } } //设置历史数据存盘间隔 void jm_set_save_interval() { if (TASK_IDLE == EepIfIdle()) { g_frame_temp_len_GuangShui =0; //MID g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = frame_struct_GuangShui.DI0; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = frame_struct_GuangShui.DI1; //间隔 g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = *(new_message_data_rev_jm + 2); g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = *(new_message_data_rev_jm + 3); his_save_para.Data.Period.data_buf[1]=*(new_message_data_rev_jm + 2); his_save_para.Data.Period.data_buf[0]=*(new_message_data_rev_jm + 3); EepWrite(&his_save_para.data_buf[0], EEP_ADDR_HIS_INDEX, 6, &s_eep_complete_GuangShui); up_deal_stat_GuangShui = UP_DEAL_S0; task_complete_GuangShui = PTL_PACK_SUCCESS; } } //设置主动上报参数 void jm_up_set() { if (TASK_IDLE == EepIfIdle()) { g_frame_temp_len_GuangShui =0; //MID g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = frame_struct_GuangShui.DI0; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = frame_struct_GuangShui.DI1; //开始时刻 linshi_jm.Data.start_time_h = *(new_message_data_rev_jm+2); linshi_jm.Data.start_time_m=*(new_message_data_rev_jm+3); g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = *(new_message_data_rev_jm + 2); g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = *(new_message_data_rev_jm + 3); //上发间隔 linshi_jm.Data.up_interval.data_buf[1]=*(new_message_data_rev_jm+4); ////上发间隔 linshi_jm.Data.up_interval.data_buf[0]=*(new_message_data_rev_jm+5); if(linshi_jm.Data.up_interval.datas <=60) //临时上报间隔不低于1小时 { linshi_jm.Data.up_interval.datas = 60; } else if(linshi_jm.Data.up_interval.datas >= 60*24) //临时上报间隔不大于24 { linshi_jm.Data.up_interval.datas =60*24; } g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = linshi_jm.Data.up_interval.data_buf[1]; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = linshi_jm.Data.up_interval.data_buf[0]; //数据间隔 linshi_jm.Data.data_interval.data_buf[1]=*(new_message_data_rev_jm+6); linshi_jm.Data.data_interval.data_buf[0]=*(new_message_data_rev_jm+7); if(linshi_jm.Data.data_interval.datas<=5) //临时存储间隔不低于5分钟 { linshi_jm.Data.data_interval.datas=5; } else if(linshi_jm.Data.data_interval.datas>=60*12) { linshi_jm.Data.data_interval.datas=60*12; } g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = linshi_jm.Data.data_interval.data_buf[1]; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = linshi_jm.Data.data_interval.data_buf[0]; //离散值 g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = 0; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = 0; //生效时长 linshi_jm.Data.effective_time.data_buf[1]=*(new_message_data_rev_jm+10); linshi_jm.Data.effective_time.data_buf[0]=*(new_message_data_rev_jm+11); if(linshi_jm.Data.effective_time.datas >=24*60) { linshi_jm.Data.effective_time.datas =24*60; } if(linshi_jm.Data.effective_time.datas==0) { linshi_jm.Data.effective_time.datas=24*60; } RtccGetDateTime(&rtcc_linshi_jm); //生效时间直接赋值给当前时间变量。 rtcc_linshi_jm.s.hour = linshi_jm.Data.start_time_h; rtcc_linshi_jm.s.minute = linshi_jm.Data.start_time_m; EepWrite(&linshi_jm.data_buf[0], EEP_ADDR_TEMP_STORE_UPLOAD, 8, &s_eep_complete_GuangShui); linshi_data_eff=1;//启动临时存储和上报标志 ls_save_cnt=0;//上报条数清0 ls_upload_index=0;//临时上报指针 up_deal_stat_GuangShui = UP_DEAL_S0; task_complete_GuangShui = PTL_PACK_SUCCESS; } } //读取临时数据存储和上报间隔 void jm_Up_read() { g_frame_temp_len_GuangShui =0; //MID g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = frame_struct_GuangShui.DI0; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = frame_struct_GuangShui.DI1; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= linshi_jm.Data.start_time_h; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= linshi_jm.Data.start_time_m; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= linshi_jm.Data.up_interval.data_buf[1]; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= linshi_jm.Data.up_interval.data_buf[0]; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= linshi_jm.Data.data_interval.data_buf[1]; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= linshi_jm.Data.data_interval.data_buf[0]; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= 0; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++]= 0; up_deal_stat_GuangShui = UP_DEAL_S0; task_complete_GuangShui = PTL_PACK_SUCCESS; } //判断临时存储间隔和临时上报间隔 u8 get_lset_judg(u8*save,u8*up) //判断是否执行临时设置 { long diff_time; static u32 time_min; RtccGetDateTime(&rtcc_time_gs); diff_time = RtccCalculateDiffTime(&rtcc_time_gs,&rtcc_linshi_jm)/(60); //计算时间差 if(diff_time>24*60) { linshi_data_eff=0; } if((diff_time 0)) { time_min= ((rtcc_time_gs.s.hour >> 4) * 10 + (rtcc_time_gs.s.hour & 0x0F))*60; time_min+= (rtcc_time_gs.s.minute >> 4) * 10 + (rtcc_time_gs.s.minute & 0x0F); if(linshi_jm.Data.up_interval.datas<24*60) { if((time_min%linshi_jm.Data.up_interval.datas)==0) { *up=TRUE; } else { *up=FALSE; } } else { *up=FALSE; } if(time_min%linshi_jm.Data.data_interval.datas==0) { *save=TRUE; } else { *save=FALSE; } return TRUE; } else { *save=FALSE; *up=FALSE; return FALSE; } } //设置数据中心地址 void jm_set_center_add() { static u16 add_len; u16 num_ip=0; u8 *mack[5]; if(TASK_IDLE == EepIfIdle())//存储数据到EEPROM { g_frame_temp_len_GuangShui =0; //MID g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = frame_struct_GuangShui.DI0; g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = frame_struct_GuangShui.DI1; add_len=frame_struct_JM.data_len.to_uint16-15-2; //下发的数据总长度去除mid for(u8 l=2; l FRAME_LEN_MAX) //检查待解帧长度是否大于数据缓冲区长度 { return (ERROR_IES); } if (frame_lenth < FRAME_LEN_MIN) //检查待解帧长度是否小于最小协议帧长度 { return (ERROR_IES); } for (i = 0; i < frame_lenth; i++) { if (FRAME_HEAD_JM == *frame_buffer) //找到帧头 { frame_struct_JM.locn = i; //记住帧头在Receive_buf位置 frame_struct_JM.len.to_uint8[1] = *(frame_buffer + 1); //数据区长度 frame_struct_JM.len.to_uint8[0] = *(frame_buffer + 2); framelen = frame_struct_JM.len.to_uint16+2; //帧长度 (现在下发的不包含头尾) if (frame_struct_JM.len.to_uint16 > (frame_lenth - i)) //防止串口通讯规约恰巧绕过防护后造成数组越界复位 { return (ERROR_IES); } endloc = framelen - 1; if ((FRAME_END_JM == frame_buffer[endloc]) && (endloc <= frame_lenth)) //结束符正确,且帧长有效 { frame_struct_JM.crc = 0; for (j = 0; j < (framelen - 2); j++) { frame_struct_JM.crc = (u8)(frame_struct_JM.crc + frame_buffer[j]); //判校验和 } if (frame_struct_JM.crc == frame_buffer[endloc - 1]) //j校验通过 { frame_struct_JM.frame_ctrl = *(frame_buffer + 13); //获取功能码 if((*(frame_buffer + 3) & 0x40) )//加密 在帧标识中,需要判断此位 { } else { frame_struct_JM.data_len.to_uint8[1] = *(frame_buffer + 1); //总数据域长度 frame_struct_JM.data_len.to_uint8[0] = *(frame_buffer + 2); /* for (j = 0; j < (frame_struct_JM.data_len.to_uint16-15); j++)//存入新缓冲区 { jm_rcv_buf[j] = *(frame_buffer + 15 + j); }*/ new_message_data_rev_jm = frame_buffer + frame_struct_JM.locn + 15; frame_struct_GuangShui.ctrl = frame_struct_JM.frame_ctrl; frame_struct_GuangShui.DI0 = *(new_message_data_rev_jm + 0);//MID frame_struct_GuangShui.DI1 = *(new_message_data_rev_jm + 1);//MID } return (SUCCESS_IES); } } } frame_buffer++; } return (ERROR_IES); } //解深水规约 u8 crack_frame_GuangShui(u16 frame_lenth,u8 *frame_buffer) { u8 temp_res = crack_frame_IES_Base(frame_lenth, frame_buffer, &frame_struct_GuangShui); if(temp_res == SUCCESS_IES) { new_message_data_rev_GuangShui = frame_buffer + frame_struct_GuangShui.head_site + 16; return SUCCESS_IES; } else if(crack_frame_GS(frame_lenth, frame_buffer) == SUCCESS_IES)//广水规约 { return SUCCESS_IES; } return ERROR_IES; } //深水规约处理 u8 up_deal_code_GuangShui(void) { task_complete_GuangShui = PTL_PACK_BUSY; switch(frame_struct_GuangShui.ctrl) { case SS_CLEAR_FAIL_TIMES_CTRL: { frame_func_s3_NB_ClearFailTimes(); frame_struct_GuangShui.ack_ctrl = SS_ACK_CLEAR_FAIL_TIMES_CTRL; } break; case SS_READ_HIS_CTRL: { switch(frame_struct_GuangShui.DI1) { case SS_READ_HIS_CTRL_ID1://深水规约读历史数据 { frame_func_reply_NB_ReadHistoryData(); frame_struct_GuangShui.ack_ctrl = SS_ACK_READ_HIS_CTRL; } break; default: { up_deal_stat_GuangShui = UP_DEAL_S0; task_complete_GuangShui = PTL_PACK_FAIL; } } } break; //广水规约 case READ_MET_CTRL_01: //回复处理 { gs_ack_upload_frame(); frame_struct_GuangShui.ack_ctrl = READ_MET_CTRL_01; } break; case READ_MET_CTRL_03: //报警回复处理 { gs_ack_upload_frame(); frame_struct_GuangShui.ack_ctrl = READ_MET_CTRL_03; } break; case READ_MET_CTRL_02: //数据查询 { gs_read_history_frame(); frame_struct_GuangShui.ack_ctrl = READ_MET_CTRL_02; } break; case READ_MET_CTRL_04: //设置时钟 { jm_set_time(); frame_struct_GuangShui.ack_ctrl = READ_MET_CTRL_04; } break; case READ_MET_CTRL_05: //设置历史存盘间隔 { jm_set_save_interval(); frame_struct_GuangShui.ack_ctrl = READ_MET_CTRL_05; } break; case READ_MET_CTRL_06: //设置上报参数 { jm_up_set(); frame_struct_GuangShui.ack_ctrl = READ_MET_CTRL_06; } break; case READ_MET_CTRL_07: //设置数据中心地址 { jm_set_center_add(); frame_struct_GuangShui.ack_ctrl = READ_MET_CTRL_07; } break; case READ_MET_CTRL_08: //工作模式 { jm_set_mode(); frame_struct_GuangShui.ack_ctrl = READ_MET_CTRL_08; } break; case READ_MET_CTRL_09: //设置设备地址 { jm_set_add_frame(); frame_struct_GuangShui.ack_ctrl = READ_MET_CTRL_09; } break; case READ_MET_CTRL_010: //设置加密标志 { jm_encrypted_data_frame(); frame_struct_GuangShui.ack_ctrl = READ_MET_CTRL_010; } break; case READ_MET_CTRL_011: //查询历史存盘间隔 { jm_read_interval_frame(); frame_struct_GuangShui.ack_ctrl = READ_MET_CTRL_011; } break; case READ_MET_CTRL_012: //查询主动上报参数 { jm_Up_read(); frame_struct_GuangShui.ack_ctrl = READ_MET_CTRL_012; } break; case READ_MET_CTRL_013: //查询数据中心地址 { jm_read_add_frame(); frame_struct_GuangShui.ack_ctrl = READ_MET_CTRL_013; } break; default: { up_deal_stat_GuangShui = UP_DEAL_S0; task_complete_GuangShui = PTL_PACK_FAIL; } break; } return task_complete_GuangShui; } void Frame_ResetDealState_GuangShui(void) { up_deal_stat_GuangShui = UP_DEAL_S0;//基线扩展规约处理状态复位 } void Frame_ack_GS(STRUCT_FRAME_IES temp_struct, u8* p_temp_buf, u16 p_temp_len, u8* p_send_buf, u16* p_send_len) { int i = 0; int temp_pack_len; UNION_2U8TOU16 temp_data; MEASURE_UPLOAD_INFO temp_UploadInfo; u8 temp_buf1[24]; u8 temp_buf2[24]; u32 temp_cell_id=0; temp_pack_len = 0; p_send_buf[temp_pack_len++] = FRAME_HEAD_JM;//帧起始符(69H) p_send_buf[temp_pack_len++] = ((48+p_temp_len)>>8);//帧长度 高字节在前 p_send_buf[temp_pack_len++] = (48+p_temp_len)&0xFF; p_send_buf[temp_pack_len++] = FRAME_MARK_JM;//帧标识 是否加密 1bit、是否分帧 2bit、帧序号 4bit、 是否包含运行参数段 1bit p_send_buf[temp_pack_len++] = FRAME_TYPE_JM;//协议版本 主版本 4bit、子版本 4bit //设备地址 8Byte p_send_buf[temp_pack_len++] = 0x79; for (i = 0; i < 7; i++) { p_send_buf[temp_pack_len++] = Sys_data_object.P1.met_addr[i]; } p_send_buf[temp_pack_len++] = temp_struct.ack_ctrl; //功能码 p_send_buf[temp_pack_len++] = FRAME_HEAD_JM;//帧确认符(69H) /////////////////////////运行参数/////////////////////////////// //设备标识,休眠模式,小口径分体水表 p_send_buf[temp_pack_len++] =0x03; //设备电压 02H E8H = 744 * 0.01 =7.44V temp_data.datas = PowerCheckValueSys(); p_send_buf[temp_pack_len++] = temp_data.data_buf[1]; p_send_buf[temp_pack_len++] = temp_data.data_buf[0]; //信号强度 CSQ temp_UploadInfo = UploadGetInfo_Base(); p_send_buf[temp_pack_len++] = temp_UploadInfo.metinfo.single_val; //接收功率(RSRP)由 2 字节组成,高字节在前,低字节在后 temp_UploadInfo.metinfo.RSRP_val /=10; temp_UploadInfo.metinfo.RSRP_val =~temp_UploadInfo.metinfo.RSRP_val+1; p_send_buf[temp_pack_len++] = (temp_UploadInfo.metinfo.RSRP_val)>>8; p_send_buf[temp_pack_len++] = (temp_UploadInfo.metinfo.RSRP_val); //信噪比 由 2 字节组成,高字节在前,低字节在后 if(temp_UploadInfo.metinfo.snr_val>=0x8000) { temp_UploadInfo.metinfo.snr_val -= 0x8000; temp_UploadInfo.metinfo.snr_val /= 10; temp_UploadInfo.metinfo.snr_val = ~temp_UploadInfo.metinfo.snr_val+1; } else { temp_UploadInfo.metinfo.snr_val /= 10; } p_send_buf[temp_pack_len++] = temp_UploadInfo.metinfo.snr_val>>8; p_send_buf[temp_pack_len++] = temp_UploadInfo.metinfo.snr_val; //覆盖等级 p_send_buf[temp_pack_len++] = temp_UploadInfo.metinfo.ecl_val; //小区 ID 4Byte NbiotGetCell_ID(temp_buf1); for(i=0;i= 'a')) { temp_cell_id |= temp_buf1[i]-'a'+10; } else if((temp_buf1[i] <= 'F')&&(temp_buf1[i] >= 'A')) { temp_cell_id |= temp_buf1[i]-'A'+10; } } } p_send_buf[temp_pack_len++] = temp_cell_id>>24; p_send_buf[temp_pack_len++] = temp_cell_id>>16; p_send_buf[temp_pack_len++] = temp_cell_id>>8; p_send_buf[temp_pack_len++] = temp_cell_id>>0; //IMEI 标识 8Byte BCD NbiotGetIMEI((char*)temp_buf1); temp_buf2[0] = temp_buf1[0] - 0x30; for(i=1;i<8;i++) { temp_buf2[i] = (temp_buf1[2*i]-0x30)&0x0F; temp_buf2[i] |= ((temp_buf1[2*i-1]-0x30)<<4)&0xF0; } for(i=0;i<8;i++) { p_send_buf[temp_pack_len++] = temp_buf2[i]; } //SIM 标识 10Byte BCD NbiotGetICCID((char*)temp_buf1); for(i=0;i<10;i++) { p_send_buf[temp_pack_len++] = ((temp_buf1[i*2]-0x30)<<4)|(temp_buf1[2*i+1]-0x30); } /////////////////////////数据段 /////////////////////////////// for(i=0;idata.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 UploadData_GS(void) { SS_UNION_4U8TOU32 tempData; u8 temp_buf[6]; //数据起始时间 upload_frame_gs.data.Datetime[0] = upload_frame.data.StepFlowStartTime[5]; upload_frame_gs.data.Datetime[1] = upload_frame.data.StepFlowStartTime[4]; upload_frame_gs.data.Datetime[2] = upload_frame.data.StepFlowStartTime[3]; upload_frame_gs.data.Datetime[3] = upload_frame.data.StepFlowStartTime[2]; upload_frame_gs.data.Datetime[4] = upload_frame.data.StepFlowStartTime[1]; upload_frame_gs.data.Datetime[5] = upload_frame.data.StepFlowStartTime[0]; //时间段个数 upload_frame_gs.data.StepCnt = 48; //时间间隔 upload_frame_gs.data.Step[0] =0; upload_frame_gs.data.Step[1] =30;//30分钟 //数据段代码 upload_frame_gs.data.DataCode = 0x20; //表头行度(单位升 L),6 字节 12 位 BCD 码,无小数部分 u32HEXtoBCDData(upload_frame.data.CurrentFlow.datas, &temp_buf[0]); upload_frame_gs.data.StepFlow1[0] = temp_buf[5]; upload_frame_gs.data.StepFlow1[1] = temp_buf[4]; upload_frame_gs.data.StepFlow1[2] = temp_buf[3]; upload_frame_gs.data.StepFlow1[3] = temp_buf[2]; upload_frame_gs.data.StepFlow1[4] = temp_buf[1]; upload_frame_gs.data.StepFlow1[5] = temp_buf[0]; //其他时间段数据 for(int i=0; i<47; i++) { tempData.data_buf[0] = upload_frame.data.StepFlow[i*2]; tempData.data_buf[1] = upload_frame.data.StepFlow[i*2+1]; tempData.data_buf[2] = 0; tempData.data_buf[3] = 0; u32HEXtoBCDData(tempData.datas, &temp_buf[0]); upload_frame_gs.data.StepFlowN[i][0] = temp_buf[2]; upload_frame_gs.data.StepFlowN[i][1] = temp_buf[1]; upload_frame_gs.data.StepFlowN[i][2] = temp_buf[0]; } } static void UploadData_GS_Current(void) { U32_To_Float temp_float_data; SS_UNION_4U8TOU32 tempData; DateTime tempRtcc_time; u8 temp_buf[6]; RtccGetDateTime(&tempRtcc_time);//上报时间 //数据起始时间 upload_frame_gs.data.Datetime[0] = tempRtcc_time.s.year; upload_frame_gs.data.Datetime[1] = tempRtcc_time.s.month; upload_frame_gs.data.Datetime[2] = tempRtcc_time.s.day; upload_frame_gs.data.Datetime[3] = tempRtcc_time.s.hour; upload_frame_gs.data.Datetime[4] = tempRtcc_time.s.minute; upload_frame_gs.data.Datetime[5] = tempRtcc_time.s.second; //时间段个数 upload_frame_gs.data.StepCnt = 1; //时间间隔 upload_frame_gs.data.Step[0] =0; upload_frame_gs.data.Step[1] =0; //数据段代码 upload_frame_gs.data.DataCode = 0x20; //表头行度(单位升 L),6 字节 12 位 BCD 码,无小数部分 temp_float_data.gp22_u32 = Gp30CheckDataApp(2); tempData.datas = (u32)(temp_float_data.gp22_float*10); u32HEXtoBCDData(tempData.datas, &temp_buf[0]); upload_frame_gs.data.StepFlow1[0] = temp_buf[5]; upload_frame_gs.data.StepFlow1[1] = temp_buf[4]; upload_frame_gs.data.StepFlow1[2] = temp_buf[3]; upload_frame_gs.data.StepFlow1[3] = temp_buf[2]; upload_frame_gs.data.StepFlow1[4] = temp_buf[1]; upload_frame_gs.data.StepFlow1[5] = temp_buf[0]; } //临时周期上报数据存储 void GS_TempSaveProc(void) { u8 temp_buf[6]; SS_UNION_4U8TOU32 tempData; u8 temp_index=(ls_save_cnt/48); if(temp_index < 6) { if((ls_save_cnt%48)==0)//新的周期开始 { for(int i=0;i= Sys_data_object.P1.histroy_r) return (Sys_data_object.P1.histroy_w - Sys_data_object.P1.histroy_r); else return (Sys_data_object.P1.histroy_w + PERIOD_DATA_NUM - Sys_data_object.P1.histroy_r); } void GetUploadDataResetState_GS(void) { upload_frame_stat_GuangShui =UP_DEAL_S0; upload_task_complete_GuangShui = PTL_PACK_BUSY; } u8 GetUploadDataCheckIdle_GS(void) { if(UP_DEAL_S0 == upload_frame_stat_GuangShui) { return TASK_IDLE; } else { return TASK_BUSY; } } u8 GetUploadDataCheckTask_GS(void) { return upload_task_complete_GuangShui; } void GetUploadDataMachine_GS(u8 data_step, u8* p_send_buf, u16* p_send_len) { switch(upload_frame_stat_GuangShui) { case UP_DEAL_S0: { if(data_step == UPLOAD_FRAME_REQUEST_NEW)//请求新数据包 { temp_upload_step = 0; upload_frame_retry_times = 0;//重发次数清0 upload_frame_stat_GuangShui = UP_DEAL_S1; } else if(data_step == UPLOAD_FRAME_UPLOAD_OK)//发送成功 { gs_upload_fail_times = 0; upload_frame_retry_times = 0;//重发次数清0 if(temp_upload_step == UP_DEAL_S10)//周期历史数据 { Sys_data_object.P1.histroy_r++; if(Sys_data_object.P1.histroy_r >= PERIOD_DATA_NUM) { Sys_data_object.P1.histroy_r = 0; } setStoreMsg(SS_StoreMsg3, TRUE);//保存读写指针 upload_frame_stat_GuangShui = UP_DEAL_S1;//继续上报下一条 } else if(temp_upload_step == UP_DEAL_S11)//当前数据上报成功,结束 { upload_task_complete_GuangShui = PTL_PACK_FAIL; upload_frame_stat_GuangShui = UP_DEAL_S0; } else if(temp_upload_step == UP_DEAL_S30)//临时上报 { if(ls_upload_index < ls_save_cnt/48) { ls_upload_index++; upload_frame_stat_GuangShui = UP_DEAL_S30; } else { upload_task_complete_GuangShui = PTL_PACK_FAIL; upload_frame_stat_GuangShui = UP_DEAL_S0; } } } else if(data_step == UPLOAD_FRAME_UPLOAD_RETRY)//请求重新发送 { upload_frame_stat_GuangShui = UP_DEAL_S21; } else if(data_step == UPLOAD_FRAME_ONLINE_FAIL) //联网失败 { if(ls_upload_flag)//临时上报不重试 { ls_upload_flag = 0;//清除临时上报标志 } else { if(UPLOAD_TYPE_FIX_TIME == GetEventUploadType())//定时上传 { setStoreMsg(SS_StoreMsg1, TRUE);//标记补报位置 SystemAddUploadAgain();//重传增加 } else if(UPLOAD_TYPE_RETRY_AGAIN == GetEventUploadType())//重传 { SystemAddUploadAgain();//重传增加 } } gs_upload_fail_times++;//失败次数增加 upload_task_complete_GuangShui = PTL_PACK_FAIL; upload_frame_stat_GuangShui = UP_DEAL_S0; } else { ls_upload_flag = 0;//清除临时上报标志 upload_task_complete_GuangShui = PTL_PACK_FAIL; upload_frame_stat_GuangShui = UP_DEAL_S0; } } break; case UP_DEAL_S1: { if(ls_upload_flag)//临时上报 { upload_frame_stat_GuangShui = UP_DEAL_S30; } else { if(EepIfIdle()) { upload_packet_count = GetUploadDataCount(); if(upload_packet_count > 0) { EepRead(EEP_ADDR_CIRCLE_DATA+(Sys_data_object.P1.histroy_r*PACK_NUM_GPRS), &upload_frame.buf[0], PACK_NUM_GPRS, &s_eep_complete_GuangShui); upload_frame_stat_GuangShui = UP_DEAL_S10; } else//没有记录,上报一条当前数据 { upload_frame_stat_GuangShui = UP_DEAL_S11; } } } } break; case UP_DEAL_S10://转广水协议上报帧 { if(EepIfIdle()) { temp_upload_step = UP_DEAL_S10; UploadData_GS(); upload_temp_len_GuangShui = STRU_DATA_LEN_GS;//上报数据长度 upload_frame_stat_GuangShui = UP_DEAL_S20; } } break; case UP_DEAL_S11://当前数据组帧 { if(EepIfIdle()) { temp_upload_step = UP_DEAL_S11; UploadData_GS_Current(); upload_temp_len_GuangShui = STRU_DATA_LEN_GS_CURRENT; upload_frame_stat_GuangShui = UP_DEAL_S20; } } break; case UP_DEAL_S20://组上传帧 { if(EepIfIdle()) { upload_struct_GuangShui.ack_ctrl = 0x01; Frame_ack_GS(upload_struct_GuangShui, upload_frame_gs.buf, upload_temp_len_GuangShui, p_send_buf, p_send_len); upload_task_complete_GuangShui = PTL_PACK_SUCCESS;// 成功 upload_frame_stat_GuangShui = UP_DEAL_S0; } } break; case UP_DEAL_S21://重试 { if(upload_frame_retry_times < 3) { upload_frame_retry_times++; upload_frame_stat_GuangShui = UP_DEAL_S20; } else//重新发送失败3次的处理 { if(temp_upload_step == UP_DEAL_S1)//当前包发送失败,判断是否补报 { if(UPLOAD_TYPE_FIX_TIME == GetEventUploadType())//定时上传 { SystemAddUploadAgain();//重传增加 gs_upload_fail_times++;//失败次数增加 } else if(UPLOAD_TYPE_RETRY_AGAIN == GetEventUploadType())//重传 { SystemAddUploadAgain();//重传增加 } } upload_task_complete_GuangShui = PTL_PACK_FAIL; upload_frame_stat_GuangShui = UP_DEAL_S0; } } break; case UP_DEAL_S30://临时上报组帧 { temp_upload_step = UP_DEAL_S30; if(ls_upload_index <= ls_save_cnt/48) { for(int i=0;i=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_GuangShui); step_save_supplt = SS_STATE_WAIT; } break; } case SS_STATE_S3://保存读指针 { if(TASK_IDLE == EepIfIdle()) { EepWrite(&Sys_data_object.P1.histroy_r, (FRAME_NBIot_BUBAO_FLAG+4), 2, &s_eep_complete_GuangShui); step_save_supplt = SS_STATE_WAIT; } break; } /*间隔流量存储*/ case SS_STATE_S20://半小时间隔流量时间判断:防止首次上电,日期变更 { if(EepIfIdle()) { if( (GuangShui_rtcc_time.s.year == store_frame.data.StepFlowStartTime[5])&& (GuangShui_rtcc_time.s.month == store_frame.data.StepFlowStartTime[4])&& (GuangShui_rtcc_time.s.day == store_frame.data.StepFlowStartTime[3])) { step_save_supplt = SS_STATE_S22; } else { EepRead(EEP_ADDR_CIRCLE_DATA+(Sys_data_object.P1.histroy_w*PACK_NUM_GPRS)+STEP_FLOW_TIME_ADDR, &store_frame.data.StepFlowStartTime[0], 7, &s_eep_complete_GuangShui); step_save_supplt = SS_STATE_S21; } } } break; case SS_STATE_S21: { if(EepIfIdle()) { if( (GuangShui_rtcc_time.s.year == store_frame.data.StepFlowStartTime[5])&& (GuangShui_rtcc_time.s.month == store_frame.data.StepFlowStartTime[4])&& (GuangShui_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]= GuangShui_rtcc_time.s.day; store_frame.data.StepFlowStartTime[4]= GuangShui_rtcc_time.s.month; store_frame.data.StepFlowStartTime[5]= GuangShui_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, (EEP_ADDR_CIRCLE_DATA+(Sys_data_object.P1.histroy_w*PACK_NUM_GPRS)), PACK_NUM_GPRS, &s_eep_complete_GuangShui); } } } 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 = EEP_ADDR_CIRCLE_DATA+(Sys_data_object.P1.histroy_w*PACK_NUM_GPRS)+STEP_FLOW_START_ADDR + BCD2HEX(GuangShui_rtcc_time.s.hour)*4 + (BCD2HEX(GuangShui_rtcc_time.s.minute)/30)*2; EepWrite(&jiange_data.datas_map.data0, temp_step_flow_addr, 2, &s_eep_complete_GuangShui); step_save_supplt = SS_STATE_WAIT; } } break; //临时间隔流量存储 case SS_STATE_S30: { GS_TempSaveProc(); step_save_supplt = SS_STATE_S0; } 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_GuangShui); step_save_supplt = SS_STATE_WAIT; } break; } case SS_STATE_WAIT: { if(TASK_IDLE == EepIfIdle()) { step_save_supplt = SS_STATE_S0; } break; } default: { break; } } } //历史数据存储 static void SS_Store_HisDataMachine(void) { switch(his_save_step) { case SS_STATE_S0: { if(getStoreMsg(SS_StoreMsg6) == TRUE)//历史数据存储每分钟判断 { setStoreMsg(SS_StoreMsg6,FALSE); save_his_interval_cnt++; } if(save_his_interval_cnt > his_save_para.Data.Period.datas) { save_his_interval_cnt = 0; his_save_step = SS_STATE_S1; } } break; case SS_STATE_S1: { if(TASK_IDLE == EepIfIdle()) { his_save_flow_value.gp22_u32 = Gp30CheckDataApp(2); his_save_flow_buf[0] = his_save_flow_value.buf[0]; his_save_flow_buf[1] = his_save_flow_value.buf[1]; his_save_flow_buf[2] = his_save_flow_value.buf[2]; his_save_flow_buf[3] = his_save_flow_value.buf[3]; his_save_flow_buf[4] = his_save_flow_buf[0]+his_save_flow_buf[1]+his_save_flow_buf[2]+his_save_flow_buf[3]; his_save_addr = EEP_ADDR_HIS_DATA+((his_save_para.Data.Index_w.datas%GS_HIS_STORE_MAX)*5);//计算本时刻流量存储位置 EepWrite(&his_save_flow_buf[0], his_save_addr, 5, &s_eep_complete_GuangShui); his_save_step = SS_STATE_S2; } } break; case SS_STATE_S2://保存存储指针 { if(TASK_IDLE == EepIfIdle()) { his_save_para.Data.Index_w.datas++; EepWrite(&his_save_para.Data.Index_w.data_buf[0], EEP_ADDR_HIS_INDEX, 4, &s_eep_complete_GuangShui); his_save_step = SS_STATE_S0; } } break; default: { his_save_step = SS_STATE_S0; } 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 { temp_fail_times = gs_upload_fail_times; } 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; gs_upload_fail_times =0; setStoreMsg(SS_StoreMsg5,TRUE);//保存EEPROM break; } case NB_SS_FormatError://上报数据格式错误 { signal_val.SignalStruct.format_error = data; break; } default: break; } } void GuangShui_Store_InitApp(void) { TYP_STATE_QZ tmp_init_stat = QZ_STATE_S0; if(Sys_data_object.P3.FirstPowerOnFlag == FIRST_POWER_ON_FLAG) { tmp_init_stat = QZ_STATE_S10; } else { tmp_init_stat = QZ_STATE_S20; } while (tmp_init_stat) { switch (tmp_init_stat) { case QZ_STATE_S0: { if (TASK_IDLE == EepIfIdle()) { tmp_init_stat = QZ_STATE_S0; } break; } case QZ_STATE_S10://第一次上电流程,历史数据存储参数 { if(TASK_IDLE == EepIfIdle()) { his_save_para.Data.Period.datas = 1440;//默认1天间隔存储 his_save_para.Data.Index_w.datas = 0; EepWrite(&his_save_para.data_buf[0], EEP_ADDR_HIS_INDEX, 6, &s_eep_complete_GuangShui);//历史数据存储 tmp_init_stat = QZ_STATE_S11; } break; } case QZ_STATE_S11://第一次上电流程,临时数据存储和上报参数 { if(TASK_IDLE == EepIfIdle()) { linshi_jm.Data.up_interval.datas = 240;//4小时上报 linshi_jm.Data.data_interval.datas = 5;//5分钟存储间隔 EepWrite(&his_save_para.data_buf[0], EEP_ADDR_HIS_INDEX, 6, &s_eep_complete_GuangShui);//历史数据存储 tmp_init_stat = QZ_STATE_S1; } break; } case QZ_STATE_S20://非第一次上电,读取历史数据存储参数 { if (TASK_IDLE == EepIfIdle()) { EepRead(EEP_ADDR_HIS_INDEX, &his_save_para.data_buf[0], 6, &s_eep_complete_GuangShui); tmp_init_stat = QZ_STATE_S21; } break; } case QZ_STATE_S21://非第一次上电,读取临时数据存储和上报参数 { if (TASK_IDLE == EepIfIdle()) { EepRead(EEP_ADDR_TEMP_STORE_UPLOAD, &linshi_jm.data_buf[0], 8, &s_eep_complete_GuangShui); tmp_init_stat = QZ_STATE_S1; } break; } case QZ_STATE_S1: { if (TASK_IDLE == EepIfIdle()) { tmp_init_stat = QZ_STATE_S0; } break; } default: { tmp_init_stat =QZ_STATE_S0; break; } } EepMachineDriver(); } if(his_save_para.Data.Index_w.datas>0x80000000) { his_save_para.Data.Index_w.datas =0; } } /****************************数据存储部分公用接口*********************************************/ //规约数据存储部分初始化 void DataStoreInit(void) { Quanzhou_Store_InitApp(); GuangShui_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();//冻结数据存储 SS_Store_HisDataMachine();//历史数据存储 } //规约数据存储休眠判断 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