415 lines
12 KiB
C
415 lines
12 KiB
C
#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;
|
||
}
|
||
}
|
||
|
||
|
||
}
|
||
} |