From 67beda0dbd4d18e864442d3972ece1790f2e714c Mon Sep 17 00:00:00 2001 From: binaryDiv Date: Fri, 16 Apr 2021 21:46:41 +0200 Subject: [PATCH 1/3] Implement HELP command --- firmware/src/commands.c | 23 +++++++++++++++++++++++ firmware/src/main.c | 2 +- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/firmware/src/commands.c b/firmware/src/commands.c index bdd142c..4a71afc 100644 --- a/firmware/src/commands.c +++ b/firmware/src/commands.c @@ -23,6 +23,10 @@ void executeCommand(CommandLine cmdLine) { // INIT command: Initializes connection. commandInit(cmdLine.arg); } + else if (strcmp(cmdLine.command, "HELP") == 0) { + // HELP command: Print a list of supported commands. + commandHelp(cmdLine.arg); + } else if (strcmp(cmdLine.command, "READ") == 0) { // READ command: Takes a hex address range (or single address) as argument, // reads data and returns it in hexadecimal ASCII format. @@ -32,6 +36,10 @@ void executeCommand(CommandLine cmdLine) { // WRITE command: Takes a hex address as argument, reads data from UART and writes it to the EEPROM. commandRead(cmdLine.arg); } + else if (strcmp(cmdLine.command, "ERASE") == 0) { + // ERASE command: Takes a hex address range as argument and writes 0x00 bytes to the specified range. + commandRead(cmdLine.arg); + } else if (strcmp(cmdLine.command, "TESTREAD") == 0) { // TESTREAD command: for testing purposes, reads a few bytes and returns them in a human readable format. commandTestRead(); @@ -68,6 +76,21 @@ void commandInit(char* arg) { } } +void commandHelp() { + uartPutLine("HELP - Supported commands:"); + uartPutLine("HELP - HELP"); + uartPutLine("HELP - INIT [BINARY|ASCII]"); + uartPutLine("HELP - READ 0000:0FFF"); + uartPutLine("HELP - WRITE 0000"); + uartPutLine("HELP - ERASE 0000:0FFF"); + + // TODO remove those + uartPutLine("HELP - TESTREAD (only for testing)"); + uartPutLine("HELP - TESTWRITE (only for testing)"); + + uartPutLine("OK"); +} + void commandRead(char* arg) { if (arg == NULL) { uartPutLine("ERR READ needs an address or address range"); diff --git a/firmware/src/main.c b/firmware/src/main.c index 056964f..cfd0404 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -15,7 +15,7 @@ int main(void) { _delay_ms(100); // Write initial message via UART - uartPutLine("INFO -- EEPROM programmer by binaryDiv"); + uartPutLine("INFO - EEPROM programmer by binaryDiv"); while(1) { // Run main loop endlessly From 5d5e4521366a3e6972999c2d8e022036745b1dc4 Mon Sep 17 00:00:00 2001 From: binaryDiv Date: Fri, 16 Apr 2021 21:46:41 +0200 Subject: [PATCH 2/3] Implement HELP command --- firmware/src/commands.c | 23 +++++++++++++++++++++++ firmware/src/commands.h | 3 ++- firmware/src/main.c | 2 +- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/firmware/src/commands.c b/firmware/src/commands.c index bdd142c..4a71afc 100644 --- a/firmware/src/commands.c +++ b/firmware/src/commands.c @@ -23,6 +23,10 @@ void executeCommand(CommandLine cmdLine) { // INIT command: Initializes connection. commandInit(cmdLine.arg); } + else if (strcmp(cmdLine.command, "HELP") == 0) { + // HELP command: Print a list of supported commands. + commandHelp(cmdLine.arg); + } else if (strcmp(cmdLine.command, "READ") == 0) { // READ command: Takes a hex address range (or single address) as argument, // reads data and returns it in hexadecimal ASCII format. @@ -32,6 +36,10 @@ void executeCommand(CommandLine cmdLine) { // WRITE command: Takes a hex address as argument, reads data from UART and writes it to the EEPROM. commandRead(cmdLine.arg); } + else if (strcmp(cmdLine.command, "ERASE") == 0) { + // ERASE command: Takes a hex address range as argument and writes 0x00 bytes to the specified range. + commandRead(cmdLine.arg); + } else if (strcmp(cmdLine.command, "TESTREAD") == 0) { // TESTREAD command: for testing purposes, reads a few bytes and returns them in a human readable format. commandTestRead(); @@ -68,6 +76,21 @@ void commandInit(char* arg) { } } +void commandHelp() { + uartPutLine("HELP - Supported commands:"); + uartPutLine("HELP - HELP"); + uartPutLine("HELP - INIT [BINARY|ASCII]"); + uartPutLine("HELP - READ 0000:0FFF"); + uartPutLine("HELP - WRITE 0000"); + uartPutLine("HELP - ERASE 0000:0FFF"); + + // TODO remove those + uartPutLine("HELP - TESTREAD (only for testing)"); + uartPutLine("HELP - TESTWRITE (only for testing)"); + + uartPutLine("OK"); +} + void commandRead(char* arg) { if (arg == NULL) { uartPutLine("ERR READ needs an address or address range"); diff --git a/firmware/src/commands.h b/firmware/src/commands.h index b1bf0ac..f31a471 100644 --- a/firmware/src/commands.h +++ b/firmware/src/commands.h @@ -6,7 +6,8 @@ void executeCommand(CommandLine cmdLine); -void commandInit(); +void commandHelp(); +void commandInit(char* arg); void commandRead(char* arg); void commandWrite(char* arg); void commandErase(); diff --git a/firmware/src/main.c b/firmware/src/main.c index 056964f..cfd0404 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -15,7 +15,7 @@ int main(void) { _delay_ms(100); // Write initial message via UART - uartPutLine("INFO -- EEPROM programmer by binaryDiv"); + uartPutLine("INFO - EEPROM programmer by binaryDiv"); while(1) { // Run main loop endlessly From 9e0ffd394b5f1dd4009204092bc92f1eecdd6bd2 Mon Sep 17 00:00:00 2001 From: binaryDiv Date: Fri, 16 Apr 2021 22:37:14 +0200 Subject: [PATCH 3/3] Implement uartPrintf() --- firmware/src/commands.c | 46 +++++++++++++---------------------------- firmware/src/uart.c | 15 ++++++++++++++ firmware/src/uart.h | 3 +++ 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/firmware/src/commands.c b/firmware/src/commands.c index 4a71afc..51b8a8f 100644 --- a/firmware/src/commands.c +++ b/firmware/src/commands.c @@ -6,13 +6,9 @@ #include #include -#include #include #include -// Internal function prototypes -void _uartPutAsciiBlock(DataBuffer buffer); - // Mode: ASCII (false) or binary (true) bool binary_mode = false; @@ -127,25 +123,17 @@ void commandRead(char* arg) { } } else { // Fancy ASCII output - _uartPutAsciiBlock(buffer); + uartPrintf("<%d>", buffer.bytes); + + for (int i = 0; i < buffer.bytes; i++) { + uartPrintf(" %02X", buffer.data[i]); + } + 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"); @@ -176,26 +164,20 @@ void commandErase() { // TESTREAD command: for testing purposes, reads a few bytes and returns them in a human readable format. void commandTestRead() { - uint8_t byte; - char outBuffer[20]; - eepromSetReadMode(); for (int i = 0x00; i < 0x20; i++) { - itoa(i, outBuffer, 16); - uartPutString("TESTREAD 0x"); - uartPutString(outBuffer); - uartPutString(": "); + uartPrintf("TESTREAD 0x%02X: ", i); - byte = eepromReadByte(i); - itoa(byte, outBuffer, 16); + uint8_t byte = eepromReadByte(i); - uartPutChar(byte); - uartPutString(" (0x"); - uartPutString(outBuffer); - uartPutString(")"); + if (byte >= 32 && byte <= 126) { + uartPutChar(byte); + } else { + uartPutChar('?'); + } - uartPutLine(NULL); + uartPrintf(" (0x%02X)\n"); } } diff --git a/firmware/src/uart.c b/firmware/src/uart.c index b68bab2..1d6fcba 100644 --- a/firmware/src/uart.c +++ b/firmware/src/uart.c @@ -2,6 +2,8 @@ #include "uart.h" #include +#include +#include #include // Initialize UART @@ -54,6 +56,19 @@ void uartPutLine(char* data) { uartPutChar('\n'); } +// Transmit a sprintf formatted string (maximum buffer: 256 bytes!) +void uartPrintf(const char* format, ...) { + char outBuffer[256]; + + va_list args; + va_start(args, format); + + vsprintf(outBuffer, format, args); + uartPutString(outBuffer); + + va_end(args); +} + // Receive a single character (blocking) unsigned char uartGetChar() { // Block until a character has been received diff --git a/firmware/src/uart.h b/firmware/src/uart.h index b47c953..7421af4 100644 --- a/firmware/src/uart.h +++ b/firmware/src/uart.h @@ -16,6 +16,9 @@ void uartPutString(char* data); // Transmit a string followed by a line break void uartPutLine(char* data); +// Transmit a sprintf formatted string (maximum buffer: 256 bytes!) +void uartPrintf(const char* format, ...); + // Read a single character (blocking) unsigned char uartGetChar();