⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 record.cpp

📁 wince外部中断计数小驱动
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -