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

📄 swpfile.cpp

📁 C51访问西门子MC55做的透传模块, 支持远程注册和配置, 仅支持TCP协议, 其他请参考MC55说明书.
💻 CPP
字号:
// SwpFile.cpp: implementation of the CSwpFile class.
//
//////////////////////////////////////////////////////////////////////
#include "SwpFile.h"
#include <dos.h>
#include <stdio.h>
#include <mem.h>

extern unsigned long GetFileDataCrc(const void *aData, const unsigned long aSize);

CSwpFile::CSwpFile()
{
	m_SwpFile=NULL;
	m_UseIndex=0;
}

CSwpFile::~CSwpFile()
{
	CloseFile();

}
//////////////////////////////////////////////////////
//////////////////////////////////////////////////////
//重建交换文件。
void CSwpFile::RebuildSwpFile()
{
	if(m_SwpFile) fclose(m_SwpFile);
	char buffer[256]={0};
	m_SwpFile=fopen(SwpFileName,"wb");
	for(int i=0;i<MaxIndex;i++) fwrite(buffer,256,1,m_SwpFile);
	fclose(m_SwpFile);
	m_SwpFile=fopen(SwpFileName,"rb+");
}

void CSwpFile::CloseFile()
{
	if(m_SwpFile) fclose(m_SwpFile);
	m_SwpFile=NULL;
}
void CSwpFile::ClearSwpFile()
{
	char buf[256]={0};
	if(!m_SwpFile)
	{
		fopen(SwpFileName,"rb+");
		for(int i=0;i<MaxIndex;i++) fwrite(buf,256,1,m_SwpFile);
	}
	else
	{
		fseek(m_SwpFile,-256,SEEK_CUR);
		fwrite(buf,256,1,m_SwpFile);
		flush(m_SwpFile);
	}
}
void CSwpFile::RestoreSwpFileData()
{
	m_SwpFile=fopen(SwpFileName,"rb+");

	if(!m_SwpFile)
	{
		RebuildSwpFile();
		return ;
	}

	fseek(m_SwpFile,0,SEEK_END);
	if(ftell(m_SwpFile)!=256*MaxIndex)
	{
		RebuildSwpFile();
		return;
	}
	//开始恢复数据
	char buf[256]={0};
	fseek(m_SwpFile,0,SEEK_SET);
	for(int i=0;i<MaxIndex;i++)
	{
		fread(buf,256,1,m_SwpFile);
		if(UShortInt(buf)!=0 && ULongInt(buf+252)==GetFileDataCrc(buf,252))
		{
			RestoreSwpFileData(buf);
			memset(buf,0,256);
			fseek(m_SwpFile,-256,SEEK_CUR);
			fwrite(buf,256,1,m_SwpFile);
			flush(m_SwpFile);
			break ;
		}
	}
	return;
}
void CSwpFile::RestoreSwpFileData(char Databuf[256])
{
	FILE *fpDBSFile;
	fpDBSFile=fopen(DbsFileName,"rb+");
	if(!fpDBSFile) return;
	switch(UShortInt(Databuf))
	{
	case 0x0101:
		if(UShortInt(Databuf+6)==192)
		{
			//写数据库系统区开始64字节
			fseek(fpDBSFile,ULongInt(Databuf+2),SEEK_SET);
			fwrite(Databuf+8,192,1,fpDBSFile);
		}
		break;
	case 0x0202://清空所有表数。
		fseek(fpDBSFile,0,SEEK_END);
		if(ftell(fpDBSFile)==LongInt(Databuf+2))
		{
			char buf[1024]={0};
			long k=ULongInt(Databuf+2)/1024-1;
			fseek(fpDBSFile,192,SEEK_SET);
			fwrite(buf,1024-192,1,fpDBSFile);
			for(;k>0;k--) fwrite(buf,1024,1,fpDBSFile);
		}
		break;
	default:
		break;
	}
	fclose(fpDBSFile);
	return;
}

void CSwpFile::PreWriteDataToSwpFile(unsigned char data[], int Position)
{
	char m_Buf[256]={0};
	UShortInt(m_Buf+0)=0x0101;
	ULongInt(m_Buf+2)=Position*192L;
	UShortInt(m_Buf+6)=192;
	memcpy(m_Buf+8,data,192);
	ULongInt(m_Buf+252)=GetFileDataCrc(m_Buf,252);
	m_UseIndex=(m_UseIndex+1)%MaxIndex;

	fseek(m_SwpFile,m_UseIndex*256L,SEEK_SET);
	fwrite(m_Buf,256,1,m_SwpFile);

	flush(m_SwpFile);
}

void CSwpFile::PreEmptyAllMeter(long FileLen)
{	
	char m_Buf[256]={0};
	UShortInt(m_Buf+0)=0x0202;
	ULongInt(m_Buf+2)=FileLen;


	ULongInt(m_Buf+252)=GetFileDataCrc(m_Buf,252);
	m_UseIndex=(m_UseIndex+1)%MaxIndex;
	fseek(m_SwpFile,m_UseIndex*256L,SEEK_SET);
	fwrite(m_Buf,256,1,m_SwpFile);

	flush(m_SwpFile);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -