📄 mcuprogrammerdlg.cpp
字号:
void CMCUProgrammerDlg::UpdateWindowProgramSettings()
{
// This takes all displayed settings from the program settings
// structure and displays them in the window
m_PartNumber = m_ProgramSettings.partNumber;
m_DebugAdapter = m_ProgramSettings.debugAdapter;
m_HexFileNotBanked = m_ProgramSettings.hexFileNotBanked;
m_HexFileBank1 = m_ProgramSettings.hexFileBank1;
m_HexFileBank2 = m_ProgramSettings.hexFileBank2;
m_HexFileBank3 = m_ProgramSettings.hexFileBank3;
m_SerializeParts = m_ProgramSettings.serializeParts;
m_EraseCodeSpace = m_ProgramSettings.eraseCodeSpace;
m_FlashPersist = m_ProgramSettings.flashPersist;
m_LockCodeSpace = m_ProgramSettings.lockCodeMemory;
// Determine if serial numbers are used, if not display an N/A in the window
if (m_ProgramSettings.serializeParts)
{
m_CurrentSerialNumber = m_ProgramSettings.startingSerialNumber;
m_CurrentSerialNumberString.Format("%u", m_ProgramSettings.startingSerialNumber);
m_SerialNumberIncrement.Format("%u", m_ProgramSettings.serialNumberIncrement);
}
else
{
m_CurrentSerialNumber = m_ProgramSettings.startingSerialNumber;
m_CurrentSerialNumberString = "N/A";
m_SerialNumberIncrement = "N/A";
}
UpdateData(FALSE);
}
void CMCUProgrammerDlg::OnProgrammenuExit()
{
OnOK();
}
void CMCUProgrammerDlg::OnButtonProgramdevice()
{
BOOL error = FALSE;
int comPort = -1;
CString partNumber;
CString errorMessage;
BeginWaitCursor();
// If settings have not been programmed, then prompt the user
if (!m_SettingsHaveBeenProgrammed)
{
errorMessage.Format("Settings have not been initialized");
LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
error = TRUE;
}
// If we are flash erasing the part, then
// do it before connecting (so that we can erase
// flash locked JTAG parts)
if (m_ProgramSettings.eraseCodeSpace)
{
if (!error)
{
if (m_ProgramSettings.debugAdapterType == SERIAL_ADAPTER)
{
// If using a serial adapter, remove the "COM" from the string, and get the
// port number value
comPort = atoi(m_DebugAdapter.Right(m_DebugAdapter.GetLength() - 3));
if (FAILED(FLASHErase(comPort, DISABLE_DIALOGS, m_ProgramSettings.ecProtocol)))
{
errorMessage.Format("Cannot Erase Code Space on Debug Adapter: %s", m_DebugAdapter);
LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
error = TRUE;
}
}
else if (m_ProgramSettings.debugAdapterType == USB_ADAPTER)
{
if (FAILED(FLASHEraseUSB(m_DebugAdapter, DISABLE_DIALOGS, m_ProgramSettings.ecProtocol)))
{
errorMessage.Format("Cannot Erase Code Space on Debug Adapter: %s", m_DebugAdapter);
LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
error = TRUE;
}
}
}
}
// Connect to the EC, log error if it cannot connect
if (!error)
{
if (m_ProgramSettings.debugAdapterType == SERIAL_ADAPTER)
{
// If using a serial adapter, remove the "COM" from the string, and get the
// port number value
comPort = atoi(m_DebugAdapter.Right(m_DebugAdapter.GetLength() - 3));
if (FAILED(Connect(comPort, DISABLE_DIALOGS, m_ProgramSettings.ecProtocol, 0)))
{
errorMessage.Format("Cannot Connect to Debug Adapter: %s", m_DebugAdapter);
LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
error = TRUE;
}
}
else if (m_ProgramSettings.debugAdapterType == USB_ADAPTER)
{
if (FAILED(ConnectUSB(m_DebugAdapter, m_ProgramSettings.ecProtocol, 1, DISABLE_DIALOGS)))
{
errorMessage.Format("Cannot Connect to Debug Adapter: %s", m_DebugAdapter);
LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
error = TRUE;
}
}
}
// Check that partnum matches, log error if not
if (!error && Connected())
{
// Pointer that will point to the part number string
const char* pPartNumber;
// Get the part number
if (SUCCEEDED(GetDeviceName(&pPartNumber)))
{
// Check the part number to see if it matches, if not give an error
if (m_ProgramSettings.partNumber.Compare(pPartNumber) != 0)
{
errorMessage.Format("Connected Device (%s) does not match Specified Device (%s)", partNumber, m_ProgramSettings.partNumber);
LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
error = TRUE;
}
}
else
{
errorMessage.Format("Cannot obtain Connected Device Part Number");
LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
error = TRUE;
}
}
// Download first hex image (not banked)
// log error if it fails
if (!m_ProgramSettings.hexFileNotBanked.IsEmpty())
{
if (!error && Connected())
{
if (FAILED(Download(const_cast<char*>((const char*)m_ProgramSettings.hexFileNotBanked), 0, DISABLE_DIALOGS, 0, -1, 0, m_ProgramSettings.flashPersist)))
{
errorMessage.Format("Error Downloading Hex File (%s)", m_ProgramSettings.hexFileNotBanked);
LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
error = TRUE;
}
}
}
// Download second hex image (bank1)
// log error if it fails
if (!m_ProgramSettings.hexFileBank1.IsEmpty())
{
if (!error && Connected())
{
if (FAILED(Download(const_cast<char*>((const char*)m_ProgramSettings.hexFileBank1), 0, DISABLE_DIALOGS, 0, 1, 0, m_ProgramSettings.flashPersist)))
{
errorMessage.Format("Error Downloading Hex File (%s)", m_ProgramSettings.hexFileBank1);
LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
error = TRUE;
}
}
}
// Download third hex image (bank2)
// log error if it fails
if (!m_ProgramSettings.hexFileBank2.IsEmpty())
{
if (!error && Connected())
{
if (FAILED(Download(const_cast<char*>((const char*)m_ProgramSettings.hexFileBank2), 0, DISABLE_DIALOGS, 0, 2, 0, m_ProgramSettings.flashPersist)))
{
errorMessage.Format("Error Downloading Hex File (%s)", m_ProgramSettings.hexFileBank2);
LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
error = TRUE;
}
}
}
// Download fourth hex image (bank3)
// log error if it fails
if (!m_ProgramSettings.hexFileBank3.IsEmpty())
{
if (!error && Connected())
{
if (FAILED(Download(const_cast<char*>((const char*)m_ProgramSettings.hexFileBank3), 0, DISABLE_DIALOGS, 0, 3, 0, m_ProgramSettings.flashPersist)))
{
errorMessage.Format("Error Downloading Hex File (%s)", m_ProgramSettings.hexFileBank3);
LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
error = TRUE;
}
}
}
// Wait for device to finish any last minute routines after the download
Sleep(500);
// If we are serializing, write the serial number to the part, then check it
// and log an error if it doesn't match or fails
if (m_ProgramSettings.serializeParts)
{
BYTE serialNumber[4] = {0x00, 0x00, 0x00, 0x00};
if (!error && Connected())
{
// Since a DWORD is reverse on PC memory, flip all the bytes before writing to flash
serialNumber[0] = (m_CurrentSerialNumber & 0xFF000000) >> 24;
serialNumber[1] = (m_CurrentSerialNumber & 0x00FF0000) >> 16;
serialNumber[2] = (m_CurrentSerialNumber & 0x0000FF00) >> 8;
serialNumber[3] = m_CurrentSerialNumber & 0x000000FF;
if (FAILED(SetCodeMemory(&(serialNumber[4-m_ProgramSettings.serialNumberSize]), m_ProgramSettings.serialNumberCodeLocation, m_ProgramSettings.serialNumberSize, DISABLE_DIALOGS)))
{
errorMessage.Format("Error Setting Serial Number (%u)", m_CurrentSerialNumber);
LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
error = TRUE;
}
}
if (!error && Connected())
{
*(DWORD*)serialNumber = 0x00000000;
if (SUCCEEDED(GetCodeMemory(&(serialNumber[4-m_ProgramSettings.serialNumberSize]), m_ProgramSettings.serialNumberCodeLocation, m_ProgramSettings.serialNumberSize)))
{
// Compare in reverse to the current serial number since bytes will be read in reverse order
// of what we will see on the PC memory
if ((DWORD)((serialNumber[0] << 24) + (serialNumber[1] << 16) + (serialNumber[2] << 8) + serialNumber[3]) != m_CurrentSerialNumber)
{
errorMessage.Format("Serial Number in Device (%u) does not match Current Serial Number (%u)", serialNumber, m_CurrentSerialNumber);
LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
error = TRUE;
}
}
else
{
LogMessage(&m_Log, FALSE, "Cannot obtain Serial Number from Device", m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
error = TRUE;
}
}
}
// If we are locking code space
if (m_ProgramSettings.lockCodeMemory)
{
if (!error && Connected())
{
BYTE bytesToWrite;
BYTE lockByte[2];
lockByte[0] = m_ProgramSettings.writeLockValue;
lockByte[1] = m_ProgramSettings.readLockValue;
// If the lock byte addresses are the same, then we only need to write
// one byte
if (m_ProgramSettings.writeLockAddress == m_ProgramSettings.readLockAddress)
{
bytesToWrite = 1;
}
else
{
bytesToWrite = 2;
}
// Write one or two bytes to the lock byte address
if (FAILED(SetCodeMemory(lockByte, m_ProgramSettings.writeLockAddress, bytesToWrite, DISABLE_DIALOGS)))
{
LogMessage(&m_Log, FALSE, "Error setting the lock byte", m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
error = TRUE;
}
}
}
// Disconnect from EC if connected
if (Connected() && (m_ProgramSettings.debugAdapterType == SERIAL_ADAPTER))
{
Disconnect(comPort);
}
else if (Connected() && (m_ProgramSettings.debugAdapterType == USB_ADAPTER))
{
DisconnectUSB();
}
// Log Success and increment Serial Number
if (!error)
{
CString serialString;
serialString.Format("with Serial %u", m_CurrentSerialNumber);
errorMessage.Format("Device %sProgrammed%s and Verified %s", (m_ProgramSettings.eraseCodeSpace ? "Erased, " : ""), (m_ProgramSettings.lockCodeMemory ? ", Locked" : ""), (m_ProgramSettings.serializeParts ? serialString : ""));
LogMessage(&m_Log, TRUE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
// Increment serial number, log error if overflow
if (m_ProgramSettings.serializeParts)
{
if (m_CurrentSerialNumber != 0xFFFFFFFF)
{
m_CurrentSerialNumber += m_ProgramSettings.serialNumberIncrement;
}
else
{
errorMessage.Format("WARNING: Max Serial Number reached, overflowing Current Serial Number to %u", m_ProgramSettings.startingSerialNumber);
LogMessage(&m_Log, TRUE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
m_CurrentSerialNumber = m_ProgramSettings.startingSerialNumber;
}
if (m_CurrentSerialNumber > m_ProgramSettings.maxSerialNumber)
{
errorMessage.Format("WARNING: Max Serial Number reached, overflowing Current Serial Number to %u", m_ProgramSettings.startingSerialNumber);
LogMessage(&m_Log, TRUE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
m_CurrentSerialNumber = m_ProgramSettings.startingSerialNumber;
}
m_CurrentSerialNumberString.Format("%u", m_CurrentSerialNumber);
}
}
UpdateData(FALSE);
EndWaitCursor();
}
void CMCUProgrammerDlg::OnDestroy()
{
CDialog::OnDestroy();
}
void CMCUProgrammerDlg::SetCurrentApplicationDirectory()
{
char szAppPath[MAX_PATH] = "";
CString strAppDirectory;
GetCurrentDirectory(MAX_PATH, szAppPath);
GetModuleFileName(0, szAppPath, sizeof(szAppPath) - 1);
// Extract directory
strAppDirectory = szAppPath;
strAppDirectory = strAppDirectory.Left(strAppDirectory.ReverseFind('\\') + 1);
// Set working directory to the current application directory for the log file
SetCurrentDirectory(strAppDirectory);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -