📄 mcuprogrammersettingsdlg.cpp
字号:
// MCUProgrammerSettingsDlg.cpp : implementation file
//
#include "stdafx.h"
#include "MCUProgrammer.h"
#include "MCUProgrammerSettingsDlg.h"
#include "SiUtilExports.h"
#include "PartList.h"
#include "CustomDDX.h"
#include "Version.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMCUProgrammerSettingsDlg dialog
/////////////////////////////////////////////////////////////////////////////
CMCUProgrammerSettingsDlg::CMCUProgrammerSettingsDlg(PPROGRAM_SETTINGS pProgramSettings, CWnd* pParent /*=NULL*/)
: CDialog(CMCUProgrammerSettingsDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMCUProgrammerSettingsDlg)
m_EraseCodeSpace = FALSE;
m_FlashPersist = FALSE;
m_SerializeParts = FALSE;
m_HexFileNotBanked = _T("");
m_HexFileBank1 = _T("");
m_HexFileBank2 = _T("");
m_HexFileBank3 = _T("");
m_MaxSerialNumber = 0;
m_NumberPartsInRange = 0;
m_SerialNumberCodeLocation = 0x00000;
m_SerialNumberIncrement = 1;
m_StartingSerialNumber = 0;
m_LogToFile = FALSE;
m_LogFile = _T("MCUProgramLog.txt");
m_AppendToLog = FALSE;
m_LockCodeSpace = FALSE;
m_wLockByteAddr = -1;
m_rLockByteAddr = -1;
m_wLockByteVal = 0x00;
m_rLockByteVal = 0x00;
//}}AFX_DATA_INIT
m_pProgramSettings = pProgramSettings;
}
void CMCUProgrammerSettingsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMCUProgrammerSettingsDlg)
DDX_Control(pDX, IDC_COMBO_SERIALNUMBERSIZE, m_ComboSerialNumberSize);
DDX_Control(pDX, IDC_COMBO_PARTNUMBER, m_ComboPartNumber);
DDX_Control(pDX, IDC_COMBO_DEBUGADAPTER, m_ComboDebugAdapter);
DDX_Check(pDX, IDC_CHECK_ERASECODESPACE, m_EraseCodeSpace);
DDX_Check(pDX, IDC_CHECK_FLASHPERSIST, m_FlashPersist);
DDX_Check(pDX, IDC_CHECK_SERIALIZEPARTS, m_SerializeParts);
DDX_Text(pDX, IDC_EDIT_HEXFILE_NOT_BANKED, m_HexFileNotBanked);
DDX_Text(pDX, IDC_EDIT_HEXFILE_BANK1, m_HexFileBank1);
DDX_Text(pDX, IDC_EDIT_HEXFILE_BANK2, m_HexFileBank2);
DDX_Text(pDX, IDC_EDIT_HEXFILE_BANK3, m_HexFileBank3);
DDX_Text(pDX, IDC_EDIT_MAXSERIALNUMBER, m_MaxSerialNumber);
DDX_Text(pDX, IDC_EDIT_NUMBERPARTSINRANGE, m_NumberPartsInRange);
DDX_Text(pDX, IDC_EDIT_SERIALNUMBERINCREMENT, m_SerialNumberIncrement);
DDV_MinMaxUInt(pDX, m_SerialNumberIncrement, 0, 4228250625);
DDX_Text(pDX, IDC_EDIT_STARTINGSERIALNUMBER, m_StartingSerialNumber);
DDX_Check(pDX, IDC_CHECK_LOGTOFILE, m_LogToFile);
DDX_Text(pDX, IDC_EDIT_LOGFILE, m_LogFile);
DDX_Check(pDX, IDC_CHECK_APPENDLOGFILE, m_AppendToLog);
DDX_Check(pDX, IDC_CHECK_LOCK_CODE_SPACE, m_LockCodeSpace);
//}}AFX_DATA_MAP
DDX_TextHex(pDX, IDC_EDIT_SERIALNUMBERCODELOCATION, m_SerialNumberCodeLocation, 5);
DDV_MaxCharsHex(pDX, m_SerialNumberCodeLocation, 5);
DDV_MinMaxUInt(pDX, m_SerialNumberCodeLocation, 0x00000, 0x1FFFF);
DDX_TextHex(pDX, IDC_EDIT_WRITE_LOCK_BYTE, m_wLockByteVal, 2);
DDV_MaxCharsHex(pDX, m_wLockByteVal, 2);
DDV_MinMaxUInt(pDX, m_wLockByteVal, 0x00, 0xFF);
DDX_TextHex(pDX, IDC_EDIT_READ_LOCK_BYTE, m_rLockByteVal, 2);
DDV_MaxCharsHex(pDX, m_rLockByteVal, 2);
DDV_MinMaxUInt(pDX, m_rLockByteVal, 0x00, 0xFF);
}
BEGIN_MESSAGE_MAP(CMCUProgrammerSettingsDlg, CDialog)
//{{AFX_MSG_MAP(CMCUProgrammerSettingsDlg)
ON_EN_CHANGE(IDC_EDIT_SERIALNUMBERINCREMENT, OnChangeSerial)
ON_BN_CLICKED(IDC_BUTTON_BROWSE_NOT_BANKED, OnButtonBrowseNotBanked)
ON_BN_CLICKED(IDC_BUTTON_BROWSE_BANK1, OnButtonBrowseBank1)
ON_BN_CLICKED(IDC_BUTTON_BROWSE_BANK2, OnButtonBrowseBank2)
ON_BN_CLICKED(IDC_BUTTON_BROWSE_BANK3, OnButtonBrowseBank3)
ON_BN_CLICKED(IDC_BUTTON_BROWSE_LOG, OnButtonBrowseLog)
ON_BN_CLICKED(IDC_CHECK_LOGTOFILE, OnCheckLogtofile)
ON_BN_CLICKED(IDC_BUTTON_LOADSETTINGS, OnButtonLoadsettings)
ON_BN_CLICKED(IDC_BUTTON_SAVESETTINGS, OnButtonSavesettings)
ON_BN_CLICKED(IDC_CHECK_LOCK_CODE_SPACE, OnCheckLockCodeSpace)
ON_CBN_SELCHANGE(IDC_COMBO_SERIALNUMBERSIZE, OnChangeSerial)
ON_EN_CHANGE(IDC_EDIT_STARTINGSERIALNUMBER, OnChangeSerial)
ON_CBN_SELCHANGE(IDC_COMBO_PARTNUMBER, OnSelchangeComboPartnumber)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMCUProgrammerSettingsDlg message handlers
BOOL CMCUProgrammerSettingsDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CString deviceSerial;
DWORD i = 0;
const char *pString;
// Initialize the list of part numbers
for (i = 0; i < PartListSize; i++)
{
m_ComboPartNumber.AddString(PartList[i].partNumber);
}
// List all EC and ToolStick debug adapters found
if (SUCCEEDED(USBDebugDevices(&m_ConnectedDevices)))
{
for (i = 0; i < m_ConnectedDevices; i++)
{
if (SUCCEEDED(GetUSBDeviceSN(i, &pString)))
{
m_ComboDebugAdapter.AddString(pString);
}
}
}
// Next list COM ports for a serial debug adapter
for (i = 1; i <= 255; i++)
{
deviceSerial.Format("COM%d", i);
m_ComboDebugAdapter.AddString(deviceSerial);
}
// Initialize the selection to the serial if it is in the list,
// otherwise the first item
m_ComboDebugAdapter.SelectString(-1, m_pProgramSettings->debugAdapter);
if (m_ComboDebugAdapter.GetCurSel() < 0)
{
m_ComboDebugAdapter.SetCurSel(0);
}
// Initialize all other settings from the program settings structure
m_ComboPartNumber.SelectString(-1, m_pProgramSettings->partNumber);
m_HexFileNotBanked = m_pProgramSettings->hexFileNotBanked;
m_HexFileBank1 = m_pProgramSettings->hexFileBank1;
m_HexFileBank2 = m_pProgramSettings->hexFileBank2;
m_HexFileBank3 = m_pProgramSettings->hexFileBank3;
m_SerializeParts = m_pProgramSettings->serializeParts;
m_EraseCodeSpace = m_pProgramSettings->eraseCodeSpace;
m_FlashPersist = m_pProgramSettings->flashPersist;
m_ComboSerialNumberSize.SetCurSel(m_pProgramSettings->serialNumberSize - 1);
m_StartingSerialNumber = m_pProgramSettings->startingSerialNumber;
m_SerialNumberIncrement = m_pProgramSettings->serialNumberIncrement;
m_SerialNumberCodeLocation = m_pProgramSettings->serialNumberCodeLocation;
m_LogToFile = m_pProgramSettings->logToFile;
m_AppendToLog = m_pProgramSettings->appendToLog;
m_LogFile = m_pProgramSettings->logFilename;
m_LockCodeSpace = m_pProgramSettings->lockCodeMemory;
m_wLockByteVal = m_pProgramSettings->writeLockValue;
m_rLockByteVal = m_pProgramSettings->readLockValue;
// 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);
}
UpdateData(FALSE);
// Update the serial ranges
OnChangeSerial();
// Enable/Disable the lock byte controls
UpdateLockByteCtrls();
// Update the hex file controls for banking
UpdateHexFileCtrls();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CMCUProgrammerSettingsDlg::OnOK()
{
if (UpdateData(TRUE))
{
// Check that valid settings are selected
if (m_ComboPartNumber.GetCurSel() == -1)
{
MessageBox("Please select a part number", "Error", MB_OK | MB_ICONEXCLAMATION);
}
else if (m_HexFileNotBanked.IsEmpty() &&
m_HexFileBank1.IsEmpty() &&
m_HexFileBank2.IsEmpty() &&
m_HexFileBank3.IsEmpty())
{
MessageBox("Please enter a valid file name", "Error", MB_OK | MB_ICONEXCLAMATION);
}
else if (m_StartingSerialNumber > m_MaxSerialNumber)
{
MessageBox("Please enter starting serial number that is in range", "Error", MB_OK | MB_ICONEXCLAMATION);
}
else
{
// If there are no errors, then set the program settings structure to contain
// all the program settings, and close the dialog with an OK
m_ComboPartNumber.GetWindowText(m_pProgramSettings->partNumber);
m_ComboDebugAdapter.GetWindowText(m_pProgramSettings->debugAdapter);
m_pProgramSettings->debugAdapterType = ((DWORD)m_ComboDebugAdapter.GetCurSel() >= m_ConnectedDevices) ? SERIAL_ADAPTER : USB_ADAPTER;
m_pProgramSettings->hexFileNotBanked = m_HexFileNotBanked;
m_pProgramSettings->hexFileBank1 = m_HexFileBank1;
m_pProgramSettings->hexFileBank2 = m_HexFileBank2;
m_pProgramSettings->hexFileBank3 = m_HexFileBank3;
m_pProgramSettings->serializeParts = m_SerializeParts;
m_pProgramSettings->eraseCodeSpace = m_EraseCodeSpace;
m_pProgramSettings->flashPersist = m_FlashPersist;
m_pProgramSettings->startingSerialNumber = m_StartingSerialNumber;
m_pProgramSettings->maxSerialNumber = m_MaxSerialNumber;
m_pProgramSettings->serialNumberIncrement = m_SerialNumberIncrement;
m_pProgramSettings->serialNumberSize = m_ComboSerialNumberSize.GetCurSel() + 1;
m_pProgramSettings->serialNumberCodeLocation = m_SerialNumberCodeLocation;
m_pProgramSettings->lockCodeMemory = m_LockCodeSpace;
m_pProgramSettings->writeLockAddress = m_wLockByteAddr;
m_pProgramSettings->writeLockValue = m_wLockByteVal;
m_pProgramSettings->readLockAddress = m_rLockByteAddr;
m_pProgramSettings->readLockValue = m_rLockByteVal;
// The EC protocol is C2 or JTAG depending on the device, currently the cutoff is the C8051F300
// for JTAG, and everything above it is C2. This is denoted by setting the #define for
// the index of the first C2 device listed, and is named FIRST_C2_DEVICE_LISTED
m_pProgramSettings->ecProtocol = (m_ComboPartNumber.GetCurSel() >= FIRST_C2_DEVICE_LISTED) ? EC_C2 : EC_JTAG;
m_pProgramSettings->logToFile = m_LogToFile;
m_pProgramSettings->appendToLog = m_AppendToLog;
m_pProgramSettings->logFilename = m_LogFile;
// If we are logging to file, try to open it now and set it up for logging
if (m_LogToFile)
{
CFile file;
UINT nOpenFlags = CFile::modeWrite | CFile::modeCreate;
// If we are appending to the log file, then don't
// clear the existing file
if (m_AppendToLog)
{
nOpenFlags |= CFile::modeNoTruncate;
}
// Create/Test the file path
if (file.Open(m_LogFile, nOpenFlags))
{
file.Close();
}
// File test failed
else
{
if (MessageBox("Could not open file for logging, do you want to continue with logging disabled?", "Error", MB_YESNO | MB_ICONEXCLAMATION) == IDYES)
{
m_pProgramSettings->logToFile = m_LogToFile = FALSE;
}
else
{
// Return but don't close the dialog
return;
}
}
}
// Return and close the dialog with IDOK
CDialog::OnOK();
}
}
// If we encountered any errors, then return
// but don't close the dialog
}
void CMCUProgrammerSettingsDlg::OnChangeSerial()
{
UINT i = 0;
// This function is called when any serial settings are changed
// and updates the information in the read only boxes
UpdateData(TRUE);
// Obtain the maximum serial number and display it
UINT serialNumberSize = m_ComboSerialNumberSize.GetCurSel() + 1;
// Reset the max serial number to 0
m_MaxSerialNumber = 0;
// Increase the max serial number by a factor of 256 for each byte that
// is allocated for it ie, 1 byte is 256, 2 bytes is 256 * 256, etc.
for (i = 0; i < serialNumberSize; i++)
{
m_MaxSerialNumber = (256 * (m_MaxSerialNumber + 1)) - 1;
}
// Determine the number of serial numbers it range if the increment is
// not 0. If it is, then there is only 1 serial in range, the starting serial number
if (m_SerialNumberIncrement > 0)
{
// Reset the parts in range
m_NumberPartsInRange = 0;
// If the starting serial is 0, and the size is 4 bytes with an increment of 1, then display the
// max UINT value, otherwise the equation overflows it to 0
// If the starting serial is less than the max serial number then equate the number of parts in range
// If the starting serial is equal to the max serial, there is only 1 part in range and is a special
// case since the equation will produce a 0
if ((m_StartingSerialNumber == 0) && (m_MaxSerialNumber == 0xFFFFFFFF) && (m_SerialNumberIncrement == 1))
{
m_NumberPartsInRange = 0xFFFFFFFF;
}
else if (m_StartingSerialNumber < m_MaxSerialNumber)
{
m_NumberPartsInRange = ((m_MaxSerialNumber - m_StartingSerialNumber) / m_SerialNumberIncrement) + 1;
}
else if (m_StartingSerialNumber == m_MaxSerialNumber)
{
m_NumberPartsInRange = 1;
}
}
else
{
m_NumberPartsInRange = 1;
}
UpdateData(FALSE);
}
void CMCUProgrammerSettingsDlg::BrowseForHexFile(enum WhichFilePath which)
{
UpdateData(TRUE);
BOOL bOpen;
CString filter;
CString defExt;
if (which == FP_LOG)
{
bOpen = FALSE;
filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*||";
defExt = "";
}
else
{
bOpen = TRUE;
filter = "Hex Files (*.hex)|*.hex|All Files (*.*)|*.*||";
defExt = "txt";
}
CFileDialog fileDlg(bOpen, defExt, NULL, OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_NOCHANGEDIR, filter);
// Browse for the Hex file
if (fileDlg.DoModal() == IDOK)
{
switch (which)
{
case FP_NOT_BANKED: m_HexFileNotBanked = fileDlg.GetPathName(); break;
case FP_BANK1: m_HexFileBank1 = fileDlg.GetPathName(); break;
case FP_BANK2: m_HexFileBank2 = fileDlg.GetPathName(); break;
case FP_BANK3: m_HexFileBank3 = fileDlg.GetPathName(); break;
case FP_LOG: m_LogFile = fileDlg.GetPathName(); break;
}
}
UpdateData(FALSE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -