From 1dfafed8fe6cf41dba648a56533bff66ff2b2aa2 Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Wed, 17 Sep 2025 11:17:43 -0400 Subject: bug fix: eeprom usb newline --- fw/usb.c | 53 +++++++++++++++++++++-------------------------------- 1 file changed, 21 insertions(+), 32 deletions(-) (limited to 'fw/usb.c') diff --git a/fw/usb.c b/fw/usb.c index cf27a47..d793d31 100644 --- a/fw/usb.c +++ b/fw/usb.c @@ -116,11 +116,6 @@ usbTask(void) { CDCTxService(); } -static void -nack(void) { - putsUSBUSART("nack\n"); -} - // Read (the start of) a command from USB. static State * idleState(void) { @@ -140,7 +135,7 @@ idleState(void) { // Skip space if (getchar(&junk) != OK) { // Incomplete command - nack(); + putsUSBUSART("nack incomplete command\n"); return &state; } @@ -151,7 +146,7 @@ idleState(void) { case 'r': state.next = readEepromState; break; default: // invalid command rxBuf.len = 0u; // discard input - nack(); + putsUSBUSART("nack invalid command\n"); break; } @@ -235,15 +230,15 @@ writeEepromState(void) { // Read and if (parseU8(&addr.hi) != OK) { - nack(); + putsUSBUSART("nack bad \n"); return &state; } if (parseU8(&addr.lo) != OK) { - nack(); + putsUSBUSART("nack bad \n"); return &state; } if (parseU8(&size) != OK) { - nack(); + putsUSBUSART("nack bad \n"); return &state; } @@ -251,40 +246,34 @@ writeEepromState(void) { // Read into buffer for (i = 0u; i < size; i++) { - // Reuse txBuf to save memory - - // Receive byte - status = getcharBlock(&c, BAILOUT); - if (status != OK) { - nack(); - eepromWriteDisable(); - return &state; - } - // Check for overflow if (i > 0u && (i%sizeof(txBuf)) == 0u) { eepromWrite(addr, txBuf, sizeof(txBuf)); addU16(&addr, sizeof(txBuf)); } - txBuf[i%sizeof(txBuf)] = c; + // Receive byte + status = getcharBlock((char *) &txBuf[i%sizeof(txBuf)], BAILOUT); + if (status != OK) { + putsUSBUSART("nack not enough bytes\n"); + eepromWriteDisable(); + return &state; + } } // Flush buffer to eeprom - if (i > 0u) { - eepromWrite(addr, txBuf, i%sizeof(txBuf)); - } + eepromWrite(addr, txBuf, i%sizeof(txBuf)); eepromWriteDisable(); // Consume '\n' status = getcharBlock(&c, BAILOUT); if (status != OK || c != '\n') { - nack(); + putsUSBUSART("nack missing newline\n"); + return &state; } putsUSBUSART("ok\n"); - return &state; } @@ -303,26 +292,26 @@ readEepromState(void) { // Read command, including '\n' if (parseU8(&addr.hi) != OK) { - nack(); + putsUSBUSART("nack bad \n"); return &state; } if (parseU8(&addr.lo) != OK) { - nack(); + putsUSBUSART("nack bad \n"); return &state; } if (parseU8(&size) != OK) { - nack(); + putsUSBUSART("nack bad \n"); return &state; } } // Read from eeprom into buffer - chunkSize = min(size, sizeof(txBuf)-1u); // -1 to leave space for '\n' + chunkSize = min(size, sizeof(txBuf)-1u); // -1 to leave space for \n eepromRead(addr, txBuf, chunkSize); addU16(&addr, chunkSize); + size -= chunkSize; // End of read? - size -= chunkSize; if (size == 0u) { // Done txBuf[chunkSize] = '\n'; @@ -333,7 +322,7 @@ readEepromState(void) { } // Flush buffer to USB - putUSBUSART(txBuf, chunkSize); + putUSBUSART(txBuf, chunkSize+1u); // +1 for \n return &state; } -- cgit v1.2.3