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

📄 filemakerdlg.cpp

📁 此程序是利用VC实现了USB的驱动程序。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				ClearDataFlag = FALSE;
			}
		}

		if ( TheFlagResetDevice )
		{	if ( session.TransferSetupPacket(0x33, 0x3a, 0xc2, 0, buffer) )
			{	Sleep(50);
				TheFlagResetDevice = FALSE;
			}
		}
*/
		if ( TheFlagVideoStartUp )
		{	
			if ( TheDeviceSampleState )
			{	if ( !session.SampleFinished )
				{	if ( session.TransferSetupPacket(SYSTEM_SET, CTRL_CMD, 0xaa, 0, session.hDataBuffer) )
					{	
						Sleep(40);
						//TheDeviceSampleState = FALSE;
					}
				}
				else
				{
					if ( session.TransferSetupPacket(SYSTEM_SET, CTRL_CMD, 0x55, 0, session.hDataBuffer) )
					{	
						//Sleep(10);
						TheFlagDataTranfer = TRUE;
						TheFlagVideoStartUp = FALSE;
					}
				}
			}
			else
				TheFlagVideoStartUp = FALSE;
		}

		if ( TheFlagDataTranfer )
		{	
			TheWholeReadEnable = TRUE;
			//PostMessage(TheHandleFileMakerDlg,MW_SOMEONEMSG, 2, 0 );
			TheFlagDataTranfer = FALSE;
			TheViewStartPoint = 0;
			PostMessage(TheHandleFileMakerDlg,MW_SOMEONEMSG, 3, 1 );
		}
/*		
		if ( TheFlagStartPlay )
		{	if ( session.TransferSetupPacket(0x33, 0x35, Stop_ISO_WRITE ? 0xc2:0xc1, 0, buffer) )
			{	Sleep(50);
				TheFlagStartPlay = FALSE;
			}
		}
*/
		//if ( !TheWholeReadIsReady || !TheWholeReadEnable )
		//	WaitForSingleObject(hResumeThreadEvent,200);

		if ( !TheWholeReadIsReady && TheWholeReadEnable )	//读取未启动
		{
			TheDataReadLength = 128;
			//TheWholeReadIsReady = FALSE;
			TheWholeReadIsReady = session.TransferSetupPacket (DATA_RDREQ,
				( TheViewStartPoint & 0x00ff00 ) >> 8, 
				( TheViewStartPoint & 0xff0000 ) >> 16,
				TheDataReadLength,session.hDataBuffer);
		}

		if ( TheWholeReadIsReady && TheWholeReadEnable )
		{	
			if ( !session.TransferSetupPacket (TEST_CMD,0,0,0,session.hDataBuffer) )
			{	Sleep(10);
				continue;
			}
		
			if ( session.StateOfReadReady == 3 || session.StateOfReadReady == 0 )
			{	
				TheWholeReadIsReady = FALSE;
			}	
			else
			if ( session.StateOfReadReady == 1 )
			{	
				TheWholeReadIsReady = FALSE;
				pBuffer = pReadBuffer;
				
				if ( session.TransferSetupPacket (DATA_RD,0,0,TheDataReadLength,session.hDataBuffer) )
				{
					if( session.DoRead ( TheDataReadLength * 256 ,pBuffer ) )
					{
						memcpy( TheViewDataBuffer + TheViewStartPoint , pBuffer , TheDataReadLength * 256 );
						TheViewStartPoint += TheDataReadLength * 256;
						if ( TheViewStartPoint >= 128*1024 )
						{	
							TheWholeReadEnable = FALSE;
							//draw
							PostMessage(TheHandleFileMakerDlg,MW_SOMEONEMSG, 2, 0 );
							TheFlagVideoStartUp = TRUE;
							//TheFlagDataTranfer = TRUE;
						}
					}
					session.DoResetPipe (0x85);
				}
			}
			else
			{	//session.StateOfReadReady == 2 (即将接受的数据正在准备中,故等待)
				Sleep(10);
			}
		}

		if ( TheCurrentUpdateMode != session.UpdateDataMode )	//数据更新模式
		{
			/*pSendBuffer[0] = 0x0b;
			pSendBuffer[1] = 0x06;
			pSendBuffer[2] = 0x09;
			pSendBuffer[3] = 0x09;
			temp = (unsigned int )session.DataCRCcheck(4, pSendBuffer );		//CRC校验

			unsigned int tt = temp;
			*/

			if ( !session.TransferSetupPacket (SYSTEM_SET,MODE_SET,TheCurrentUpdateMode > 0 ? 0xa3:0x00,0,session.hDataBuffer) )
			{	Sleep(10);
				continue;
			}
			TheUpdateDownLoadStep = 1;	//更新数据下载完成步骤
									
		}

		if ( TheCurrentUpdateMode > 0 && TheUpdateDataReady )
		{	
			//if ( !TheDataWriteDone )
			//	WaitForSingleObject(MyDevice.ResumeThreadEvent,50);

			switch( TheUpdateDownLoadStep )
			{
				case 1 :	//启动FLASH校验(验证数据是否完成)
							if ( session.StateOfDateCheck != 2)
							{	
								if ( !session.TransferSetupPacket (DATA_CHK ,TheUpdateDataAddress & 0x00ff, (TheUpdateDataAddress & 0xff00 ) >> 8, TheUpdateDataLength ,session.hDataBuffer) )
								{	Sleep(10);									//		起点地址低8位		起点地址高8位		数据总数
									break;
								}
								TheUpdateDownLoadStep = 2;
								TheCounterError = 0;
							}
							break;
				
				case 2 :	//检查FLASH校验结果
							if ( session.StateOfDateCheck == 1)
							{	
								if ( !session.TransferSetupPacket (SYSTEM_SET,SHAK_CMD,0x3a, TheUpdateDataLength ,session.hDataBuffer) )
								{	Sleep(10);				//		起点地址低8位		起点地址高8位		数据总数
									if ( session.ErrorCommond )
										TheUpdateDownLoadStep = 1;
								}
								else
								{
									temp = session.DataCRCcheck( TheUpdateDataLength << 8 , TheUpdateDataBuffer );		//CRC校验
									if ( (temp & 0x00ff) == session.hDataBuffer[6] && ( (temp & 0xff00)>>8 ) == session.hDataBuffer[7] )
									{
										TheUpdateDownLoadStep = 1;
										TRACE("check completed.\n");
									}
									else
									{	//下载数据块
										TRACE("下载数据块\tcheck = 0x%02x 0x%02x\twill = 0x%02x 0x%02x\n",session.hDataBuffer[6],session.hDataBuffer[7],(temp & 0x00ff),( (temp & 0xff00)>>8 ));
										TheUpdateDownLoadStep = 3;
										UpdateStartAddress = 0;
										TheDataDownloading = TRUE;	//暂停使用缓冲区
										TheDataWriteDone = FALSE;
										TheCounterError = 0;
										if ( TheUpdateDataLength < _MAX_DOWNLOADBUFPKG_NUM_ )
											UpdateDataPackageNum = TheUpdateDataLength;
										else
											UpdateDataPackageNum =  _MAX_DOWNLOADBUFPKG_NUM_; //每次传输(默认) 32 * 64 = 2048 字节
									}
								}
							}
							else
							if ( session.StateOfDateCheck == 3 || session.StateOfDateCheck == 0)
							{
								TheUpdateDownLoadStep = 1;
							}
							else
							{
								if ( TheCounterError++ > 10 )		//校验超时
									TheUpdateDownLoadStep = 1;
							}
							break;
				case 3:		//启动BUFFER改写
							if ( UpdateStartAddress < TheUpdateDataLength )	//有数据未传完
							{	if ( !TheDataWriteDone )	 //并且数据写入未启动
								{	
									memcpy ( pSendBuffer , TheUpdateDataBuffer + ( UpdateStartAddress << 8 ), UpdateDataPackageNum << 8 );
									pBuffer = pSendBuffer ;			//每次传输 32 * 256 = 8k 字节(可变)
									temp = session.DataCRCcheck( UpdateDataPackageNum << 8 , pBuffer );		//生成CRC校验
									TRACE2("StartAdd = %d CRC = 0x%04x\n",UpdateStartAddress,temp);
									pBuffer[UpdateDataPackageNum << 8] = temp & 0x00ff;
									pBuffer[(UpdateDataPackageNum << 8) + 1] = (temp & 0xff00) >> 8;

									if(session.TransferSetupPacket (DATA_WR,(BYTE)( UpdateStartAddress & 0x00ff ),(BYTE)( (UpdateStartAddress & 0xff00) >> 8 ),UpdateDataPackageNum,session.hDataBuffer ))
									{									
										if ( session.DoWrite ( (UpdateDataPackageNum << 8) + 64,(unsigned char *)pBuffer) )
										{	total = 0;
											session.StateOfDateCheck = 0;
											session.TransferTimeOut = FALSE;
											do
											{
												Sleep(10);
												if ( session.TransferSetupPacket (0,0,0,0,session.hDataBuffer) )
												{	if ( session.StateOfDateCheck != 0 || session.TransferTimeOut )
													{	
														TRACE("传输启动或超时!\n");
														break;		//传输启动或超时
													}
												}
												else
													TRACE("session.TransferSetupPacket Error!\n");
												total++;
											}
											while ( total<3 && !AllthreadQuit);
												
											if(AllthreadQuit) 
											{	free(pSendBuffer);
												free(pReadBuffer);
												return 0;		//如果线程结束标志置位,则退出线程。
											}

											if ( total <= 3 && session.StateOfDateCheck != 0)
											{
												TheDataWriteDone = TRUE;
												TRACE1("UpdateStartAddress = 0x%04x\n",UpdateStartAddress);
											}
										}
										else
											TRACE("DoWrite Error!\n");
									}
									else
										TRACE("TransferSetupPacket Error!\n");
								}
								else
								{	
									if ( !session.TransferSetupPacket (TEST_CMD,0,0,0,session.hDataBuffer) )
									{	Sleep(10);
										continue;
									}

									if ( session.StateOfDateCheck == 3 || session.StateOfDateCheck == 0 )
											//写操作意外中断
									{	
										TRACE("写操作意外中断! %d\n",session.StateOfDateCheck);
										TheDataWriteDone = FALSE;	//UpdateStartAddress不变(以原有数据重新写入一次)
									}
									else
									if ( session.StateOfDateCheck == 1 )		//写操作正确完成
									{	
										TheDataWriteDone = FALSE;	//无回送标志则恢复初态,开始下一次操作
										UpdateStartAddress += UpdateDataPackageNum ;
										if ( ( UpdateStartAddress + _MAX_DOWNLOADBUFPKG_NUM_ ) <= TheUpdateDataLength )
											UpdateDataPackageNum = _MAX_DOWNLOADBUFPKG_NUM_;
										else
											UpdateDataPackageNum = TheUpdateDataLength - UpdateStartAddress +1;	//剩余数据包数,由下一次操作
										
										TheCounterError = 0;
										TRACE("写操作正确完成!\n");
									}
									else  //session.StateOfDateCheck == 2 (已经写入的数据正在解析过程中,故等待)
									if ( TheCounterError++ > 50 )		//解析过程超时
									{
										TRACE("解析过程超时!\n");
										TheUpdateDownLoadStep = 1;
									}
									
									Sleep(10);
								}
							}
							else	//数据下载完成,进行启动擦除FLASH
							{	
								TheUpdateDownLoadStep = 4;
								TRACE("数据下载完成,进行启动改写FLASH!\n");
							}
							break;
				case 4:		//启动擦除FLASH
							if ( session.StateOfDateCheck != 2)
							{	
								if ( !session.TransferSetupPacket (SYSTEM_SET, FLASH_ERASE ,(TheUpdateDataAddress & 0x0f80) >> 4, 0 ,session.hDataBuffer) )
								{	Sleep(10);									
									break;
								}
								TheUpdateDownLoadStep = 5;
								TheCounterError = 0;
							}
							break;
				case 5 :	//检查擦除结果
							if ( session.StateOfDateCheck == 1)
							{	
								//启动改写FLASH
								if ( !session.TransferSetupPacket (FLASH_WR ,TheUpdateDataAddress & 0x00ff, (TheUpdateDataAddress & 0xff00 ) >> 8, TheUpdateDataLength ,session.hDataBuffer) )
								{	Sleep(10);									//		起点地址低8位		起点地址高8位		数据总数
									break;
								}
								TheUpdateDownLoadStep = 6;
								TheCounterError = 0;
							}
							else
							if ( session.StateOfDateCheck == 3 || session.StateOfDateCheck == 0)
							{
								TheUpdateDownLoadStep = 4;
							}
							else
							{
								TheCounterError++;
								//if ( TheCounterError++ > 10 )		//超时
								//	TheUpdateDownLoadStep = 1;
							}
							break;
				
				case 6 :	//检查改写结果
							if ( session.StateOfDateCheck == 1)
							{	
								TheUpdateDownLoadStep = 1;
							}
							else
							if ( session.StateOfDateCheck == 3 || session.StateOfDateCheck == 0)
							{
								TheUpdateDownLoadStep = 4;
							}
							else
							{
								TheCounterError++;
								//if ( TheCounterError++ > 20 )		//校验超时
								//	TheUpdateDownLoadStep = 1;
							}
							break;
			}
		}
		
		Sleep(10);
	}
	free(pSendBuffer);
	free(pReadBuffer);
	return 0;
}

void CFileMakerDlg::OnButtonClear() 
{
	// TODO: Add your control notification handler code here
	m_MessageList.ResetContent();
	//Stop_ISO_Audio = TRUE;
}

void CFileMakerDlg::OnButtonReset() 
{
	// TODO: Add your control notification handler code here
	TheFlagResetDevice = TRUE;
	CString MsgStr;
	MsgStr.Format("参数复位,可以接受新数据。");
	m_MessageList.AddString(MsgStr);
}

void CFileMakerDlg::OnCheck4() 
{
	// TODO: Add your control notification handler code here
	int i=0;
	UpdateData(TRUE);
	if ( m_FlashUpdateMode )
	{	
		m_ButtonUpdate.EnableWindow(TRUE);
		m_FileNameCtrl.EnableWindow(TRUE);
		m_FlashUpdateAddrCtrl.EnableWindow(TRUE);
		TheUpdateDataReady = FALSE;
		TheCurrentUpdateMode = 1;
	}
	else
	{	
		m_ButtonUpdate.EnableWindow(FALSE);
		m_FileNameCtrl.EnableWindow(FALSE);
		m_FlashUpdateAddrCtrl.EnableWindow(FALSE);
		TheCurrentUpdateMode = 0;
	};
}

void CFileMakerDlg::OnCheckStartUp() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	if ( m_SampleState != TheDeviceSampleState )
	{	TheDeviceSampleState = m_SampleState;
		TheFlagVideoStartUp = TRUE;
	}
}

