R2UWaterRS485UW500/app/UWater_SY_Store_App.c

1920 lines
61 KiB
C
Raw Permalink 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_SY
#include "UWater_frame_app.h"
#include "UWater_eeprom_driver.h"
#include "UWater_rtcc_driver.h"
#include "UWater_rtcc_app.h"
#include "UWater_lcd_app.h"
#include "UWater_gp22_app.h"
#include "UWater_DataTools_App.h"
#include "UWater_pt_app.h"
#include "UWater_valve_driver.h"
#include "UWater_valve_app.h"
#include "SOE.h"
#include "UWater_power_app.h"
#include "UWater_SY_Store_App.h"
#include "sys_processor.h"
/**********公用变量************************************************************/
DateTime uTempRtccTime_BCD;
TYP_STATE_SY step_ShenYangStoreInit=SY_STATE_S0; //EE存储参数初始化状态机
TYP_STATE_SY step_ShenYangStoreMachine=SY_STATE_S0;//沈阳规约数据存储主状态机
UNION_SY_STORE_INDEX uStoreIndex_SY;//存储索引
u16 uTemp_ee_addr=0;
u8 uTempMsg_EE=0;
u8 s_sy_eep_complete=0;
static u8 s_sy_clear_history_buf[256];
DateTime sy_protl_rtcc_time;
/**********周期数据存储相关变量***********************************************/
UNION_SY_STORE_CIRCLE temp_Circle_data;//周期数据存储缓存
u8 uStoreCircleIndex_SY=0; //周期数据存储地址索引
TYP_STATE_SY step_CircleDataStore=SY_STATE_S0;//周期数据存储状态机
u32 uUploadIndexTimeBuf[6];//周期数据指针时间排序
u8 uUploadIndexBuf[6];//周期数据指针排序
/**********冻结信息存储相关变量***********************************************/
UNION_SY_STORE_FROZEN temp_frozen_data;//冻结数据存储缓存
u8 *pTempBuf_DailyHighestFlow;//日最高流量指针
TYP_STATE_SY step_FrozenDataStore=SY_STATE_S0;//冻结数据存储状态机
TYP_STATE_SY step_FrozenDataClear = SY_STATE_S0;//冻结数据和周期数据清除
u8 uClearDataLen=0;
/**********报警信息存储相关变量***********************************************/
TYP_STATE_SY step_ShenYangSOEMachine=SY_STATE_S0;
u16 uSOE_Data_New=0;
u16 uSOE_Data_Old=0;
u8 uSOE_Valve_New=0;
u8 uSOE_Valve_Old=0;
u8 uSOE_Power_New=0;
u8 uSOE_Power_Old=0;
float uSOE_Temprature_New=0;
u8 uSOE_Temprature_ShortNew=0;
u8 uSOE_Temprature_ShortOld=0;
u8 uSOE_Temprature_OpenNew=0;
u8 uSOE_Temprature_OpenOld=0;
u32 uSOE_Update_Flag=0xFFFFFFFF;
u32 uSOE_Update_Flag_Old=0xFFFFFFFF;
u8 uWaterState=0;
DateTime ValveActiveDateTime;
u8 Valve_Active=0;
/**********TLV数据存储相关变量***********************************************/
TYP_STATE_SY step_TlvDataStore=SY_STATE_S0;
u8 temp_tlv_data[32];
Type_TLVValue TlvValue;
u8 tlv_store_cnt=0;
/**********周期数据上报***********************************************/
int SY_ThisPack_Count=0;
TYP_STATE_SY SY_CircleUploadStep=SY_STATE_S0;//上报状态机
/********************************************************************************
函数名ShenYang_Store_InitApp
说 明:沈阳数据存储初始化
********************************************************************************/
void ShenYang_Store_InitApp(void)
{
TYP_STATE_SY tmp_init_stat;
while (tmp_init_stat)
{
switch (tmp_init_stat)
{
case SY_STATE_S0:
{
if(TASK_IDLE == EepIfIdle())
{
tmp_init_stat = SY_STATE_S0;
}
break;
}
case SY_STATE_S1:
{
if (TASK_IDLE == EepIfIdle())
{
EepRead(EEP_ADDR_SY_STORE_INDEX_CIRCLE, &uStoreIndex_SY.data_buf[0], SIZE_SY_STORE_INDEX, &uTempMsg_EE);
tmp_init_stat = SY_STATE_S2;
}
break;
}
case SY_STATE_S2://非第一次上电需要读取参数
{
if (TASK_IDLE == EepIfIdle())
{
EepRead(EEP_ADDR_SY_TLVDATA,&TlvValue.data_buf[0], TLV_VALUE_LEN, &s_sy_eep_complete);
tmp_init_stat =SY_STATE_S3;
}
break;
}
case SY_STATE_S3://判断第一次上电标志
{
if (TASK_IDLE == EepIfIdle())
{
if(uStoreIndex_SY.Data.firstPowerOn != SY_FIRST_POWERON_FLAG)
{
tmp_init_stat =SY_STATE_S10;
}
else
{
tmp_init_stat =SY_STATE_S0;
}
}
break;
}
//第一次上电流程
case SY_STATE_S10:
{
if (TASK_IDLE == EepIfIdle())
{
for(int i=0;i<SIZE_SY_STORE_INDEX;i++)
{
uStoreIndex_SY.data_buf[i] = 0;
}
uStoreIndex_SY.Data.firstPowerOn = SY_FIRST_POWERON_FLAG;
EepWrite(&uStoreIndex_SY.data_buf[0], EEP_ADDR_SY_STORE_INDEX_CIRCLE, SIZE_SY_STORE_INDEX, &uTempMsg_EE);
tmp_init_stat = SY_STATE_S11;
}
break;
}
case SY_STATE_S11: //第一次上电赋值参数
{
if(TASK_IDLE == EepIfIdle())
{
int i;
int len=0;
UNION_4U8TOU32 tmp_datas_buf;
TlvValue.s.ValueWarningId[0]=0;//即时报警ID--------------------------2
TlvValue.s.ValueWarningId[1]=0;
tmp_datas_buf.datas = (MAX_FLOW_1_02/65536.00)*10;//单位0.1L/h
TlvValue.s.ValueOverFlowCurrent[0]=tmp_datas_buf.data_buf[0];//过流报警的阈值单位0.1L/H----4
TlvValue.s.ValueOverFlowCurrent[1]=tmp_datas_buf.data_buf[1];
TlvValue.s.ValueOverFlowCurrent[2]=tmp_datas_buf.data_buf[2];
TlvValue.s.ValueOverFlowCurrent[3]=tmp_datas_buf.data_buf[3];
//
TlvValue.s.ValueOverFlowMinute=10;//持续过流时间----------------------1
TlvValue.s.ValueReverseFlowCurrent[0]=0;//反流报警的阈值单位0.1L/H-4
TlvValue.s.ValueReverseFlowCurrent[1]=0;
TlvValue.s.ValueReverseFlowCurrent[2]=0;
TlvValue.s.ValueReverseFlowCurrent[3]=0;
TlvValue.s.ValueReverseFlowMinute=10;//持续反流报警时间---------------1
TlvValue.s.ValueLeakFlowMinute=10;//漏水报警时间----------------------1
TlvValue.s.ValuePowerLow001V[0]=0x36;//电压报警阈值---------------------2
TlvValue.s.ValuePowerLow001V[1]=0x01;
TlvValue.s.ValueNoWaterMinute=10;//空管报警时间-----------------------1
TlvValue.s.ValueValveState[0]=0;//阀门状态---------------------------7预留
TlvValue.s.ValueValveState[1]=0;
TlvValue.s.ValueValveState[2]=0;
TlvValue.s.ValueValveState[3]=0;
TlvValue.s.ValueValveState[4]=0;
TlvValue.s.ValueValveState[5]=0;
TlvValue.s.ValueValveState[6]=0;
tmp_datas_buf.datas = FrameCheckParaApp(FramePara_ReportFreq);
TlvValue.s.ValueUploadStartTime[0]=0;//数据上报起始时间a-------------4
TlvValue.s.ValueUploadStartTime[1]=BCD2HEX(tmp_datas_buf.data_buf[2]);//小时
TlvValue.s.ValueUploadStartTime[2]=BCD2HEX(tmp_datas_buf.data_buf[3]);//分钟
TlvValue.s.ValueUploadStartTime[3]=0;
TlvValue.s.ValueCircleData5Minutes=6;//周期数据时间间隔a-------------1
TlvValue.s.ValueDataFrozenTimeDailay=0;//日冻结时间------------------1
TlvValue.s.ValueDataFrozenTimeMonth[0]=1;//月冻结时间----------------2
TlvValue.s.ValueDataFrozenTimeMonth[1]=0;
TlvValue.s.ValueUploadRetryTimes=Sys_data_object.P1.report_retry_times;//上报重发次数--------------------1
TlvValue.s.ValueUploadRetryDelayMinite=20;//重发延时时间--------------1
TlvValue.s.ValueUploadIntervalHour=12;//数据上报时间间隔a-------------1
//IP 223.100.022.125 3031
Sys_data_object.P2.server_ip[0] = 223;
Sys_data_object.P2.server_ip[1] = 100;
Sys_data_object.P2.server_ip[2] = 22;
Sys_data_object.P2.server_ip[3] = 125;
Sys_data_object.P2.server_port.datas =3031;
for (i = 0; i < 4; i++)
{
if (Sys_data_object.P2.server_ip[i] < 10)
{
TlvValue.s.ValueServerIpPort[len++] = Sys_data_object.P2.server_ip[i] + 0x30;
}
else if (Sys_data_object.P2.server_ip[i] < 100)
{
TlvValue.s.ValueServerIpPort[len++] = (Sys_data_object.P2.server_ip[i] / 10) + 0x30;
TlvValue.s.ValueServerIpPort[len++] = (Sys_data_object.P2.server_ip[i] % 10) + 0x30;
}
else
{
TlvValue.s.ValueServerIpPort[len++] = (Sys_data_object.P2.server_ip[i] / 100) + 0x30;
TlvValue.s.ValueServerIpPort[len++] = (Sys_data_object.P2.server_ip[i] / 10) % 10 + 0x30;
TlvValue.s.ValueServerIpPort[len++] = (Sys_data_object.P2.server_ip[i] % 10) + 0x30;
}
TlvValue.s.ValueServerIpPort[len++] = '.';
}
len--; //消除多余的点号
TlvValue.s.ValueServerIpPort[len++] = ':';
TlvValue.s.ValueServerIpPort[len++] = ((Sys_data_object.P2.server_port.datas) / 10000) + 0x30;
TlvValue.s.ValueServerIpPort[len++] = (((Sys_data_object.P2.server_port.datas) % 10000) / 1000) + 0x30;
TlvValue.s.ValueServerIpPort[len++] = (((Sys_data_object.P2.server_port.datas) % 1000) / 100) + 0x30;
TlvValue.s.ValueServerIpPort[len++] = (((Sys_data_object.P2.server_port.datas) % 100) / 10) + 0x30;
TlvValue.s.ValueServerIpPort[len++] = ((Sys_data_object.P2.server_port.datas) % 10) + 0x30;
TlvValue.s.ValueServerIpPort[len++] = 0;
//APN
for(int i = 0; i < Sys_data_object.P1.apn[1]; i++)
{
TlvValue.s.ValueAPN[i] = Sys_data_object.P1.apn[2 + i];
}
TlvValue.s.ValueWorkTime[0]=0;//水表运行时间-------------------------6
EepWrite(&TlvValue.data_buf[0], EEP_ADDR_SY_TLVDATA, TLV_VALUE_LEN, &s_sy_eep_complete);
tmp_init_stat = SY_STATE_S12;
}
break;
}
case SY_STATE_S12:
{
if (TASK_IDLE == EepIfIdle())
{
EepWrite(&Sys_data_object.P2.server_ip[0], EEP_UPDATE_UDP_IP, 6, &s_sy_eep_complete);//保存到UDP IP
tmp_init_stat = SY_STATE_S13;
}
break;
}
case SY_STATE_S13:
{
if (TASK_IDLE == EepIfIdle())
{
tmp_init_stat = SY_STATE_S0;
}
break;
}
default:
{
tmp_init_stat =SY_STATE_S0;
break;
}
}
EepMachineDriver();
}
//存储时间合法性判断
for(int i=0;i<6;i++)
{
if(Rtcc_Check_DateTime(&uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleDataTime) == ERROR)
{
uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleDataTime.s.year = 0x19;
uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleDataTime.s.month = 0x01;
uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleDataTime.s.day = 0x01;
uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleDataTime.s.weekday=0x01;
uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleDataTime.s.hour = 0x01;
uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleDataTime.s.minute= 0x01;
uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleDataTime.s.second= 0x01;
uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleCntStart = 0;
uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleCntEnd =0;
uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.ReadStart =0;
uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.ReadEnd =0;
}
}
step_ShenYangSOEMachine=SY_STATE_S0;
uSOE_Data_New=0;
uSOE_Data_Old=0;
uSOE_Valve_New=0;
uSOE_Valve_Old=0;
uSOE_Power_New=0;
uSOE_Power_Old=0;
uSOE_Temprature_New=0;
uSOE_Temprature_ShortNew=0;
uSOE_Temprature_ShortOld=0;
uSOE_Temprature_OpenNew=0;
uSOE_Temprature_OpenOld=0;
uSOE_Update_Flag=0xFFFFFFFF;
}
/********************************************************************************
函数名SortMinToMax
说 明:大小排序
********************************************************************************/
void SortMinToMax(u32 *data, u8 data_len)
{
u8 i, j, len;
u32 *p;
u32 temp = 0;
p = data;
len = data_len;
for (j = 0; j < len - 1; j++)
{
for (i = 0; i < len - 1 - j; i++)
{
if (p[i] > p[i + 1])
{
temp = p[i];
p[i] = p[i + 1];
p[i + 1] = temp;
}
}
}
}
/********************************************************************************
函数名getSY_StoreCircleIndex
说 明:获取周期数据存储位置
********************************************************************************/
u8 getSY_StoreCircleIndex(void)
{
u8 i=0;
u8 new_index=0;
u8 temp_hour=0;
//获取当前时间
RtccGetDateTime(&uTempRtccTime_BCD);
//检测上半天或下半天
if(uTempRtccTime_BCD.s.hour>=0x12)
{
temp_hour = 0x12;
}
else
{
temp_hour = 0x00;
}
for(i=0;i<6;i++)
{
if((uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleDataTime.s.year == uTempRtccTime_BCD.s.year)
&&(uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleDataTime.s.month == uTempRtccTime_BCD.s.month)
&&(uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleDataTime.s.day == uTempRtccTime_BCD.s.day)
&&(uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleDataTime.s.hour == temp_hour))
{
new_index = (BCD2HEX(uTempRtccTime_BCD.s.hour) % 12)*2+BCD2HEX(uTempRtccTime_BCD.s.minute)/30;//根据时间计算当前应该存储的位置
//合法性判断,指针错误则初始话start和end
if((uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleCntEnd > 24)||
(uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleCntEnd < uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleCntStart)||
(uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleCntEnd != new_index))//存储位置和当前时间不对应,则重新初始该位置
{
uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleDataTime.s.year = uTempRtccTime_BCD.s.year;
uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleDataTime.s.month = uTempRtccTime_BCD.s.month;
uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleDataTime.s.day = uTempRtccTime_BCD.s.day;
uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleDataTime.s.hour = temp_hour;
uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleDataTime.s.minute= 0x00;
uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleDataTime.s.second= 0x00;
uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleCntStart = new_index;
uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleCntEnd = uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleCntStart;
uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.ReadStart = uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleCntStart;
uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.ReadEnd = uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleCntStart;
}
return i;
}
}
//如果没有查询到当天对应日期则按照已存储时间顺序递增新递增到的位置存储数量清0
//在重新上电的情况下,表计时间小于存储的时间,不会覆盖已存储时间
//出现这种情况的原因可能有:断过电RTC时间重置,校时往前或往后超过半天
for(new_index=0; new_index<6; new_index++)//使用无效的指针
{
if((uStoreIndex_SY.Data.Circle.CircleIndex[new_index].Data.CircleCntEnd > 24)||
(uStoreIndex_SY.Data.Circle.CircleIndex[new_index].Data.CircleCntStart > uStoreIndex_SY.Data.Circle.CircleIndex[new_index].Data.CircleCntEnd)||
(Rtcc_Check_DateTime(&uStoreIndex_SY.Data.Circle.CircleIndex[new_index].Data.CircleDataTime) == ERROR)||
(RtccCalculateDiffTime(&uStoreIndex_SY.Data.Circle.CircleIndex[new_index].Data.CircleDataTime, &uTempRtccTime_BCD)>0))
{
uStoreIndex_SY.Data.Circle.CircleIndex[new_index].Data.CircleDataTime.s.year = uTempRtccTime_BCD.s.year;
uStoreIndex_SY.Data.Circle.CircleIndex[new_index].Data.CircleDataTime.s.month = uTempRtccTime_BCD.s.month;
uStoreIndex_SY.Data.Circle.CircleIndex[new_index].Data.CircleDataTime.s.day = uTempRtccTime_BCD.s.day;
uStoreIndex_SY.Data.Circle.CircleIndex[new_index].Data.CircleDataTime.s.hour = temp_hour;
uStoreIndex_SY.Data.Circle.CircleIndex[new_index].Data.CircleDataTime.s.minute= 0x00;
uStoreIndex_SY.Data.Circle.CircleIndex[new_index].Data.CircleDataTime.s.second= 0x00;
uStoreIndex_SY.Data.Circle.CircleIndex[new_index].Data.CircleCntStart = (BCD2HEX(uTempRtccTime_BCD.s.hour) % 12)*2+BCD2HEX(uTempRtccTime_BCD.s.minute)/30;
uStoreIndex_SY.Data.Circle.CircleIndex[new_index].Data.CircleCntEnd = uStoreIndex_SY.Data.Circle.CircleIndex[new_index].Data.CircleCntStart;
uStoreIndex_SY.Data.Circle.CircleIndex[new_index].Data.ReadStart = uStoreIndex_SY.Data.Circle.CircleIndex[new_index].Data.CircleCntStart;
uStoreIndex_SY.Data.Circle.CircleIndex[new_index].Data.ReadEnd = uStoreIndex_SY.Data.Circle.CircleIndex[new_index].Data.CircleCntStart;
return new_index;
}
else
{
uUploadIndexTimeBuf[new_index] = get_mktime(&uStoreIndex_SY.Data.Circle.CircleIndex[new_index].Data.CircleDataTime);
}
}
SortMinToMax(uUploadIndexTimeBuf, new_index);//时间按大小排序
for(int index=0;index<6;index++)
{
if(uUploadIndexTimeBuf[0] == get_mktime(&uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleDataTime))
{
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleDataTime.s.year = uTempRtccTime_BCD.s.year;
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleDataTime.s.month = uTempRtccTime_BCD.s.month;
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleDataTime.s.day = uTempRtccTime_BCD.s.day;
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleDataTime.s.hour = temp_hour;
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleDataTime.s.minute= 0x00;
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleDataTime.s.second= 0x00;
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleCntStart = (BCD2HEX(uTempRtccTime_BCD.s.hour) % 12)*2+BCD2HEX(uTempRtccTime_BCD.s.minute)/30;
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleCntEnd = uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleCntStart;
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.ReadStart = uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleCntStart;
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.ReadEnd = uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleCntStart;
return index;
}
}
return 0;
}
/********************************************************************************
函数名ShenYang_CircleDataStore_proc
说 明:周期数据存储
累计流量单位为L/0.001M34字节无符号整数。
瞬时流量单位为0.01L/H4字节无符号整数。
电压单位为0.01V2字节无符号整数。
压力单位为10mbar/0.01kg/1KPa2字节无符号整数。
温度单位为0.01℃2字节有符号整数。
正向累计流量 4
负向累计流量 4
瞬时流量 4
压力 2
温度 2
********************************************************************************/
static int ShenYang_CircleDataStore_proc(void)
{
switch(step_CircleDataStore)
{
case SY_STATE_S0:
{
SY_U32_To_Float temp_float_data;
//获取当前流量
temp_float_data.gp22_u32 = Gp30CheckDataApp(2);
temp_Circle_data.Data.CurrentFlow = (u32)(temp_float_data.gp22_float*10);//(注意测试最大最小值)
//负向累计
temp_float_data.gp22_u32 = Gp30CheckDataApp(3);
temp_Circle_data.Data.CurrentFlowReverse = (u32)(temp_float_data.gp22_float*10);
//瞬时流量
temp_float_data.gp22_float = Gp30CheckDataApp(1); //瞬时流量 瞬时流量单位为0.01L/H4字节无符号整数。
temp_Circle_data.Data.InstantaneousFlow = (u32)(temp_float_data.gp22_float / (float)65536.00)*100;
//压力
temp_Circle_data.Data.Presure = 0;
//温度
temp_float_data.gp22_float = TempCheckValueApp();
if(temp_float_data.gp22_float<0)
{
temp_Circle_data.Data.Temprature = (~(u16)(-temp_float_data.gp22_float*100))|0x8000;
}
else
{
temp_Circle_data.Data.Temprature = ((u16)(temp_float_data.gp22_float*100));
}
step_CircleDataStore = SY_STATE_S1;
break;
}
case SY_STATE_S1://存储数据
{
if(TASK_IDLE == EepIfIdle())
{
uStoreCircleIndex_SY = getSY_StoreCircleIndex();
uTemp_ee_addr = EEP_ADDR_SY_STORE_CIRCLE + //周期数据基地址
(uStoreCircleIndex_SY*STORE_SIZE_DATA_CIRCLE*24)+ //每半天偏移地址长度
uStoreIndex_SY.Data.Circle.CircleIndex[uStoreCircleIndex_SY].Data.CircleCntEnd*STORE_SIZE_DATA_CIRCLE; //当前半天偏移位置
EepWrite(temp_Circle_data.data_buf, uTemp_ee_addr, STORE_SIZE_DATA_CIRCLE, &uTempMsg_EE);
step_CircleDataStore = SY_STATE_S2;
}
break;
}
case SY_STATE_S2: //存储指针
{
if(TASK_IDLE == EepIfIdle())
{
uStoreIndex_SY.Data.Circle.CircleIndex[uStoreCircleIndex_SY].Data.CircleCntEnd++;
if(uStoreIndex_SY.Data.Circle.CircleIndex[uStoreCircleIndex_SY].Data.CircleCntEnd>=24)
{
uStoreIndex_SY.Data.Circle.CircleIndex[uStoreCircleIndex_SY].Data.CircleCntEnd = 24;
}
uStoreIndex_SY.Data.Circle.CircleIndex[uStoreCircleIndex_SY].Data.ReadEnd = uStoreIndex_SY.Data.Circle.CircleIndex[uStoreCircleIndex_SY].Data.CircleCntEnd;
/*当CircleCntEnd++到24时禁止归0而是在下次存储调用getSY_StoreCircleIndex的时候重新切换存储块*/
EepWrite(&uStoreIndex_SY.Data.Circle.CircleIndex[uStoreCircleIndex_SY].data_buf[0], EEP_ADDR_SY_STORE_INDEX_CIRCLE+uStoreCircleIndex_SY*11, 11, &uTempMsg_EE);
step_CircleDataStore = SY_STATE_S3;
}
break;
}
case SY_STATE_S3:
{
if(TASK_IDLE == EepIfIdle())
{
step_CircleDataStore = SY_STATE_S0;
return 1;
}
break;
}
default:
{
step_CircleDataStore = SY_STATE_S0;
break;
}
}
return 0;
}
//清除已经上报成功的索引;保留时间,ReadStart和ReadEnd以备读取周期数据使用
int ShenYang_CircleDataStore_ClearUploadIndex(u8 index)
{
if(TASK_IDLE == EepIfIdle())
{
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleCntStart=uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleCntEnd;
EepWrite(&uStoreIndex_SY.Data.Circle.CircleIndex[index].data_buf[7], EEP_ADDR_SY_STORE_INDEX_CIRCLE+index*11+7, 2, &uTempMsg_EE);
return 1;
}
return 0;
}
/********************************************************************************
函数名ShenYang_FrozenDataStore_proc
说 明:冻结数据存储,
0点存储日冻结数据\
半小时的间隔流量\
日最高流速\
日最高水温\
日最低水温\
报警状态字\
时间年月日
日期 3
时间 3
正向累计流量 4
负向累计流量 4
峰值流量 4
峰值流量时间 3
电池电压 6
水表状态 1
水表故障 1
阀门状态 1
预留 1
校验和 1
总字节数 32
********************************************************************************/
static int ShenYang_FrozenDataStore_proc(TYP_STATE_SY StoreType)
{
switch(step_FrozenDataStore)
{
case SY_STATE_S0:
{
u8 temp_index = 0;
SY_U32_To_Float temp_float_data;
RTCC_HISTORY_DATA temp_his_data;
RtccGetDateTime(&uTempRtccTime_BCD);
//冻结日期时间
temp_frozen_data.Data.FrozenDataTime.s.year = uTempRtccTime_BCD.s.year;
temp_frozen_data.Data.FrozenDataTime.s.month = uTempRtccTime_BCD.s.month;
temp_frozen_data.Data.FrozenDataTime.s.day = uTempRtccTime_BCD.s.day;
temp_frozen_data.Data.FrozenDataTime.s.hour = uTempRtccTime_BCD.s.hour;
temp_frozen_data.Data.FrozenDataTime.s.minute = uTempRtccTime_BCD.s.minute;
temp_frozen_data.Data.FrozenDataTime.s.second = uTempRtccTime_BCD.s.second;
//获取当前流量
temp_float_data.gp22_u32 = Gp30CheckDataApp(2);
temp_frozen_data.Data.CurrentFlow = (u32)(temp_float_data.gp22_float*10);//(注意测试最大最小值)
//负向累计
temp_float_data.gp22_u32 = Gp30CheckDataApp(3);
temp_frozen_data.Data.CurrentFlowReverse = (u32)(temp_float_data.gp22_float*10);
//获取日最高流速
RtccCheck_Hight_Flow(&pTempBuf_DailyHighestFlow);
for(temp_index = 0; temp_index <14 ;temp_index++)
{
temp_his_data.byte[temp_index] = *(pTempBuf_DailyHighestFlow+temp_index);
}
temp_frozen_data.Data.PeakCurrentFlow = temp_his_data.s.most_high_flow;//(temp_his_data.s.most_high_flow/10)*60;//原存储格式386~38.6L/min
temp_frozen_data.Data.PeakCurrentFlowTime[0] = temp_his_data.byte[8];//最高流速起始时间:hour
temp_frozen_data.Data.PeakCurrentFlowTime[1] = temp_his_data.byte[7];//最高流速起始时间:minute
temp_frozen_data.Data.PeakCurrentFlowTime[2] = temp_his_data.byte[6];//最高流速起始时间:second
//电池电压
for(temp_index = 0; temp_index <6 ;temp_index++)
{
temp_frozen_data.Data.BatPower[temp_index] = 0;
}//选一组电池电压-----------------
temp_frozen_data.Data.BatPower[0] = PowerCheckValueSys()&0xFF;
temp_frozen_data.Data.BatPower[1] = (PowerCheckValueSys()>>8)&0xFF;
//水表状态
temp_frozen_data.Data.MeterState = 0;//0为正常按实计自己定义有用状态
//水表故障
temp_frozen_data.Data.MeterFault = 0;//0为正常按实计自己定义有用故障信息
//阀门状态
temp_frozen_data.Data.ValveState = 0;
if(Sys_data_object.P1.ies_valve_paras.valve_err)
{
temp_frozen_data.Data.ValveState = 0xFF;
}
else
{
#if defined(VALVE)
if(VALVE_STATE_CLOSE == ValveGetStateApp())
{
temp_frozen_data.Data.ValveState = 0x99;
}
else if(VALVE_STATE_OPEN == ValveGetStateApp())
{
temp_frozen_data.Data.ValveState = 0x55;
}
#endif
}
//预留字节
temp_frozen_data.Data.Reverse =0x99;
//校验和
temp_frozen_data.Data.CheckSum = 0;
for(temp_index = 0; temp_index<(STORE_SIZE_DATA_FROZEN-1); temp_index++)
{
temp_frozen_data.Data.CheckSum += temp_frozen_data.data_buf[temp_index];
}
step_FrozenDataStore = StoreType;
break;
}
case SY_STATE_S10://存储数据:日冻结
{
if(TASK_IDLE == EepIfIdle())
{
if(uStoreIndex_SY.Data.Daily>=7)
{
uStoreIndex_SY.Data.Daily = 0;
}
EepWrite(temp_frozen_data.data_buf, EEP_ADDR_SY_STORE_FROZEN_DAILY + uStoreIndex_SY.Data.Daily*32, 32, &uTempMsg_EE);
step_FrozenDataStore = SY_STATE_S11;
}
break;
}
case SY_STATE_S11: //存储指针:日冻结指针
{
if(TASK_IDLE == EepIfIdle())
{
uStoreIndex_SY.Data.Daily++;//下次要存的位置
EepWrite(&uStoreIndex_SY.Data.Daily, EEP_ADDR_SY_STORE_INDEX_DAILY, 1, &uTempMsg_EE);
step_FrozenDataStore = SY_STATE_S1;
}
break;
}
case SY_STATE_S20://存储数据:月冻结
{
if(TASK_IDLE == EepIfIdle())
{
if(uStoreIndex_SY.Data.Month >=18)
{
uStoreIndex_SY.Data.Month = 0;
}
EepWrite(temp_frozen_data.data_buf, EEP_ADDR_SY_STORE_FROZEN_MONTH + uStoreIndex_SY.Data.Month*32, 32, &uTempMsg_EE);
step_FrozenDataStore = SY_STATE_S21;
}
break;
}
case SY_STATE_S21: //存储指针:月冻结指针
{
if(TASK_IDLE == EepIfIdle())
{
uStoreIndex_SY.Data.Month++;//下次要存的位置
EepWrite(&uStoreIndex_SY.Data.Month, EEP_ADDR_SY_STORE_INDEX_MONTH, 1, &uTempMsg_EE);
step_FrozenDataStore = SY_STATE_S1;
}
break;
}
case SY_STATE_S30://存储数据:年冻结
{
if(TASK_IDLE == EepIfIdle())
{
if(uStoreIndex_SY.Data.Year>=6)
{
uStoreIndex_SY.Data.Year = 0;
}
EepWrite(temp_frozen_data.data_buf, EEP_ADDR_SY_STORE_FROZEN_YEAR + uStoreIndex_SY.Data.Year*32, 32, &uTempMsg_EE);
step_FrozenDataStore = SY_STATE_S31;
}
break;
}
case SY_STATE_S31: //存储指针:年冻结指针
{
if(TASK_IDLE == EepIfIdle())
{
uStoreIndex_SY.Data.Year++;//下次要存的位置
EepWrite(&uStoreIndex_SY.Data.Year, EEP_ADDR_SY_STORE_INDEX_YEAR, 1, &uTempMsg_EE);
step_FrozenDataStore = SY_STATE_S1;
}
break;
}
case SY_STATE_S1:
{
if(TASK_IDLE == EepIfIdle())
{
step_FrozenDataStore = SY_STATE_S0;
return SY_STATE_S1;
}
break;
}
default:
{
step_FrozenDataStore = SY_STATE_S0;
break;
}
}
return 0;
}
//冻结数据和周期数据的清除
static int ShenYang_StoreDataClear_proc(TYP_STATE_SY StoreType)
{
switch(step_FrozenDataClear)
{
case SY_STATE_S0:
{
uClearDataLen =0;
step_FrozenDataClear = StoreType;
break;
}
case SY_STATE_S10://清除冻结数据
{
if(TASK_IDLE == EepIfIdle())
{
memset(s_sy_clear_history_buf,0,sizeof(s_sy_clear_history_buf));
EepWrite(s_sy_clear_history_buf, EEP_ADDR_SY_STORE_FROZEN_DAILY + uClearDataLen*CLEAR_HIS_BUF_LEN, CLEAR_HIS_BUF_LEN, &uTempMsg_EE);
step_FrozenDataClear = SY_STATE_S11;
}
break;
}
case SY_STATE_S11:
{
if(TASK_IDLE == EepIfIdle())
{
uClearDataLen++;
if((uClearDataLen+1)*CLEAR_HIS_BUF_LEN < EEP_DATA_LEN_FROZEN)
{
step_FrozenDataClear = SY_STATE_S10;
}
else
{
memset(s_sy_clear_history_buf,0,sizeof(s_sy_clear_history_buf));
EepWrite(s_sy_clear_history_buf, EEP_ADDR_SY_STORE_FROZEN_DAILY + uClearDataLen*CLEAR_HIS_BUF_LEN, (EEP_DATA_LEN_FROZEN%CLEAR_HIS_BUF_LEN), &uTempMsg_EE);
uStoreIndex_SY.Data.Daily = 0;
uStoreIndex_SY.Data.Month = 0;
uStoreIndex_SY.Data.Year = 0;
step_FrozenDataClear = SY_STATE_S12;
}
}
break;
}
case SY_STATE_S12://清除冻结数据存储指针
{
if(TASK_IDLE == EepIfIdle())
{
memset(s_sy_clear_history_buf,0,sizeof(s_sy_clear_history_buf));
EepWrite(s_sy_clear_history_buf, EEP_ADDR_SY_STORE_INDEX_DAILY, 3, &uTempMsg_EE);
step_FrozenDataClear = SY_STATE_S0;
return 1;
}
break;
}
case SY_STATE_S20://清除周期数据
{
if(TASK_IDLE == EepIfIdle())
{
memset(s_sy_clear_history_buf,0,sizeof(s_sy_clear_history_buf));
EepWrite(s_sy_clear_history_buf, EEP_ADDR_SY_STORE_CIRCLE + uClearDataLen*CLEAR_HIS_BUF_LEN, CLEAR_HIS_BUF_LEN, &uTempMsg_EE);
step_FrozenDataClear = SY_STATE_S21;
}
break;
}
case SY_STATE_S21:
{
if(TASK_IDLE == EepIfIdle())
{
uClearDataLen++;
if((uClearDataLen+1)*CLEAR_HIS_BUF_LEN < EEP_DATA_LEN_CIRCLE)
{
step_FrozenDataClear = SY_STATE_S20;
}
else
{
memset(s_sy_clear_history_buf,0,sizeof(s_sy_clear_history_buf));
EepWrite(s_sy_clear_history_buf, EEP_ADDR_SY_STORE_CIRCLE + uClearDataLen*CLEAR_HIS_BUF_LEN, (EEP_DATA_LEN_CIRCLE%CLEAR_HIS_BUF_LEN), &uTempMsg_EE);
for(int index=0; index<6; index++)
{
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleDataTime.s.year = 0x00;
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleDataTime.s.month = 0x00;
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleDataTime.s.day = 0x00;
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleDataTime.s.hour = 0x00;
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleDataTime.s.minute = 0x00;
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleDataTime.s.second = 0x00;
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleDataTime.s.weekday = 0x00;
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleCntStart = 0;
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleCntEnd = 0;
//清除读取索引
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.ReadStart = 0;
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.ReadEnd = 0;
}
step_FrozenDataClear = SY_STATE_S22;
}
}
break;
}
case SY_STATE_S22://清除周期数据存储指针
{
if(TASK_IDLE == EepIfIdle())
{
memset(s_sy_clear_history_buf,0,sizeof(s_sy_clear_history_buf));
EepWrite(s_sy_clear_history_buf, EEP_ADDR_SY_STORE_INDEX_CIRCLE, 66, &uTempMsg_EE);
step_FrozenDataClear = SY_STATE_S0;
return 1;
}
break;
}
case SY_STATE_S30://清除报警事件
{
if(TASK_IDLE == EepIfIdle())
{
memset(s_sy_clear_history_buf,0,sizeof(s_sy_clear_history_buf));
EepWrite(s_sy_clear_history_buf, EEP_ADDR_SOE_BASE + uClearDataLen*CLEAR_HIS_BUF_LEN, CLEAR_HIS_BUF_LEN, &uTempMsg_EE);
step_FrozenDataClear = SY_STATE_S31;
}
break;
}
case SY_STATE_S31:
{
if(TASK_IDLE == EepIfIdle())
{
uClearDataLen++;
if((uClearDataLen+1)*CLEAR_HIS_BUF_LEN < EEP_DATA_LEN_SOE)
{
step_FrozenDataClear = SY_STATE_S30;
}
else
{
memset(s_sy_clear_history_buf,0,sizeof(s_sy_clear_history_buf));
EepWrite(s_sy_clear_history_buf, EEP_ADDR_SOE_BASE + uClearDataLen*CLEAR_HIS_BUF_LEN, (EEP_DATA_LEN_SOE%CLEAR_HIS_BUF_LEN), &uTempMsg_EE);
step_FrozenDataClear = SY_STATE_S0;
return 1;
}
}
break;
}
default:
{
step_FrozenDataClear = SY_STATE_S0;
break;
}
}
return 0;
}
/********************************************************************************
ShenYang_Store_Machine
说 明:沈阳数据存储状态机
********************************************************************************/
void ShenYang_Store_Machine(void)
{
switch(step_ShenYangStoreMachine)
{
case SY_STATE_S0://数据存储消息判断
{
if (RtccCheckMsgApp(RtccMsg_OtherProtl))
{
RtccClearMsgApp(RtccMsg_OtherProtl);
FrameSetMsgApp(MsgShenYang_WarningCheck);
RtccGetDateTime(&sy_protl_rtcc_time);
if((sy_protl_rtcc_time.s.hour==0)&&(sy_protl_rtcc_time.s.minute==1))//每月1号0点1分存储月冻结数据
{
FrameSetMsgApp(MsgShenYang_DailySave);//沈阳日冻结数据存储
if(sy_protl_rtcc_time.s.day == 1)
{
FrameSetMsgApp(MsgShenYang_MonthSave);//沈阳月冻结数据存储
if(sy_protl_rtcc_time.s.month == 1)
{
FrameSetMsgApp(MsgShenYang_YearSave);//沈阳年冻结数据存储
}
}
}
if((sy_protl_rtcc_time.s.minute==0x00)||(sy_protl_rtcc_time.s.minute==0x30))
{
FrameSetMsgApp(MsgShenYang_CircleSave);//周期数据存储
}
if (sy_protl_rtcc_time.s.hour == 0)//零点
{
FrameSetMsgApp(MsgShenYang_WarningStoreReset);//重置报警存储标志
}
}
if(FrameCheckMsgApp(MsgShenYang_DailySave))//日冻结存储消息
{
FrameClearMsgApp(MsgShenYang_DailySave); //清消息
step_ShenYangStoreMachine = SY_STATE_S1;
}
else if(FrameCheckMsgApp(MsgShenYang_MonthSave))//月冻结存储消息
{
FrameClearMsgApp(MsgShenYang_MonthSave);
step_ShenYangStoreMachine = SY_STATE_S2;
}
else if(FrameCheckMsgApp(MsgShenYang_YearSave))//年冻结存储消息
{
FrameClearMsgApp(MsgShenYang_YearSave);
step_ShenYangStoreMachine = SY_STATE_S3;
}
else if(FrameCheckMsgApp(MsgShenYang_CircleSave))//周期数据存储消息
{
FrameClearMsgApp(MsgShenYang_CircleSave);
step_ShenYangStoreMachine = SY_STATE_S4;
}
else if(FrameCheckMsgApp(MsgShenYang_CircleClear))//周期数据清除
{
FrameClearMsgApp(MsgShenYang_CircleClear);
step_ShenYangStoreMachine = SY_STATE_S6;
}
else if(FrameCheckMsgApp(MsgShenYang_WarningClear))//报警数据清除
{
uSOE_Update_Flag=0xFFFFFFFF; //清除标志,当天重复的报警可以再次记录
FrameClearMsgApp(MsgShenYang_WarningClear);
step_ShenYangStoreMachine = SY_STATE_S7;
}
else if(FrameCheckMsgApp(MsgShenYang_FrozenClear))//冻结数据清除
{
FrameClearMsgApp(MsgShenYang_FrozenClear);
SaveNewSoe(SOE_SY_FROZEN_CLEAR,SOE_REMARK_NOR);//冻结数据清空
step_ShenYangStoreMachine = SY_STATE_S5;
}
else if(FrameCheckMsgApp(MsgShenYang_FactorySettingAndReset))//恢复出厂设置
{
FrameClearMsgApp(MsgShenYang_FactorySettingAndReset);
step_ShenYangStoreMachine = SY_STATE_S8;
}
else if(FrameCheckMsgApp(MsgShenYang_SysReset))//系统重启
{
FrameClearMsgApp(MsgShenYang_SysReset);
step_ShenYangStoreMachine = SY_STATE_S8;
}
break;
}
case SY_STATE_S1://日冻结数据存储
{
if(ShenYang_FrozenDataStore_proc(SY_STATE_S10) == 1)
{
step_ShenYangStoreMachine = SY_STATE_S0;
}
break;
}
case SY_STATE_S2://月冻结数据存储
{
if(ShenYang_FrozenDataStore_proc(SY_STATE_S20) == 1)
{
step_ShenYangStoreMachine = SY_STATE_S0;
}
break;
}
case SY_STATE_S3://年冻结数据存储
{
if(ShenYang_FrozenDataStore_proc(SY_STATE_S30) == 1)
{
step_ShenYangStoreMachine = SY_STATE_S0;
}
break;
}
case SY_STATE_S4://周期数据存储
{
if(ShenYang_CircleDataStore_proc() == 1)
{
//RtccAdjustDateTime(1,1800-5);//往后校时半小时,测试使用
step_ShenYangStoreMachine = SY_STATE_S0;
}
break;
}
case SY_STATE_S5:
{
if(ShenYang_StoreDataClear_proc(SY_STATE_S10) == 1)//清冻结数据
{
step_ShenYangStoreMachine = SY_STATE_S0;
}
break;
}
case SY_STATE_S6:
{
if(ShenYang_StoreDataClear_proc(SY_STATE_S20) == 1)//清周期数据
{
step_ShenYangStoreMachine = SY_STATE_S0;
}
break;
}
case SY_STATE_S7:
{
if(ShenYang_StoreDataClear_proc(SY_STATE_S30) == 1)//清报警数据
{
step_ShenYangStoreMachine = SY_STATE_S0;
}
break;
}
case SY_STATE_S8://暂不使用恢复出厂设置
{
if (TASK_IDLE == EepIfIdle())
{
NVIC_SystemReset();
step_ShenYangStoreMachine = SY_STATE_S0;
}
break;
}
default:
{
step_ShenYangStoreMachine = SY_STATE_S0;
break;
}
}
}
//计算上报总包数
u8 getSY_CircleUploadPackets(void)
{
u8 temp_count=0;
u32 temp_time=0;
for(int i=0;i<6;i++)
{
uUploadIndexTimeBuf[i] = 0;
}
for(int index=0; index<6; index++)
{
if(uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleCntEnd <= 24) //合法性判断
{
if(uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleCntStart < uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleCntEnd)
{
uUploadIndexTimeBuf[temp_count] = get_mktime(&uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleDataTime);
temp_count++;
}
}
}
SortMinToMax(uUploadIndexTimeBuf, temp_count);//时间按大小排序
for(int j=0; j<temp_count; j++)//根据时间大小排序索引
{
for(int index=0;index<6;index++)
{
temp_time = get_mktime(&uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleDataTime);
if(temp_time == uUploadIndexTimeBuf[j])
{
uUploadIndexBuf[j] = index;
}
}
}
return temp_count;
}
//获取当前要上报数据包索引
u8 getSY_ThisCirclePacket_Index(u8 current_packet)
{
if(current_packet < 6)
{
return uUploadIndexBuf[current_packet];
}
return 0;
}
//获取当前要上报数据包数据
int NB_SY_Frame_Upload_Data(u8 index, u8 *pBuf)
{
switch(SY_CircleUploadStep)
{
case SY_STATE_S0://计算当前包位置,获取当前要上报数据
{
if(TASK_IDLE == EepIfIdle())
{
SY_ThisPack_Count = uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleCntEnd-
uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleCntStart;
EepRead(EEP_ADDR_SY_STORE_CIRCLE + index*16*24 + uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleCntStart*16, pBuf, 16*SY_ThisPack_Count, &uTempMsg_EE);
SY_CircleUploadStep = SY_STATE_S1;
}
}
break;
case SY_STATE_S1:
{
if(TASK_IDLE == EepIfIdle())
{
SY_CircleUploadStep =SY_STATE_S0;
return SY_ThisPack_Count;
}
}
break;
default:
{
SY_CircleUploadStep = SY_STATE_S0;
}
break;
}
return 0;
}
//获取最近几天的存储总包数和包号
u8 getSY_CircleDataPackets(u8 readDays, u8 *pIndexBuf)
{
u8 temp_packet_cnt=0;//总包数,局部变量
DateTime start_time;
DateTime end_time;
time_t sec_start,sec_end,sec_circle;//临时变量,时间转成秒数
start_time = getBackDateTime(readDays);//获取起始时间
RtccGetDateTime(&end_time);//获取当前时间,结束时间
sec_start = get_mktime(&start_time);
sec_end = get_mktime(&end_time);
for(int i=0;i<6;i++)
{
sec_circle = get_mktime(&uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.CircleDataTime);
if((uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.ReadEnd<=24)&&
(uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.ReadEnd>uStoreIndex_SY.Data.Circle.CircleIndex[i].Data.ReadStart))//判断存储指针是否有效
{
if((sec_circle >= sec_start) && (sec_circle <= sec_end)) //判断时间是否有效
{
*pIndexBuf++ = i;
temp_packet_cnt++;
}
}
}
return temp_packet_cnt;
}
/*******************************************************************************
* @fun_name: NB_SY_Frame_Upload_CurrentData
* @brief : 上报当前表数据
* @param[in] : None
* @param[out]: None
* @retval : None
* @other : 联调测试平台接收到的数据需要非加密平台应答数据时间返回的是HEX格式
******************************************************************************/
int NB_SY_Frame_Upload_CurrentData(u8 *pBuf)
{
UNION_4U8TOU32 tmp_datas_buf;
SY_U32_To_Float temp_float_data;
*pBuf++ = 1; //总包数 1字节
*pBuf++ = 1; //当前包序号 1字节
RtccGetDateTime(&uTempRtccTime_BCD);
//起始日期 3字节
*pBuf++ = BCD2HEX(uTempRtccTime_BCD.s.year);
*pBuf++ = BCD2HEX(uTempRtccTime_BCD.s.month);
*pBuf++ = BCD2HEX(uTempRtccTime_BCD.s.day);
//起始时间 3字节
*pBuf++ = BCD2HEX(uTempRtccTime_BCD.s.hour);
*pBuf++ = BCD2HEX(uTempRtccTime_BCD.s.minute);
*pBuf++ = BCD2HEX(uTempRtccTime_BCD.s.second);
*pBuf++ = 6; //6:表示30分钟5x6时间间隔1字节
*pBuf++ = 1; //数据条数1字节
temp_float_data.gp22_u32 = Gp30CheckDataApp(2); //正向累计流量 累计流量单位为L/0.001M34字节无符号整数。
tmp_datas_buf.datas = (u32)(temp_float_data.gp22_float*10);
*pBuf++ = tmp_datas_buf.data_buf[0];//小数位
*pBuf++ = tmp_datas_buf.data_buf[1];
*pBuf++ = tmp_datas_buf.data_buf[2];
*pBuf++ = tmp_datas_buf.data_buf[3];//小数位
temp_float_data.gp22_u32 = Gp30CheckDataApp(3); //反向累计流量
tmp_datas_buf.datas = (u32)(temp_float_data.gp22_float*10);
*pBuf++ = tmp_datas_buf.data_buf[0];//小数位
*pBuf++ = tmp_datas_buf.data_buf[1];
*pBuf++ = tmp_datas_buf.data_buf[2];
*pBuf++ = tmp_datas_buf.data_buf[3];//小数位
temp_float_data.gp22_float = Gp30CheckDataApp(GP30_APP_INS_FLOW); //瞬时流量 瞬时流量单位为0.01L/H4字节无符号整数。
tmp_datas_buf.datas = (u32)(temp_float_data.gp22_float / (float)65536.00)*100;
*pBuf++ = tmp_datas_buf.data_buf[0];
*pBuf++ = tmp_datas_buf.data_buf[1];
*pBuf++ = tmp_datas_buf.data_buf[2];//小数位
*pBuf++ = tmp_datas_buf.data_buf[3];
//tmp_datas_buf_yali.datas = 210; //测试大表返回压力 压力单位为10mbar/0.01kg/1KPa2字节无符号整数。
*pBuf++ = 0; //压力
*pBuf++ = 0;
//温度 温度单位为0.01℃2字节有符号整数
float tmep = TempCheckValueApp(); //
//tmep = -12.03; //测试
if(tmep <0)
{
tmp_datas_buf.datas = (u16)(tmep*(-100));
tmp_datas_buf.datas &= 0x0FFF;
tmp_datas_buf.datas = ~tmp_datas_buf.datas;
tmp_datas_buf.datas |= 0x8000;
}
else
{
tmp_datas_buf.datas = (u16)(tmep*(100));
}
*pBuf++ = tmp_datas_buf.datas_map.data0; //温度
*pBuf++ = tmp_datas_buf.datas_map.data1;
return 26;
}
/********************************************************************************
函数名SY_GetCircleDateTime
说 明:获取数据包的起始时间
********************************************************************************/
void SY_GetCircleDateTime(DateTime *pDT, u8 index, u8 UploadOrRead)
{
u8 temp_hour=0;
u8 temp_minute=0;
u32 temp_second=0;
pDT->s.year = uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleDataTime.s.year;
pDT->s.month = uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleDataTime.s.month;
pDT->s.day = uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleDataTime.s.day;
pDT->s.hour = uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleDataTime.s.hour;
pDT->s.minute = uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleDataTime.s.minute;
pDT->s.second = uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleDataTime.s.second;
if(UploadOrRead == 0)//上报周期数据使用
{
temp_second = uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.CircleCntStart*30*60;
}
else//读取周期数据使用
{
temp_second = uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.ReadStart*30*60;
}
temp_hour = (temp_second/3600)%12;
temp_minute = (temp_second/60)%60;
pDT->s.hour = HEX2BCD(BCD2HEX(pDT->s.hour)+temp_hour);
pDT->s.minute = HEX2BCD(BCD2HEX(pDT->s.minute)+temp_minute);
}
//根据包号获取存储指针的起始和结束位置
u8 SY_GetCircleReadStartEnd(u8 index, u8 StartOrEnd)
{
if(StartOrEnd == 0)
{
return uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.ReadStart;
}
else
{
return uStoreIndex_SY.Data.Circle.CircleIndex[index].Data.ReadEnd;
}
}
/********************************************************************************
函数名get_SY_StorePara
说 明:获取沈阳数据存储当前指针
********************************************************************************/
u8 get_SY_StorePara(SY_ParaTypeDef paraType)
{
switch(paraType)
{
case SY_StoreCurIndex_Daily://日冻结存储指针
{
return uStoreIndex_SY.Data.Daily;
}
case SY_StoreCurIndex_Month://月冻结存储指针
{
return uStoreIndex_SY.Data.Month;
}
case SY_StoreCurIndex_Year://年冻结存储指针
{
return uStoreIndex_SY.Data.Year;
}
default:
break;
}
return 0;
}
/****************************************************************
Function: u16 Gp30CheckErrDataApp (void)
Description: 查询错误信息
Input:
Return:
Others:
Bit0:当前流量>Q4或者<Q1 GP30_low_high_flow
Bit1:水温超出温度等级范围 GP30_out_temp
Bit2:倒转 GP30_reverse_flow
Bit3:无水 GP30_no_water
Bit4:GP30异常 GP30_err
Bit5:低流量报警 GP30_low_flow
Bit6:换能器接受信号低(低振幅) GP30_low_amp;
Bit7:GP30通信异常 GP30_communication_err
Bit8:TOF overrun GP30_TOF_overrun
Bit9:水流方向 water_reverse
*****************************************************************/
u8 sy_rtc_time_overflow=0;//过流报警时间
u8 sy_rtc_time_reverseflow=0;//反流报警时间
u8 sy_rtc_time_leakflow=0;//漏水报警时间
u8 sy_rtc_time_nowater=0;//空管报警时间
//时间延迟置位
u16 Gp30CheckErrDataApp_ReWrite(void)
{
u16 temp_state=0;
u8 temp_data=0;
temp_state = Gp30CheckErrDataApp();
//流量超限
if(temp_state&0x0001)//gp30_event_flag.low_high_flow<<0
{
temp_state &=~0x0001;//先清除
sy_rtc_time_overflow += 1;//增加1分钟
if(GetTLVData(TagOverFlowMinute, LenOverFlowMinute, &temp_data))
{
if(sy_rtc_time_overflow>temp_data)
{
temp_state |=0x0001;//满足条件再置起
}
}
}
else
{
sy_rtc_time_overflow = 0;
}
//反流报警
if(temp_state&0x0004)//gp30_event_flag.low_high_flow<<0
{
temp_state &=~0x0004;
sy_rtc_time_reverseflow += 1;
if(GetTLVData(TagReverseFlowMinute, LenReverseFlowMinute, &temp_data))
{
if(sy_rtc_time_reverseflow>temp_data)
{
temp_state |=0x0004;
}
}
}
else
{
sy_rtc_time_reverseflow = 0;
}
//漏水报警
if(temp_state&0x0020)//gp30_event_flag.low_high_flow<<0
{
temp_state &=~0x0020;
sy_rtc_time_leakflow += 1;
if(GetTLVData(TagLeakFlowMinute, LenLeakFlowMinute, &temp_data))
{
if(sy_rtc_time_leakflow>temp_data)
{
temp_state |=0x0020;
}
}
}
else
{
sy_rtc_time_leakflow = 0;
}
//空管报警
if(temp_state&0x0008)//gp30_event_flag.low_high_flow<<0
{
temp_state &=~0x0008;
sy_rtc_time_nowater += 1;
if(GetTLVData(TagNoWaterMinute, LenNoWaterMinute, &temp_data))
{
if(sy_rtc_time_nowater>temp_data)
{
temp_state |=0x0008;
}
}
}
else
{
sy_rtc_time_nowater = 0;
}
return temp_state;
}
u8 PowerCheckStatusSys_ReWrite(void)
{
UNION_2U8TOU16 temp_data;
u16 temp_power;
if(GetTLVData(TagPowerLow001V, LenPowerLow001V, &temp_data.data_buf[0]))
{
temp_power = PowerCheckValueSys();
if(temp_power < temp_data.datas)//数据转一下
{
return LOW_POWER;
}
}
return NORMAL_POWER;
}
void ShenYang_SOE_Machine(void)
{
switch(step_ShenYangSOEMachine)
{
case SY_STATE_S0:
{
if(FrameCheckMsgApp(MsgShenYang_WarningCheck))
{
FrameClearMsgApp(MsgShenYang_WarningCheck);
step_ShenYangSOEMachine =SY_STATE_S1;
}
if(FrameCheckMsgApp(MsgShenYang_WarningStoreReset))
{
FrameClearMsgApp(MsgShenYang_WarningStoreReset);
uSOE_Data_Old = 0;
uSOE_Temprature_ShortOld = 0;
uSOE_Temprature_OpenOld = 0;
uSOE_Update_Flag = 0xFFFFFFFF;
uWaterState =0;
}
}
break;
case SY_STATE_S1://报警事件消息判断
{
uSOE_Data_New = Gp30CheckErrDataApp_ReWrite();
#if defined(VALVE)
uSOE_Valve_New = ValveGetStateApp();
#endif
uSOE_Power_New = PowerCheckStatusSys_ReWrite();
uSOE_Temprature_New = TempCheckValueApp();
if(uSOE_Data_Old != uSOE_Data_New)
{
uSOE_Data_Old = uSOE_Data_New;
if((uSOE_Data_New&0x0001)&&(uSOE_Update_Flag&0x00000001))//gp30_event_flag.low_high_flow<<0
{
uSOE_Update_Flag &=~0x00000001;
SaveNewSoe(SOE_SY_OVER_FLOW,SOE_REMARK_NOR);//流量超限
if(checkWarningUploadState(UPLOAD_OVER_FLOW))
{
FrameSetMsgApp(MsgShenYang_NbUploadWarning);
}
FrameSetMsgApp(MsgShenYang_NbUploadWarningWithCircle);
uWaterState = SOE_SY_OVER_FLOW -1000;
}
if((uSOE_Data_New&0x0002)&&(uSOE_Update_Flag&0x00000002))//(gp30_event_flag.out_temp<<1)
{
uSOE_Update_Flag &=~0x00000002;
SaveNewSoe(SOE_SY_TEMP_OVER,SOE_REMARK_NOR);//温度超限
if(checkWarningUploadState(UPLOAD_TEMP_OVER))
{
FrameSetMsgApp(MsgShenYang_NbUploadWarning);
}
FrameSetMsgApp(MsgShenYang_NbUploadWarningWithCircle);
}
if((uSOE_Data_New&0x0004)&&(uSOE_Update_Flag&0x00000004))//(gp30_event_flag.reverse_flow<<2)
{
uSOE_Update_Flag &=~0x00000004;
SaveNewSoe(SOE_SY_REVERSE_FLOW,SOE_REMARK_NOR);//反流报警
if(checkWarningUploadState(UPLOAD_REVERSE_FLOW))
{
FrameSetMsgApp(MsgShenYang_NbUploadWarning);
}
FrameSetMsgApp(MsgShenYang_NbUploadWarningWithCircle);
uWaterState = SOE_SY_REVERSE_FLOW -1000;
}
if((uSOE_Data_New&0x0008)&&(uSOE_Update_Flag&0x00000008))//(gp30_event_flag.no_water<<3)
{
uSOE_Update_Flag &=~0x00000008;
SaveNewSoe(SOE_SY_NO_WATER,SOE_REMARK_NOR);//空管报警
if(checkWarningUploadState(UPLOAD_NO_WATER))
{
FrameSetMsgApp(MsgShenYang_NbUploadWarning);
}
FrameSetMsgApp(MsgShenYang_NbUploadWarningWithCircle);
}
if((uSOE_Data_New&0x0010)&&(uSOE_Update_Flag&0x00000010))//(gp30_event_flag.gp30_err<<4)
{
uSOE_Update_Flag &=~0x00000010;
SaveNewSoe(SOE_SY_CIRCLE_WRONG,SOE_REMARK_NOR);//电路故障
FrameSetMsgApp(MsgShenYang_NbUploadWarningWithCircle);
uWaterState = SOE_SY_CIRCLE_WRONG -1000;
}
if((uSOE_Data_New&0x0020)&&(uSOE_Update_Flag&0x00000020))//(gp30_event_flag.low_flow<<5)
{
uSOE_Update_Flag &=~0x00000020;
SaveNewSoe(SOE_SY_LEAK_FLOW,SOE_REMARK_NOR);//漏水报警
if(checkWarningUploadState(UPLOAD_LEAK_FLOW))
{
FrameSetMsgApp(MsgShenYang_NbUploadWarning);
}
FrameSetMsgApp(MsgShenYang_NbUploadWarningWithCircle);
}
if((uSOE_Data_New&0x0040)&&(uSOE_Update_Flag&0x00000040))//(gp30_event_flag.low_amp<<6)
{
uSOE_Update_Flag &=~0x00000040;
SaveNewSoe(SOE_SY_LOW_AMP,SOE_REMARK_NOR);//低振幅
}
if((uSOE_Data_New&0x0080)&&(uSOE_Update_Flag&0x00000080))//(gp30_event_flag.communication_err<<7)
{
uSOE_Update_Flag &=~0x00000080;
SaveNewSoe(SOE_SY_GP30_COMERR,SOE_REMARK_NOR);//GP30通信故障
FrameSetMsgApp(MsgShenYang_NbUploadWarningWithCircle);
uWaterState = SOE_SY_GP30_COMERR -1000;
}
if((uSOE_Data_New&0x0001)&&(uSOE_Update_Flag&0x00000100))//(gp30_event_flag.tof_overrun<<8)
{
uSOE_Update_Flag &=~0x00000100;
SaveNewSoe(SOE_SY_TOF_OVER,SOE_REMARK_NOR);//TOF跳变
}
if((uSOE_Data_New&0x0100)&&(uSOE_Update_Flag&0x00000200))//(gp30_event_flag.water_direction<<9)
{
uSOE_Update_Flag &=~0x00000200;
SaveNewSoe(SOE_SY_REVERSE_FLOW,SOE_REMARK_NOR);//反流报警
/*if(checkWarningUploadState(UPLOAD_REVERSE_FLOW))
{
FrameSetMsgApp(MsgShenYang_NbUploadWarning);
}*/
uWaterState = SOE_SY_REVERSE_FLOW -1000;
}
}
if(uSOE_Valve_Old != uSOE_Valve_New)
{
u8 tem_tlv_data[7];
uSOE_Valve_Old = uSOE_Valve_New;
RtccGetDateTime(&uTempRtccTime_BCD);//阀门动作时间
if(Sys_data_object.P1.ies_valve_paras.valve_err)
{
SaveNewSoe(SOE_SY_VALVE_ERR,SOE_REMARK_NOR);//阀门操作失败
tem_tlv_data[0] = 0xFF;
}
else
{
if(uSOE_Valve_New == VALVE_STATE_OPEN)
{
SaveNewSoe(SOE_SY_VALVE_OPEN,SOE_REMARK_NOR);//开阀
tem_tlv_data[0] = 0x55;
}
else if(uSOE_Valve_New == VALVE_STATE_CLOSE)
{
SaveNewSoe(SOE_SY_VALVE_CLOSE,SOE_REMARK_NOR);//关阀
tem_tlv_data[0] = 0x99;
}
}
if(checkWarningUploadState(UPLOAD_VALVE_CHANGE))
{
FrameSetMsgApp(MsgShenYang_NbUploadWarning);
}
FrameSetMsgApp(MsgShenYang_NbUploadWarningWithCircle);
tem_tlv_data[1] = uTempRtccTime_BCD.s.year;
tem_tlv_data[2] = uTempRtccTime_BCD.s.month;
tem_tlv_data[3] = uTempRtccTime_BCD.s.day;
tem_tlv_data[4] = uTempRtccTime_BCD.s.hour;
tem_tlv_data[5] = uTempRtccTime_BCD.s.minute;
tem_tlv_data[6] = uTempRtccTime_BCD.s.second;
SetTLVData(TagValveState, LenValveState, tem_tlv_data);//保存到TLV缓存
}
if(uSOE_Power_Old != uSOE_Power_New)
{
uSOE_Power_Old = uSOE_Power_New;
if((LOW_POWER == uSOE_Power_New)&&(uSOE_Update_Flag&0x00000400))
{
uSOE_Update_Flag &=~0x00000400;
SaveNewSoe(SOE_SY_LOW_POWER,SOE_REMARK_NOR);//低电压报警
if(checkWarningUploadState(UPLOAD_LOW_POWER))
{
FrameSetMsgApp(MsgShenYang_NbUploadWarning);
}
FrameSetMsgApp(MsgShenYang_NbUploadWarningWithCircle);
}
}
if(uSOE_Temprature_New == -1)
{
uSOE_Temprature_OpenNew = 1;
}
else if(uSOE_Temprature_New == 36)
{
uSOE_Temprature_ShortNew = 1;
}
step_ShenYangSOEMachine = SY_STATE_S2;
}
break;
case SY_STATE_S2://其他触发事件的处理
{
//获取当前时间
RtccGetDateTime(&uTempRtccTime_BCD);
//需要存eeprom
if( (uTempRtccTime_BCD.s.year == ValveActiveDateTime.s.year)&&
(uTempRtccTime_BCD.s.month == ValveActiveDateTime.s.month)&&
(uTempRtccTime_BCD.s.day == ValveActiveDateTime.s.day)&&
(uTempRtccTime_BCD.s.hour == ValveActiveDateTime.s.hour)&&
(uTempRtccTime_BCD.s.minute == ValveActiveDateTime.s.minute))
{
if (Valve_Active == 0x55) //开阀门
{
FrameSetMsgApp(ValveOpenMsg);
}
else if (Valve_Active == 0x99) //关阀门
{
FrameSetMsgApp(ValveCloseMsg);
}
else if(Valve_Active == 0xAA)//半开
{
FrameSetMsgApp(ValveHalfMsg);
}
}
step_ShenYangSOEMachine = SY_STATE_S0;
}
break;
default:
{
step_ShenYangSOEMachine = SY_STATE_S0;
break;
}
}
}
u8 getWaterState(void)
{
return uWaterState;
}
//TLV数据
u8 getTlvTagIndex(u8 inTag)
{
int index=0;
for(index=0;index<TLV_STR_BUF_LEN;index++)
{
if(TlvStrBuf[index].Tag == inTag)
{
return index;
}
}
return 0xFF;
}
u8 SetTLVData(u8 Tag, u8 Len, u8* pValue)
{
int index = getTlvTagIndex(Tag);
int i=0;
u8 temp_addr=0;
if(index != 0xFF)
{
if(Len == TlvStrBuf[index].Len)//长度判断
{
temp_addr = TlvStrBuf[index].ValueAddr;
for(i=0; i<TlvStrBuf[index].Len ;i++)
{
TlvValue.data_buf[temp_addr++] = *pValue++;
}
TlvStrBuf[index].EditFlag = 1;
if(tlv_store_cnt<=TLV_STR_BUF_LEN)
{
tlv_store_cnt++;
}
return SUCCESS_IES;
}
}
return ERROR_IES;
}
u8 GetTLVData(u8 Tag, u8 Len, u8* pValue)
{
int index = getTlvTagIndex(Tag);
int i=0;
u8 temp_addr=0;
if(TagWorkTime == TlvStrBuf[index].Tag)//更新表计运行时间
{
RtccGetDateTime(&uTempRtccTime_BCD);
TlvValue.s.ValueWorkTime[0] = uTempRtccTime_BCD.s.year;
TlvValue.s.ValueWorkTime[1] = uTempRtccTime_BCD.s.month;
TlvValue.s.ValueWorkTime[2] = uTempRtccTime_BCD.s.day;
TlvValue.s.ValueWorkTime[3] = uTempRtccTime_BCD.s.hour;
TlvValue.s.ValueWorkTime[4] = uTempRtccTime_BCD.s.minute;
TlvValue.s.ValueWorkTime[5] = uTempRtccTime_BCD.s.second;
}
if(index != 0xFF)
{
if(Len == TlvStrBuf[index].Len)//长度判断
{
temp_addr = TlvStrBuf[index].ValueAddr;
for(i=0; i<TlvStrBuf[index].Len ;i++)
{
*pValue++ = TlvValue.data_buf[temp_addr++];
}
return SUCCESS_IES;
}
}
return ERROR_IES;
}
/**
bit 含义
0 流量超限
1 空管报警
2 反流报警
3 漏水报警
4 低电压报警
5 温度超范围
6 上盖被打开
7 阀门动作
8-11 预留
12-15 厂家自定义
*/
u8 checkWarningUploadState(TypeDef_UploadWarning tWarningType)
{
UNION_2U8TOU16 temp_warning_id;
if(GetTLVData(TagWarningId, LenWarningId, &temp_warning_id.data_buf[0]))
{
if((temp_warning_id.datas>>tWarningType)&0x0001)
{
return 1;
}
}
return 0;
}
void ShenYang_TlvDataStoreMachine(void)
{
static u8 index_edit=0xFF;
switch(step_TlvDataStore)
{
case SY_STATE_S0:
{
if(FrameCheckMsgApp(MsgNbUploadFreqChange))
{
FrameClearMsgApp(MsgNbUploadFreqChange);
temp_tlv_data[0]=0;
temp_tlv_data[1]=Sys_data_object.P1.Time_upload_2006.s.hour;//小时
temp_tlv_data[2]=Sys_data_object.P1.Time_upload_2006.s.minute;//分钟
temp_tlv_data[3]=0;
SetTLVData(TagUploadStartTime, LenUploadStartTime, temp_tlv_data);
}
if(FrameCheckMsgApp(MsgShenYang_UdpIpPortChange))
{
int len=0;
FrameClearMsgApp(MsgShenYang_UdpIpPortChange);
//IP
for (int i = 0; i < 4; i++)
{
if (Sys_data_object.P2.server_ip[i] < 10)
{
temp_tlv_data[len++] = Sys_data_object.P2.server_ip[i] + 0x30;
}
else if (Sys_data_object.P2.server_ip[i] < 100)
{
temp_tlv_data[len++] = (Sys_data_object.P2.server_ip[i] / 10) + 0x30;
temp_tlv_data[len++] = (Sys_data_object.P2.server_ip[i] % 10) + 0x30;
}
else
{
temp_tlv_data[len++] = (Sys_data_object.P2.server_ip[i] / 100) + 0x30;
temp_tlv_data[len++] = (Sys_data_object.P2.server_ip[i] / 10) % 10 + 0x30;
temp_tlv_data[len++] = (Sys_data_object.P2.server_ip[i] % 10) + 0x30;
}
temp_tlv_data[len++] = '.';
}
len--; //消除多余的点号
temp_tlv_data[len++] = ':';
temp_tlv_data[len++] = ((Sys_data_object.P2.server_port.datas) / 10000) + 0x30;
temp_tlv_data[len++] = (((Sys_data_object.P2.server_port.datas) % 10000) / 1000) + 0x30;
temp_tlv_data[len++] = (((Sys_data_object.P2.server_port.datas) % 1000) / 100) + 0x30;
temp_tlv_data[len++] = (((Sys_data_object.P2.server_port.datas) % 100) / 10) + 0x30;
temp_tlv_data[len++] = ((Sys_data_object.P2.server_port.datas) % 10) + 0x30;
temp_tlv_data[len++] = 0;
SetTLVData(TagServerIpPort, LenServerIpPort, temp_tlv_data);
}
if(tlv_store_cnt>0)
{
step_TlvDataStore = SY_STATE_S1;
}
}
break;
case SY_STATE_S1://
{
if(TASK_IDLE == EepIfIdle())
{
for(int index=0; index<TLV_STR_BUF_LEN; index++)
{
if(TlvStrBuf[index].EditFlag == 1)
{
TlvStrBuf[index].EditFlag = 0;
index_edit = index;//缓存被编辑的标号
EepWrite(&TlvValue.data_buf[TlvStrBuf[index].ValueAddr], (EEP_ADDR_SY_TLVDATA+TlvStrBuf[index].ValueAddr), TlvStrBuf[index].Len, &s_sy_eep_complete);
break;
}
}
tlv_store_cnt--;//无论是否找到,都得减掉
step_TlvDataStore = SY_STATE_S2;
}
}
break;
case SY_STATE_S2://沈阳规约转存积成规约
{
if(TASK_IDLE == EepIfIdle())
{
GetTLVData(TlvStrBuf[index_edit].Tag, TlvStrBuf[index_edit].Len, temp_tlv_data);//获取tlv数据
if(TlvStrBuf[index_edit].Tag == TagValveState)//判断是否为阀控设置
{
if((temp_tlv_data[1]==0)&&(temp_tlv_data[2]==0)&&(temp_tlv_data[3]==0)&&
(temp_tlv_data[4]==0)&&(temp_tlv_data[5]==0)&&(temp_tlv_data[6]==0))
{
if (temp_tlv_data[0] == 0x55) //开阀门
{
FrameSetMsgApp(ValveOpenMsg);
}
else if (temp_tlv_data[0] == 0x99) //关阀门
{
FrameSetMsgApp(ValveCloseMsg);
}
else if(temp_tlv_data[0] == 0xAA)//半开
{
FrameSetMsgApp(ValveHalfMsg);
}
}
else
{
uTempRtccTime_BCD.s.year = temp_tlv_data[1];
uTempRtccTime_BCD.s.month = temp_tlv_data[2];
uTempRtccTime_BCD.s.day = temp_tlv_data[3];
uTempRtccTime_BCD.s.hour = temp_tlv_data[4];
uTempRtccTime_BCD.s.minute= temp_tlv_data[5];
uTempRtccTime_BCD.s.second= temp_tlv_data[6];
if(Rtcc_Check_DateTime(&uTempRtccTime_BCD) == SUCCESS)//判断时间是否合法
{
Valve_Active = temp_tlv_data[0];
ValveActiveDateTime.s.year = uTempRtccTime_BCD.s.year;
ValveActiveDateTime.s.month = uTempRtccTime_BCD.s.month;
ValveActiveDateTime.s.day = uTempRtccTime_BCD.s.day;
ValveActiveDateTime.s.hour = uTempRtccTime_BCD.s.hour;
ValveActiveDateTime.s.minute = uTempRtccTime_BCD.s.minute;
ValveActiveDateTime.s.second = 0;
for(int i=0;i<7;i++)//修改为阀门无动作
{
TlvValue.s.ValueValveState[i] = 0;
}
EepWrite(&TlvValue.data_buf[TlvStrBuf[index_edit].ValueAddr], (EEP_ADDR_SY_TLVDATA+TlvStrBuf[index_edit].ValueAddr), TlvStrBuf[index_edit].Len, &s_sy_eep_complete);
}
}
}
if(TlvStrBuf[index_edit].Tag == TagUploadRetryTimes)//设置重发次数---转存积成规约
{
Sys_data_object.P1.report_retry_times = temp_tlv_data[0];
EepWrite(&Sys_data_object.P1.report_retry_times, EEP_RETRY_TIMES_ADDR, 1, &s_sy_eep_complete);//转存积成规约
FrameSetMsgApp(MsgNbRetryTimesChange);
}
if(TlvStrBuf[index_edit].Tag == TagUploadRetryTimes)//重发延时时间---转存积成规约
{
Sys_data_object.P1.Upload_again_interval_time.datas = temp_tlv_data[0]*60;
EepWrite(&Sys_data_object.P1.Upload_again_interval_time.datas_map.data0, EEP_FRAME_NB_PARA_ADDR, 2, &s_sy_eep_complete);
Frame_Para_Init();
}
if(TlvStrBuf[index_edit].Tag == TagUploadRetryTimes)//设置服务器IP地址---转存积成规约
{
}
if(TlvStrBuf[index_edit].Tag == TagUploadRetryTimes)//设置APN---转存积成规约
{
}
step_TlvDataStore = SY_STATE_S0;
}
}
break;
default:
{
step_TlvDataStore = SY_STATE_S0;
break;
}
}
}
//计算往前几天的日期和时间,带周
DateTime getBackDateTime(u8 backDays)
{
DateTime cdt;
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.s.year = ((*ldt).tm_year - 100) / 10 * 16 + ((*ldt).tm_year - 100) % 10;
cdt.s.month = ((*ldt).tm_mon + 1) / 10 * 16 + ((*ldt).tm_mon + 1) % 10;
cdt.s.day = ((*ldt).tm_mday) / 10 * 16 + ((*ldt).tm_mday) % 10;
cdt.s.weekday = ((*ldt).tm_wday) / 10 * 16 + ((*ldt).tm_wday) % 10;
cdt.s.hour = ((*ldt).tm_hour) / 10 * 16 + ((*ldt).tm_hour) % 10;
cdt.s.minute = ((*ldt).tm_min) / 10 * 16 + ((*ldt).tm_min) % 10;
cdt.s.second = ((*ldt).tm_sec) / 10 * 16 + ((*ldt).tm_sec) % 10;
return cdt;
}
//计算往前几天的日期和时间,不带周
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;
}
/********************************************************************************
函数名ShenYangStore_IfSleep
说 明:数据存储状态机空闲判断
********************************************************************************/
u8 ShenYangStore_IfSleep(void)
{
if((step_ShenYangStoreMachine == SY_STATE_S0)&&(step_ShenYangSOEMachine == SY_STATE_S0)&&(step_TlvDataStore ==SY_STATE_S0))
{
return TRUE;
}
else
{
return FALSE;
}
}
#endif