Implement binary mode for READ

This commit is contained in:
Lexi / Zoe 2021-04-16 21:46:07 +02:00
parent e8fbc175ca
commit d29465b2dd
Signed by: binaryDiv
GPG Key ID: F8D4956E224DA232
1 changed files with 56 additions and 14 deletions

View File

@ -10,12 +10,18 @@
#include <stdlib.h>
#include <util/delay.h>
// 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");
}