📄 record.cpp
字号:
temp += VIBlockIndex[1];
if (temp > (MAX_VI_RECORD_MEM/VI_FOR_HOUR_MEM))
{
return FALSE;
}
bRet = pFramOnBorad->WriteByte(ADD_MIN_INDEX,VIMinIndex);
if (FALSE == bRet)
{
return FALSE;
}
Sleep(100);
unsigned char temp2;
bRet = pFramOnBorad->ReadByte(ADD_MIN_INDEX,temp2);
if (VIMinIndex != temp2)
{
return FALSE;
}
bRet = pFramOnBorad->Writeblock(ADD_BLOCK_INDEX,2,VIBlockIndex);
if (FALSE == bRet)
{
return FALSE;
}
Sleep(100);
unsigned char temp1[2] = {0};
bRet = pFramOnBorad->ReadBlock(ADD_MIN_INDEX,2,temp1);
if (0 != memcmp(VIBlockIndex,temp1,2))
{
return FALSE;
}
return TRUE;
}
//0.2s调用一次
BOOL CRecord::InsertVi(unsigned char vi)
{
LPSYSTEMTIME time = new SYSTEMTIME();
unsigned long offset = 0;
//判断传入速度值是否越界
if (vi > MAX_VI)
{
vi = MAX_VI;
}
unsigned char blockIndex[2] = {0};
unsigned int block = 0;
//Get current time
::GetLocalTime(time);
if (time->wMinute != lastTime->wMinute)
{//分钟数跳变
//更新lastTime
lastTime->wMinute = time->wMinute;
//获取存取块号索引
pFramOnBorad->ReadBlock(ADD_BLOCK_INDEX,2,blockIndex);
block = blockIndex[0] * 256;
block += blockIndex[1];
//读取每块的头四个字节即年月日小时
BOOL bChanged = FALSE;
unsigned char lastRecordTime[4] = {0};
offset = ADD_VI_START + ((block - 1) * 64);
pFramOnBorad->ReadBlock(offset,4,lastRecordTime);
//和当前时间比较,看是否向下一小时写
int i = 0;
//小时数不相等
if (lastRecordTime[3] != (unsigned char)time->wHour)
{
bChanged = TRUE;
}
//日不相等
if (lastRecordTime[2] != (unsigned char)time->wDay)
{
bChanged = TRUE;
}
//月不相等
if (lastRecordTime[1] != (unsigned char)time->wMonth)
{
bChanged = TRUE;
}
//年不相等
if (lastRecordTime[0] != (unsigned char)(time->wYear - 2000))
{
bChanged = TRUE;
}
if (TRUE == bChanged)
{
//写入下一块
block++;
if (block > MAX_HOUR_NUM)
{
//存储区写完,需要从头写
block = 1;
}
//创建这块格式,即在头四个字节写入当前年月日小时
lastRecordTime[0] = (unsigned char)(time->wYear - 2000);//year
lastRecordTime[1] = (unsigned char)time->wMonth;//month
lastRecordTime[2] = (unsigned char)time->wDay;//day
lastRecordTime[3] = (unsigned char)time->wHour;//hour
offset = ADD_VI_START + ((block - 1) * 64);
pFramOnBorad->Writeblock(offset,4,lastRecordTime);
//格式化块
RETAILMSG(FRAM_DEBUG_INF_OUT,(_T("Creat block %d-%d-%d %d:%d:%d %dms\n\r"),time->wYear,time->wMonth,time->wDay,time->wHour,time->wMinute,time->wSecond,time->wMilliseconds));
}
//写入数据
offset = ADD_VI_START + ((block - 1) * 64) + time->wMinute + 4;
pFramOnBorad->WriteByte(offset,(unsigned char)minuVi/counter);
minuVi = 0;
counter = 1;
//存储索引
blockIndex[0] = block / 256;
blockIndex[1] = block % 256;
pFramOnBorad->Writeblock(ADD_BLOCK_INDEX,2,blockIndex);
pFramOnBorad->WriteByte(ADD_MIN_INDEX,unsigned char(time->wMinute));
::GetLocalTime(time);
RETAILMSG(FRAM_DEBUG_INF_OUT,(_T("Insert VI at %d-%d-%d %d:%d:%d %dms"),time->wYear,time->wMonth,time->wDay,time->wHour,time->wMinute,time->wSecond,time->wMilliseconds));
RETAILMSG(FRAM_DEBUG_INF_OUT,(_T(" >>Current block:%d\n"),block));
//RETAILMSG(FRAM_DEBUG_INF_OUT,(_T(" >>Current vi:%d\n\r"),minuVi/counter));
}
else
{//分钟数没有跳变
minuVi += vi;
counter++;
}
delete time;
time = NULL;
return TRUE;
}
unsigned long CRecord::SeekPointer(unsigned int& blockIndex, unsigned char minuIndex)
{
unsigned long offset = 0;
//分钟索引已大于60
if (minuIndex > 60)
{
blockIndex++;
unsigned long add = (ADD_VI_START + (VI_SIZE * (blockIndex - 1)));
SYSTEMTIME time;
::GetLocalTime(&time);
pFramOnBorad->WriteByte(add,unsigned char(time.wYear - 2000));
add++;
pFramOnBorad->WriteByte(add,unsigned char(time.wMonth));
add++;
pFramOnBorad->WriteByte(add,unsigned char(time.wDay));
minuIndex = 1;
}
//已存满480小时数据
if (blockIndex > MAX_HOUR_NUM)
{
blockIndex = 1;
}
offset = ADD_VI_START + (VI_SIZE * (blockIndex - 1)) + (minuIndex + 4 - 1);
return offset;
}
//每0.2s调用一次
BOOL CRecord::AddMileage(unsigned long numberOfPause)
{
unsigned long lTmp = 0;
unsigned char cTmp = 0;
unsigned char aTmp[4] = {0};
LPSYSTEMTIME time = new SYSTEMTIME();
int i = 0;
//读取当前索引
pFramOnBorad->ReadBlock(ADD_MILEAGE_INDEX,1,&cTmp);
//#define MAX_NUMBER_OF_MILEAGE_RECORD 30
//#define NUM_OF_BYTE_IN_ITEM 8
//#define ADD_MILEAGE_START 0x8001
//#define ADD_MILEAGE_INDEX 0x8000
//读取上次记录的日期
unsigned long add = ADD_MILEAGE_START + (cTmp - 1) * NUM_OF_BYTE_IN_ITEM;
unsigned char aTime[3] = {0};
pFramOnBorad->ReadBlock(add,3,aTmp);
//判断年月日是否改变
BOOL bChanged = FALSE;
::GetLocalTime(time);
//年
if (unsigned char(time->wYear - 2000) != aTime[0])
{
bChanged = TRUE;
}
//月
if (unsigned char(time->wMonth) != aTime[1])
{
bChanged = TRUE;
}
//日
if (unsigned char(time->wDay) != aTime[2])
{
bChanged = TRUE;
}
if (TRUE == bChanged)
{
//另起一块
cTmp++;
if (cTmp > MAX_NUMBER_OF_MILEAGE_RECORD)
{
//已写满30天,从头写
cTmp = 1;
}
//创建新的一块
aTime[0] = unsigned char(time->wYear - 2000);
aTime[1] = unsigned char(time->wMonth);
aTime[2] = unsigned char(time->wDay);
//写入年月日
add = ADD_MILEAGE_START + (cTmp - 1) * NUM_OF_BYTE_IN_ITEM;
pFramOnBorad->Writeblock(add,3,aTime);
//清空脉冲数
for (i = 0; i < 4; i++)
{
aTmp[i] = 0;
}
add = ADD_MILEAGE_START + (cTmp - 1) * NUM_OF_BYTE_IN_ITEM + 3;
pFramOnBorad->Writeblock(add,4,aTmp);
//格式化
//保存索引
pFramOnBorad->WriteByte(ADD_MILEAGE_INDEX,cTmp);
}
//获取已存储脉冲数
add = ADD_MILEAGE_START + (cTmp - 1) * NUM_OF_BYTE_IN_ITEM + 3;
pFramOnBorad->ReadBlock(add,4,aTmp);
lTmp = unsigned int((aTmp[0] * 0x1000000) + (aTmp[1] * 0x10000) + (aTmp[2] * 0x100) + aTmp[3]);
//累加
lTmp += numberOfPause;
//写入
aTmp[3] = unsigned char(lTmp % 0x100);
lTmp = (lTmp / 0x100);
aTmp[2] = unsigned char(lTmp % 0x100);
lTmp = (lTmp / 0x100);
aTmp[1] = unsigned char(lTmp % 0x100);
lTmp = (lTmp / 0x100);
aTmp[0] = unsigned char(lTmp % 0x100);
lTmp = (lTmp / 0x100);
add = ADD_MILEAGE_START + (cTmp - 1) * NUM_OF_BYTE_IN_ITEM + 3;
pFramOnBorad->Writeblock(add,4,aTmp);
delete time;
time = NULL;
return TRUE;
}
BOOL CRecord::GetKModulus(unsigned int &KModulus)
{
unsigned char tmp[4] = {0};
pFramOnBorad->ReadBlock(ADD_K_MODULUS,4,tmp);
KModulus = unsigned int((tmp[0] * 0x1000000) + (tmp[1] * 0x10000) + (tmp[2] * 0x100) + tmp[3]);
return TRUE;
}
BOOL CRecord::SetKModulus(unsigned int KModulus)
{
unsigned char tmp[4] = {0};
tmp[3] = unsigned char(KModulus % 0x100);
KModulus = (KModulus / 0x100);
tmp[2] = unsigned char(KModulus % 0x100);
KModulus = (KModulus / 0x100);
tmp[1] = unsigned char(KModulus % 0x100);
KModulus = (KModulus / 0x100);
tmp[0] = unsigned char(KModulus % 0x100);
KModulus = (KModulus / 0x100);
return (pFramOnBorad->Writeblock(ADD_K_MODULUS,4,tmp));
}
//进出站记录
BOOL CRecord::InsertStation(const SATION station)
{
//读取索引
unsigned char aIndex[2] = {0};
unsigned long add = ADD_STATION_INDEX;
pFramOnBorad->ReadBlock(add,2,aIndex);
unsigned long lIndex = 0;
lIndex = aIndex[0] * 0x100 + aIndex[1];
//判断索引是否越界
unsigned char index[2] = {0};
unsigned int iIndex = 0;
pFramOnBorad->ReadBlock(add,2,index);
iIndex = index[0] * 0x100 + index[1];//获取上一次记录的索引
iIndex++;
if (iIndex > NUM_OF_STATION_REC)
{
iIndex = 1;
}
//写入数据
add = ADD_STATION_START + SIZEOF_STATION_ITEM * (iIndex - 1);
pFramOnBorad->Writeblock(add,SIZEOF_STATION_ITEM,(unsigned char*)&station);
//保存索引
index[0] = iIndex / 0x100;
index[1] = iIndex % 0x100;
pFramOnBorad->Writeblock(add,2,index);
return TRUE;
}
BOOL CRecord::InsertDoubt(unsigned char vi, unsigned char byteValue1, unsigned char byteValue2)
{
//读取上次记录组数索引号
unsigned long add = ADD_DOUBT_INDEX;
unsigned char item = 0;
pFramOnBorad->ReadByte(ADD_DOUBT_INDEX,item);
//判断是否需要重起一组,根据上次记录组数索引号读取是否停车标志
//该标志为0标识没有停车,继续在该组内写数据,如果该标识为非0
//责上次记录已停车,形成了一条有效疑点数据,则从新开辟一组写入数据
unsigned char stop = 0;
add = ADD_DOUBT_START + (item - 1) * SIZEOF_A_DOUT_REC + (SIZEOF_ITEM_HEAD - 1);
pFramOnBorad->ReadByte(add,stop);
if (0 == stop)
{//已形成一条有效的疑点数据
//新开辟一条存储区
item++;
//初始化该存储区
}
else
{//未形成一条有效的疑点数据
}
// #define SIZEOF_A_DOUT_REC 312
// #define MAX_NUM_OF_DOUT_REC 20
// #define ADD_DOUBT_INDEX 0xdfff
// #define ADD_DOUBT_START 0xe000
if (0 == vi)
{//已停车
}
else
{//未停车
//
//
//
//
//
//
//
//
//
//
//
//
}
return TRUE;
}
BOOL CRecord::Overspeed(const OVER_SPEED over_speed)
{
//读取索引
unsigned char aIndex[2] = {0};
unsigned long add = ADD_OVERSPEED_INDEX;
pFramOnBorad->ReadBlock(add,2,aIndex);
unsigned long lIndex = 0;
lIndex = aIndex[0] * 0x100 + aIndex[1];
//判断是否越界
unsigned char index[2] = {0};
unsigned int iIndex = 0;
pFramOnBorad->ReadBlock(add,2,index);
iIndex = index[0] * 0x100 + index[1];//获取上一次记录的索引
iIndex++;
if (iIndex > MAX_NUM_OF_OVERSPEED_REC)
{
iIndex = 1;
}
//写入数据
add = ADD_OVERSPEED_START + SIZEOF_A_OVERSPEED_REC* (iIndex - 1);
pFramOnBorad->Writeblock(add,SIZEOF_A_OVERSPEED_REC,(unsigned char*)&over_speed);
//保存索引
index[0] = iIndex / 0x100;
index[1] = iIndex % 0x100;
pFramOnBorad->Writeblock(ADD_OVERSPEED_INDEX,2,index);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -