Files
HBshuiwuConcentrator/APP/WaterMeterManager.c
2025-12-15 16:07:49 +08:00

415 lines
12 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 "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;i<SJManager.AddrSum;i++)
{
// if(SJManager.Info[i].Addr.AddrValidFlag == VALID_FLAG)
{
if(0 == memcmp(addr,SJManager.Info[i].Addr.Address,6))
{
if(SJManager.Info[i].Data.DataValidFlag == VALID_FLAG)
{
data[0] = SJManager.Info[i].Data.BCD_Decimal;
data[1] = SJManager.Info[i].Data.BCD_Integer_L;
data[2] = SJManager.Info[i].Data.BCD_Integer_M;
data[3] = SJManager.Info[i].Data.BCD_Integer_H;
* state = SJManager.Info[i].Data.StateFlag0;
* state2 = SJManager.Info[i].Data.StateFlag1;
return true;
}
}
}
}
return false;
}
bool UpdateRFReceiveData(u8* addr,u8* data,u8* status)
{
RETURN_TYPE ret = NKNOW;
sTime Temp_Time;
bool Save = false;
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(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;
}
}
}
}