亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? upgrade.cpp

?? 運行環境:DOS, 通過串口升級的下位程序, 需配合上位升級程序FileUpgrade運行, 可用于嵌入式DOS系統中.
?? CPP
字號:
// Upgrade.cpp: implementation of the CUpgradeFile class.
//
//////////////////////////////////////////////////////////////////////
#include "public.h"
#include "Upgrade.h"

#include "DataPort.h"
extern CDataPort gDataPort;

#include "CrcCode.h"
extern CCrcCode  gCrcCode;

unsigned char mBuffer[10240];
extern unsigned short int	gSecondTimeout;

extern const unsigned short int  gUSecond;

extern void Teststack();
extern unsigned char gArriveAnswerTime;


CUpgradeFile::CUpgradeFile()
{

}
CUpgradeFile::~CUpgradeFile()
{
	DELETE(m_ptrSuccPackMark);
}
/////////////////////////////////////////////////////////////

void CUpgradeFile::SendErrorMessagePackage(unsigned char ErrorCode)
{
	extern unsigned short int	gIntervalTimeout;
	unsigned char SendBuffer[12]={0x0,0x07,0x01,0xB9,ErrorCode};
	cprintf("\r\n\tSend Error Code %02X ",ErrorCode);
	RuningOK();
	gDataPort.SendDataPackage(SendBuffer);
	gIntervalTimeout=18;while(gIntervalTimeout) ;
	gDataPort.SendDataPackage(SendBuffer);
	gIntervalTimeout=9;while(gIntervalTimeout) ;
}

//從數據包獲得升級數據參數0=OK 1=ERROR
short CUpgradeFile::ReadUpgradeParameter(const unsigned char *ptrData)
{
	m_UnSuccFileCount=*(ptrData+0);//最后文件(標識)
	m_UprModel=*(ptrData+1);//升級模式 1=單工  2=其他
	m_lFileLen=ftonl(ptrData+2);//升級文件長度
	m_uPackageSize=ftons(ptrData+6);//升級文件每包大小
	m_uPackageCount=ftons(ptrData+8);;//升級包數。
	m_lFileCrcCode1=ftonl(ptrData+10);//升級文件最終校驗碼
	m_lFileCrcCode2=ftonl(ptrData+14);//升級文件最終校驗碼
	memcpy(m_strFileName,ptrData+18,64);//升級文件名
	m_strFileName[64]=0;	
	if(m_lFileCrcCode1!=m_lFileCrcCode2 
		|| m_uPackageSize==0
		|| m_uPackageSize%512!=0
		|| (m_lFileLen+m_uPackageSize-1)/m_uPackageSize!=m_uPackageCount
		|| strlen(m_strFileName)==0)
	{
		m_lFileLen=m_uPackageSize=m_uPackageCount=0;
		m_strFileName[0]=0;
		return 1;
	}
	return 0;
}
short CUpgradeFile::CheckDiskFreeSpace(unsigned long newFileLen)//0=OK 1=不足
{
	struct dfree free;
	getdfree(getdisk()+1, &free);//獲得當前磁盤的基本信息。

	//每族字節數.每一文件按簇分配,不足一簇使用一簇
	unsigned short BytesPerCluster=free.df_bsec*free.df_sclus;
	newFileLen=(newFileLen+BytesPerCluster-1)/BytesPerCluster;//升級文件占有簇數
	if(free.df_avail<newFileLen) return 1;
	return 0;
}
/////////////////////////////////////////////////////////////
void CUpgradeFile::CreateSuccMarkFile()
{
	FILE *fp;
	cprintf("\r\n  ----Create Succ Mark File \\\\uprade!!.OK----");
	fp=fopen(constUpgradeOKFileName,"w");
	fprintf(fp,"OK");
	fclose(fp);
}
//主動發送連接信息(計算機編號)和上位通信協商,每550毫秒發送一次,等待0xB1協議或等待50秒。
short CUpgradeFile::Operate_SendB0_WaitB1()//發送B0等待連接協商
{
	extern  unsigned long GetCurComputerNo();
	static unsigned long ComputerNo=GetCurComputerNo();
	unsigned char SendBuffer[16]={0x0,0x0A,0x01,0xB0};
	*(unsigned long*)(SendBuffer+4)=ftonl(ComputerNo);

	cprintf("\r\nWait Connect.");
	int k=12;
	unsigned char ReturnCode;
	while(k)
	{
		RuningOK();
		gDataPort.SendDataPackage(SendBuffer);

		ReturnCode=gDataPort.ReceiveDataPackage(mBuffer);
		if(ReturnCode==0xB1)
		{
			cprintf("..OK. ");
			return 0;
		}
		else if(ReturnCode==0xB9)
		{
			cprintf("\r\n...Fail(Recv Stop Command).");
			return 1;
		}
		k--;
		cprintf("%u ",k);
	}
	cprintf("..Fail(Over Time). ");
	return 1;
}
//收到B1協商數據,建立文件等等。直到收到B2數據包為止。
short CUpgradeFile::Operate_SendB1_WaitB2()//發送B1等待傳輸數據
{
	unsigned char SendBuffer[12]={0x0,0x07,0x01,0xB1,0xF0};
	unsigned char ReturnCode;
	if(mBuffer[3]!=0xB1) return 1;

	//準備建立升級文件
	ReturnCode=Handle_0xB1();
	if(ReturnCode) {SendErrorMessagePackage(ReturnCode);return 1;}
	DELETE(m_ptrSuccPackMark);
	m_ptrSuccPackMark=new char[m_uPackageCount];
	if(m_ptrSuccPackMark==NULL){SendErrorMessagePackage(0xF1);return 1;}
	memset(m_ptrSuccPackMark,0,m_uPackageCount);
	m_SuccPackCount=0;
	m_CurRecvFileIndex=0;

	//產生wenjianOK,等待發送數據
	gDataPort.SendDataPackage(SendBuffer);//發送

	gSecondTimeout=60;
	while(gSecondTimeout)
	{
		RuningOK();
		ReturnCode=gDataPort.ReceiveDataPackage(mBuffer);
		if(ReturnCode==0xB2) return 0;
		else if(ReturnCode==0xB9)
		{
			cprintf("\r\n...Fail(Recv Stop Command).");
			return 1;
		}
		else if(ReturnCode) gDataPort.SendDataPackage(SendBuffer);//發送
		else cprintf("+");
	}
	cprintf("..Fail(Over Time). ");
	SendErrorMessagePackage(0xF1);
	return 1;
}
//收到數據包回答是否學要需要數據,直到所有數據全部收到。只能接受B2或B9。
short CUpgradeFile::Operate_SendB2_WaitTransDataEND()//發送B2等待傳輸數據或新協商
{
	unsigned char ReturnCode;
HAVE_NEW_DATA:
	if(mBuffer[3]==0xB2)//肯定是數據包B2協議。本來是多余,為了防止程序有錯
	{
		Handle_0xB2();
		if(m_SuccPackCount==m_uPackageCount) return 0;//升級數據接受完成,等待校驗。
		Handle_Answer_0xB2();
	}

	//等待新數據
	gSecondTimeout=60;
	for(;;)
	{
		RuningOK();
		if(gSecondTimeout==0)
		{
			cprintf("...Over Time.");
			SendErrorMessagePackage(0xF1);
			break;
		}
		ReturnCode=gDataPort.ReceiveDataPackage(mBuffer);
		if(ReturnCode==0xB2) goto HAVE_NEW_DATA;
		else if(ReturnCode==0xB9)
		{
			cprintf("\r\n...Fail(Recv Stop Command).");
			break;
		}
		else if(ReturnCode)
		{
			SendErrorMessagePackage(0xF2);
			break;
		}
		else cprintf("+");
	}
	return 1;
}
//數據已經接受完成,等待檢驗文件CRC碼,等待新的協商
short CUpgradeFile::Operate_SendTransDataEND_WaitB1()//發送傳輸數據結束等待新文件協商
{
	unsigned char  ReturnCode;
	//回答數據包

	unsigned char SendBuffer[12]={0x0,0x0A,0x01,0xB2};
	*(unsigned short *)(SendBuffer+4)=ftons(m_SuccPackCount);//正確包數
	*(unsigned short *)(SendBuffer+6)=0L;//需重發包數

	//校驗文件CRC碼。
	FCLOSE(ptrFile);
	if(CheckFileCrcCode())	//文件校驗碼錯
	{
		cprintf("\r\nFile CRC Error");
		SendErrorMessagePackage(0xF7);
		return 1;
	}

	cprintf("\r\nFile %s Uprgade OK!!!",m_strFileName);
	DELETE(m_ptrSuccPackMark);
	gDataPort.SendDataPackage(SendBuffer);
	cprintf("%4c",'O');

	//如果是最后一個文件。
	if(m_UnSuccFileCount==0)//最后一文件。
	{
		CreateSuccMarkFile();
		gSecondTimeout=20;
		while(gSecondTimeout)
		{
			ReturnCode=gDataPort.ReceiveDataPackage(mBuffer);
			if(ReturnCode==0xB9) break;
			else if(ReturnCode)
			{
				gDataPort.SendDataPackage(SendBuffer);
				cprintf("%4c",'O');
			}
			else cprintf("+");
		}
		cprintf("\r\nUprgade Succeed!!!");
		return 1;
	}
	gSecondTimeout=60;
	for(;;)
	{
		if(gSecondTimeout==0)
		{
			cprintf("..Fail(Over Time). ");
			SendErrorMessagePackage(0xF1);
			break;
		}
		ReturnCode=gDataPort.ReceiveDataPackage(mBuffer);
		if(ReturnCode==0xB1) return 0;
		else if(ReturnCode==0xB9)
		{
			cprintf("\r\n...Fail(Recv Stop Command).");
			break;
		}
		else if(ReturnCode)
		{
			gDataPort.SendDataPackage(SendBuffer);
			cprintf("%4c",'A');
		}
		else cprintf("+");
	}

	return 1;
}
void CUpgradeFile::Start()
{
	Teststack();
	//刪除文件 \\uprade!!.OK
	unlink(constUpgradeOKFileName);	//刪除文件uprade!!.OK
	m_ptrSuccPackMark=NULL;
	m_SuccPackCount=0;

	if(Operate_SendB0_WaitB1()) return ;

	RuningOK();
	for(;;)
	{
		RuningOK();
		if(Operate_SendB1_WaitB2()) return ;//返回數據B2協議,發送B1等待傳輸數據
		if(Operate_SendB2_WaitTransDataEND()) return ;//發送B2等待傳輸數據結束,
		if(Operate_SendTransDataEND_WaitB1()) return;//校驗文件CRC,發送傳輸數據結束等待新文件協商
	}
	DELETE(m_ptrSuccPackMark);	
	FCLOSE(ptrFile);
	cprintf("\r\n");
}
////////////////////////////////////////////////////////////////////
//F1=錯誤或人為停止升級、F2=協議(未知)錯誤
//F3=產生文件錯誤、F4=升級磁盤空間不夠、F5=磁盤讀寫錯誤、
unsigned char CUpgradeFile::Handle_0xB1()//返回0=OK,其它=錯誤碼
{
	//從0xB1協議數據mBuffer中獲得升級參數。
	if(ReadUpgradeParameter(mBuffer+4)) return 0xF2;//F2=協議(未知)錯誤

	//產生一個升級空文件
	cprintf("\r\n   Create Upgrade File %s..",m_strFileName);
	cprintf("\r\n(%u)Len %lu,PackageSize %u ,PackCount %u,Name:%s",m_UnSuccFileCount,m_lFileLen,	m_uPackageSize,m_uPackageCount,m_strFileName);
	if(m_lFileLen==0 ||m_uPackageCount==0)
	{
			 cprintf("\r\n\t!!!FileLen=0,Upgrade Fail!!! ");
			 return 0xF8;//升級文件,包數不能為0
	}

	ptrFile=fopen(m_strFileName,"wb");
	if(!ptrFile)
	{
		cprintf("..Error(File Name Error).");
		return 0xF3;//F3=產生文件錯誤
	}

	RuningOK();
	//檢查磁盤空間是否夠。
	if(CheckDiskFreeSpace(m_lFileLen))
	{
		FCLOSE(ptrFile);
		unlink(m_strFileName);
		cprintf("..Error(disk Free Space too small).");
		return 0xF4;//F4=升級磁盤空間不夠
	}
	cprintf("..OK");

	//產生給定大小的磁盤文件
	unsigned long k=m_lFileLen;
	memset(mBuffer,0,2048);
	while(k>=2048)
	{
		RuningOK();
		if(fwrite(mBuffer,2048,1,ptrFile)!=1) goto CREATE_ERROR_END;
		k-=2048;
	}
	if(k) if(fwrite(mBuffer,(unsigned short)k,1,ptrFile)!=1) goto CREATE_ERROR_END;
	FCLOSE(ptrFile);
	
	//檢驗產生文件大小是否成功,并打開讀寫。
	ptrFile=fopen(m_strFileName,"rb+");
	if(ptrFile)
	{
		fseek(ptrFile,0,SEEK_END);
		if(ftell(ptrFile)!=(long)m_lFileLen) goto CREATE_ERROR_END;
	}
	cprintf("\r\n  Waiting Transmit File Data(Succ Count): \r\n");
	return 0;
CREATE_ERROR_END:
	FCLOSE(ptrFile);
	unlink(m_strFileName);
	cprintf("\r\n...Disk have Error!!!!");
	return 0xF5;//F5=磁盤讀寫錯誤
}

short CUpgradeFile::Handle_Check_0xB1()//返回0=和上次協商一致,1=不一致
{
	const unsigned char *ptrData=mBuffer+4;
	if(m_UnSuccFileCount==*(ptrData+0)
	&&m_UprModel==*(ptrData+1)
	&&m_lFileLen==ftonl(ptrData+2)
	&&m_uPackageSize==ftons(ptrData+6)
	&&m_uPackageCount==ftons(ptrData+8)
	&&m_lFileCrcCode1==ftonl(ptrData+10)
	&&m_lFileCrcCode2==ftonl(ptrData+14)
	&& stricmp(m_strFileName,(char*)(ptrData+18))==0
	) return 0;

	return 1;
}

short CUpgradeFile::Handle_0xB2()//0=數據OK  其它=錯誤。
{
	unsigned short int  FileDataLen=((mBuffer[0]<<8)|mBuffer[1])-6-2;
	unsigned short int FileIndex=((mBuffer[4]<<8)|mBuffer[5]);
	unsigned char *ptrFileData=(mBuffer+6);

	if(FileIndex>=m_uPackageCount)
	{
		return 1;
	}
	else if(FileIndex==m_uPackageCount-1)  //最后一包
	{
		if(m_lFileLen!=(m_uPackageCount-1)*(unsigned long)m_uPackageSize+FileDataLen) return 1;
		gArriveAnswerTime=0;
	}
	else//其他包
	{
		if(FileDataLen!=m_uPackageSize ) return 1;
	}

	if(m_ptrSuccPackMark[FileIndex]==0)
	{
		m_SuccPackCount++;
		m_ptrSuccPackMark[FileIndex]=1;
		fseek(ptrFile,(long)FileIndex*m_uPackageSize,SEEK_SET);
		fwrite(ptrFileData,FileDataLen,1,ptrFile);
		cprintf("%4u",m_SuccPackCount);
	}
	m_CurRecvFileIndex=FileIndex;
	return 0;
}

short CUpgradeFile::Handle_Answer_0xB2()//每5秒會一包數據包。單工沒收到一包就就回一包
{
	short ReSendCount=0;
	if(m_SuccPackCount<(m_CurRecvFileIndex+1))//需重發包數
	{
		unsigned short *ptrReSendIndex=(unsigned short *)(mBuffer+8);
		unsigned short int i;
		for(i=0;i<=m_CurRecvFileIndex && ReSendCount<16;i++)
		{
			if(m_ptrSuccPackMark[i]==0)
			{
				*ptrReSendIndex=ftons(i);
				ptrReSendIndex++;
				ReSendCount++;
			}
		}
	}
	*(unsigned short *)mBuffer=ftons(6+4+ReSendCount*2);//長度
	mBuffer[2]=0x01;
	mBuffer[3]=0xB2;
	*(unsigned short *)(mBuffer+4)=ftons(m_SuccPackCount);//正確包數
	*(unsigned short *)(mBuffer+6)=ftons(ReSendCount);//需重發包數
	gDataPort.SendDataPackage(mBuffer);
	cprintf("%4c",'A');
    return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////
short CUpgradeFile::CheckFileCrcCode()//0=OK 1=錯誤
{
	unsigned long CrcCode=0;
	long k=0;

	FILE *fp;
	fp=fopen(m_strFileName,"rb");
	if(!fp) return 1;

	fseek(fp,0,SEEK_END);
	if(ftell(fp)!=(long)m_lFileLen) {FCLOSE(fp);return 1;}

	fseek(fp,0,SEEK_SET);
	for(k=m_lFileLen;k>=2048;k-=2048)
	{
		RuningOK();
		fread(mBuffer,2048,1,fp);
		CrcCode=gCrcCode.Crc32Mtt(mBuffer,2048,CrcCode);
	}
	if(k) fread(mBuffer,(short)k,1,fp);
	CrcCode=gCrcCode.Crc32Mtt(mBuffer,k,CrcCode);
	FCLOSE(fp);
//	cprintf("\r\nCRC=%lX CRc1=%lX CRC2=%lX",CrcCode,m_lFileCrcCode1,m_lFileCrcCode2);
	if(CrcCode==m_lFileCrcCode1 && CrcCode==m_lFileCrcCode2) return 0;
	return 1;
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲狼人国产精品| 国产精品资源网站| 韩国在线一区二区| 91网站在线播放| 久久亚洲精品国产精品紫薇| 亚洲色图清纯唯美| 国内精品国产成人国产三级粉色 | 欧美色视频一区| 久久欧美中文字幕| 丝袜亚洲另类欧美| 在线中文字幕不卡| 国产精品成人一区二区三区夜夜夜| 老司机精品视频在线| 欧美日韩精品高清| 亚洲精品成人天堂一二三| 国产激情精品久久久第一区二区| 91精品国产综合久久久久久漫画| 亚洲色图都市小说| av电影天堂一区二区在线| 久久综合九色欧美综合狠狠| 另类欧美日韩国产在线| 777a∨成人精品桃花网| 亚洲成a人片在线不卡一二三区| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 日韩欧美国产1| 日韩av二区在线播放| 欧美日产在线观看| 亚洲1区2区3区视频| 欧美日韩国产高清一区二区三区 | 秋霞国产午夜精品免费视频| 欧美综合在线视频| 亚洲一区国产视频| 在线观看一区不卡| 亚洲成av人片| 欧美一区二区三区视频免费| 免费成人在线播放| 日韩视频一区二区三区在线播放 | 国产在线播放一区二区三区| 日韩久久精品一区| 极品瑜伽女神91| 久久久久免费观看| 成人免费视频一区二区| 国产精品九色蝌蚪自拍| 99re66热这里只有精品3直播| 亚洲欧洲av在线| 色94色欧美sute亚洲13| 午夜精品久久久久久久99水蜜桃| 精品视频123区在线观看| 天天操天天干天天综合网| 日韩一区二区三区四区| 国产精品456露脸| 亚洲欧美在线观看| 欧美日韩国产综合草草| 久久99国产乱子伦精品免费| 亚洲另类在线视频| 7777精品伊人久久久大香线蕉完整版 | 91在线无精精品入口| 亚洲精品国产第一综合99久久| 欧美在线观看一区| 久久se精品一区二区| 国产精品日产欧美久久久久| 91亚洲大成网污www| 日韩国产一区二| 中文字幕高清不卡| 欧美日韩精品欧美日韩精品一综合| 久久国产精品露脸对白| 中文字幕视频一区| 日韩欧美中文字幕一区| 成人性生交大片| 亚洲国产一区二区三区青草影视| 日韩欧美国产一区二区在线播放| av中文一区二区三区| 人人超碰91尤物精品国产| 国产精品久久久久三级| 欧美日韩美少妇| 成人午夜视频免费看| 免费人成网站在线观看欧美高清| 国产精品免费aⅴ片在线观看| 欧美男同性恋视频网站| 成人av综合在线| 久久99国产精品久久99| 一区二区成人在线视频| 久久久久免费观看| 欧美一区二区三区公司| 色综合久久中文综合久久97| 狠狠色丁香久久婷婷综合_中 | 国产性做久久久久久| 欧美日韩亚洲综合| 99国产一区二区三精品乱码| 男女男精品视频网| 夜夜亚洲天天久久| 国产精品久久久久久久久搜平片 | 欧美三级乱人伦电影| 成人动漫一区二区| 国产一区二区三区综合| 日韩**一区毛片| 亚洲mv在线观看| 亚洲男人的天堂一区二区 | 国产91富婆露脸刺激对白| 久久精品国产秦先生| 午夜天堂影视香蕉久久| 亚洲资源在线观看| 亚洲精品久久久久久国产精华液| 国产精品视频九色porn| 久久久久高清精品| 久久久综合视频| 久久女同性恋中文字幕| 久久亚洲综合av| 欧美精品一区二区在线播放| 欧美一区二区成人6969| 欧美一级片免费看| 日韩欧美成人一区| 日韩视频不卡中文| 日韩欧美国产综合一区| 精品卡一卡二卡三卡四在线| 日韩午夜三级在线| 精品国产乱子伦一区| 久久亚洲综合色一区二区三区| 日韩精品一区二区三区视频| 欧美xxxxxxxxx| 欧美mv日韩mv国产| 久久久久久久久久久久电影| www成人在线观看| 久久久美女毛片| 欧美激情一区二区| 亚洲欧洲性图库| 亚洲高清一区二区三区| 五月天视频一区| 蜜臀精品久久久久久蜜臀| 精品一区二区三区免费毛片爱| 麻豆精品久久精品色综合| 国产一区 二区| 99re这里只有精品首页| 欧美性色综合网| 日韩欧美国产高清| 久久精品免视看| 日韩伦理av电影| 天天av天天翘天天综合网色鬼国产| 爽好久久久欧美精品| 国产精品一区二区三区四区 | 国产精品成人一区二区艾草 | 欧美激情综合五月色丁香| 自拍av一区二区三区| 亚洲成人综合在线| 国产综合色在线视频区| 99久久精品国产导航| 91精品国产91久久久久久一区二区 | 日本一区二区三级电影在线观看 | 久久久久久久久99精品| 亚洲色图.com| 日本不卡一二三| 成人sese在线| 91精品国产91久久综合桃花| 中文字幕第一区| 午夜视频在线观看一区二区| 国产精品资源在线观看| 欧美熟乱第一页| 国产亚洲精品福利| 亚洲国产精品综合小说图片区| 韩日av一区二区| 欧美日韩国产中文| 亚洲视频综合在线| 美女视频黄免费的久久| 91美女在线观看| 2021国产精品久久精品| 亚洲香肠在线观看| 成人国产电影网| 日韩女优毛片在线| 亚洲国产综合91精品麻豆| 国产成人在线视频网址| 欧美日韩成人激情| 亚洲欧美电影院| 成人性生交大合| 久久久久国色av免费看影院| 丝袜诱惑制服诱惑色一区在线观看| 99在线视频精品| 国产色91在线| 国内成人精品2018免费看| 欧美日韩午夜精品| 亚洲女子a中天字幕| 成人午夜碰碰视频| 久久亚洲精精品中文字幕早川悠里 | 亚洲美女在线国产| 懂色av一区二区在线播放| 日韩免费性生活视频播放| 亚洲国产精品一区二区久久| 91无套直看片红桃| 国产精品乱人伦| 成人网在线播放| 欧美经典一区二区| 国产精品一二三区在线| 欧美精品一区二区不卡 | 日韩欧美在线1卡| 视频一区二区三区中文字幕| 欧美在线不卡一区| 亚洲一区二区在线免费看| 在线观看亚洲精品| 亚洲国产精品久久久久婷婷884 | 亚洲一二三四久久| 欧美色欧美亚洲另类二区|