void CFileMakerDlg::OnChangeEdit1() 
{
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CDialog::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.
	
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	UpdateData(FALSE);
}

void CFileMakerDlg::OnChangeEdit2() 
{
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CDialog::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.
	
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_CommondDataSend.EnableWindow(TRUE);
	UpdateData(FALSE);	
}

char TheCommondDataSend[32];
int TheCommondDataLength = 0;
int TheCommondDataNextSend = 0;

void CFileMakerDlg::OnCommondDataSend() 
{
	// TODO: Add your control notification handler code here
}

void CFileMakerDlg::OnChangeEdit3() 
{
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CDialog::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.
	
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	int i,l=m_FlashUpdateAddr.GetLength();
	if ( l > 0 )
	{ 	unsigned char ch = m_FlashUpdateAddr.GetAt(l-1);
		if ( l<=6 && ( ( ch>='0' && ch<='9' || ch >='A' && ch<='F' ) && l<6 || (l==6 && ch=='H') ) )
		{
			if (l==6)
			{	TheUpdateStartAddress = 0;
				for (i=0;i<l-1;i++)
					TheUpdateStartAddress += chtoint(m_FlashUpdateAddr.GetAt(l-2-i)) << (i*4) ;
			}
		}
		else
		{	m_FlashUpdateAddr = m_FlashUpdateAddr.Left( l - 1 );
			UpdateData(FALSE);
			m_FlashUpdateAddrCtrl.SetSel(l,-1);
		}
	}
}

⌨️ 快捷键说明

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