P2UWaterJiangXi/app/UWater_QZ_Store_App.c

461 lines
13 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 "UWater_frame_app.h"
#include "UWater_eeprom_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_QZ_Store_App.h"
#include "sys_processor.h"
/**********公用变量************************************************************/
DateTime tempRtccTime_BCD;
u8 tempMsg_EE=0;
MET_STATE temp_MetState; //状态字
UNION_QZ_STORE_INDEX uStoreIndex_QZ;
TYP_STATE_QZ step_QuanzhouStoreInit = QZ_STATE_S0;
TYP_STATE_QZ step_QuanzhouStoreMachine = QZ_STATE_S0;
DateTime protl_rtcc_time;
/**********日冻结信息存储相关变量***********************************************/
UNION_QZ_STORE_DAY temp_daily_data;
u8 *pBuf_DailyHalfHourFlow;
u8 *pBuf_DailyHighestFlow;
TYP_STATE_QZ step_DailyDataStore = QZ_STATE_S0;
/**********月冻结数据存储相关变量***********************************************/
UNION_QZ_STORE_MONTH temp_month_data;
TYP_STATE_QZ step_MonthDataStore = QZ_STATE_S0;
static float s_daily_temprature[3];
static u16 s_daily_temprature_min_max[2];
//间隔流量缓存
static u8 temp_IntervalDataBuf[96];
static u8 temp_interval_flow_addr;//间隔流量缓存地址
static RTCC_To_Float old_jiange_total_flow;
static RTCC_To_Float new_jiange_total_flow;
static RTCC_UNION_2U8TOU16 jiange_data;
/********************************************************************************
函数名Quanzhou_Store_InitApp
说 明:泉州数据存储初始化
********************************************************************************/
void Quanzhou_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())
{
uStoreIndex_QZ.Data.DailyStore = 0;
uStoreIndex_QZ.Data.MonthStore = 0;
EepWrite(&uStoreIndex_QZ.data_buf[0], EEP_ADDR_QZ_STORE_INDEX_WRITE, 2, &tempMsg_EE);
tmp_init_stat = QZ_STATE_S1;
}
break;
}
case QZ_STATE_S20://非第一次上电
{
if (TASK_IDLE == EepIfIdle())
{
EepRead(EEP_ADDR_QZ_STORE_INDEX_WRITE, &uStoreIndex_QZ.data_buf[0], 2, &tempMsg_EE);
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();
}
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<96;i++)
{
temp_IntervalDataBuf[i] = 0;
}
}
//日最高最低水温
static void SysCheckTempratureMinMax(DateTime alarm_time)
{
if((0 == alarm_time.s.hour) && (0 == alarm_time.s.minute))
{
//每天0点重新记录温度
if(s_daily_temprature[0]<0)//高温小于0
{
s_daily_temprature_min_max[0] = -((u16)(s_daily_temprature[0]*10));
s_daily_temprature_min_max[0] = 0x8000|s_daily_temprature_min_max[0];
}
else//高温大于0
{
s_daily_temprature_min_max[0] = (u16)(s_daily_temprature[0]*10);//强转优先级大于乘,要先乘
}
if(s_daily_temprature[1]<0)//低温小于0
{
s_daily_temprature_min_max[1] = -((u16)(s_daily_temprature[1]*10));
s_daily_temprature_min_max[1] = 0x8000|s_daily_temprature_min_max[1];
}
else//低温大于0
{
s_daily_temprature_min_max[1] = (u16)(s_daily_temprature[1]*10);
}
s_daily_temprature[2] = TempCheckValueApp();
s_daily_temprature[0] = s_daily_temprature[2];
s_daily_temprature[1] = s_daily_temprature[2];
}
else
{
//计算温度最大最小值
s_daily_temprature[2] = TempCheckValueApp();
if(s_daily_temprature[2]>s_daily_temprature[0])
{
s_daily_temprature[0] = s_daily_temprature[2];//高温
}
if(s_daily_temprature[2]<s_daily_temprature[1])
{
s_daily_temprature[1] = s_daily_temprature[2];//低温
}
}
}
/********************************************************************************
函数名QuanZhou_DailyDataStore_proc
说 明:日冻结数据存储,
0点存储日冻结数据\
半小时的间隔流量\
日最高流速\
日最高水温\
日最低水温\
报警状态字\
时间年月日
********************************************************************************/
static int QuanZhou_DailyDataStore_proc(void)
{
switch(step_DailyDataStore)
{
case QZ_STATE_S0:
{
u8 temp_index = 0;
temp_daily_data.Data.Head = 0x5A;
QZ_U32_To_Float temp_float_dadta;
//获取当前流量
temp_float_dadta.gp22_u32 = Gp30CheckDataApp(2);
temp_daily_data.Data.DailyFlowData.gp22_u32 = (u32)temp_float_dadta.gp22_float;
//获取间隔流量:2B(间隔流量)X2(次/h)X24h=96B
for(temp_index = 0; temp_index <96 ;temp_index++)
{
temp_daily_data.Data.StepFlowDataBuf[temp_index] = temp_IntervalDataBuf[temp_index];
}
for(temp_index = 0; temp_index <96 ;temp_index++)
{
temp_IntervalDataBuf[temp_index] = 0;
}
//获取日最高流速
RtccCheck_Hight_Flow(&pBuf_DailyHighestFlow);
for(temp_index = 0; temp_index <14 ;temp_index++)
{
temp_daily_data.Data.HighestFlowDataBuf[temp_index] = *(pBuf_DailyHighestFlow+temp_index);
}
//获取日最高和最低水温
temp_daily_data.Data.HighestTemp = s_daily_temprature_min_max[0];
temp_daily_data.Data.LowestTemp = s_daily_temprature_min_max[1];
//获取报警信息
//状态字
temp_MetState = FrameGetByte();
temp_daily_data.Data.MetState[0] = temp_MetState.stat0;
temp_daily_data.Data.MetState[1] = temp_MetState.stat1;
temp_daily_data.Data.MetState[2] = temp_MetState.stat3;
//获取当前时间
RtccGetDateTime(&tempRtccTime_BCD);
temp_daily_data.Data.Year = tempRtccTime_BCD.s.year;
temp_daily_data.Data.Month = tempRtccTime_BCD.s.month;
temp_daily_data.Data.Day = tempRtccTime_BCD.s.day;
//校验和
temp_daily_data.Data.CheckSum=0;
for(temp_index = 0; temp_index<(STORE_SIZE_DATA_DAILY-2); temp_index++)
{
temp_daily_data.Data.CheckSum += temp_daily_data.data_buf[temp_index];
}
//预留字节
temp_daily_data.Data.End = 0xA5;
step_DailyDataStore = QZ_STATE_S1;
break;
}
case QZ_STATE_S1://存储数据
{
if(TASK_IDLE == EepIfIdle())
{
if(uStoreIndex_QZ.Data.DailyStore>=100)
{
uStoreIndex_QZ.Data.DailyStore = 0;
}
EepWrite(temp_daily_data.data_buf, EEP_ADDR_QZ_STORE_DAY + uStoreIndex_QZ.Data.DailyStore*128, 128, &tempMsg_EE);
step_DailyDataStore = QZ_STATE_S2;
}
break;
}
case QZ_STATE_S2: //存储指针
{
if(TASK_IDLE == EepIfIdle())
{
uStoreIndex_QZ.Data.DailyStore++;
if(uStoreIndex_QZ.Data.DailyStore>=100)
{
uStoreIndex_QZ.Data.DailyStore = 0;
}
EepWrite(&uStoreIndex_QZ.data_buf[0], EEP_ADDR_QZ_STORE_INDEX_WRITE, 2, &tempMsg_EE);
step_DailyDataStore = QZ_STATE_S3;
}
break;
}
case QZ_STATE_S3:
{
if(TASK_IDLE == EepIfIdle())
{
step_DailyDataStore = QZ_STATE_S0;
return SUCCESS;
}
break;
}
default:
{
step_DailyDataStore = QZ_STATE_S0;
break;
}
}
return ERROR;
}
/********************************************************************************
函数名month_store_proc
说 明:月冻结数据存储,存储24个月的冻结数据。
每月1号0点1分存储,时间记录为上一个月的月份
********************************************************************************/
static int QuanZhou_MonthDataStore_proc(void)
{
switch(step_MonthDataStore)
{
case QZ_STATE_S0://月冻结数据
{
QZ_U32_To_Float temp_float_dadta;
//清消息
RtccGetDateTime(&tempRtccTime_BCD);
temp_float_dadta.gp22_u32 = Gp30CheckDataApp(2);
temp_month_data.Data.FlowData.gp22_u32 = (u32)temp_float_dadta.gp22_float;
temp_month_data.Data.Month = tempRtccTime_BCD.s.month;
temp_month_data.Data.Year = tempRtccTime_BCD.s.year;
if(tempRtccTime_BCD.s.month>1)
{
temp_month_data.Data.Month = BCD2HEX(tempRtccTime_BCD.s.month) -1;
temp_month_data.Data.Month = HEX2BCD(temp_month_data.Data.Month);
}
else
{
temp_month_data.Data.Year = BCD2HEX(tempRtccTime_BCD.s.year) -1;
temp_month_data.Data.Year = HEX2BCD(temp_month_data.Data.Year);
temp_month_data.Data.Month = 0x12;
}
step_MonthDataStore = QZ_STATE_S1;
break;
}
case QZ_STATE_S1://存储数据
{
if(TASK_IDLE == EepIfIdle())
{
if(uStoreIndex_QZ.Data.MonthStore>=24)
{
uStoreIndex_QZ.Data.MonthStore = 0;
}
EepWrite(temp_month_data.data_buf, EEP_ADDR_QZ_STORE_MONTH + uStoreIndex_QZ.Data.MonthStore*6, 6, &tempMsg_EE);
step_MonthDataStore = QZ_STATE_S2;
}
break;
}
case QZ_STATE_S2: //存储指针
{
if(TASK_IDLE == EepIfIdle())
{
uStoreIndex_QZ.Data.MonthStore++;
if(uStoreIndex_QZ.Data.MonthStore>=24)
{
uStoreIndex_QZ.Data.MonthStore = 0;
}
EepWrite(&uStoreIndex_QZ.data_buf[0], EEP_ADDR_QZ_STORE_INDEX_WRITE, 2, &tempMsg_EE);
step_MonthDataStore = QZ_STATE_S3;
}
break;
}
case QZ_STATE_S3:
{
if(TASK_IDLE == EepIfIdle())
{
step_MonthDataStore = QZ_STATE_S0;
return SUCCESS;
}
break;
}
default:
{
step_MonthDataStore = QZ_STATE_S0;
break;
}
}
return ERROR;
}
/********************************************************************************
函数名Quanzhou_Store_Machine
说 明:泉州数据存储状态机
********************************************************************************/
void Quanzhou_Store_Machine(void)
{
switch(step_QuanzhouStoreMachine)
{
case QZ_STATE_S0://数据存储消息判断
{
if (FrameCheckMsgApp(Msg_FrozenStore))
{
FrameClearMsgApp(Msg_FrozenStore);
RtccGetDateTime(&protl_rtcc_time);
SysCheckTempratureMinMax(protl_rtcc_time);//计算日最高最低水温
if((protl_rtcc_time.s.minute==0x00)||(protl_rtcc_time.s.minute==0x30))//半小时间隔流量存储
{
//计算间隔流量
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_interval_flow_addr = BCD2HEX(protl_rtcc_time.s.hour)*4 + (BCD2HEX(protl_rtcc_time.s.minute)/30)*2;
temp_IntervalDataBuf[temp_interval_flow_addr] = jiange_data.datas_map.data0;
temp_IntervalDataBuf[temp_interval_flow_addr+1] = jiange_data.datas_map.data1;
}
if((protl_rtcc_time.s.hour==0)&&(protl_rtcc_time.s.minute==0))//日冻结数据存储
{
FrameSetMsgApp(MsgQuanzhou_DailySave);
if(protl_rtcc_time.s.day == 1)//每月1号0点0分存储月冻结数据
{
FrameSetMsgApp(MsgQuanzhou_MonthSave);
}
}
}
if(FrameCheckMsgApp(MsgQuanzhou_DailySave))//日冻结消息
{
FrameClearMsgApp(MsgQuanzhou_DailySave); //清消息
step_QuanzhouStoreMachine = QZ_STATE_S1;
}
else if(FrameCheckMsgApp(MsgQuanzhou_MonthSave))//月冻结消息
{
FrameClearMsgApp(MsgQuanzhou_MonthSave); //清消息
step_QuanzhouStoreMachine = QZ_STATE_S2;
}
break;
}
case QZ_STATE_S1://日冻结数据存储
{
if(QuanZhou_DailyDataStore_proc() == SUCCESS)
{
step_QuanzhouStoreMachine = QZ_STATE_S0;
}
break;
}
case QZ_STATE_S2://月冻结数据存储
{
if(QuanZhou_MonthDataStore_proc() == SUCCESS)
{
step_QuanzhouStoreMachine = QZ_STATE_S0;
}
break;
}
default:
{
step_QuanzhouStoreMachine = QZ_STATE_S0;
break;
}
}
}
/********************************************************************************
函数名get_QZ_StorePara
说 明:获取泉州数据存储当前指针
********************************************************************************/
u8 get_QZ_StorePara(QZ_ParaTypeDef paraType)
{
switch(paraType)
{
case QZ_StoreCurIndex_Daily://日冻结存储指针
{
if(uStoreIndex_QZ.Data.DailyStore>=100)
{
uStoreIndex_QZ.Data.DailyStore = 0;
}
return uStoreIndex_QZ.Data.DailyStore;
}
case QZ_StoreCurIndex_Month://月冻结存储指针
{
if(uStoreIndex_QZ.Data.MonthStore>=24)
{
uStoreIndex_QZ.Data.MonthStore = 0;
}
return uStoreIndex_QZ.Data.MonthStore;
}
default:
break;
}
return 0;
}
/********************************************************************************
函数名QuanzhouStore_IfSleep
说 明:泉州数据存储状态机空闲判断
********************************************************************************/
u8 QuanzhouStore_IfSleep(void)
{
if(step_QuanzhouStoreMachine == 0)
{
return TRUE;
}
else
{
return FALSE;
}
}