diff options
author | Christian Hammacher <bmasterc@gmail.com> | 2021-06-04 12:31:03 +0300 |
---|---|---|
committer | Christian Hammacher <bmasterc@gmail.com> | 2021-06-04 12:31:03 +0300 |
commit | b227a6388d7f4f5fb34aea6f2519a30c1627742c (patch) | |
tree | 644825d34642ccc961a837faac62a140aa197092 | |
parent | ffbb0080f75dc69a0fb0a52a57f4f5b4102e64e0 (diff) |
Improved SBC diagnostics
Reset maximum time between SPI transfers back to 4 seconds
Fixed potential issue that could cause stale packets to be written
-rw-r--r-- | src/Linux/DataTransfer.cpp | 12 | ||||
-rw-r--r-- | src/Linux/DataTransfer.h | 3 | ||||
-rw-r--r-- | src/Linux/LinuxInterface.cpp | 8 | ||||
-rw-r--r-- | src/Linux/LinuxInterface.h | 2 | ||||
-rw-r--r-- | src/Linux/LinuxMessageFormats.h | 2 |
5 files changed, 17 insertions, 10 deletions
diff --git a/src/Linux/DataTransfer.cpp b/src/Linux/DataTransfer.cpp index 509fc22a..48351c7d 100644 --- a/src/Linux/DataTransfer.cpp +++ b/src/Linux/DataTransfer.cpp @@ -393,7 +393,7 @@ alignas(4) __nocache char DataTransfer::rxBuffer[LinuxTransferBufferSize]; alignas(4) __nocache char DataTransfer::txBuffer[LinuxTransferBufferSize]; #endif -DataTransfer::DataTransfer() noexcept : state(SpiState::ExchangingData), lastTransferTime(0), lastTransferNumber(0), failedTransfers(0), +DataTransfer::DataTransfer() noexcept : state(SpiState::ExchangingData), lastTransferTime(0), lastTransferNumber(0), failedTransfers(0), checksumErrors(0), #if SAME5x rxBuffer(nullptr), txBuffer(nullptr), #endif @@ -487,7 +487,7 @@ void DataTransfer::SetSBCTask(TaskHandle handle) noexcept void DataTransfer::Diagnostics(MessageType mtype) noexcept { - reprap.GetPlatform().MessageF(mtype, "State: %d, failed transfers: %u\n", (int)state, failedTransfers); + reprap.GetPlatform().MessageF(mtype, "State: %d, failed transfers: %u, checksum errors: %u\n", (int)state, failedTransfers, checksumErrors); reprap.GetPlatform().MessageF(mtype, "Last transfer: %" PRIu32 "ms ago\n", millis() - lastTransferTime); reprap.GetPlatform().MessageF(mtype, "RX/TX seq numbers: %d/%d\n", (int)rxHeader.sequenceNumber, (int)txHeader.sequenceNumber); reprap.GetPlatform().MessageF(mtype, "SPI underruns %u, overruns %u\n", spiTxUnderruns, spiRxOverruns); @@ -727,7 +727,6 @@ void DataTransfer::ResetTransfer(bool ownRequest) noexcept { debugPrintf(ownRequest ? "Resetting transfer\n" : "Resetting transfer due to Linux request\n"); } - failedTransfers++; if (ownRequest) { @@ -844,6 +843,7 @@ bool DataTransfer::IsReady() noexcept else if (rxResponse == TransferResponse::BadHeaderChecksum || txResponse == TransferResponse::BadHeaderChecksum) { // Failed to exchange header, restart the full transfer + checksumErrors++; ExchangeHeader(); } else @@ -863,6 +863,7 @@ bool DataTransfer::IsReady() noexcept { debugPrintf("Resetting state due to Linux request\n"); } + failedTransfers++; ExchangeHeader(); break; } @@ -902,6 +903,7 @@ bool DataTransfer::IsReady() noexcept else if (rxResponse == TransferResponse::BadDataChecksum || txResponse == TransferResponse::BadDataChecksum) { // Resend the data if a checksum error occurred + checksumErrors++; ExchangeData(); } else @@ -928,6 +930,7 @@ bool DataTransfer::IsReady() noexcept // Reset failed transfers automatically after a certain period of time transferReadyHigh = false; disable_spi(); + failedTransfers++; ExchangeHeader(); } else if (!IsConnected() && lastTransferNumber != 0) @@ -939,7 +942,8 @@ bool DataTransfer::IsReady() noexcept lastTransferNumber = 0; rxHeader.sequenceNumber = 0; txHeader.sequenceNumber = 0; - txPointer = 0; + rxPointer = txPointer = 0; + packetId = 0; // Kick off a new transfer if (transferReadyHigh) diff --git a/src/Linux/DataTransfer.h b/src/Linux/DataTransfer.h index 2ba77979..0bf1e09d 100644 --- a/src/Linux/DataTransfer.h +++ b/src/Linux/DataTransfer.h @@ -87,7 +87,7 @@ private: // Transfer properties uint32_t lastTransferTime; uint16_t lastTransferNumber; - unsigned int failedTransfers; + unsigned int failedTransfers, checksumErrors; // Transfer buffers @@ -169,7 +169,6 @@ inline size_t DataTransfer::AddPadding(size_t length) const noexcept size_t extraBytes = (length & 3); return (extraBytes == 0) ? length : length + 4 - extraBytes; } - #endif // HAS_LINUX_INTERFACE #endif /* SRC_LINUX_DATATRANSFER_H_ */ diff --git a/src/Linux/LinuxInterface.cpp b/src/Linux/LinuxInterface.cpp index db9a4a30..d9bae283 100644 --- a/src/Linux/LinuxInterface.cpp +++ b/src/Linux/LinuxInterface.cpp @@ -47,7 +47,7 @@ extern "C" [[noreturn]] void SBCTaskStart(void * pvParameters) noexcept reprap.GetLinuxInterface().TaskLoop(); } -LinuxInterface::LinuxInterface() noexcept : isConnected(false), numDisconnects(0), +LinuxInterface::LinuxInterface() noexcept : isConnected(false), numDisconnects(0), numTimeouts(0), reportPause(false), reportPauseWritten(false), printStarted(false), printStopped(false), codeBuffer(nullptr), rxPointer(0), txPointer(0), txEnd(0), sendBufferUpdate(true), iapWritePointer(IAP_IMAGE_START), waitingForFileChunk(false) @@ -897,6 +897,10 @@ void LinuxInterface::Init() noexcept { isConnected = false; numDisconnects++; + if (!hadReset) + { + numTimeouts++; + } reprap.GetPlatform().Message(NetworkInfoMessage, "Lost connection to Linux\n"); rxPointer = txPointer = txEnd = 0; @@ -963,7 +967,7 @@ void LinuxInterface::Diagnostics(MessageType mtype) noexcept { reprap.GetPlatform().Message(mtype, "=== SBC interface ===\n"); transfer.Diagnostics(mtype); - reprap.GetPlatform().MessageF(mtype, "Number of disconnects: %" PRIu32 ", IAP RAM available 0x%05" PRIx32 "\n", numDisconnects, iapRamAvailable); + reprap.GetPlatform().MessageF(mtype, "Disconnects: %" PRIu32 ", timeouts: %" PRIu32 ", IAP RAM available 0x%05" PRIx32 "\n", numDisconnects, numTimeouts, iapRamAvailable); reprap.GetPlatform().MessageF(mtype, "Buffer RX/TX: %d/%d-%d\n", (int)rxPointer, (int)txPointer, (int)txEnd); #ifdef TRACK_FILE_CODES reprap.GetPlatform().MessageF(mtype, "File codes read/handled: %d/%d, file macros open/closing: %d %d\n", (int)fileCodesRead, (int)fileCodesHandled, (int)fileMacrosRunning, (int)fileMacrosClosing); diff --git a/src/Linux/LinuxInterface.h b/src/Linux/LinuxInterface.h index b00526f4..3276df5e 100644 --- a/src/Linux/LinuxInterface.h +++ b/src/Linux/LinuxInterface.h @@ -57,7 +57,7 @@ public: private: DataTransfer transfer; bool isConnected; - uint32_t numDisconnects; + uint32_t numDisconnects, numTimeouts; GCodeFileInfo fileInfo; FilePosition pauseFilePosition; diff --git a/src/Linux/LinuxMessageFormats.h b/src/Linux/LinuxMessageFormats.h index 98d5110f..9c690684 100644 --- a/src/Linux/LinuxMessageFormats.h +++ b/src/Linux/LinuxMessageFormats.h @@ -29,7 +29,7 @@ static_assert(MaxCodeBufferSize >= GCODE_LENGTH, "MaxCodeBufferSize must be at l constexpr uint32_t SpiMacroRequestTimeout = 3000; // maximum time to wait a macro file constexpr uint32_t SpiTransferTimeout = 500; // maximum allowed delay between data exchanges during a full transfer (in ms) -constexpr uint32_t SpiConnectionTimeout = 8000; // maximum time to wait for the next transfer (in ms) +constexpr uint32_t SpiConnectionTimeout = 4000; // maximum time to wait for the next transfer (in ms) constexpr uint16_t SpiCodeBufferSize = 4096; // number of bytes available for G-code caching // Shared structures |