P2UWaterJiangXi/app/UWater_Frame/UWater_frame_func_ReplyShen...

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