Welcome to mirror list, hosted at ThFree Co, Russian Federation.

HeaterMonitor.cpp « Heating « src - github.com/Duet3D/RepRapFirmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 7b1ef9fb00798170208e4625bfc0d656770b3849 (plain)
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/*
 * HeaterProtection.cpp
 *
 *  Created on: 16 Nov 2017
 *      Author: Christian
 */

#include "HeaterMonitor.h"

#include <Platform/Platform.h>
#include <Platform/RepRap.h>
#include "Heat.h"

HeaterMonitor::HeaterMonitor() noexcept
	: sensorNumber(-1), trigger(HeaterMonitorTrigger::Disabled), badTemperatureCount(0)
{
}

// Check if any action needs to be taken. Returns true if everything is OK
bool HeaterMonitor::Check(unsigned int maxBadTemperatureCount) noexcept
{
	if (sensorNumber >= 0 && trigger != HeaterMonitorTrigger::Disabled)
	{
		TemperatureError err;
		const float temperature = reprap.GetHeat().GetSensorTemperature(sensorNumber, err);

		if (err != TemperatureError::success)
		{
			badTemperatureCount++;
			if (badTemperatureCount > maxBadTemperatureCount)
			{
				reprap.GetPlatform().MessageF(ErrorMessage, "Temperature reading error on sensor %d\n", sensorNumber);
				return false;
			}
		}
		else
		{
			badTemperatureCount = 0;
			switch (trigger)
			{
			case HeaterMonitorTrigger::TemperatureExceeded:
				return (temperature <= limit);

			case HeaterMonitorTrigger::TemperatureTooLow:
				return (temperature >= limit);

			default:
				break;
			}
		}
	}
	return true;
}

// Append a report of this monitor to the string
void HeaterMonitor::Report(unsigned int heater, unsigned int index, const StringRef& reply) const noexcept
{
	reply.lcatf("Heater %d monitor %d ", heater, index);
	if (trigger == HeaterMonitorTrigger::Disabled)
	{
		reply.cat("is disabled");
	}
	else
	{
		const char *actionString, *triggerString;
		switch (action)
		{
		case HeaterMonitorAction::GenerateFault:		actionString = "generate a heater fault"; break;
		case HeaterMonitorAction::PermanentSwitchOff:	actionString = "permanently switch off"; break;
		case HeaterMonitorAction::TemporarySwitchOff:	actionString = "temporarily switch off"; break;
		case HeaterMonitorAction::ShutDown:				actionString = "shut down the printer"; break;
		default:										actionString = "(undefined)"; break;
		}

		switch (trigger)
		{
		case HeaterMonitorTrigger::TemperatureExceeded:	triggerString = "exceeds"; break;
		case HeaterMonitorTrigger::TemperatureTooLow:	triggerString = "falls below"; break;
		default:										triggerString = "(undefined)"; break;
		}

		reply.catf("uses sensor %d to %s if the reading %s %.1f" DEGREE_SYMBOL "C", sensorNumber, actionString, triggerString, (double)limit);
	}
}

// Get the condition for a temperature event as a string
const char *HeaterMonitor::GetTriggerName() const noexcept
{
	switch (trigger)
	{
	case HeaterMonitorTrigger::Disabled:				return "disabled";
	case HeaterMonitorTrigger::TemperatureExceeded:		return "tooHigh";
	case HeaterMonitorTrigger::TemperatureTooLow:		return "tooLow";
	default:											return "undefined";
	}
}

// End