Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use chip size for selected commands where it makes sense #70

Merged
merged 8 commits into from
Apr 12, 2024
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
more nuanced default command args
  • Loading branch information
jscrane committed Apr 10, 2024
commit b2a2b1d3bff2d8ba14cbaacd52bc5be6e7ac5798
1 change: 1 addition & 0 deletions TommyPROM/PromDevice.h
Original file line number Diff line number Diff line change
@@ -29,6 +29,7 @@ class PromDevice
byte readData(uint32_t address) { return readByte(address); }
void resetDebugStats();
void printDebugStats();
uint32_t end() const { return mSize-1; }

virtual void begin() = 0;
virtual const char * getName() = 0;
51 changes: 35 additions & 16 deletions TommyPROM/TommyPROM.ino
Original file line number Diff line number Diff line change
@@ -19,7 +19,7 @@
#include "XModem.h"


static const char * MY_VERSION = "3.4";
static const char * MY_VERSION = "3.5";


// Global status
@@ -95,6 +95,8 @@ XModem xmodem(prom, cmdStatus);
* CLI parse functions
*/
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 {
// CLI Commands
@@ -220,7 +222,7 @@ byte hexDigit(char c)
* @param pointer to string with the hex value of the word (modified)
* @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;

@@ -346,7 +348,7 @@ word checksumBlock(uint32_t start, uint32_t end)
/**
* 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];
// 01234567891 234567892 234567893 234567894 234567895 234567896 234567897 23456789
@@ -404,6 +406,7 @@ void dumpBlock(uint32_t start, uint32_t end)
{
Serial.println();
}
return end+1;
}


@@ -476,7 +479,7 @@ void pokeBytes(char * pCursor)
//first value returned is the starting address
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);
}
@@ -682,7 +685,7 @@ void setup()
char line[120];
uint32_t start = 0;
uint32_t end = 0xff;
byte val = 0xff;
uint32_t val = 0xff;

void loop()
{
@@ -695,9 +698,9 @@ void loop()
Serial.println();
byte cmd = parseCommand(line[0]);
char * pCursor = line+1;
start = getHex32(pCursor, 0);
end = getHex32(pCursor, 0xff);
val = (byte) getHex32(pCursor, 0);
start = getHex32(pCursor, start);
end = getHex32(pCursor);
val = (byte) getHex32(pCursor);

if ((cmd != CMD_LAST_STATUS) && (cmd != CMD_INVALID))
{
@@ -707,10 +710,11 @@ void loop()
switch (cmd)
{
case CMD_BLANK:
erasedBlockCheck(start, end);
erasedBlockCheck(start, if_unspec(end, prom.end()));
break;

case CMD_CHECKSUM:
end = if_unspec(end, prom.end());
w = checksumBlock(start, end);
Serial.print(F("Checksum "));
printWord(start);
@@ -722,16 +726,30 @@ void loop()
break;

case CMD_DUMP:
dumpBlock(start, end);
start = dumpBlock(start, start + if_unspec(end, 0xff));
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this should be
if_unspec(end, start+0xff)
otherwise d 100 1ff would dump from 100 to 2ff instead of 100 to 1ff
Am I reading that right?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes that's right; will fix.

break;

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;

case CMD_FILL:
prom.resetDebugStats();
fillBlock(start, end, val);
if (start == unspec || end == unspec || val == unspec)
{
Serial.println(F("Fill requires explicit start, end and value"));
}
else
{
prom.resetDebugStats();
fillBlock(start, end, (byte)val);
}
break;

case CMD_LOCK:
@@ -745,10 +763,11 @@ void loop()
break;

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.setValueDec(0, "NumBytes", uint32_t(end) - start + 1);
cmdStatus.setValueDec(0, "NumBytes", end - start + 1);
}
break;

@@ -777,7 +796,7 @@ void loop()
break;

case CMD_SCAN:
scanBlock(start, end);
scanBlock(start, if_unspec(end, prom.end()));
break;

case CMD_TEST: