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

📄 jobinfo.cpp

📁 一个开放源代码的AVR单片机编程器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/*****************************************************************************
 *
 * Atmel Corporation
 *
 * File              : JobInfo.cpp
 * Compiler          : Dev-C++ 4.9.8.0 - http://bloodshed.net/dev/
 * Revision          : $Revision: 3.0 $
 * Date              : $Date: Tuesday, January 17, 2006 18:33:50 UTC $
 * Updated by        : $Author: raapeland $
 *
 * Support mail      : avr@atmel.com
 *
 * Target platform   : Win32
 *
 * AppNote           : AVR911 - AVR Open-source Programmer
 *
 * Description       : A class holding information on what the AVR Open-Source Programmer
 *                     should do. The information is derived from the command-line.
 *
 *
 ****************************************************************************/
#include "JobInfo.hpp"

#include <conio.h>

#define VERSIONSTRING "$Revision: 3.0 $" // For use in later text output.

#define TIMEOUT 5
#define TIMEOUTSTRING "5"


JobInfo::JobInfo()
{
	/* Initialize variables */
	showHelp = false;
	silentMode = false;
	noProgressIndicator = false;
	readSignature = false;
	chipErase = false;
	getHWrevision = false;
	getSWrevision = false;
	programFlash = false;
	programEEPROM = false;
	readFlash = false;
	readEEPROM = false;
	verifyFlash = false;
	verifyEEPROM = false;
	readLockBits = false;
	readFuseBits = false;
	readOSCCAL = false;

	deviceName.erase();
	inputFileFlash.erase();
	inputFileEEPROM.erase();
	outputFileFlash.erase();
	outputFileEEPROM.erase();

	OSCCAL_Parameter = -1;
	OSCCAL_FlashAddress = -1;
	OSCCAL_EEPROMAddress = -1;

	programLockBits = -1;
	verifyLockBits = -1;	

	programFuseBits = -1;
	programExtendedFuseBits = -1;
	verifyFuseBits = -1;
	verifyExtendedFuseBits = -1;

	memoryFillPattern = -1;

	flashStartAddress = -1;
	flashEndAddress = -1;

	eepromStartAddress = -1;
	eepromEndAddress = -1;

	comPort = -1;
}



