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:
authorDavid Crocker <dcrocker@eschertech.com>2022-07-13 10:30:24 +0300
committerDavid Crocker <dcrocker@eschertech.com>2022-07-13 10:30:24 +0300
commit4722b3af90f5c29fba30a493d84aadbca735c5b9 (patch)
treecc70122ba1dc20fd80b27c514e591ef3bf2f43f3
parentb807e6e3178e1a1ae3334bb718c7a2ccafc39e7c (diff)
Fix for main boards in expansion mode
Also drive ACT LED on MB6XD Also make main board STATUS LED flash at the correct rate even when the loop time is high
-rw-r--r--src/CAN/CanInterface.cpp105
-rw-r--r--src/Config/Pins_Duet3_MB6HC.h2
-rw-r--r--src/Config/Pins_Duet3_MB6XD.h1
-rw-r--r--src/Platform/Platform.cpp16
-rw-r--r--src/Platform/Platform.h2
-rw-r--r--src/Version.h2
6 files changed, 64 insertions, 64 deletions
diff --git a/src/CAN/CanInterface.cpp b/src/CAN/CanInterface.cpp
index b7827e4d..4c3a6739 100644
--- a/src/CAN/CanInterface.cpp
+++ b/src/CAN/CanInterface.cpp
@@ -489,71 +489,76 @@ extern "C" [[noreturn]] void CanClockLoop(void *) noexcept
for (;;)
{
-#if SUPPORT_REMOTE_COMMANDS
- if (!inExpansionMode)
-#endif
- {
- CanMessageTimeSync * const msg = buf.SetupBroadcastMessage<CanMessageTimeSync>(CanInterface::GetCanAddress());
- msg->lastTimeSent = lastTimeSent;
- msg->lastTimeAcknowledgeDelay = 0; // assume we don't have the transmit delay available
+ CanMessageTimeSync * const msg = buf.SetupBroadcastMessage<CanMessageTimeSync>(CanInterface::GetCanAddress());
+ msg->lastTimeSent = lastTimeSent;
+ msg->lastTimeAcknowledgeDelay = 0; // assume we don't have the transmit delay available
- currentTimeSyncMarker = ((currentTimeSyncMarker + 1) & 0x0F) | 0xA0;
- buf.marker = currentTimeSyncMarker;
- buf.reportInFifo = 1;
+ currentTimeSyncMarker = ((currentTimeSyncMarker + 1) & 0x0F) | 0xA0;
+ buf.marker = currentTimeSyncMarker;
+ buf.reportInFifo = 1;
- if (gotTimeSyncTxTimeStamp)
- {
+ if (gotTimeSyncTxTimeStamp)
+ {
# if SAME70
- // On the SAME70 the step clock is also the external time stamp counter
- const uint32_t timeSyncTxDelay = (timeSyncTxTimeStamp - (uint16_t)lastTimeSent) & 0xFFFF;
+ // On the SAME70 the step clock is also the external time stamp counter
+ const uint32_t timeSyncTxDelay = (timeSyncTxTimeStamp - (uint16_t)lastTimeSent) & 0xFFFF;
# else
- // On the SAME5x the time stamp counter counts CAN bit times divided by 64
- const uint32_t timeSyncTxDelay = (((timeSyncTxTimeStamp - lastTimeSyncTxPreparedStamp) & 0xFFFF) * CanInterface::GetTimeStampPeriod()) >> 6;
+ // On the SAME5x the time stamp counter counts CAN bit times divided by 64
+ const uint32_t timeSyncTxDelay = (((timeSyncTxTimeStamp - lastTimeSyncTxPreparedStamp) & 0xFFFF) * CanInterface::GetTimeStampPeriod()) >> 6;
# endif
- if (timeSyncTxDelay > peakTimeSyncTxDelay)
- {
- peakTimeSyncTxDelay = timeSyncTxDelay;
- }
-
- // Occasionally on the SAME70 we get very large delays reported. These delays are not genuine.
- if (timeSyncTxDelay < MaxTimeSyncDelay)
- {
- msg->lastTimeAcknowledgeDelay = timeSyncTxDelay;
- }
- gotTimeSyncTxTimeStamp = false;
- }
-
- msg->isPrinting = reprap.GetGCodes().IsReallyPrinting();
-
- // Send the real time just once a second
- const uint32_t realTime = (uint32_t)reprap.GetPlatform().GetDateTime();
- if (realTime != lastRealTimeSent)
+ if (timeSyncTxDelay > peakTimeSyncTxDelay)
{
- msg->realTime = realTime;
- lastRealTimeSent = realTime;
+ peakTimeSyncTxDelay = timeSyncTxDelay;
}
- else
+
+ // Occasionally on the SAME70 we get very large delays reported. These delays are not genuine.
+ if (timeSyncTxDelay < MaxTimeSyncDelay)
{
- buf.dataLength = CanMessageTimeSync::SizeWithoutRealTime; // send a short message to save CAN bandwidth
+ msg->lastTimeAcknowledgeDelay = timeSyncTxDelay;
}
+ gotTimeSyncTxTimeStamp = false;
+ }
+
+ msg->isPrinting = reprap.GetGCodes().IsReallyPrinting();
+
+ // Send the real time just once a second
+ const uint32_t realTime = (uint32_t)reprap.GetPlatform().GetDateTime();
+ if (realTime != lastRealTimeSent)
+ {
+ msg->realTime = realTime;
+ lastRealTimeSent = realTime;
+ }
+ else
+ {
+ buf.dataLength = CanMessageTimeSync::SizeWithoutRealTime; // send a short message to save CAN bandwidth
+ }
#if SAME70
- lastTimeSent = StepTimer::GetTimerTicks();
+ lastTimeSent = StepTimer::GetTimerTicks();
#else
- {
- AtomicCriticalSectionLocker lock;
- lastTimeSent = StepTimer::GetTimerTicks();
- lastTimeSyncTxPreparedStamp = CanInterface::GetTimeStampCounter();
- }
-#endif
- msg->timeSent = lastTimeSent;
- SendCanMessage(TxBufferIndexTimeSync, 0, &buf);
- ++timeSyncMessagesSent;
+ {
+ AtomicCriticalSectionLocker lock;
+ lastTimeSent = StepTimer::GetTimerTicks();
+ lastTimeSyncTxPreparedStamp = CanInterface::GetTimeStampCounter();
}
+#endif
+ msg->timeSent = lastTimeSent;
+ SendCanMessage(TxBufferIndexTimeSync, 0, &buf);
+ ++timeSyncMessagesSent;
+
+ // Blink the LED at about 2Hz. Duet 3 expansion boards will blink in sync when they have established clock sync with us.
+ digitalWrite(DiagPin, XNor(DiagOnPolarity, lastTimeSent & (1u << 19)) != 0);
// Delay until it is time again
vTaskDelayUntil(&lastWakeTime, CanClockIntervalMillis);
+#if SUPPORT_REMOTE_COMMANDS
+ if (inExpansionMode)
+ {
+ vTaskDelete(nullptr); // once in expansion mode we can't revert to main board mode, so we don't need this task any more
+ }
+#endif
+
// Check that the message was sent and get the time stamp
if (can0dev->IsSpaceAvailable((CanDevice::TxBufferNumber)TxBufferIndexTimeSync, 0)) // if the buffer is free already then the message was sent
{
@@ -562,8 +567,8 @@ extern "C" [[noreturn]] void CanClockLoop(void *) noexcept
else
{
(void)can0dev->IsSpaceAvailable((CanDevice::TxBufferNumber)TxBufferIndexTimeSync, MaxTimeSyncSendWait); // free the buffer
- can0dev->PollTxEventFifo(TxCallback); // empty the fifo
- gotTimeSyncTxTimeStamp = false; // ignore any values read from it
+ can0dev->PollTxEventFifo(TxCallback); // empty the fifo
+ gotTimeSyncTxTimeStamp = false; // ignore any values read from it
}
}
}
diff --git a/src/Config/Pins_Duet3_MB6HC.h b/src/Config/Pins_Duet3_MB6HC.h
index c59559ec..5574ff1e 100644
--- a/src/Config/Pins_Duet3_MB6HC.h
+++ b/src/Config/Pins_Duet3_MB6HC.h
@@ -149,6 +149,8 @@ constexpr float V12MonitorVoltageRange = (60.4 + 4.7)/4.7 * 3.3; // voltage di
// Digital pin number to turn the IR LED on (high) or off (low), also controls the DIAG LED
constexpr Pin DiagPin = PortCPin(20);
constexpr bool DiagOnPolarity = true;
+constexpr Pin ActLedPin = NoPin;
+constexpr bool ActOnPolarity = false;
// SD cards
constexpr size_t NumSdCards = 2; // we now allow one SPI-connected SD card to be configured at boot time
diff --git a/src/Config/Pins_Duet3_MB6XD.h b/src/Config/Pins_Duet3_MB6XD.h
index 70ec355d..514cb4ed 100644
--- a/src/Config/Pins_Duet3_MB6XD.h
+++ b/src/Config/Pins_Duet3_MB6XD.h
@@ -132,6 +132,7 @@ constexpr float V12MonitorVoltageRange = (60.4 + 4.7)/4.7 * 3.3; // voltage di
constexpr Pin DiagPin = PortBPin(6); // diag/status LED
constexpr Pin ActLedPin = PortBPin(7); // activityLED
constexpr bool DiagOnPolarity = false;
+constexpr bool ActOnPolarity = false;
// SD cards
constexpr size_t NumSdCards = 2;
diff --git a/src/Platform/Platform.cpp b/src/Platform/Platform.cpp
index 968ed426..5988dfd2 100644
--- a/src/Platform/Platform.cpp
+++ b/src/Platform/Platform.cpp
@@ -415,7 +415,7 @@ Platform::Platform() noexcept :
#endif
tickState(0), debugCode(0),
lastDriverPollMillis(0),
-#ifdef DUET3MINI
+#if SUPPORT_CAN_EXPANSION
whenLastCanMessageProcessed(0),
#endif
@@ -977,8 +977,7 @@ void Platform::Spin() noexcept
return;
}
-#if defined(DUET3) || defined(DUET3MINI) || defined(__LPC17xx__)
-# if SUPPORT_REMOTE_COMMANDS
+#if SUPPORT_REMOTE_COMMANDS
if (CanInterface::InExpansionMode())
{
if (StepTimer::IsSynced())
@@ -990,21 +989,14 @@ void Platform::Spin() noexcept
digitalWrite(DiagPin, XNor(DiagOnPolarity, StepTimer::GetTimerTicks() & (1u << 17)) != 0);
}
}
- else
-# endif
- {
- // Blink the LED at about 2Hz. Duet 3 expansion boards will blink in sync when they have established clock sync with us.
- digitalWrite(DiagPin, XNor(DiagOnPolarity, StepTimer::GetTimerTicks() & (1u << 19)) != 0);
- }
#endif
-#if defined(DUET3MINI)
+#if SUPPORT_CAN_EXPANSION
// Turn off the ACT LED if it is time to do so
if (millis() - whenLastCanMessageProcessed > ActLedFlashTime)
{
digitalWrite(ActLedPin, !ActOnPolarity);
}
-
#endif
#if HAS_MASS_STORAGE || HAS_SBC_INTERFACE || HAS_EMBEDDED_FILES
@@ -4552,7 +4544,7 @@ GCodeResult Platform::UpdateRemoteStepsPerMmAndMicrostepping(AxesBitmap axesAndE
void Platform::OnProcessingCanMessage() noexcept
{
-#ifdef DUET3MINI // MB6HC doesn't yet have a ACT LED
+#if SUPPORT_CAN_EXPANSION
whenLastCanMessageProcessed = millis();
digitalWrite(ActLedPin, ActOnPolarity); // turn the ACT LED on
#endif
diff --git a/src/Platform/Platform.h b/src/Platform/Platform.h
index a8ae2c27..b8eca7d9 100644
--- a/src/Platform/Platform.h
+++ b/src/Platform/Platform.h
@@ -912,7 +912,7 @@ private:
// Event handling
uint32_t lastDriverPollMillis; // when we last checked the drivers and voltage monitoring
-#ifdef DUET3MINI
+#if SUPPORT_CAN_EXPANSION
uint32_t whenLastCanMessageProcessed;
#endif
diff --git a/src/Version.h b/src/Version.h
index eca88cd1..711fda3f 100644
--- a/src/Version.h
+++ b/src/Version.h
@@ -10,7 +10,7 @@
#ifndef VERSION
// Note: the complete VERSION string must be in standard version number format and must not contain spaces! This is so that DWC can parse it.
-# define MAIN_VERSION "3.4.2rc1"
+# define MAIN_VERSION "3.4.2rc1+"
# ifdef USE_CAN0
# define VERSION_SUFFIX "(CAN0)"
# else