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

📄 mcuprogrammersettingsdlg.cpp

📁 Sliicon Lab C8051F 系列MCU 燒錄程式碼
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}

void CMCUProgrammerSettingsDlg::OnButtonBrowseNotBanked() 
{
	BrowseForHexFile(FP_NOT_BANKED);
}

void CMCUProgrammerSettingsDlg::OnButtonBrowseBank1() 
{
	BrowseForHexFile(FP_BANK1);
}

void CMCUProgrammerSettingsDlg::OnButtonBrowseBank2() 
{
	BrowseForHexFile(FP_BANK2);
}

void CMCUProgrammerSettingsDlg::OnButtonBrowseBank3() 
{
	BrowseForHexFile(FP_BANK3);
}

void CMCUProgrammerSettingsDlg::OnButtonBrowseLog()
{
	BrowseForHexFile(FP_LOG);
}

void CMCUProgrammerSettingsDlg::OnCheckLogtofile() 
{
	UpdateData(TRUE);

	// Only enable the append if we are logging, if not do not allow it
	// as a selection
	if (m_LogToFile)
	{
		GetDlgItem(IDC_CHECK_APPENDLOGFILE)->EnableWindow(TRUE);
	}
	else
	{
		GetDlgItem(IDC_CHECK_APPENDLOGFILE)->EnableWindow(FALSE);
	}	
}

void CMCUProgrammerSettingsDlg::OnCheckLockCodeSpace() 
{
	// Update the lock byte edit boxes and captions
	UpdateLockByteCtrls();
}

// Update the lock byte edit boxes and captions
void CMCUProgrammerSettingsDlg::UpdateLockByteCtrls()
{
	BOOL bEnableLockCtrls = FALSE;

// Enable/disable the lock byte controls based on the check status
// of the lock code space checkbox

	bEnableLockCtrls = IsDlgButtonChecked(IDC_CHECK_LOCK_CODE_SPACE);

	// Enable the lock byte controls if the checkbox is enabled
	// otherwise disable the controls
	GetDlgItem(IDC_STATIC_WRITE_LOCK_BYTE)->EnableWindow(bEnableLockCtrls);
	GetDlgItem(IDC_EDIT_WRITE_LOCK_BYTE)->EnableWindow(bEnableLockCtrls);
	GetDlgItem(IDC_STATIC_READ_LOCK_BYTE)->EnableWindow(bEnableLockCtrls);
	GetDlgItem(IDC_EDIT_READ_LOCK_BYTE)->EnableWindow(bEnableLockCtrls);

// Show one or two lock byte edit boxes depending on the selected part
// number

	CString partNum;
	m_ComboPartNumber.GetWindowText(partNum);

	// Get the read/write lock byte addresses
	if (GetLockByteAddresses(partNum, m_wLockByteAddr, m_rLockByteAddr))
	{
		BOOL bTwoLockBytes = TRUE;

		CString textA;
		CString textB;
		
		CString prefix = "Write Lock";

		// If the addresses are the same, then there only needs to be
		// one edit box for the lock byte value
		if (m_wLockByteAddr == m_rLockByteAddr)
		{
			prefix = "R/W Lock";
			bTwoLockBytes = FALSE;
		}

		// If addresses are the same, then show:
		//
		// "R/W Lock
		//  (0x00000):"
		//
		// Otherwise show:
		//
		// "Write Lock
		//  (0x00000):"
		// "Read Lock
		//  (0x00000):"
		//

		textA.Format("%s\n(0x%05X):", prefix, m_wLockByteAddr);
		textB.Format("Read Lock\n(0x%05X):", m_rLockByteAddr);

		SetDlgItemText(IDC_STATIC_WRITE_LOCK_BYTE, textA);
		SetDlgItemText(IDC_STATIC_READ_LOCK_BYTE, textB);

		GetDlgItem(IDC_STATIC_WRITE_LOCK_BYTE)->ShowWindow(TRUE);
		GetDlgItem(IDC_EDIT_WRITE_LOCK_BYTE)->ShowWindow(TRUE);
		GetDlgItem(IDC_STATIC_READ_LOCK_BYTE)->ShowWindow(bTwoLockBytes);
		GetDlgItem(IDC_EDIT_READ_LOCK_BYTE)->ShowWindow(bTwoLockBytes);
	}
	// If an unknown part or no part has been selected
	else
	{
		// Hide all lock byte controls
		GetDlgItem(IDC_STATIC_WRITE_LOCK_BYTE)->ShowWindow(FALSE);
		GetDlgItem(IDC_EDIT_WRITE_LOCK_BYTE)->ShowWindow(FALSE);
		GetDlgItem(IDC_STATIC_READ_LOCK_BYTE)->ShowWindow(FALSE);
		GetDlgItem(IDC_EDIT_READ_LOCK_BYTE)->ShowWindow(FALSE);

		// Uncheck the lock code space checkbox
		CheckDlgButton(IDC_CHECK_LOCK_CODE_SPACE, FALSE);
		m_LockCodeSpace = FALSE;
	}
}

void CMCUProgrammerSettingsDlg::UpdateHexFileCtrls()
{
	int numBanks = 0;

	CString partNum;
	m_ComboPartNumber.GetWindowText(partNum);

	// Check to see if the part supports code banking
	GetNumCodeBanks(partNum, numBanks);

	// Show all three sets of controls if the device supports banking
	if (numBanks == 3)
	{
		GetDlgItem(IDC_STATIC_BANK1)->EnableWindow(TRUE);
		GetDlgItem(IDC_STATIC_BANK2)->EnableWindow(TRUE);
		GetDlgItem(IDC_STATIC_BANK3)->EnableWindow(TRUE);
		GetDlgItem(IDC_EDIT_HEXFILE_BANK1)->EnableWindow(TRUE);
		GetDlgItem(IDC_EDIT_HEXFILE_BANK2)->EnableWindow(TRUE);
		GetDlgItem(IDC_EDIT_HEXFILE_BANK3)->EnableWindow(TRUE);
		GetDlgItem(IDC_BUTTON_BROWSE_BANK1)->EnableWindow(TRUE);
		GetDlgItem(IDC_BUTTON_BROWSE_BANK2)->EnableWindow(TRUE);
		GetDlgItem(IDC_BUTTON_BROWSE_BANK3)->EnableWindow(TRUE);
	}
	// Otherwise only show the first set of controls
	else
	{
		GetDlgItem(IDC_STATIC_BANK1)->EnableWindow(FALSE);
		GetDlgItem(IDC_STATIC_BANK2)->EnableWindow(FALSE);
		GetDlgItem(IDC_STATIC_BANK3)->EnableWindow(FALSE);
		GetDlgItem(IDC_EDIT_HEXFILE_BANK1)->EnableWindow(FALSE);
		GetDlgItem(IDC_EDIT_HEXFILE_BANK2)->EnableWindow(FALSE);
		GetDlgItem(IDC_EDIT_HEXFILE_BANK3)->EnableWindow(FALSE);
		GetDlgItem(IDC_BUTTON_BROWSE_BANK1)->EnableWindow(FALSE);
		GetDlgItem(IDC_BUTTON_BROWSE_BANK2)->EnableWindow(FALSE);
		GetDlgItem(IDC_BUTTON_BROWSE_BANK3)->EnableWindow(FALSE);

		// Clear the banked hex filenames
		SetDlgItemText(IDC_EDIT_HEXFILE_BANK1, "");
		SetDlgItemText(IDC_EDIT_HEXFILE_BANK2, "");
		SetDlgItemText(IDC_EDIT_HEXFILE_BANK3, "");
		m_HexFileBank1.Empty();
		m_HexFileBank2.Empty();
		m_HexFileBank3.Empty();
	}
}

BOOL CMCUProgrammerSettingsDlg::GetLockByteAddresses(CString partNum, UINT& wLockAddr, UINT& rLockAddr)
{
	BOOL retVal = FALSE;

	// Search through the part list for a matching part name
	for (int i = 0; i < PartListSize; i++)
	{
		if (PartList[i].partNumber == partNum)
		{
			wLockAddr = PartList[i].wLockAddr;
			rLockAddr = PartList[i].rLockAddr;

			retVal = TRUE;
			break;
		}
	}

	return retVal;
}

BOOL CMCUProgrammerSettingsDlg::GetNumCodeBanks(CString partNum, int& numBanks)
{
	BOOL retVal = FALSE;

	// So far only the F12x/F13x devices support code banking
	// with 3, 32kB banks plus the common bank
	if (partNum.Left(8) == "C8051F12" ||
		partNum.Left(8) == "C8051F13")
	{
		numBanks = 3;
		retVal = TRUE;
	}
	else if (!partNum.IsEmpty())
	{
		numBanks = 0;
		retVal = TRUE;
	}
	else
	{
		retVal = FALSE;
	}

	return retVal;
}

