#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]=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; } }