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

📄 downloaddialog.cpp

📁 该程序使用计算机的并行口烧写flash芯片
💻 CPP
字号:
// DownloadDialog.cpp : implementation file
//

#include "stdafx.h"
#include "FlashWriter.h"
#include "DownloadDialog.h"
#include "FlashWriterDlg.h"

#include "conio.h"
#include "ParallelPort.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDownloadDialog dialog

void InitParallel()
{
	_outp(PORT_CONTROL, 0);
}

void SendOneByte(BYTE btData)
{
	_outp(PORT_DATA, btData);

	_outp(PORT_CONTROL, REQUEST_ONESEND_BIT);
	//Sleep(10);
	_outp(PORT_CONTROL, 0);

	return;
}

/////////////////////////////////////////////
//
DWORD WINAPI DownloadThread(LPVOID lPara)
{
	HANDLE hGiveIO, hFile = INVALID_HANDLE_VALUE;
	DWORD dwFileSize;
	const DWORD dwToRead = 6;
	DWORD dwHaveRead;
	BYTE btReadBuf[dwToRead];
	const DWORD dwTryTime = 10;
	CString csDisplay;
	CDownloadDialog* pCDownloadDialog = (CDownloadDialog*)lPara;

    hGiveIO = CreateFile("\\\\.\\giveio", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if(hGiveIO == INVALID_HANDLE_VALUE) 
	{
		TRACE("Couldn't access giveio device!");
        return 0;
    }
	CloseHandle(hGiveIO);
	
	hFile=CreateFile(pCDownloadDialog->m_csFilename,GENERIC_WRITE|GENERIC_READ,FILE_SHARE_WRITE|FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
	if(hFile == INVALID_HANDLE_VALUE)
	{
		TRACE("Failed to open the file!");
		return 0;
	}

	dwFileSize = GetFileSize(hFile,NULL);
	(pCDownloadDialog->m_ProgressCtr).SetRange32(0,dwFileSize/dwToRead);
	(pCDownloadDialog->m_ProgressCtr).SetPos(0);
	csDisplay.Format(" %d kB",dwFileSize/1024);
	pCDownloadDialog->SetDlgItemText(IDC_FILESIZE, csDisplay);

	if(SetFilePointer(hFile,0,NULL,FILE_BEGIN)==0xffffffff)
	{
		TRACE("Failed to set the file pointer!");
		CloseHandle(hFile);
		return 0;
	}

	InitParallel();

	for(DWORD i=0; i<dwFileSize/dwToRead; i++)
	{
		ReadFile(hFile,btReadBuf,dwToRead,&dwHaveRead,NULL);
		if(dwToRead!=dwHaveRead)
		{
			TRACE("Not enough data!");
			CloseHandle(hFile);
			return 0;
		}

		while(1)
		{
			BOOL bDone = FALSE;
			
			for(DWORD j=0; j<dwToRead; j++)
			{
				SendOneByte(btReadBuf[j]);
			}
			_outp(PORT_CONTROL, REQUEST_SIXSEND_BIT);
			//Sleep(10);
			_outp(PORT_CONTROL, 0);

			while(1)
			{
				EnterCriticalSection(&(pCDownloadDialog->m_csExitThread));
				if(pCDownloadDialog->m_bExitThread)
				{
					LeaveCriticalSection(&(pCDownloadDialog->m_csExitThread));
					TRACE("Ended by the user!");
					CloseHandle(hFile);
					return 1;
				}
				LeaveCriticalSection(&(pCDownloadDialog->m_csExitThread));
				
				if( (SIX_DONE_BIT|(BYTE)_inp(PORT_STATE)) )
				{
					bDone = TRUE;
					break;
				}
				else if( (SIX_FAIL_BIT|(BYTE)_inp(PORT_STATE)) )
				{
					bDone = FALSE;
					break;
				}
			}

			if(bDone)
			{
				break;
			}
		}
		(pCDownloadDialog->m_ProgressCtr).SetPos(i+1);
		csDisplay.Format(" %d kB",(i+1)*6/1024);
		pCDownloadDialog->SetDlgItemText(IDC_HAVEDOWN, csDisplay);
	}

	pCDownloadDialog->EndDialog(IDOK);
	
	return 1;
}

CDownloadDialog::CDownloadDialog(CWnd* pParent /*=NULL*/)
	: CDialog(CDownloadDialog::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDownloadDialog)
		// NOTE: the ClassWizard will add member initialization here
	m_hThread = NULL;
	m_bExitThread = FALSE;
	InitializeCriticalSection(&m_csExitThread);
	m_csFilename = ((CFlashWriterDlg*)pParent)->m_csFilename;
	
	m_hThread=CreateThread(NULL,0,DownloadThread,this,NULL,NULL);
	if(NULL==m_hThread)
	{
		AfxMessageBox("Can not create download thread!");
	}
	//}}AFX_DATA_INIT
}

CDownloadDialog::~CDownloadDialog()
{
	DeleteCriticalSection(&m_csExitThread);
}

void CDownloadDialog::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDownloadDialog)
	DDX_Control(pDX, IDC_DOWNLOAD_PROGRESS, m_ProgressCtr);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDownloadDialog, CDialog)
	//{{AFX_MSG_MAP(CDownloadDialog)
	ON_BN_CLICKED(IDC_CANCEL_DOWNLOAD, OnCancel)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDownloadDialog message handlers

void CDownloadDialog::OnCancel() 
{
	// TODO: Add your control notification handler code here
	EnterCriticalSection(&m_csExitThread);
	m_bExitThread = TRUE;
	LeaveCriticalSection(&m_csExitThread);

//	WaitForSingleObject(m_hThread,INFINITE);
	WaitForSingleObject(m_hThread,500);
	CloseHandle(m_hThread);
	EndDialog(IDCANCEL);
}

⌨️ 快捷键说明

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