#include "WaterMetermanager.h" #include "storage.h" #include "bl24c512.h" #include "include.h" #include "sx1276-Fsk.h" #include "rtc_ext.h" u16 read_maintain_time_ram(void); void Clear485PortINValidCount( void ); //QueueHandle_t RfSendTask; //APP_OPER_COLLECT_MAN_UNIT_TYPE ManXTCollecterUnit; //转换器控制新天采集器数据以及任务单元 //extern u8 HNSJ_chl ; static SJ_ADDRLIST_MANUNIT_TYPE SJManager = {0}; /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------ 抄表数据以及水表档案存储读取管理任务 ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ */ //读取水表地址档案数量 bool ReadAddrListLength( u8* Length ) { u8 TempBuff[5] = {0x00}; SP_SJ_ADDRLIST_MANUNIT_TYPE Pload = (SP_SJ_ADDRLIST_MANUNIT_TYPE)TempBuff; if(Pload->ValidFlag == SHUANGJIA_MANAGERUNIT_VALID) { SJManager.ValidFlag = SHUANGJIA_MANAGERUNIT_VALID; *Length = Pload->AddrSum; return true; } else { *Length = 0; return false; } } //更新水表地址档案数量 bool WriteAddrListLength( u8 Length ) { return true; } //更新水表地址地址和数据 bool WriteAddrListDataInfo( LPMETER_STRUCT_UNITTYPE Pload ) { return true; } /*根据地址信息,获取某块水表的数据*/ //当数据链表内,已经保存当前水表地址时,检查该水表数据是否有效,当无效时,返回00,表示从未监控到该水表数据 //当数据链表内,未保存当前水表地址时,需要保存当前水表地址,并且标记数据区域无效,且返回00,方便集中器继续执行抄表动作。 //三种情况。1.没有水表地址,2.有水表地址,但是数据无效,3.有水表地址,而且数据有效 //save :是否保留当前地址信息 RETURN_TYPE ReadAddrListDataInfo( LPMETER_STRUCT_UNITTYPE Pload ,bool Save) { u16 index = 0x00; RETURN_TYPE ret = NKNOW; if(SJManager.ValidFlag != SHUANGJIA_MANAGERUNIT_VALID) { return ret; } for(index = 0x00; index < SJManager.AddrSum; index ++) { if((SJManager.Info[index].Index == index) && (SJManager.Info[index].Addr.AddrValidFlag == VALID_FLAG)) if(MemCmp(Pload->Addr.Address,SJManager.Info[index].Addr.Address,ADDRESS_LENGTH) == 0x00) { if(SJManager.Info[index].Data.DataValidFlag == VALID_FLAG) { if(SJManager.Info[index].CRCV == GetCRC16(&SJManager.Info[index].Index, sizeof(METER_STRUCT_UNITTYPE) - sizeof(SJManager.Info[index].CRCV))) { ret = EXIST_ADDR_DATA_VALID; Pload->Index = index; Pload->Data.BCD_Decimal = SJManager.Info[index].Data.BCD_Decimal; Pload->Data.BCD_Integer_L = SJManager.Info[index].Data.BCD_Integer_L; Pload->Data.BCD_Integer_M = SJManager.Info[index].Data.BCD_Integer_M; Pload->Data.BCD_Integer_H = SJManager.Info[index].Data.BCD_Integer_H; Pload->Data.FailCount = SJManager.Info[index].Data.FailCount; Pload->Data.StateFlag0 = SJManager.Info[index].Data.StateFlag0; Pload->Data.StateFlag1 = SJManager.Info[index].Data.StateFlag1; memcpy(&Pload->Index,&SJManager.Info[index].Index, sizeof(METER_STRUCT_UNITTYPE)); return ret; } else { Pload->Index = index; Pload->Data.FailCount = SJManager.Info[index].Data.FailCount; memcpy(&Pload->Index,&SJManager.Info[index].Index, sizeof(METER_STRUCT_UNITTYPE)); ret = EXIST_ADDR_CRC_ERROR; return ret; } } else { Pload->Index = index; Pload->Data.FailCount = SJManager.Info[index].Data.FailCount; memcpy(&Pload->Index,&SJManager.Info[index].Index, sizeof(METER_STRUCT_UNITTYPE)); ret = EXIST_ADDR_DATA_INVALID; //存在地址但是数据无效 return ret; } } } // u8 Index; // METER_ADDR_UNITTYPE Addr; // METER_DATA_UNITTYPE Data; // u16 CRCV; if( Save == false) return NO_EXIST_ADDR; SJManager.AddrSum ++; SJManager.Info[index].Index = index; SJManager.Info[index].Addr.AddrValidFlag = VALID_FLAG; MemCpy(SJManager.Info[index].Addr.Address,Pload->Addr.Address,ADDRESS_LENGTH); SJManager.Info[index].Data.DataValidFlag = INVALID_FLAG; SJManager.Info[index].Data.BCD_Decimal = 0x00; SJManager.Info[index].Data.BCD_Integer_H = 0x00; SJManager.Info[index].Data.BCD_Integer_L = 0x00; SJManager.Info[index].Data.BCD_Integer_M = 0x00; //当前地址不存在 SJManager.Info[index].Data.FailCount = 0x00; Pload->Data.BCD_Decimal = SJManager.Info[index].Data.BCD_Decimal; Pload->Data.BCD_Integer_L = SJManager.Info[index].Data.BCD_Integer_L; Pload->Data.BCD_Integer_M = SJManager.Info[index].Data.BCD_Integer_M; Pload->Data.BCD_Integer_H = SJManager.Info[index].Data.BCD_Integer_H; SJManager.Info[index].CRCV = GetCRC16(&SJManager.Info[index].Index, sizeof(METER_STRUCT_UNITTYPE) - sizeof(SJManager.Info[index].CRCV)); WriteAddrListLength(SJManager.AddrSum); WriteAddrListDataInfo(&SJManager.Info[index]); return NO_EXIST_ADDR; } void ReadSystemMeterAddrList( void ) { //u8 Length = 0x00; u8 index = 0x00; //if(ReadAddrListLength( &Length ) == false) if(SJManager.AddrSum == 00) { printf("Water Meter SUM is 0\r\n"); return ; } else { printf("Water Meter SUM is %03d\r\n",SJManager.AddrSum); } printf("\r\n-序号---------地址-----------水表示数---------水表状态---------抄表时间\r\n"); for(index = 0x00 ; index < SJManager.AddrSum; index ++) { if(SJManager.Info[index].Addr.AddrValidFlag == VALID_FLAG) { printf(" %03d: %02X%02X%02X%02X%02X%02X%02X",index,SJManager.Info[index].Addr.Address[6],SJManager.Info[index].Addr.Address[5],SJManager.Info[index].Addr.Address[4],SJManager.Info[index].Addr.Address[3],SJManager.Info[index].Addr.Address[2],SJManager.Info[index].Addr.Address[1],SJManager.Info[index].Addr.Address[0]); if(SJManager.Info[index].Data.DataValidFlag == VALID_FLAG) {//新版本转换器使用的是内部时钟 printf(" %02X%02X%02X.%02X %02X%02X %02d.%02d.%02d %02d:%02d:%02d\r\n", SJManager.Info[index].Data.BCD_Integer_H,SJManager.Info[index].Data.BCD_Integer_M,SJManager.Info[index].Data.BCD_Integer_L,SJManager.Info[index].Data.BCD_Decimal,SJManager.Info[index].Data.StateFlag0,SJManager.Info[index].Data.StateFlag1,SJManager.Info[index].Data.TYaer,SJManager.Info[index].Data.TMonth,SJManager.Info[index].Data.TDay,SJManager.Info[index].Data.THour,SJManager.Info[index].Data.TMin,SJManager.Info[index].Data.TSec); } else { printf(" --------\r\n"); } vTaskDelay( 50 / portTICK_RATE_MS ); } } } bool manager_get_data(u8 * addr,u8* data,u8* state,u8 * state2) { for(u8 i = 0;iAddr.Address,addr,ADDRESS_LENGTH); //不能保存当前接收的地址,只做读取当前地址的水表数据检查 ret = ReadAddrListDataInfo( Pstr ,false); if(EXIST_ADDR_DATA_VALID == ret) { if(MemCmp(&Pstr->Data.BCD_Decimal,data,METER_DATA_MAX_SIZE) == 0x00) { //return false; Save = true; } else { Save = true; } } else if((EXIST_ADDR_DATA_INVALID == ret) || (EXIST_ADDR_CRC_ERROR == ret)) { Save = true; } else { return false; } if(true == Save) { Clear485PortINValidCount(); //GetExternClockTime(&Temp_Time); get_timeBCD(&Temp_Time); Pstr->Addr.AddrValidFlag = VALID_FLAG; Pstr->Data.DataValidFlag = VALID_FLAG; MemCpy(&Pstr->Data.BCD_Decimal,data,METER_DATA_MAX_SIZE); Pstr->Data.FailCount = 0x00; Pstr->Data.StateFlag0 = status[0]; Pstr->Data.StateFlag1 = status[1]; Pstr->Data.TYaer = Temp_Time.year; Pstr->Data.TMonth= Temp_Time.month; Pstr->Data.TDay = Temp_Time.day; Pstr->Data.THour = Temp_Time.hour; Pstr->Data.TMin = Temp_Time.minute; Pstr->Data.TSec = Temp_Time.second; Pstr->CRCV = GetCRC16(TempBuff, sizeof(METER_STRUCT_UNITTYPE) - sizeof(Pstr->CRCV)); MemCpy(&SJManager.Info[Pstr->Index].Index,&Pstr->Index,sizeof(METER_STRUCT_UNITTYPE)); WriteAddrListDataInfo( Pstr ); return true; } return false; } bool UpdataWMRMFailCounterProcess(u8* addr) { RETURN_TYPE ret = NKNOW; //sTime Temp_Time; bool Save = true; u8 TempBuff[sizeof(METER_STRUCT_UNITTYPE)] = {0x00}; LPMETER_STRUCT_UNITTYPE Pstr = (LPMETER_STRUCT_UNITTYPE)TempBuff; MemCpy(Pstr->Addr.Address,addr,ADDRESS_LENGTH); //不能保存当前接收的地址,只做读取当前地址的水表数据检查 ret = ReadAddrListDataInfo( Pstr ,false); if( (ret == EXIST_ADDR_DATA_VALID) || (ret == EXIST_ADDR_CRC_ERROR) || (ret == EXIST_ADDR_DATA_INVALID) ) { Pstr->Data.FailCount ++; if(true == Save) { //GetExternClockTime(&Temp_Time); //get_timeBCD(&Temp_Time); //Pstr->Addr.AddrValidFlag = VALID_FLAG; Pstr->CRCV = GetCRC16(TempBuff, sizeof(METER_STRUCT_UNITTYPE) - sizeof(Pstr->CRCV)); MemCpy(&SJManager.Info[Pstr->Index].Index,&Pstr->Index,sizeof(METER_STRUCT_UNITTYPE)); //WriteAddrListDataInfo( Pstr ); return true; } } return false; } void CopyEEPROMInfoToRAM( void ) { } void SJMeterInfoInit( void ) { if(ReadAddrListLength( &SJManager.AddrSum ) == false) { SJManager.ValidFlag = SHUANGJIA_MANAGERUNIT_VALID; WriteAddrListLength( 00 ); return ; } CopyEEPROMInfoToRAM( ); } void ClearMeterInfo( void ) { SJManager.AddrSum = 0x00; WriteAddrListLength( 00 ); MemSet((u8*)&SJManager.Info[0].Index,0x00, sizeof(METER_STRUCT_UNITTYPE)*ADDR_LIST_LENGTH); printf("Success !!\r\n"); } void ClearMeterInfo_realdl( void ) { SJManager.AddrSum = 0; } u8 GetCurrentAddrListLength( void ) { return SJManager.AddrSum; } bool CheckDataStoreTime(u8* CurTim,u8* StoreTime,u32 MaxT) { sTime * curt = (sTime *)CurTim; PLst_rtc_ext storet = (PLst_rtc_ext)StoreTime; //u32 curt_hour = (BCDToHex(curt->year) * 365 * 24) + (BCDToHex(curt->month) * 30 * 24) + (BCDToHex(curt->day) * 24) + BCDToHex(curt->hour); u32 curt_hour = ((curt->year) * 365 * 24) + ((curt->month) * 30 * 24) + ((curt->day) * 24) + (curt->hour);//当前时间使用的是内部RTC,不是BCD码 //u32 storet_hour = (BCDToHex(storet->year) * 365 * 24) + (BCDToHex(storet->month) * 30 * 24) + (BCDToHex(storet->day) * 24) + BCDToHex(storet->hour); u32 storet_hour = ((storet->year) * 365 * 24) + ((storet->month) * 30 * 24) + ((storet->day) * 24) + (storet->hour); if(curt_hour > (storet_hour + MaxT)) { return false; } else if(curt_hour < storet_hour) { return false; } else { return true; } } void ClearMeterDataTimeOuttime( void ) { u8 index = 0x00; sTime Temp_Time; //GetExternClockTime(&Temp_Time); get_timeBCD(&Temp_Time); for(index = 0x00 ; index < SJManager.AddrSum; index ++) { if( (SJManager.Info[index].Addr.AddrValidFlag == VALID_FLAG) && (SJManager.Info[index].Data.DataValidFlag == VALID_FLAG) ) { if(CheckDataStoreTime((u8*)&Temp_Time.year,&SJManager.Info[index].Data.TSec,read_maintain_time_ram()) == false) { SJManager.Info[index].Data.DataValidFlag = INVALID_FLAG; SJManager.Info[index].Data.FailCount = 0x00; } } } }