void CMCUProgrammerSettingsDlg::OnButtonLoadsettings() 
{
	UpdateData(TRUE);

	CFileDialog fileDlg(TRUE, "pgs", NULL, OFN_NOCHANGEDIR, "Program Settings Files (*.pgs)|*.pgs|All Files(*.*)|*.*||");
	
	// Browse for the Hex file
	if (fileDlg.DoModal() == IDOK)
	{
		SerializeSettings(fileDlg.GetPathName(), SERIALIZE_IN);
	}

	UpdateData(FALSE);

	// Configure the check boxes
	OnCheckLogtofile();

	// Update the serial settings
	OnChangeSerial();

	// Update the lock byte edit boxes and captions
	UpdateLockByteCtrls();

	// Update the hex file controls for banking
	UpdateHexFileCtrls();
}

void CMCUProgrammerSettingsDlg::OnButtonSavesettings() 
{
	UpdateData(TRUE);

	CFileDialog fileDlg(FALSE, "pgs", "ProgramSettings.pgs", OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_NOCHANGEDIR, "Program Settings Files (*.pgs)|*.pgs|All Files(*.*)|*.*||");
	
	// Browse for the Hex file
	if (fileDlg.DoModal() == IDOK)
	{
		SerializeSettings(fileDlg.GetPathName(), SERIALIZE_OUT);
	}

	UpdateData(FALSE);
}

void CMCUProgrammerSettingsDlg::SerializeSettings(CString fileName, BOOL inOut)
{
	CFile iniFile;

	// Check if we are serializing in or out
	if (inOut == SERIALIZE_IN)
	{
		// Serialize in the default settings if the ini file exists
		if (iniFile.Open(fileName, CFile::modeRead))
		{
			CArchive ar(&iniFile, CArchive::load);
			Serialize(ar);
			ar.Close();
			iniFile.Close();
		}
	}
	else
	{
		// Serialize in the default settings if the ini file exists
		if (iniFile.Open(fileName, CFile::modeCreate | CFile::modeWrite))
		{
			CArchive ar(&iniFile, CArchive::store);
			Serialize(ar);
			ar.Close();
			iniFile.Close();
		}
	}
}

void CMCUProgrammerSettingsDlg::Serialize(CArchive& ar) 
{
	try
	{
		// Serialize the configuration in or out
		if (ar.IsStoring())
		{
			ar << m_ComboSerialNumberSize.GetCurSel();
			ar << m_ComboPartNumber.GetCurSel();
			ar << m_EraseCodeSpace;
			ar << m_SerializeParts;
			ar << m_HexFileNotBanked;
			ar << m_SerialNumberCodeLocation;
			ar << m_SerialNumberIncrement;
			ar << m_StartingSerialNumber;
			ar << m_LogToFile;
			ar << m_LogFile;
			ar << m_AppendToLog;
			
			// New to version 1.2
			ar << (WORD)VERSION_MAJOR;
			ar << (WORD)VERSION_MINOR;
			ar << m_HexFileBank1;
			ar << m_HexFileBank2;
			ar << m_HexFileBank3;
			ar << m_FlashPersist;
			ar << m_LockCodeSpace;
			ar << m_wLockByteVal;
			ar << m_rLockByteVal;
		}
		else
		{
			int tmp;
			WORD version_major;
			WORD version_minor;

			ar >> tmp;
			m_ComboSerialNumberSize.SetCurSel(tmp);
			ar >> tmp;
			m_ComboPartNumber.SetCurSel(tmp);
			ar >> m_EraseCodeSpace;
			ar >> m_SerializeParts;
			ar >> m_HexFileNotBanked;
			ar >> m_SerialNumberCodeLocation;
			ar >> m_SerialNumberIncrement;
			ar >> m_StartingSerialNumber;
			ar >> m_LogToFile;
			ar >> m_LogFile;
			ar >> m_AppendToLog;

			// Previous version of the save file did not
			// serialize these variables
			//
			// So only serialize if the file isn't
			// empty
			if (!ar.IsBufferEmpty())
			{
				ar >> version_major;
				ar >> version_minor;

				ar >> m_HexFileBank1;
				ar >> m_HexFileBank2;
				ar >> m_HexFileBank3;
				ar >> m_FlashPersist;
				ar >> m_LockCodeSpace;
				ar >> m_wLockByteVal;
				ar >> m_rLockByteVal;
			}
			// Otherwise use default values
			else
			{
				m_HexFileBank1.Empty();
				m_HexFileBank2.Empty();
				m_HexFileBank3.Empty();
				m_FlashPersist	= FALSE;
				m_LockCodeSpace	= FALSE;
				m_wLockByteVal	= 0xFF;
				m_rLockByteVal	= 0xFF;
			}
		}
	}
	catch(...)
	{
		
	}
}

void CMCUProgrammerSettingsDlg::OnSelchangeComboPartnumber() 
{
	// Update the lock byte edit boxes and captions
	UpdateLockByteCtrls();

	// Update the hex file controls for banking
	UpdateHexFileCtrls();
}

⌨️ 快捷键说明

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