1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
/*
* RemoteHeater.h
*
* Created on: 24 Jul 2019
* Author: David
*/
#ifndef SRC_HEATING_REMOTEHEATER_H_
#define SRC_HEATING_REMOTEHEATER_H_
#include "Heater.h"
#if SUPPORT_CAN_EXPANSION
class RemoteHeater : public Heater
{
public:
RemoteHeater(unsigned int num, CanAddress board) noexcept;
~RemoteHeater() noexcept;
GCodeResult ConfigurePortAndSensor(const char *portName, PwmFrequency freq, unsigned int sn, const StringRef& reply) override;
GCodeResult SetPwmFrequency(PwmFrequency freq, const StringRef& reply) override;
GCodeResult ReportDetails(const StringRef& reply) const noexcept override;
void Spin() noexcept override; // Called in a tight loop to keep things running
void SwitchOff() noexcept override; // Not even standby - all heater power off
GCodeResult ResetFault(const StringRef& reply) noexcept override; // Reset a fault condition - only call this if you know what you are doing
float GetTemperature() const noexcept override; // Get the latest temperature
float GetAveragePWM() const noexcept override; // Return the running average PWM to the heater. Answer is a fraction in [0, 1].
float GetAccumulator() const noexcept override; // Return the integral accumulator
void Suspend(bool sus) noexcept override; // Suspend the heater to conserve power or while doing Z probing
void FeedForwardAdjustment(float fanPwmChange, float extrusionChange) noexcept override;
void UpdateRemoteStatus(CanAddress src, const CanHeaterReport& report) noexcept override;
void UpdateHeaterTuning(CanAddress src, const CanMessageHeaterTuningReport& msg) noexcept override;
protected:
void ResetHeater() noexcept override;
HeaterMode GetMode() const noexcept override;
GCodeResult SwitchOn(const StringRef& reply) noexcept override; // Turn the heater on and set the mode
GCodeResult UpdateModel(const StringRef& reply) noexcept override; // Called when the heater model has been changed
GCodeResult UpdateFaultDetectionParameters(const StringRef& reply) noexcept override;
GCodeResult UpdateHeaterMonitors(const StringRef& reply) noexcept override;
GCodeResult StartAutoTune(const StringRef& reply, bool seenA, float ambientTemp) noexcept override;
// Start an auto tune cycle for this heater
private:
enum class TuningState : uint8_t
{
notTuning = 0,
stabilising,
heatingUp,
idleCycles,
cycling
};
GCodeResult SendTuningCommand(const StringRef& reply, bool on) noexcept;
void StopTuning() noexcept;
static constexpr uint32_t RemoteStatusTimeout = 2000;
CanAddress boardAddress;
HeaterMode lastMode;
uint8_t averagePwm;
TuningState tuningState;
float lastTemperature;
uint32_t whenLastStatusReceived;
// Variables used only during tuning
static uint32_t timeSetHeating; // When we turned on the heater at the start of auto tuning
static float currentCoolingRate;
static unsigned int tuningCyclesDone;
static bool newTuningResult;
};
#endif
#endif /* SRC_HEATING_REMOTEHEATER_H_ */
|