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 /src/Heating
parented23db138ff8113ca1765463b253167fe7353474 (diff)
Support multiple ports per heater
Diffstat (limited to 'src/Heating')
-rw-r--r--src/Heating/LocalHeater.cpp36
-rw-r--r--src/Heating/LocalHeater.h2
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