📄 jobinfo.cpp
字号:
/*****************************************************************************
*
* 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 + -