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

📄 burnnanddlg.cpp.svn-base

📁 vc环境下编译的一个对USB设备进行烧录的驱动程序
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
    
    //for better look of BS(backspace) char.,
    //the BS in the end of the string will be processed next time.
    for(i=0;i<prevBSCnt;i++) //process the previous BS char.
		string[i]='\b';
    string[prevBSCnt]='\0';
    lstrcat(string,string2);
    string2[0]='\0';

    slen=lstrlen(string);
    for(i=0;i<slen;i++)
    	if(string[slen-i-1]!='\b')break;
    
    prevBSCnt=i; // These BSs will be processed next time.
    slen=slen-prevBSCnt;
    
    if(slen==0)
    {
		return;
    }

    for(i=0;i<slen;i++)
    {
	
	if( (string[i]==KEY_BACKSPACE))
	{
		if (str2Pt>0)
		{
		    string2[str2Pt--]=' ';	//KEY_BACKSPACE;
			txtRepEnd--;
			wasCr=0;
			continue;
		}
	}

	if( (string[i]=='\n'))
	{
	    string2[str2Pt++]='\r';txtRepEnd++;
	    string2[str2Pt++]='\n';txtRepEnd++;
	    wasCr=0;
	    continue;
	}
	if( (string[i]!='\n') && (wasCr==1) )
	{
	    string2[str2Pt++]='\r';txtRepEnd++;
	    string2[str2Pt++]='\n';txtRepEnd++;
	    wasCr=0;
	}
	if(string[i]=='\r')
	{
	    wasCr=1;
	    continue;
	}

	if(string[i]=='\b')
	{
	    //flush string2
	    if(str2Pt>0)
	    {
		string2[--str2Pt]='\0';
		txtRepEnd--;
		continue;
	    }
	    //str2Pt==0;	    
	    if(txtRepStart>0)
	    {
		txtRepStart--;		
	    }
	    continue;
	}
	string2[str2Pt++]=string[i];
	txtRepEnd++;
	// if(str2Pt>256-3)break; //why needed? 2001.1.26
    }
    
    string2[str2Pt]='\0';    
    if(str2Pt>0)
    {
		_hwndEdit->SetSel(txtRepStart, txtRepEnd + 1);
		_hwndEdit->ReplaceSel(string2);
    }
    else
    {
		if(txtRepStart<=txtRepEnd)
		{
			_hwndEdit->SetSel(txtRepStart, txtRepEnd + 1);
			_hwndEdit->ReplaceSel("");
		}
    }
	
    
    //If edit buffer is over EDIT_BUF_SIZE,
    //the size of buffer must be decreased by EDIT_BUF_DEC_SIZE.
    if(txtRepEnd>EDIT_BUF_SIZE)
    {
		lineIdx = _hwndEdit->LineFromChar(EDIT_BUF_DEC_SIZE);
	
		txtSelEnd = _hwndEdit->LineIndex(lineIdx) - 1;

		_hwndEdit->SetSel(0, txtSelEnd + 1);
	
		_hwndEdit->ReplaceSel("");
	
		//make the end of the text shown.
		txtRepEnd = _hwndEdit->GetWindowTextLength() - 1;

		_hwndEdit->SetSel(txtRepEnd + 1, txtRepEnd + 2);

		_hwndEdit->ReplaceSel(" ");

		_hwndEdit->SetSel(txtRepEnd + 1, txtRepEnd + 2);

		_hwndEdit->ReplaceSel("");

    }
}

void CBurnNANDDlg::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here

	if(!m_dlgInit)
		return;

#define BUTTON_BURN_X			500
#define BUTTON_BURN_Y			2
#define BUTTON_BURN_WIDTH		50
#define BUTTON_BURN_HEIGHT		20

