R2UWaterRS485UW500/app/UWater_Frame/UWater_frame_func_ReplyGuan...

2138 lines
68 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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)<temp_diff_time)
{
his_read_end_count = 0;
his_read_start_count = his_save_para.Data.Index_w.datas - (temp_diff_time/60)/his_save_para.Data.Period.datas;
up_deal_stat_GuangShui = UP_DEAL_S1;
}
else//返回异常
{
up_deal_stat_GuangShui = UP_DEAL_S4;
}
}
else//返回异常
{
up_deal_stat_GuangShui = UP_DEAL_S4;
}
}
}
break;
case UP_DEAL_S1://数据读取
{
if(TASK_IDLE == EepIfIdle())
{
his_read_addr = EEP_ADDR_HIS_DATA+(((his_read_start_count+his_read_end_count)%GS_HIS_STORE_MAX)*5);
EepRead(his_read_addr, &his_read_flow_buf[0], 5, &s_eep_complete_GuangShui);
up_deal_stat_GuangShui = UP_DEAL_S2;
}
}
break;
case UP_DEAL_S2://数据处理:EE_BUF->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 <linshi_jm.Data.effective_time.datas)&&linshi_data_eff&&(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<add_len; l++)
{
g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = *(new_message_data_rev_jm+l);
if(((char)(*(new_message_data_rev_jm+l))==':'))
{
*(new_message_data_rev_jm+l)='.';
}
if(((char)(*(new_message_data_rev_jm+l))=='.')&&(num_ip<=3))
{
mack[0]=new_message_data_rev_jm+1;
mack[++num_ip]=(new_message_data_rev_jm+l);
if(num_ip==4)
{
for(u8 n=0; n<4; n++)
{
if(mack[n+1]-mack[n]==2)
{
Sys_data_object.P1.server_ip[n]=*(mack[n]+1)-0x30;
}
else if(mack[n+1]-mack[n]==3)
{
Sys_data_object.P1.server_ip[n]=(*(mack[n]+1)-0x30)*10+(*(mack[n]+2)-0x30);
}
else if(mack[n+1]-mack[n]==4)
{
Sys_data_object.P1.server_ip[n]=(*(mack[n]+1)-0x30)*100+(*(mack[n]+2)-0x30)*10+(*(mack[n]+3)-0x30);
}
}
if(new_message_data_rev_jm+2+add_len-mack[4]==3) //port 为1位 多0位
{
Sys_data_object.P1.server_port.datas=*(mack[4]+1)-0x30;
}
else if(new_message_data_rev_jm+2+add_len-mack[4]==4) //port 为两位
{
Sys_data_object.P1.server_port.datas=(*(mack[4]+1)-0x30)*10+*(mack[4]+2)-0x30;
}
else if(new_message_data_rev_jm+2+add_len-mack[4]==5) //port 为3位
{
Sys_data_object.P1.server_port.datas=(*(mack[4]+1)-0x30)*100+(*(mack[4]+2)-0x30)*10+(*(mack[4]+3)-0x30);
}
else if(new_message_data_rev_jm+2+add_len-mack[4]==6) //port 为4位
{
Sys_data_object.P1.server_port.datas=(*(mack[4]+1)-0x30)*1000+(*(mack[4]+2)-0x30)*100+(*(mack[4]+3)-0x30)*10+(*(mack[4]+4)-0x30);
}
else if(new_message_data_rev_jm+2+add_len-mack[4]==7) //port 为5位
{
Sys_data_object.P1.server_port.datas=(*(mack[4]+1)-0x30)*10000
+(*(mack[4]+2)-0x30)*1000+(*(mack[4]+3)-0x30)*100+(*(mack[4]+4)-0x30)*10+(*(mack[4]+5)-0x30);
}
}
}
}
EepWrite(&Sys_data_object.P1.server_ip[0], FRAME_NBIot_IP, 6, &s_eep_complete_GuangShui);
up_deal_stat_GuangShui = UP_DEAL_S0;
task_complete_GuangShui = PTL_PACK_SUCCESS;
}
}
//设置工作模式,只给回帧,不实际应用
void jm_set_mode()
{
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++] = 0x00;
g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = 0x00;
g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = 0x00;
up_deal_stat_GuangShui = UP_DEAL_S0;
task_complete_GuangShui = PTL_PACK_SUCCESS;
}
//设置设备地址,(设置设备地址指令用于非 NB 水表应用场景NB 水表表码通常不允许修 改,所以 NB 水表不需实现该指令)
void jm_set_add_frame() //回帧
{
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++] = 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;
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;
}
//设置加密标志,无效
void jm_encrypted_data_frame()
{
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;
//加密标志和密钥
for(int i=0;i<17;i++)
{
g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = *(new_message_data_rev_jm+2+i);
}
up_deal_stat_GuangShui = UP_DEAL_S0;
task_complete_GuangShui = PTL_PACK_SUCCESS;
}
//查询历史数据存盘间隔
void jm_read_interval_frame()
{
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++] = his_save_para.Data.Period.data_buf[1];
g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = his_save_para.Data.Period.data_buf[0];
up_deal_stat_GuangShui = UP_DEAL_S0;
task_complete_GuangShui = PTL_PACK_SUCCESS;
}
//查询数据中心地址
void jm_read_add_frame()
{
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;
for (int i = 0; i < 4; i++)
{
if (Sys_data_object.P1.server_ip[i] < 10)
{
g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = Sys_data_object.P1.server_ip[i] + 0x30;
}
else if (Sys_data_object.P1.server_ip[i] < 100)
{
g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = (Sys_data_object.P1.server_ip[i] / 10) + 0x30;
g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = (Sys_data_object.P1.server_ip[i] % 10) + 0x30;
}
else
{
g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = (Sys_data_object.P1.server_ip[i] / 100) + 0x30;
g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = (Sys_data_object.P1.server_ip[i] / 10) % 10 + 0x30;
g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = (Sys_data_object.P1.server_ip[i] % 10) + 0x30;
}
g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = '.';
}
g_frame_temp_len_GuangShui--;
g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = ':';
g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = (Sys_data_object.P1.server_port.datas / 10000) + 0x30;
g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = (Sys_data_object.P1.server_port.datas % 10000) / 1000 + 0x30;
g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = (Sys_data_object.P1.server_port.datas % 1000) / 100 + 0x30;
g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = (Sys_data_object.P1.server_port.datas % 100) / 10 + 0x30;
g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = (Sys_data_object.P1.server_port.datas % 10) + 0x30;
g_frame_temp_buf_GuangShui[g_frame_temp_len_GuangShui++] = 0x0;
up_deal_stat_GuangShui = UP_DEAL_S0;
task_complete_GuangShui = PTL_PACK_SUCCESS;
}
/****************************************************************************************************/
//解广水规约
u8 crack_frame_GS(u16 frame_lenth,u8 *frame_buffer)
{
u16 i;
u16 j;
u16 endloc = 0;
u16 framelen = 0;
if (frame_lenth > 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<CELL_ID_SIZE;i++)
{
if(temp_buf1[i] != 0)
{
temp_cell_id <<= 4;
if(temp_buf1[i] <= '9')
{
temp_cell_id |= temp_buf1[i]-'0';
}
else if((temp_buf1[i] <= 'f')&&(temp_buf1[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;i<p_temp_len;i++)
{
p_send_buf[temp_pack_len++] = p_temp_buf[i];
}
//校验和
p_send_buf[temp_pack_len] = 0;//校验和清0
for(i = 0; i < temp_pack_len; i++) //这里需要看下从0开始的///////
{
p_send_buf[temp_pack_len] += p_send_buf[i];
}
temp_pack_len++;
p_send_buf[temp_pack_len++] = FRAME_END_JM; //帧尾
*p_send_len = temp_pack_len;
}
//应答数据组帧
void Frame_ack_GuangShui(u8* p_send_buf, u16* p_send_len)
{
STRUCT_FRAME_IES temp_struct;
temp_struct.ack_ctrl = frame_struct_GuangShui.ack_ctrl;
temp_struct.DI0 = frame_struct_GuangShui.DI0;
temp_struct.DI1 = frame_struct_GuangShui.DI1;
switch(temp_struct.ack_ctrl)
{
case SS_ACK_CLEAR_FAIL_TIMES_CTRL:
case SS_ACK_READ_HIS_CTRL:
{
temp_struct.sta = frame_struct_GuangShui.sta;
temp_struct.serial_num0 = frame_struct_GuangShui.serial_num0;
temp_struct.serial_num1 = frame_struct_GuangShui.serial_num1;
Frame_ack_IesBase(temp_struct,g_frame_temp_buf_GuangShui, g_frame_temp_len_GuangShui, p_send_buf, p_send_len);
}
break;
default://广水规约
{
Frame_ack_GS(temp_struct,g_frame_temp_buf_GuangShui, g_frame_temp_len_GuangShui, p_send_buf, p_send_len);
}
}
}
/****************************************************************以下主动上报数据的处理*********************************************/
static void setStoreMsg(SS_StoreMsgType msg, boolean_t bFlag)
{
if(TRUE == bFlag)
{
temp_store_msg |= (1<<msg);
}
else
{
temp_store_msg &= (~(1<<msg));
}
}
static boolean_t getStoreMsg(SS_StoreMsgType msg)
{
if(temp_store_msg & (1<<msg))
{
return TRUE;
}
else
{
return FALSE;
}
}
//更新数据包中的当前流量和信息状态
static void Upload_RenewCurrentData(STRU_UPLOAD_FRAME* temp_frame)
{
MET_STATE temp_state; //状态字
u8 temp1 = 0;
Fram_To_Float tmp_float;
u8* hight_flow;
DateTime tempRtcc_time;
tmp_float.gp22_u32 = Gp30CheckDataApp(2);
temp_frame->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 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;
//表头行度(单位升 L6 字节 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;
//表头行度(单位升 L6 字节 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<STRU_DATA_LEN_GS;i++)
{
ls_save_buf[temp_index].buf[i] =0;
}
new_gs_total_flow.gp22_u32 = Gp30CheckDataApp(2);
old_gs_total_flow.gp22_u32 = new_gs_total_flow.gp22_u32;
//保存数据起始时间
ls_save_buf[temp_index].data.Datetime[0] = GuangShui_rtcc_time.s.year;
ls_save_buf[temp_index].data.Datetime[1] = GuangShui_rtcc_time.s.month;
ls_save_buf[temp_index].data.Datetime[2] = GuangShui_rtcc_time.s.day;
ls_save_buf[temp_index].data.Datetime[3] = GuangShui_rtcc_time.s.hour;
ls_save_buf[temp_index].data.Datetime[4] = GuangShui_rtcc_time.s.minute;
ls_save_buf[temp_index].data.Datetime[5] = GuangShui_rtcc_time.s.second;
//时间段个数清0
ls_save_buf[temp_index].data.StepCnt = 0;
//时间间隔
ls_save_buf[temp_index].data.Step[0] =linshi_jm.Data.data_interval.data_buf[1];
ls_save_buf[temp_index].data.Step[1] =linshi_jm.Data.data_interval.data_buf[0];
//数据段代码
ls_save_buf[temp_index].data.DataCode = 0x20;
//表头行度(单位升 L6 字节 12 位 BCD 码,无小数部分
tempData.datas = (u32)(new_gs_total_flow.gp22_float*10);
u32HEXtoBCDData(tempData.datas, &temp_buf[0]);
ls_save_buf[temp_index].data.StepFlow1[0] = temp_buf[5];
ls_save_buf[temp_index].data.StepFlow1[1] = temp_buf[4];
ls_save_buf[temp_index].data.StepFlow1[2] = temp_buf[3];
ls_save_buf[temp_index].data.StepFlow1[3] = temp_buf[2];
ls_save_buf[temp_index].data.StepFlow1[4] = temp_buf[1];
ls_save_buf[temp_index].data.StepFlow1[5] = temp_buf[0];
ls_save_buf[temp_index].data.StepCnt++;
}
else
{
new_gs_total_flow.gp22_u32 = Gp30CheckDataApp(2);
jiange_data.datas = (u16)((new_gs_total_flow.gp22_float - old_gs_total_flow.gp22_float)*10);
old_gs_total_flow.gp22_u32 = new_gs_total_flow.gp22_u32;
tempData.data_buf[0] = jiange_data.datas_map.data0;
tempData.data_buf[1] = jiange_data.datas_map.data1;
tempData.data_buf[2] = 0;
tempData.data_buf[3] = 0;
u32HEXtoBCDData(tempData.datas, &temp_buf[0]);
ls_save_buf[temp_index].data.StepFlowN[ls_save_buf[temp_index].data.StepCnt-1][0] = temp_buf[2];
ls_save_buf[temp_index].data.StepFlowN[ls_save_buf[temp_index].data.StepCnt-1][1] = temp_buf[1];
ls_save_buf[temp_index].data.StepFlowN[ls_save_buf[temp_index].data.StepCnt-1][2] = temp_buf[0];
ls_save_buf[temp_index].data.StepCnt++;
}
ls_save_cnt++;
}
}
int GetUploadDataCount(void)
{
if (Sys_data_object.P1.histroy_w >= 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<STRU_DATA_LEN_GS;i++)
{
upload_frame_gs.buf[i] = ls_save_buf[ls_upload_index].buf[i];
}
upload_temp_len_GuangShui = STRU_DATA_LEN_GS;//无密集上报数据长度
upload_frame_stat_GuangShui = UP_DEAL_S20;
}
else
{
ls_upload_flag = 0;//清除临时上报标志
upload_task_complete_GuangShui = PTL_PACK_FAIL;
upload_frame_stat_GuangShui = UP_DEAL_S0;
}
}
break;
default:
{
ls_upload_flag = 0;//清除临时上报标志
upload_task_complete_GuangShui = PTL_PACK_FAIL;
upload_frame_stat_GuangShui = UP_DEAL_S0;
}
break;
}
}
/*************************************************规约数据存储部分****************************/
//补报标志存储
static void SS_Store_SuppleFlagMachine(void)
{
switch(step_clear_flag)
{
case SS_STATE_S0:
{
if(getStoreMsg(SS_StoreMsg1) == TRUE)//保存补报标志
{
setStoreMsg(SS_StoreMsg1,FALSE);
Sys_data_object.P1.Supplemental_send_flag.datas |=(0x00001<<Sys_data_object.P1.histroy_r);
step_clear_flag = SS_STATE_S1;
}
else if(getStoreMsg(SS_StoreMsg2) == TRUE)//清当前补报标志
{
setStoreMsg(SS_StoreMsg2,FALSE);
Sys_data_object.P1.Supplemental_send_flag.datas &=(~(0x0001<<(Sys_data_object.P1.histroy_r)));
step_clear_flag = SS_STATE_S1;
}
else if(getStoreMsg(SS_StoreMsg5) == TRUE)//清所有补报标志
{
setStoreMsg(SS_StoreMsg5,FALSE);
Sys_data_object.P1.Supplemental_send_flag.datas = 0;
step_clear_flag = SS_STATE_S1;
}
}
break;
case SS_STATE_S1:
{
if(EepIfIdle())
{
EepWrite(&Sys_data_object.P1.Supplemental_send_flag.datas_map.data0, FRAME_NBIot_BUBAO_FLAG, 6, &s_eep_complete_GuangShui);
step_clear_flag = SS_STATE_WAIT;
}
}
break;
case SS_STATE_WAIT:
{
if(EepIfIdle())
{
step_clear_flag = SS_STATE_S0;
}
}
break;
default:
{
step_clear_flag = SS_STATE_S0;
}
break;
}
}
//周期数据存储
static void SS_Store_CircleDataMachine(void)
{
switch (step_save_supplt)//数据存储
{
case SS_STATE_S0://存储消息类型判断
{
if (RtccCheckMsgApp(RtccMsg_OtherProtl))
{
RtccClearMsgApp(RtccMsg_OtherProtl);
setStoreMsg(SS_StoreMsg6,TRUE);//历史数据存储消息
RtccGetDateTime(&GuangShui_rtcc_time);
if(get_lset_judg(&ls_save,&ls_up))
{
if(ls_save)
{
setStoreMsg(SS_StoreMsg7,TRUE);//临时间隔流量存储消息
}
if(ls_up)
{
ls_up=FALSE;
FrameSetMsgApp(MsgShenYang_NbUploadWarning);
ls_upload_flag = 1;
}
}
if((GuangShui_rtcc_time.s.minute==0x00)||(GuangShui_rtcc_time.s.minute==0x30))
{
FrameSetMsgApp(MsgSS_JianGeStore);//半小时间隔流量存储消息
}
if ((GuangShui_rtcc_time.s.hour == 0)&&(GuangShui_rtcc_time.s.minute==0x00))//冻结时间到,零点
{
//间隔流量清除:2B(间隔流量)X2(次/h)X24h=96B
for(int i = 0; i <96 ;i++)//间隔流量清除
{
store_frame.data.StepFlow[i] = 0;
}
//间隔流量初始化
new_jiange_total_flow.gp22_u32 = Gp30CheckDataApp(2);
old_jiange_total_flow.gp22_u32 = new_jiange_total_flow.gp22_u32;
//存储消息
RtccSetMsgApp(RtccMsg_DataSave);//0点更新冻结数据
FrameSetMsgApp(MsgSS_HisIndexStore);//0点更新冻结数据指针
}
}
/**间隔流量和冻结数据存储先0点存储冻结数据; 然后最后存储指针增加; 最后开始新的一轮间隔流量存储,期间判断写指针的有效性;*/
if(FrameCheckMsgApp(MsgSS_HisIndexStore))//0点更新冻结数据指针
{
FrameClearMsgApp(MsgSS_HisIndexStore);
step_save_supplt = SS_STATE_S2;
}
else if(RtccCheckMsgApp(RtccMsg_DataSave))//0点保存冻结数据
{
RtccClearMsgApp(RtccMsg_DataSave);
step_save_supplt = SS_STATE_S10;
}
else if(FrameCheckMsgApp(MsgSS_JianGeStore)) //半小时间隔流量存储
{
FrameClearMsgApp(MsgSS_JianGeStore);
step_save_supplt = SS_STATE_S20;
}
else if(FrameCheckMsgApp(Msg_ClearHisOther))//清表数据
{
FrameClearMsgApp(Msg_ClearHisOther);
step_save_supplt = SS_STATE_S40;
}
else if(getStoreMsg(SS_StoreMsg3) == TRUE)//清所有补报标志
{
setStoreMsg(SS_StoreMsg3,FALSE);
step_save_supplt = SS_STATE_S3;
}
else if(getStoreMsg(SS_StoreMsg7) == TRUE)//临时间隔流量存储
{
setStoreMsg(SS_StoreMsg7,FALSE);
step_save_supplt = SS_STATE_S30;
}
break;
}
/*0点更新冻结数据*/
case SS_STATE_S10:
{
if(TASK_IDLE == EepIfIdle())
{
//(只)更新表计数据和表计状态
Upload_RenewCurrentData(&store_frame);
EepWrite(store_frame.buf, (EEP_ADDR_CIRCLE_DATA+(Sys_data_object.P1.histroy_w*PACK_NUM_GPRS)), CURRENT_DATA_INFO_LEN, &s_eep_complete_GuangShui);
step_save_supplt = SS_STATE_S11;
}
break;
}
case SS_STATE_S11://保存上报时间
{
if(TASK_IDLE == EepIfIdle())
{
EepWrite(&store_frame.data.UploadTime[0], (EEP_ADDR_CIRCLE_DATA+(Sys_data_object.P1.histroy_w*PACK_NUM_GPRS)+UPLOAD_TIME_ADDR), 7, &s_eep_complete_GuangShui);
step_save_supplt = SS_STATE_WAIT;
}
break;
}
/*0点更新冻结数据指针*/
case SS_STATE_S2:
{
if(TASK_IDLE == EepIfIdle())
{
Sys_data_object.P1.histroy_w++;
if(Sys_data_object.P1.histroy_w>=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