Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Duet3D/RepRapFirmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Hammacher <bmasterc@gmail.com>2021-06-04 12:31:03 +0300
committerChristian Hammacher <bmasterc@gmail.com>2021-06-04 12:31:03 +0300
commitb227a6388d7f4f5fb34aea6f2519a30c1627742c (patch)
tree644825d34642ccc961a837faac62a140aa197092
parentffbb0080f75dc69a0fb0a52a57f4f5b4102e64e0 (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.cpp12
-rw-r--r--src/Linux/DataTransfer.h3
-rw-r--r--src/Linux/LinuxInterface.cpp8
-rw-r--r--src/Linux/LinuxInterface.h2
-rw-r--r--src/Linux/LinuxMessageFormats.h2
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