diff options
author | David Crocker <dcrocker@eschertech.com> | 2021-06-03 16:48:52 +0300 |
---|---|---|
committer | David Crocker <dcrocker@eschertech.com> | 2021-06-03 16:48:52 +0300 |
commit | a9e074cdeda7195103d2131c7ab7d653dacc8a30 (patch) | |
tree | a07db988626b62b49f97eb977e7376c1b0f56214 | |
parent | ed23db138ff8113ca1765463b253167fe7353474 (diff) |
Support multiple ports per heater
-rw-r--r-- | src/Duet3Mini/Pins_Duet3Mini.h | 2 | ||||
-rw-r--r-- | src/Duet3_V06/Pins_Duet3_V06.h | 2 | ||||
-rw-r--r-- | src/DuetM/Pins_DuetM.h | 1 | ||||
-rw-r--r-- | src/DuetNG/Pins_DuetNG.h | 1 | ||||
-rw-r--r-- | src/Heating/LocalHeater.cpp | 36 | ||||
-rw-r--r-- | src/Heating/LocalHeater.h | 2 |
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 |