#define COM1_GROUP_BOX_X		10
#define COM1_GROUP_BOX_Y		20
#define GROUP_BOX_WIDTH			350
#define GROUP_BOX_HEIGHT		70
#define GROUP_BOX_CLEARANCE		10
#define COLOR_STATIC_X_OFFSET	5
#define COLOR_STATIC_Y_OFFSET	25
#define COLOR_STATIC_WIDTH		40
#define COLOR_STATIC_HEIGHT		30
#define STATUS_STATIC_X_OFFSET	COLOR_STATIC_X_OFFSET + COLOR_STATIC_WIDTH + 5
#define STATUS_STATIC_Y_OFFSET	15
#define STATUS_STATIC_WIDTH		110
#define STATUS_STATIC_HEIGHT	20
#define PROGRESS_X_OFFSET		STATUS_STATIC_X_OFFSET
#define PROGRESS_Y_OFFSET		STATUS_STATIC_Y_OFFSET + STATUS_STATIC_HEIGHT + 5
#define PROGRESS_WIDTH			140
#define PROGRESS_HEIGHT			20
#define COM_SCREEN_X_OFFSET		PROGRESS_X_OFFSET + PROGRESS_WIDTH + 5
#define COM_SCREEN_Y_OFFSET		STATUS_STATIC_Y_OFFSET
#define COM_SCREEN_WIDTH		135
#define COM_SCREEN_HEIGHT		50

    for(int i = 0; i < MAX_DEVICE_NUM / 2; i++)
	{
		int group_box_y = COM1_GROUP_BOX_Y + i * (GROUP_BOX_HEIGHT + GROUP_BOX_CLEARANCE);

		::MoveWindow(GetDlgItem(IDC_GROUP_COM1 + i)->GetSafeHwnd(), COM1_GROUP_BOX_X, group_box_y, 
		    GROUP_BOX_WIDTH, GROUP_BOX_HEIGHT, TRUE);

//		GetDlgItem(IDC_STATIC_COLOR_COM1 + i)->MoveWindow(COM1_GROUP_BOX_X + COLOR_STATIC_X_OFFSET,
//			group_box_y + COLOR_STATIC_Y_OFFSET, COLOR_STATIC_WIDTH, COLOR_STATIC_HEIGHT);

		::MoveWindow(GetDlgItem(IDC_STATIC_COLOR_COM1 + i)->GetSafeHwnd(), COM1_GROUP_BOX_X + COLOR_STATIC_X_OFFSET,
			group_box_y + COLOR_STATIC_Y_OFFSET, COLOR_STATIC_WIDTH, COLOR_STATIC_HEIGHT, TRUE);

		::MoveWindow(GetDlgItem(IDC_STATIC_COM1 + i)->GetSafeHwnd(), COM1_GROUP_BOX_X + STATUS_STATIC_X_OFFSET,
			group_box_y + STATUS_STATIC_Y_OFFSET, STATUS_STATIC_WIDTH, STATUS_STATIC_HEIGHT, TRUE);

		::MoveWindow(GetDlgItem(IDC_PROGRESS_COM1 + i)->GetSafeHwnd(), COM1_GROUP_BOX_X + PROGRESS_X_OFFSET,
			group_box_y + PROGRESS_Y_OFFSET, PROGRESS_WIDTH, PROGRESS_HEIGHT, TRUE);

		::MoveWindow(GetDlgItem(IDC_SCREEN_COM1 + i)->GetSafeHwnd(), COM1_GROUP_BOX_X + COM_SCREEN_X_OFFSET,
			group_box_y + COM_SCREEN_Y_OFFSET, COM_SCREEN_WIDTH, COM_SCREEN_HEIGHT, TRUE);

	}

    for(i = 0; i < MAX_DEVICE_NUM / 2; i++)
	{
		int group_box_y = COM1_GROUP_BOX_Y + i * (GROUP_BOX_HEIGHT + GROUP_BOX_CLEARANCE);

		::MoveWindow(GetDlgItem(IDC_GROUP_COM9 + i)->GetSafeHwnd(), COM1_GROUP_BOX_X + GROUP_BOX_WIDTH + 40, group_box_y, 
		    GROUP_BOX_WIDTH, GROUP_BOX_HEIGHT, TRUE);

//		GetDlgItem(IDC_STATIC_COLOR_COM1 + i)->MoveWindow(COM1_GROUP_BOX_X + COLOR_STATIC_X_OFFSET,
//			group_box_y + COLOR_STATIC_Y_OFFSET, COLOR_STATIC_WIDTH, COLOR_STATIC_HEIGHT);

		::MoveWindow(GetDlgItem(IDC_STATIC_COLOR_COM9 + i)->GetSafeHwnd(), COM1_GROUP_BOX_X + GROUP_BOX_WIDTH + 40 + COLOR_STATIC_X_OFFSET,
			group_box_y + COLOR_STATIC_Y_OFFSET, COLOR_STATIC_WIDTH, COLOR_STATIC_HEIGHT, TRUE);

		::MoveWindow(GetDlgItem(IDC_STATIC_COM9 + i)->GetSafeHwnd(), COM1_GROUP_BOX_X + GROUP_BOX_WIDTH + 40 + STATUS_STATIC_X_OFFSET,
			group_box_y + STATUS_STATIC_Y_OFFSET, STATUS_STATIC_WIDTH, STATUS_STATIC_HEIGHT, TRUE);

		::MoveWindow(GetDlgItem(IDC_PROGRESS_COM9 + i)->GetSafeHwnd(), COM1_GROUP_BOX_X + GROUP_BOX_WIDTH + 40 + PROGRESS_X_OFFSET,
			group_box_y + PROGRESS_Y_OFFSET, PROGRESS_WIDTH, PROGRESS_HEIGHT, TRUE);

		::MoveWindow(GetDlgItem(IDC_SCREEN_COM9 + i)->GetSafeHwnd(), COM1_GROUP_BOX_X + GROUP_BOX_WIDTH + 40 + COM_SCREEN_X_OFFSET,
			group_box_y + COM_SCREEN_Y_OFFSET, COM_SCREEN_WIDTH, COM_SCREEN_HEIGHT, TRUE);

	}


	::MoveWindow(GetDlgItem(IDC_BUTTON_BURN)->GetSafeHwnd(), BUTTON_BURN_X, BUTTON_BURN_Y, 
		BUTTON_BURN_WIDTH, BUTTON_BURN_HEIGHT, TRUE);
		
}