void JobInfo::parseCommandline( int argc, char *argv[] )
{
	char * param; // Temp string ptr for holding current parsed parameter.
	int comma; // Temp position for comma separator in address ranges.

	/* Get application directory */
	string ownpath = argv[0];
	int slash_pos = ownpath.find_last_of( "\\/" ); // Search for last og / or \.
	if( slash_pos == string::npos ) // Not found?
	{
		ownpath.assign( "." ); // The current directory is the AVROSP EXE path also.
	} else
	{
		ownpath.erase( slash_pos ); // Remove from and including the last slash separator.
	}

	searchpath.push_back( "." ); // Add current directory also.
	searchpath.push_back( ownpath ); // Save for later.

	if( argc <= 1 )
	{
		showHelp = true;
		return;
	}

	/* Iterate through cmdline parameters */
	for( int i = 1; i < argc; i++ )
	{
		param = argv[i];

		/* Allow parameters to start with '-' */
		if( param[0] != '-' )
			throw new ErrorMsg( "All parameters must start with '-'!" );

		if( strlen( param ) <= 1 )
			throw new ErrorMsg( "Parameters cannot be just the minus without any characters!" );

		/* Now for the parsing... */
		switch( param[1] )
		{
			case 'a' : // Address range specified.
				if( strlen( param ) <= 2 )
					throw new ErrorMsg( "Cannot use -a without memory type!" );

				if( strlen( param ) <= 5 )
					throw new ErrorMsg( "Cannot use -a without start and end address!" );

				/* Find comma position and set it to '0' to help hex conversion */
				comma = 2;
				while( (param[comma] != 0) && (param[comma] != ',') )
					comma++;

				if( comma == strlen( param ) ) // No comma found?
					throw new ErrorMsg( "No comma separator found in -a parameter!" );

				param[comma] = 0; // It is now two separate strings for hex conversion.

				/* Convert limits */
				switch( param[2] )
				{
					case 'f' : // Flash address range.
						try
						{
							flashStartAddress = convertHex( param + 3 );
						}
						catch( ErrorMsg * e )
						{
							delete e;
							throw new ErrorMsg( "Number format error in start limit for -af parameter!" );
						}

						try
						{
							flashEndAddress = convertHex( param + comma + 1 );
						}
						catch( ErrorMsg * e )
						{
							delete e;
							throw new ErrorMsg( "Number format error in end limit for -af parameter!" );
						}

						if( flashEndAddress < flashStartAddress )
							throw new ErrorMsg( "Cannot have Flash end limit less than start limit!" );

						break;

					case 'e' : // EEPROM address range.
						try
						{
							eepromStartAddress = convertHex( param + 3 );
						}
						catch( ErrorMsg * e )
						{
							delete e;
							throw new ErrorMsg( "Number format error in start limit for -ae parameter!" );
						}

						try
						{
							eepromEndAddress = convertHex( param + comma + 1 );
						}
						catch( ErrorMsg * e )
						{
							delete e;
							throw new ErrorMsg( "Number format error in end limit for -ae parameter!" );
						}

						if( eepromEndAddress < eepromStartAddress )
							throw new ErrorMsg( "Cannot have EEPROM end limit less than start limit!" );

						break;

					default:
						throw new ErrorMsg( "Unknown choice for -a, use -af or -ae!" );

				}

				break;


			case 'b' : // Get revision.
				if( strlen( param ) != 3 )
					throw new ErrorMsg( "Specify SW og HW revision, not just -b!" );

				switch( param[2] )
				{
					case 'h' : // Hardware revision.
						getHWrevision = true;
						break;

					case 's' : // Software revision.
						getSWrevision = true;
						break;

					default:
						throw new ErrorMsg( "Unknown choice for -b, use -bs or -bh!" );
				}

				break;


			case 'c' : // Specify COM port.
				if( strlen( param ) != 6 )
					throw new ErrorMsg( "COM port parameter syntax is -cCOMx!" );

				if( param[2] != 'C' || param[3] != 'O' || param[4] != 'M' )
					throw new ErrorMsg( "COM port parameter syntax is -cCOMx!" );

				if( param[5] < '1' || param[5] > '8' )
					throw new ErrorMsg( "Use COM1 to COM8!" );

				comPort = param[5] - '0'; // Convert COM port digit to number.
				break;


			case 'd' : // Device name specified.
				if( strlen( param ) <= 2 )
					throw new ErrorMsg( "Cannot use -d without the device name!" );

				/* Copy device name string to class variable */
				deviceName.assign( param + 2 );
				break;


			case 'e' : // Chip erase before programming.
				if( strlen( param ) != 2 )
					throw new ErrorMsg( "Parameter -e needs no extra arguments!" );

				chipErase = true;
				break;


			case 'E' : // Set extended fuse bits.
				if( strlen( param ) != 4 )
					throw new ErrorMsg( "Use two hex digits for the -E parameter!" );

				try
				{
					programExtendedFuseBits = convertHex( param + 2 );
				}
				catch( ErrorMsg * e )
				{
					delete e;
					throw new ErrorMsg( "Hex number format error for -E parameter!" );
				}

				break;


			case 'f' : // Set fuse bits.
				if( strlen( param ) != 6 )
					throw new ErrorMsg( "Use four hex digits for the -f parameter!" );

				try
				{
					programFuseBits = convertHex( param + 2 );
				}
				catch( ErrorMsg * e )
				{
					delete e;
					throw new ErrorMsg( "Hex number format error for -f parameter!" );
				}

				break;


			case 'F' : // Verify fuse bits.
				if( strlen( param ) != 6 )
					throw new ErrorMsg( "Use four hex digits for the -F parameter!" );

				try
				{
					verifyFuseBits = convertHex( param + 2 );
				}
				catch( ErrorMsg * e )
				{
					delete e;
					throw new ErrorMsg( "Hex number format error for -F parameter!" );
				}

				break;


			case 'g' : // Silent operation.
				if( strlen( param ) != 2 )
					throw new ErrorMsg( "Parameter -g needs no extra arguments!" );

				silentMode = true;
				break;


			case 'G' : // Verify extended fuse bits.
				if( strlen( param ) != 4 )
					throw new ErrorMsg( "Use two hex digits for the -G parameter!" );

				try
				{
					verifyExtendedFuseBits = convertHex( param + 2 );
				}
				catch( ErrorMsg * e )
				{
					delete e;
					throw new ErrorMsg( "Hex number format error for -G parameter!" );
				}

				break;


			case 'h' : // Help screen.
			case '?' : // Help screen.
				if( strlen( param ) != 2 )
					throw new ErrorMsg( "Parameter -h and -? needs no extra arguments!" );

				showHelp = true;
				break;


			case 'i' : // Input file specified.
				if( strlen( param ) <= 2 )
					throw new ErrorMsg( "Cannot use -i without memory type!" );

				if( strlen( param ) <= 3 )
					throw new ErrorMsg( "Cannot use -i without file name!" );

				/* Copy file name string to correct class variable */
				switch( param[2] )
				{
					case 'f' : // Flash input file.
						inputFileFlash.assign( param + 3 );
						break;

					case 'e' : // EEPROM input file.
						inputFileEEPROM.assign( param + 3 );
						break;

					default:
						throw new ErrorMsg( "Unknown choice for -i, use -if or -ie!" );
				}

				break;


			case 'l' : // Set lock bits.
				if( strlen( param ) != 4 )
					throw new ErrorMsg( "Use two hex digits for the -l parameter!" );

				try
				{
					programLockBits = convertHex( param + 2 );
				}
				catch( ErrorMsg * e )
				{
					delete e;
					throw new ErrorMsg( "Hex number format error for -l parameter!" );
				}

				break;


			case 'L' : // Verify lock bits.
				if( strlen( param ) != 4 )
					throw new ErrorMsg( "Use two hex digits for the -l parameter!" );

				try
				{
					verifyLockBits = convertHex( param + 2 );
				}
				catch( ErrorMsg * e )
				{
					delete e;
					throw new ErrorMsg( "Hex number format error for -L parameter!" );
				}

				break;


			case 'o' : // Output file specified.
				if( strlen( param ) <= 2 )
					throw new ErrorMsg( "Cannot use -o without memory type!" );

				if( strlen( param ) <= 3 )
					throw new ErrorMsg( "Cannot use -o without file name!" );

				/* Copy file name string to correct class variable */
				switch( param[2] )
				{
					case 'f' : // Flash output file.
						outputFileFlash.assign( param + 3 );
						break;

					case 'e' : // EEPROM output file.
						outputFileEEPROM.assign( param + 3 );
						break;

					default:
						throw new ErrorMsg( "Unknown choice for -o, use -of or -oe!" );
				}

				break;


			case 'O' : // Read OSCCAL byte.
				switch( strlen( param ) )
				{
					case 2 : // No value specified, use first OSCCAL byte.
						readOSCCAL = true;
						OSCCAL_Parameter = 0; // First OSCCAL byte.
						break;

					case 3 : // Byte index specified.
					case 4 :

⌨️ 快捷键说明

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