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 /src/Heating | |
parent | ed23db138ff8113ca1765463b253167fe7353474 (diff) |
Support multiple ports per heater
Diffstat (limited to 'src/Heating')
-rw-r--r-- | src/Heating/LocalHeater.cpp | 36 | ||||
-rw-r--r-- | src/Heating/LocalHeater.h | 2 |
2 files changed, 31 insertions, 7 deletions
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 |