HBRUSH CBurnNANDDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	
	// TODO: Change any attributes of the DC here

	for(int i = 0; i < MAX_DEVICE_NUM; i++)
	{
		if(GetDlgItem(IDC_STATIC_COLOR_COM1 + i)->GetSafeHwnd() == pWnd->m_hWnd)
		{
//			pDC->SetBkColor(m_StaticColor[i]);
			return *m_brStaticBrush[i];
		}
	}
	
	// TODO: Return a different brush if the default is not desired
	return hbr;
}

BOOL CBurnNANDDlg::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class

	if(pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE)
		return TRUE;
	
	return CDialog::PreTranslateMessage(pMsg);
}

DEFINE_GUID(M3USB_GUID, 
                0x6e7ac6a7, 0x1a4c, 0x4a72, 0x83, 0x54, 0x89, 0x95, 0x11, 0xf8, 0x13, 0x51);


void CBurnNANDDlg::OnButtonBurn() 
{
	// TODO: Add your control notification handler code here

	if(m_nWorkNum > 0)
		return;

	for(int i = 0; i < MAX_DEVICE_NUM; i++)
	{
		if(burnflash[i].is_standby())
		{
			if(burnflash[i].is_com_open())
			{
				record_int(config.base_com + i);
			}

			if(config.bUBoot)
			{
				burnflash[i].open_usb();
			}
			else
			{
				set_reg_com(0x20060000 + 0x04, (config.system_clock * 1000000
					/16/115200) & 0xff, burnflash[i].com);

				//burnflash[i].set_reg(0x20060000 + 0x08, ((60000000/16/115200) >> 8) & 0xff);

				burnflash[i].close_com();

				bool ret  = burnflash[i].open_com(config.base_com + i, 115200, m_hWnd);

				//burnflash[i].set_dcb(115200, config.ByteSize, config.Parity, config.StopBits);

				//bool ret = burnflash[i].set_para();
            
				if(!ret)
				{
					CString str;
					str.Format("打开串口%d失败", config.base_com + i);
					MessageBox(str, NULL, MB_OK);
				}

			}
			burnflash[i].begin_burn_flash();
			
			burnflash[i].set_standby(FALSE);
			m_bWorking[i] = TRUE;

			m_nWorkNum++;

			GetMenu()->EnableMenuItem(IDM_CONFIG, MF_BYCOMMAND | MF_GRAYED );
		}
        else
        {
            m_brStaticBrush[i] = &m_brBlackBrush;
			m_StaticColor[i] = RGB(0, 0, 0);
            GetDlgItem(IDC_STATIC_COM1 + i)->SetWindowText("");
            GetDlgItem(IDC_STATIC_COLOR_COM1 + i)->Invalidate();
        }
	}
}

void CBurnNANDDlg::OnSettingHelp() 
{
	// TODO: Add your command handler code here
	CAboutDlg help;

	help.DoModal();
	
}

