diff options
author | David Crocker <dcrocker@eschertech.com> | 2020-01-19 02:03:39 +0300 |
---|---|---|
committer | David Crocker <dcrocker@eschertech.com> | 2020-01-19 02:03:39 +0300 |
commit | c812ce5e14cf476526d955edbce2effa9d922902 (patch) | |
tree | da67dc55e46efdd38a0647318977a342da730345 /src/Fans/LocalFan.cpp | |
parent | e0bbf71357b07c22e6d43be3cca5c7422163be32 (diff) |
Major refactoring, bug fixes in function evaluation
Changed all bitmaps to use the bitmap class from RRFLibraries
Fixed bugs in functoin evaluation
Diffstat (limited to 'src/Fans/LocalFan.cpp')
-rw-r--r-- | src/Fans/LocalFan.cpp | 73 |
1 files changed, 38 insertions, 35 deletions
diff --git a/src/Fans/LocalFan.cpp b/src/Fans/LocalFan.cpp index 4d3daf21..9980d91d 100644 --- a/src/Fans/LocalFan.cpp +++ b/src/Fans/LocalFan.cpp @@ -70,10 +70,10 @@ void LocalFan::InternalRefresh() noexcept { float reqVal; #if HAS_SMART_DRIVERS - uint32_t driverChannelsMonitored = 0; + DriverChannelsBitmap driverChannelsMonitored; #endif - if (sensorsMonitored == 0) + if (sensorsMonitored.IsEmpty()) { reqVal = val; } @@ -81,40 +81,43 @@ void LocalFan::InternalRefresh() noexcept { reqVal = 0.0; const bool bangBangMode = (triggerTemperatures[1] <= triggerTemperatures[0]); - SensorsBitmap copySensorsMonitored = sensorsMonitored; - while (copySensorsMonitored != 0) - { - const unsigned int sensorNum = LowestSetBit(copySensorsMonitored); - ClearBit(copySensorsMonitored, sensorNum); - const auto sensor = reprap.GetHeat().FindSensor(sensorNum); - if (sensor.IsNotNull()) + sensorsMonitored.Iterate + ([&reqVal, bangBangMode, this +#if HAS_SMART_DRIVERS + , &driverChannelsMonitored +#endif + ](unsigned int sensorNum) { - //TODO we used to turn the fan on if the associated heater was being tuned - float ht; - const TemperatureError err = sensor->GetLatestTemperature(ht); - if (err != TemperatureError::success || ht < BadLowTemperature || ht >= triggerTemperatures[1]) - { - reqVal = max<float>(reqVal, (bangBangMode) ? max<float>(0.5, val) : 1.0); - } - else if (!bangBangMode && ht > triggerTemperatures[0]) - { - // We already know that ht < triggerTemperatures[1], therefore unless we have NaNs it is safe to divide by (triggerTemperatures[1] - triggerTemperatures[0]) - reqVal = max<float>(reqVal, (ht - triggerTemperatures[0])/(triggerTemperatures[1] - triggerTemperatures[0])); - } - else if (lastVal != 0.0 && ht + ThermostatHysteresis > triggerTemperatures[0]) // if the fan is on, add a hysteresis before turning it off + const auto sensor = reprap.GetHeat().FindSensor(sensorNum); + if (sensor.IsNotNull()) { - const float minFanSpeed = (bangBangMode) ? max<float>(0.5, val) : minVal; - reqVal = constrain<float>(reqVal, minFanSpeed, maxVal); - } + //TODO we used to turn the fan on if the associated heater was being tuned + float ht; + const TemperatureError err = sensor->GetLatestTemperature(ht); + if (err != TemperatureError::success || ht < BadLowTemperature || ht >= triggerTemperatures[1]) + { + reqVal = max<float>(reqVal, (bangBangMode) ? max<float>(0.5, val) : 1.0); + } + else if (!bangBangMode && ht > triggerTemperatures[0]) + { + // We already know that ht < triggerTemperatures[1], therefore unless we have NaNs it is safe to divide by (triggerTemperatures[1] - triggerTemperatures[0]) + reqVal = max<float>(reqVal, (ht - triggerTemperatures[0])/(triggerTemperatures[1] - triggerTemperatures[0])); + } + else if (lastVal != 0.0 && ht + ThermostatHysteresis > triggerTemperatures[0]) // if the fan is on, add a hysteresis before turning it off + { + const float minFanSpeed = (bangBangMode) ? max<float>(0.5, val) : minVal; + reqVal = constrain<float>(reqVal, minFanSpeed, maxVal); + } #if HAS_SMART_DRIVERS - const int channel = sensor->GetSmartDriversChannel(); - if (channel >= 0) - { - driverChannelsMonitored |= 1 << (unsigned int)channel; - } + const int channel = sensor->GetSmartDriversChannel(); + if (channel >= 0) + { + driverChannelsMonitored.SetBit((unsigned int)channel); + } #endif + } } - } + ); } if (reqVal > 0.0) @@ -124,7 +127,7 @@ void LocalFan::InternalRefresh() noexcept { // We are turning this fan on #if HAS_SMART_DRIVERS - if (driverChannelsMonitored != 0) + if (driverChannelsMonitored.IsNonEmpty()) { reprap.GetPlatform().DriverCoolingFansOnOff(driverChannelsMonitored, true); // tell Platform that we have started a fan that cools drivers } @@ -150,7 +153,7 @@ void LocalFan::InternalRefresh() noexcept } } #if HAS_SMART_DRIVERS - else if (driverChannelsMonitored != 0 && lastVal != 0.0) + else if (driverChannelsMonitored.IsNonEmpty() && lastVal != 0.0) { reprap.GetPlatform().DriverCoolingFansOnOff(driverChannelsMonitored, false); // tell Platform that we have stopped a fan that cools drivers } @@ -185,11 +188,11 @@ bool LocalFan::UpdateFanConfiguration(const StringRef& reply) noexcept bool LocalFan::Check() noexcept { - if (sensorsMonitored != 0 || blipping) + if (sensorsMonitored.IsNonEmpty() || blipping) { InternalRefresh(); } - return sensorsMonitored != 0 && lastVal != 0.0; + return sensorsMonitored.IsNonEmpty() && lastVal != 0.0; } bool LocalFan::AssignPorts(const char *pinNames, const StringRef& reply) noexcept |