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>2021-06-03 16:48:52 +0300
committerDavid Crocker <dcrocker@eschertech.com>2021-06-03 16:48:52 +0300
commita9e074cdeda7195103d2131c7ab7d653dacc8a30 (patch)
treea07db988626b62b49f97eb977e7376c1b0f56214
parented23db138ff8113ca1765463b253167fe7353474 (diff)
Support multiple ports per heater
-rw-r--r--src/Duet3Mini/Pins_Duet3Mini.h2
-rw-r--r--src/Duet3_V06/Pins_Duet3_V06.h2
-rw-r--r--src/DuetM/Pins_DuetM.h1
-rw-r--r--src/DuetNG/Pins_DuetNG.h1
-rw-r--r--src/Heating/LocalHeater.cpp36
-rw-r--r--src/Heating/LocalHeater.h2
6 files changed, 37 insertions, 7 deletions
diff --git a/src/Duet3Mini/Pins_Duet3Mini.h b/src/Duet3Mini/Pins_Duet3Mini.h
index 0ad29756..65bb0019 100644
--- a/src/Duet3Mini/Pins_Duet3Mini.h
+++ b/src/Duet3Mini/Pins_Duet3Mini.h
@@ -99,6 +99,8 @@ constexpr size_t MaxCanDrivers = 7; // enough to support another Mini5+ as a
constexpr unsigned int MaxCanBoards = 4;
#endif
+constexpr size_t MaxPortsPerHeater = 2;
+
constexpr size_t MaxBedHeaters = 2;
constexpr size_t MaxChamberHeaters = 2;
constexpr int8_t DefaultBedHeater = 0;
diff --git a/src/Duet3_V06/Pins_Duet3_V06.h b/src/Duet3_V06/Pins_Duet3_V06.h
index d1dfe43e..7f8bba84 100644
--- a/src/Duet3_V06/Pins_Duet3_V06.h
+++ b/src/Duet3_V06/Pins_Duet3_V06.h
@@ -66,6 +66,8 @@ constexpr size_t MaxCanBoards = 20;
constexpr float MaxTmc5160Current = 6300.0; // The maximum current we allow the TMC5160/5161 drivers to be set to
constexpr float Tmc5160SenseResistor = 0.050;
+constexpr size_t MaxPortsPerHeater = 3;
+
constexpr size_t MaxBedHeaters = 12;
constexpr size_t MaxChamberHeaters = 4;
constexpr int8_t DefaultE0Heater = 1; // Index of the default first extruder heater, used only for the legacy status response
diff --git a/src/DuetM/Pins_DuetM.h b/src/DuetM/Pins_DuetM.h
index 0f9f5dac..82c1cc60 100644
--- a/src/DuetM/Pins_DuetM.h
+++ b/src/DuetM/Pins_DuetM.h
@@ -57,6 +57,7 @@ constexpr size_t MaxSmartDrivers = 7; // The maximum number of smart drivers
constexpr size_t MaxSensors = 32;
constexpr size_t MaxHeaters = 4; // The maximum number of heaters in the machine
+constexpr size_t MaxPortsPerHeater = 2;
constexpr size_t MaxMonitorsPerHeater = 3; // The maximum number of monitors per heater
constexpr size_t MaxBedHeaters = 2;
diff --git a/src/DuetNG/Pins_DuetNG.h b/src/DuetNG/Pins_DuetNG.h
index 7a8f69e4..b30c0080 100644
--- a/src/DuetNG/Pins_DuetNG.h
+++ b/src/DuetNG/Pins_DuetNG.h
@@ -110,6 +110,7 @@ constexpr size_t MaxSmartDrivers = 10; // The maximum number of smart drivers
constexpr size_t MaxSensors = 32;
constexpr size_t MaxHeaters = 10; // The maximum number of heaters in the machine
+constexpr size_t MaxPortsPerHeater = 2;
constexpr size_t MaxMonitorsPerHeater = 3; // The maximum number of monitors per heater
constexpr size_t MaxBedHeaters = 4;
diff --git a/src/Heating/LocalHeater.cpp b/src/Heating/LocalHeater.cpp
index 718fb809..552b111b 100644
--- a/src/Heating/LocalHeater.cpp
+++ b/src/Heating/LocalHeater.cpp
@@ -29,7 +29,10 @@ LocalHeater::LocalHeater(unsigned int heaterNum) noexcept : Heater(heaterNum), m
LocalHeater::~LocalHeater() noexcept
{
LocalHeater::SwitchOff();
- port.Release();
+ for (auto& port : ports)
+ {
+ port.Release();
+ }
}
float LocalHeater::GetTemperature() const noexcept
@@ -44,7 +47,10 @@ float LocalHeater::GetAccumulator() const noexcept
inline void LocalHeater::SetHeater(float power) const noexcept
{
- port.WriteAnalog(power);
+ for (auto& port : ports)
+ {
+ port.WriteAnalog(power);
+ }
}
void LocalHeater::ResetHeater() noexcept
@@ -62,12 +68,22 @@ void LocalHeater::ResetHeater() noexcept
// Configure the heater port and the sensor number
GCodeResult LocalHeater::ConfigurePortAndSensor(const char *portName, PwmFrequency freq, unsigned int sn, const StringRef& reply)
{
- if (!port.AssignPort(portName, reply, PinUsedBy::heater, PinAccess::pwm))
+ PinAccess access[MaxPortsPerHeater];
+ IoPort* portAddrs[MaxPortsPerHeater];
+ for (size_t i = 0; i < MaxPortsPerHeater; ++i)
+ {
+ access[i] = PinAccess::pwm;
+ portAddrs[i] = &ports[i];
+ }
+ if (IoPort::AssignPorts(portName, reply, PinUsedBy::heater, MaxPortsPerHeater, portAddrs, access) == 0)
{
return GCodeResult::error;
}
- port.SetFrequency(freq);
+ for (auto& port : ports)
+ {
+ port.SetFrequency(freq);
+ }
SetSensorNumber(sn);
if (reprap.GetHeat().FindSensor(sn).IsNull())
{
@@ -79,14 +95,22 @@ GCodeResult LocalHeater::ConfigurePortAndSensor(const char *portName, PwmFrequen
GCodeResult LocalHeater::SetPwmFrequency(PwmFrequency freq, const StringRef& reply) noexcept
{
- port.SetFrequency(freq);
+ for (auto& port : ports)
+ {
+ port.SetFrequency(freq);
+ }
return GCodeResult::ok;
}
GCodeResult LocalHeater::ReportDetails(const StringRef& reply) const noexcept
{
reply.printf("Heater %u", GetHeaterNumber());
- port.AppendDetails(reply);
+ ports[0].AppendDetails(reply);
+ for (size_t i = 1; i < MaxPortsPerHeater && ports[i].IsValid(); ++i)
+ {
+ reply.cat('+');
+ ports[i].AppendDetails(reply);
+ }
if (GetSensorNumber() >= 0)
{
reply.catf(", sensor %d", GetSensorNumber());
diff --git a/src/Heating/LocalHeater.h b/src/Heating/LocalHeater.h
index 2015eb6e..db6db03d 100644
--- a/src/Heating/LocalHeater.h
+++ b/src/Heating/LocalHeater.h
@@ -61,7 +61,7 @@ private:
float GetExpectedHeatingRate() const noexcept; // Get the minimum heating rate we expect
void RaiseHeaterFault(const char *format, ...) noexcept;
- PwmPort port; // The port that drives the heater
+ PwmPort ports[MaxPortsPerHeater]; // The port(s) that drive the heater
float temperature; // The current temperature
float previousTemperatures[NumPreviousTemperatures]; // The temperatures of the previous NumDerivativeSamples measurements, used for calculating the derivative
size_t previousTemperatureIndex; // Which slot in previousTemperature we fill in next