more nuanced default command args

This commit is contained in:
steve 2024-04-10 19:30:59 +01:00
parent 08f93deee6
commit b2a2b1d3bf
2 changed files with 36 additions and 16 deletions

View File

@ -29,6 +29,7 @@ class PromDevice
byte readData(uint32_t address) { return readByte(address); } byte readData(uint32_t address) { return readByte(address); }
void resetDebugStats(); void resetDebugStats();
void printDebugStats(); void printDebugStats();
uint32_t end() const { return mSize-1; }
virtual void begin() = 0; virtual void begin() = 0;
virtual const char * getName() = 0; virtual const char * getName() = 0;

View File

@ -19,7 +19,7 @@
#include "XModem.h" #include "XModem.h"
static const char * MY_VERSION = "3.4"; static const char * MY_VERSION = "3.5";
// Global status // Global status
@ -95,6 +95,8 @@ XModem xmodem(prom, cmdStatus);
* CLI parse functions * CLI parse functions
*/ */
const char hex[] = "0123456789abcdef"; const char hex[] = "0123456789abcdef";
const uint32_t unspec = ~0;;
inline uint32_t if_unspec(uint32_t val, uint32_t repl) { return val == unspec? repl: val; }
enum { enum {
// CLI Commands // CLI Commands
@ -220,7 +222,7 @@ byte hexDigit(char c)
* @param pointer to string with the hex value of the word (modified) * @param pointer to string with the hex value of the word (modified)
* @return unsigned int represented by the digits * @return unsigned int represented by the digits
************************************************************/ ************************************************************/
uint32_t getHex32(char *& pData, uint32_t defaultValue=0) uint32_t getHex32(char *& pData, uint32_t defaultValue=unspec)
{ {
uint32_t u32 = 0; uint32_t u32 = 0;
@ -346,7 +348,7 @@ word checksumBlock(uint32_t start, uint32_t end)
/** /**
* Read data from the device and dump it in hex and ascii. * Read data from the device and dump it in hex and ascii.
**/ **/
void dumpBlock(uint32_t start, uint32_t end) uint32_t dumpBlock(uint32_t start, uint32_t end)
{ {
char line[81]; char line[81];
// 01234567891 234567892 234567893 234567894 234567895 234567896 234567897 23456789 // 01234567891 234567892 234567893 234567894 234567895 234567896 234567897 23456789
@ -404,6 +406,7 @@ void dumpBlock(uint32_t start, uint32_t end)
{ {
Serial.println(); Serial.println();
} }
return end+1;
} }
@ -476,7 +479,7 @@ void pokeBytes(char * pCursor)
//first value returned is the starting address //first value returned is the starting address
start = getHex32(pCursor, 0); start = getHex32(pCursor, 0);
while (((val = getHex32(pCursor, 0xffff)) != 0xffff) && (byteCtr < BLOCK_SIZE)) while (((val = getHex32(pCursor)) != unspec) && (byteCtr < BLOCK_SIZE))
{ {
data[byteCtr++] = byte(val); data[byteCtr++] = byte(val);
} }
@ -682,7 +685,7 @@ void setup()
char line[120]; char line[120];
uint32_t start = 0; uint32_t start = 0;
uint32_t end = 0xff; uint32_t end = 0xff;
byte val = 0xff; uint32_t val = 0xff;
void loop() void loop()
{ {
@ -695,9 +698,9 @@ void loop()
Serial.println(); Serial.println();
byte cmd = parseCommand(line[0]); byte cmd = parseCommand(line[0]);
char * pCursor = line+1; char * pCursor = line+1;
start = getHex32(pCursor, 0); start = getHex32(pCursor, start);
end = getHex32(pCursor, 0xff); end = getHex32(pCursor);
val = (byte) getHex32(pCursor, 0); val = (byte) getHex32(pCursor);
if ((cmd != CMD_LAST_STATUS) && (cmd != CMD_INVALID)) if ((cmd != CMD_LAST_STATUS) && (cmd != CMD_INVALID))
{ {
@ -707,10 +710,11 @@ void loop()
switch (cmd) switch (cmd)
{ {
case CMD_BLANK: case CMD_BLANK:
erasedBlockCheck(start, end); erasedBlockCheck(start, if_unspec(end, prom.end()));
break; break;
case CMD_CHECKSUM: case CMD_CHECKSUM:
end = if_unspec(end, prom.end());
w = checksumBlock(start, end); w = checksumBlock(start, end);
Serial.print(F("Checksum ")); Serial.print(F("Checksum "));
printWord(start); printWord(start);
@ -722,16 +726,30 @@ void loop()
break; break;
case CMD_DUMP: case CMD_DUMP:
dumpBlock(start, end); start = dumpBlock(start, start + if_unspec(end, 0xff));
break; break;
case CMD_ERASE: case CMD_ERASE:
printRetStatus(prom.erase(start, end)); if (start == unspec || end == unspec)
{
Serial.println(F("Erase requires explicit start, end"));
}
else
{
printRetStatus(prom.erase(start, end));
}
break; break;
case CMD_FILL: case CMD_FILL:
prom.resetDebugStats(); if (start == unspec || end == unspec || val == unspec)
fillBlock(start, end, val); {
Serial.println(F("Fill requires explicit start, end and value"));
}
else
{
prom.resetDebugStats();
fillBlock(start, end, (byte)val);
}
break; break;
case CMD_LOCK: case CMD_LOCK:
@ -745,10 +763,11 @@ void loop()
break; break;
case CMD_READ: case CMD_READ:
if (xmodem.SendFile(start, uint32_t(end) - start + 1)) end = if_unspec(end, prom.end());
if (xmodem.SendFile(start, end - start + 1))
{ {
cmdStatus.info("Send complete."); cmdStatus.info("Send complete.");
cmdStatus.setValueDec(0, "NumBytes", uint32_t(end) - start + 1); cmdStatus.setValueDec(0, "NumBytes", end - start + 1);
} }
break; break;
@ -777,7 +796,7 @@ void loop()
break; break;
case CMD_SCAN: case CMD_SCAN:
scanBlock(start, end); scanBlock(start, if_unspec(end, prom.end()));
break; break;
case CMD_TEST: case CMD_TEST: