461 lines
13 KiB
C
461 lines
13 KiB
C
#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;
|
||
}
|
||
}
|
||
|
||
|
||
|