diff --git a/firmware/src/commands.c b/firmware/src/commands.c index 5dcdc3c..248c499 100644 --- a/firmware/src/commands.c +++ b/firmware/src/commands.c @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -219,8 +220,30 @@ void commandWrite(char* arg) { uartPutLine("OK END"); } -void commandErase() { - uartPutLine("ERROR not implemented"); +void commandErase(char* arg) { + if (arg == NULL) { + uartPutLine("ERROR ERASE needs a start address"); + return; + } + + // Parse address(es) + AddressRange range = parseAddressRange(arg); + if (!range.isValid || range.to < range.from) { + uartPutLine("ERROR invalid address format"); + return; + } + + uint32_t bytesErased = eepromEraseBlock(range); + + if (bytesErased == 0) { + uartPutLine("ERROR 0 bytes erased"); + } else { + char outBuffer[16]; + snprintf(outBuffer, 16, "%lu", bytesErased); + uartPutString("OK erased "); + uartPutString(outBuffer); + uartPutLine(" bytes"); + } } // TESTREAD command: for testing purposes, reads a few bytes and returns them in a human readable format. diff --git a/firmware/src/eeprom.c b/firmware/src/eeprom.c index abe6e6b..cdeaad9 100644 --- a/firmware/src/eeprom.c +++ b/firmware/src/eeprom.c @@ -172,3 +172,34 @@ Address eepromWriteBlock(Address startAddress, DataBuffer buffer) { return (Address) {true, currentAddress}; } + +// Erase block of data on the EEPROM +uint32_t eepromEraseBlock(AddressRange addressRange) { + // Set write mode + eepromSetWriteMode(); + + if (!addressRange.isValid) { + return 0; + } + + address_t currentAddress = addressRange.from; + address_t highestAddress = addressRange.to; + + if (highestAddress > HIGHEST_VALID_ADDRESS) { + highestAddress = HIGHEST_VALID_ADDRESS; + } + + uint32_t bytesErased = 0; + + while (currentAddress <= highestAddress) { + eepromWriteByte(currentAddress++, 0x00); + bytesErased++; + + // Handle integer overflow + if (currentAddress == 0) { + break; + } + } + + return bytesErased; +} diff --git a/firmware/src/eeprom.h b/firmware/src/eeprom.h index 0dfdffd..a8a1d51 100644 --- a/firmware/src/eeprom.h +++ b/firmware/src/eeprom.h @@ -46,4 +46,7 @@ Address eepromReadBlock(AddressRange addressRange, DataBuffer* buffer); // Write multiple bytes from a buffer to EEPROM Address eepromWriteBlock(Address startAddress, DataBuffer buffer); +// Erase block of data on the EEPROM +uint32_t eepromEraseBlock(AddressRange addressRange); + #endif /* EEPROM_H_ */