BOOL CAboutDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here

    CString str;
    str.Format("烧录工具 %d.%d.%dc 版", MAIN_VERSION, SUB_VERSION, SUB1_VERSION);


    GetDlgItem(IDC_STATIC_VERSION)->SetWindowText(str);
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CBurnNANDDlg::StartBurn(int i)
{
	if(burnflash[i].is_standby())
	{
		record_int(config.base_com + i);

		set_reg_com(0x20060000 + 0x04, (config.system_clock * 1000000
			/16/115200) & 0xff, burnflash[i].com);

		//burnflash[i].set_reg(0x20060000 + 0x08, ((60000000/16/115200) >> 8) & 0xff);

		burnflash[i].close_com();

        bool ret  = burnflash[i].open_com(config.base_com + i, 115200, m_hWnd);

        //burnflash[i].set_dcb(115200, config.ByteSize, config.Parity, config.StopBits);

        //bool ret = burnflash[i].set_para();
        
		if(!ret)
		{
			CString str;
			str.Format("打开串口%d失败", config.base_com + i);
			MessageBox(str, NULL, MB_OK);
		}

		m_bWorking[i] = TRUE;
		
		m_nWorkNum++;

		GetMenu()->EnableMenuItem(IDM_CONFIG, MF_BYCOMMAND | MF_GRAYED );

		burnflash[i].begin_burn_flash();
		burnflash[i].set_standby(FALSE);
	}
}

LRESULT CBurnNANDDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	// TODO: Add your specialized code here and/or call the base class
   PDEV_BROADCAST_DEVICEINTERFACE hDev_Broadcast_Deviceinterface;

    if(message == WM_DEVICECHANGE)
    {
        if(wParam == DBT_DEVICEARRIVAL)
        {
            PDEV_BROADCAST_HDR hDev_Broadcast_HDR = (PDEV_BROADCAST_HDR)lParam;

            switch(hDev_Broadcast_HDR->dbch_devicetype)
            {
            case DBT_DEVTYP_DEVICEINTERFACE:
                
                hDev_Broadcast_Deviceinterface = 
                    (PDEV_BROADCAST_DEVICEINTERFACE)lParam;

                if( hDev_Broadcast_Deviceinterface->dbcc_classguid == 
                    M3USB_GUID )
                {
                    for(int i = 0; i < (config.equipment_count * 2); i++)
                    {
                        if(m_arrive_name[i].IsEmpty())
                            break;
                    }

                    if(i >= (config.equipment_count * 2))
                        i = 0;

                    m_arrive_name[i] = hDev_Broadcast_Deviceinterface->dbcc_name;

                    PostMessage(ON_BURNFLASH_DEVICE_ARRIVE, (WPARAM)i, lParam);
                }

                break;
            default:
                break;
            }
        }
        else if(wParam == DBT_DEVICEREMOVECOMPLETE)
        {

            PDEV_BROADCAST_HDR hDev_Broadcast_HDR = (PDEV_BROADCAST_HDR)lParam;

            switch(hDev_Broadcast_HDR->dbch_devicetype)
            {
            case DBT_DEVTYP_DEVICEINTERFACE:
                
                hDev_Broadcast_Deviceinterface = 
                    (PDEV_BROADCAST_DEVICEINTERFACE)lParam;

                if( hDev_Broadcast_Deviceinterface->dbcc_classguid == 
                    M3USB_GUID )
                {
                    for(int i = 0; i < (config.equipment_count * 2); i++)
                    {
                        if(m_remove_name[i].IsEmpty())
                            break;
                    }

                    if(i >= (config.equipment_count * 2))
                        i = 0;

                    m_remove_name[i] = hDev_Broadcast_Deviceinterface->dbcc_name;

                    PostMessage(ON_BURNFLASH_DEVICE_REMOVE, (WPARAM)i, 0);
                }

                break;
            default:
                break;
            }
            
        }
    }
	
	return CDialog::WindowProc(message, wParam, lParam);
}

BOOL CBurnNANDDlg::DoRegisterDeviceInterface( GUID InterfaceClassGuid )
{
    DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
    DWORD Err;

    ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) );
    NotificationFilter.dbcc_size = 
        sizeof(DEV_BROADCAST_DEVICEINTERFACE);
    NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
    NotificationFilter.dbcc_classguid = InterfaceClassGuid;

    m_hDevNotify = RegisterDeviceNotification( m_hWnd, 
        &NotificationFilter,
        DEVICE_NOTIFY_WINDOW_HANDLE
    );

    if(!m_hDevNotify) 
    {
        Err = GetLastError();
        printf( "RegisterDeviceNotification failed: %lx.\n", Err);
        return FALSE;
    }

    return TRUE;
}

⌨️ 快捷键说明

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