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

📄 mcuprogrammerdlg.cpp

📁 MCU Production Programmer
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				UpdateWindowProgramSettings();

				m_ProgramSettings.startingSerialNumber = tempStartingSerialNumber;
			}
			else
			{
				// Otherwise just update
				UpdateWindowProgramSettings();
			}
		}
		else
		{
			// If settings have not been programmed, or the serial doesn't
			// need a prompt for updating then just perform the update
			UpdateWindowProgramSettings();
		}

		// Settings have been programmed now if OK was pressed
		m_SettingsHaveBeenProgrammed = TRUE;

		CString startingMessage;
		CTime time;

		time = CTime::GetCurrentTime();

		// Display the settings
		startingMessage.Format("Assigned New Programming Session Settings:\r\n\r\n  Debug Adapter: %s\r\n  Part Number: %s\r\n  Hex File: %s\r\n  Erase Code Space: %s\r\n  Serialize Parts: %s\r\n  Serial Number Code Location: 0x%04X\r\n  Serial Number Size (Bytes): %u\r\n  Starting Serial: %s\r\n  Serial Increment: %s\r\n", m_ProgramSettings.debugAdapter, m_ProgramSettings.partNumber, m_ProgramSettings.hexFile, (m_ProgramSettings.eraseCodeSpace ? "Yes" : "No"), (m_ProgramSettings.serializeParts ? "Yes" : "No"), m_ProgramSettings.serialNumberCodeLocation, m_ProgramSettings.serialNumberSize, m_CurrentSerialNumberString, m_SerialNumberIncrement);
		LogMessage(&m_Log, TRUE, startingMessage, m_ProgramSettings.logToFile, &m_ProgramSettings.logFile);

		// Display the session start time and date
		startingMessage.Format("%s - Starting New Programming Session", time.Format("%B %d %Y"));
		LogMessage(&m_Log, TRUE, startingMessage, m_ProgramSettings.logToFile, &m_ProgramSettings.logFile);

		SetCurrentApplicationDirectory();
	}
}

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_HexFile = m_ProgramSettings.hexFile;
	m_SerializeParts = m_ProgramSettings.serializeParts;
	m_EraseCodeSpace = m_ProgramSettings.eraseCodeSpace;

	// 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 been programmed then connect to the EC,
	// log error if it cannot connect (if settings have not been
	// initialized then prompt the user
	if (m_SettingsHaveBeenProgrammed)
	{
		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, 1, m_ProgramSettings.ecProtocol, 0)))
			{
				errorMessage.Format("Can't Connect to Debug Adapter: %s", m_DebugAdapter);
				LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, &m_ProgramSettings.logFile);
				error = TRUE;
			}
		}
		else if (m_ProgramSettings.debugAdapterType == USB_ADAPTER)
		{
			if (FAILED(ConnectUSB(m_DebugAdapter, m_ProgramSettings.ecProtocol, 1, 1)))
			{
				errorMessage.Format("Can't Connect to Device: %s", m_DebugAdapter);
				LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, &m_ProgramSettings.logFile);
				error = TRUE;
			}
		}
	}
	else
	{
		errorMessage.Format("Settings have not been initialized");
		LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, &m_ProgramSettings.logFile);
		error = TRUE;
	}
	
	// Check that partnum matches, log error if not
	if (!error && Connected())
	{
		// Get the buffer for the part number
		const char* partNumberBuffer = partNumber.GetBuffer(1);

		if (SUCCEEDED(GetDeviceName(&partNumberBuffer)))
		{
			// Check the part number to see if it matches, if not give an error
			if (m_ProgramSettings.partNumber.Compare(partNumberBuffer) != 0)
			{
				errorMessage.Format("Connected Device (%s) does not match Specified Device (%s)", partNumberBuffer, m_ProgramSettings.partNumber);
				LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, &m_ProgramSettings.logFile);
				error = TRUE;
			}
		}
		else
		{
			errorMessage.Format("Cannot obtain Connected Device Part Number");
			LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, &m_ProgramSettings.logFile);
			error = TRUE;
		}

		partNumber.ReleaseBuffer();
	}

	// Download the hex image - erase if needed, log error if it fails
	if (!error && Connected())
	{
		if (FAILED(Download(m_ProgramSettings.hexFile.GetBuffer(1), m_ProgramSettings.eraseCodeSpace, 1)))
		{
			errorMessage.Format("Error Downloading Hex File (%s)", m_ProgramSettings.hexFile);
			LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, &m_ProgramSettings.logFile);
			error = TRUE;
		}

		m_ProgramSettings.hexFile.ReleaseBuffer();
	}

	// 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, 1)))
			{
				errorMessage.Format("Error Setting Serial Number (%u)", m_CurrentSerialNumber);
				LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, &m_ProgramSettings.logFile);
				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.logFile);
					error = TRUE;
				}
			}
			else
			{
				LogMessage(&m_Log, FALSE, "Cannot obtain Serial Number from Device", m_ProgramSettings.logToFile, &m_ProgramSettings.logFile);
				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 and Verified %s", (m_ProgramSettings.eraseCodeSpace ? "Erased, " : ""), (m_ProgramSettings.serializeParts ? serialString : ""));
		LogMessage(&m_Log, TRUE, errorMessage, m_ProgramSettings.logToFile, &m_ProgramSettings.logFile);

		// 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.logFile);
				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.logFile);
				m_CurrentSerialNumber = m_ProgramSettings.startingSerialNumber;
			}

			m_CurrentSerialNumberString.Format("%u", m_CurrentSerialNumber);
		}
	}

	UpdateData(FALSE);

	EndWaitCursor();
}

void CMCUProgrammerDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	// If we were logging to file and it is a valid file, close that file now
	if (m_ProgramSettings.logToFile && (m_ProgramSettings.logFile.m_hFile != (UINT)INVALID_HANDLE_VALUE))
	{
		m_ProgramSettings.logFile.Close();
	}
}

void CMCUProgrammerDlg::HotKeyFunction(WPARAM wParam, LPARAM lParam)
{
	// All HotKeys map to this function, execute it when a hotkey combo is pressed
	OnButtonProgramdevice();
}

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 + -