From d29465b2dd1d1f762887aa14fce2f2e26e7861ef Mon Sep 17 00:00:00 2001 From: binaryDiv Date: Fri, 16 Apr 2021 21:46:07 +0200 Subject: [PATCH] Implement binary mode for READ --- firmware/src/commands.c | 70 ++++++++++++++++++++++++++++++++--------- 1 file changed, 56 insertions(+), 14 deletions(-) diff --git a/firmware/src/commands.c b/firmware/src/commands.c index 5132acb..bdd142c 100644 --- a/firmware/src/commands.c +++ b/firmware/src/commands.c @@ -10,12 +10,18 @@ #include #include +// Internal function prototypes +void _uartPutAsciiBlock(DataBuffer buffer); + +// Mode: ASCII (false) or binary (true) +bool binary_mode = false; + // Execute a single parsed command void executeCommand(CommandLine cmdLine) { // Parse command if (strcmp(cmdLine.command, "INIT") == 0) { // INIT command: Initializes connection. - commandInit(); + commandInit(cmdLine.arg); } else if (strcmp(cmdLine.command, "READ") == 0) { // READ command: Takes a hex address range (or single address) as argument, @@ -40,9 +46,26 @@ void executeCommand(CommandLine cmdLine) { } } -void commandInit() { - // TODO init... or something? - uartPutLine("OK"); +void commandInit(char* arg) { + // (Re-)initialize EEPROM functions + eepromInit(); + + // Default mode: ASCII + binary_mode = false; + + if (arg != NULL) { + if (strcmp(arg, "BINARY") == 0) { + binary_mode = true; + } else if (strcmp(arg, "ASCII") == 0 || strcmp(arg, "TEXT") == 0) { + binary_mode = false; + } + } + + if (binary_mode) { + uartPutLine("OK (binary mode)"); + } else { + uartPutLine("OK (ASCII mode)"); + } } void commandRead(char* arg) { @@ -71,22 +94,35 @@ void commandRead(char* arg) { // Read a single block with up to DATA_BLOCK_SIZE bytes range.from = eepromReadBlock(range, &buffer); - // TODO binary output + if (binary_mode) { + // Send block as binary "package": + // First the size of the package (1 byte) followed by the data bytes + uartPutChar(buffer.bytes); - // ASCII output - char outBuffer[20]; - sprintf(outBuffer, "<%d>", buffer.bytes); - uartPutString(outBuffer); - - for (int i = 0; i < buffer.bytes; i++) { - sprintf(outBuffer, " %02X", buffer.data[i]); - uartPutString(outBuffer); + for (int i = 0; i < buffer.bytes; i++) { + uartPutChar(buffer.data[i]); + } + } else { + // Fancy ASCII output + _uartPutAsciiBlock(buffer); } - uartPutLine(NULL); } while (buffer.bytes > 0); } +void _uartPutAsciiBlock(DataBuffer buffer) { + char outBuffer[20]; + sprintf(outBuffer, "<%d>", buffer.bytes); + uartPutString(outBuffer); + + for (int i = 0; i < buffer.bytes; i++) { + sprintf(outBuffer, " %02X", buffer.data[i]); + uartPutString(outBuffer); + } + + uartPutLine(NULL); +} + void commandWrite(char* arg) { if (arg == NULL) { uartPutLine("ERR WRITE needs a start address"); @@ -100,6 +136,12 @@ void commandWrite(char* arg) { return; } + // Only binary mode + if (!binary_mode) { + uartPutLine("ERR WRITE in ASCII mode is not implemented"); + return; + } + // TODO read data from input and write to EEPROM uartPutLine("ERR not implemented"); }