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

📄 main.cpp

📁 使用USB接口实现AVR单片机ISP升级.
💻 CPP
字号:
#include <windows.h>
#include <string.h>
#include <string>
#include  "resource.h"
#include "fileCtrl.h"
#include "cbootloader.h"
#include "cflashmem.h"
#include "usbHIDcalls.h"
//#include <commctrl.h>        //InitCommonControls
//#pragma comment(lib, "comctl32") //InitCommonControls

extern int isp(char* filename);
extern void UpdataMessageStr(char* mystring);
extern void UpdataMessageVal(unsigned int i);
extern void ClearMessage(void);

CFileCtrl m_fileCtrl;
HWND hDialog;
char key[]="file";
char Section[]="FilePath";
char path[MAX_PATH]="";
string inipath="";

DWORD   WINAPI   ThreadProc(LPVOID   lpVoid)
{
	char       buffer[132];
	usbDevice_t  *device = NULL;
	char *vname = "";
	char *devname = "";
	int len=132;
	while(1)
	{
		Sleep(10);
		if(device==NULL)
		{
			//EnableWindow(GetDlgItem(hDialog,IDC_BUTTON_BROWSE),FALSE);
			EnableWindow(GetDlgItem(hDialog,IDOK),FALSE);
			if(usbOpenDevice(&device, USBDEV_SHARED_VENDOR, vname, USBDEV_SHARED_PRODUCT, devname, 1))
				continue;
		}
		if (usbGetReport(device, USB_HID_REPORT_TYPE_FEATURE, 1, (char *)buffer, &len)!=0) 
		{
			//EnableWindow(GetDlgItem(hDialog,IDC_BUTTON_BROWSE),FALSE);
			EnableWindow(GetDlgItem(hDialog,IDOK),FALSE);
			device=NULL;
			usbOpenDevice(&device, USBDEV_SHARED_VENDOR, vname, USBDEV_SHARED_PRODUCT, devname, 1);
			continue;
		}	
		{
			//EnableWindow(GetDlgItem(hDialog,IDC_BUTTON_BROWSE),TRUE);
			EnableWindow(GetDlgItem(hDialog,IDOK),TRUE);
		}
		device=NULL;
		usbOpenDevice(&device, USBDEV_SHARED_VENDOR, vname, USBDEV_SHARED_PRODUCT, devname, 1);
	}
}
//过程函数的返回值都是LRESULT,类型都是CALLBACK   
LRESULT   CALLBACK   DialogProc(HWND   hDlg,   UINT   message,WPARAM   wParam,   LPARAM   lParam) ;
int   CALLBACK   WinMain(HINSTANCE   hInstance,   HINSTANCE   hPrevInstance,   
						 LPSTR   lpCmdLine,   int   nCmdShow)  
{   
	DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG1),GetDesktopWindow(),( DLGPROC )DialogProc);
	return 0;
}  

int isp(char* filename)
{
	CBootloader * bootloader = new CBootloader();
	unsigned int pagesize =bootloader->getPagesize();
	
	if(pagesize==NULL)//ssda
		return ERROR;
	//printf("Pagesize: %d\n", pagesize);
	UpdataMessageStr("Pagesize:");
	UpdataMessageVal(pagesize);
	UpdataMessageStr("\r\n");
	
	CFlashmem * flashmem = new CFlashmem(pagesize);
	string m_filename;
	m_filename=filename;

	if(!stricmp(&filename[m_filename.length()-4],".hex"))
		flashmem->readFromIHEX(filename);
	else if(!stricmp(&filename[m_filename.length()-4],".bin"))
			flashmem->readFromBIN(filename);
	
	CPage* pPage = flashmem->getFirstpage();
	while (pPage != NULL) {
		//printf("Write page at adresse: %d\n", pPage->getPageaddress());
		UpdataMessageStr("Write page at adresse:");
		UpdataMessageVal(pPage->getPageaddress());
		UpdataMessageStr("\r\n");
		bootloader->writePage(pPage);
		pPage = pPage->getNext();
	} 
	
	return 1;
}
   
void InitDialog(HWND hDlg)
{
	string mestr="";
	char pathtemp[MAX_PATH];
	GetCurrentDirectory(MAX_PATH,pathtemp);
	inipath=pathtemp;
	inipath = inipath + "\\BootHID.ini";
	GetPrivateProfileString(Section,key,path,path,MAX_PATH,inipath.c_str());
	m_fileCtrl.SetSelectedDir(path);
	SetDlgItemText(hDlg,IDC_EDIT_FILE_PATH,path);
	mestr=path;
	if(mestr.empty()==FALSE)
	{
		if(!stricmp(&path[mestr.length()-4],".hex"))
			m_fileCtrl.SetBrowseExt("hex");
		else if(!stricmp(&path[mestr.length()-4],".bin"))
			m_fileCtrl.SetBrowseExt("bin");
	}
}
void ProcessISP(HWND hDlg)
{
	string fileName ;
	string Ext;
	int i=0;
	char m_fileName[MAX_PATH];
	GetDlgItemText(hDlg,IDC_EDIT_FILE_PATH, m_fileName,MAX_PATH);
	fileName=m_fileName;
	if (fileName.empty()) 
	{
		UpdataMessageStr("没有选择要下载的文件");
		UpdataMessageStr("\r\n");
	}
	else
	{
		Ext=m_fileCtrl.GetBrowseExt();
		if(stricmp(Ext.c_str(),"hex") && stricmp(Ext.c_str(),"bin"))
		{
			UpdataMessageStr("不是HEX文件或BIN文件!!!");
			UpdataMessageStr("\r\n");
		}
		else
		{
			if(isp((char*)fileName.c_str()))
			{
			UpdataMessageStr("下载完成!!!");
			UpdataMessageStr("\r\n");
			}
		}
	}
}
LRESULT   CALLBACK   DialogProc(HWND   hDlg,   UINT   message,   
								WPARAM   wParam,   LPARAM   lParam)   
{   
	hDialog=hDlg;
	switch   (message)   
	{   
	case   WM_INITDIALOG:
		CreateThread(NULL,0,ThreadProc,0,0,0);
		InitDialog(hDlg);
		return   TRUE;   
	case   WM_COMMAND:   
		if   ( LOWORD(wParam)   ==   IDCANCEL)     
		{   
			EndDialog(hDlg,   0);
			return   TRUE;   
		} 
		else if(LOWORD(wParam)   ==   IDOK)
		{
			ProcessISP(hDlg);
		}
		else if(LOWORD(wParam)   == IDC_BUTTON_BROWSE)
		{
			string Ext;
			ClearMessage();
			GetDlgItemText(hDlg,IDC_EDIT_FILE_PATH,path,MAX_PATH);
			m_fileCtrl.SetSelectedDir(path);
			if (m_fileCtrl.OpenFileDialog())
			{
				SetDlgItemText(hDlg,IDC_EDIT_FILE_PATH, (LPSTR)m_fileCtrl.GetSelectedDir());
				WritePrivateProfileString(Section,key,(LPSTR)m_fileCtrl.GetSelectedDir(),inipath.c_str()); 
			}
			Ext=m_fileCtrl.GetBrowseExt();
			if(stricmp(Ext.c_str(),"hex") && stricmp(Ext.c_str(),"bin"))
			{
				UpdataMessageStr("不是HEX文件或BIN文件!!!");
				UpdataMessageStr("\r\n");
			}
		}
		break;
	case WM_CLOSE:
		EndDialog(hDlg,0);
		return TRUE;
	}   
	return   FALSE;     
  }

⌨️ 快捷键说明

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