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

PrintMonitor.h « src - github.com/Duet3D/RepRapFirmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 77e872c28d0ad59d53b5efad32b8426b2839c87a (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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/****************************************************************************************************

RepRapFirmware - PrintMonitor

This class provides methods to obtain print end-time estimations and file information from generated
G-Code files, which may be reported to auxiliary devices and to the web interface using status responses.

-----------------------------------------------------------------------------------------------------

Version 0.1

Created on: Feb 24, 2015

Christian Hammacher

Licence: GPL

****************************************************************************************************/

#ifndef PRINTMONITOR_H
#define PRINTMONITOR_H

#include <RepRapFirmware.h>
#include <GCodes/GCodeFileInfo.h>
#include <ObjectModel/ObjectModel.h>

const float LAYER_HEIGHT_TOLERANCE = 0.015;			// Tolerance for comparing two Z heights (in mm)

const size_t MAX_LAYER_SAMPLES = 5;					// Number of layer samples for end-time estimation (except for first layer)
const float ESTIMATION_MIN_FILAMENT_USAGE = 0.01;	// Minimum per cent of filament to be printed before the filament-based estimation returns values
const float ESTIMATION_MIN_FILE_USAGE = 0.001;		// Minimum per cent of the file to be processed before any file-based estimations are made
const float FIRST_LAYER_SPEED_FACTOR = 0.25;		// First layer speed factor compared to other layers (only for layer-based estimation)

const uint32_t PRINTMONITOR_UPDATE_INTERVAL = 200;	// Update interval in milliseconds

enum PrintEstimationMethod
{
	filamentBased,
	fileBased,
	layerBased
};

class PrintMonitor INHERIT_OBJECT_MODEL
{
public:
	PrintMonitor(Platform& p, GCodes& gc) noexcept;
	void Spin() noexcept;
	void Init() noexcept;

	bool IsPrinting() const noexcept;						// Is a file being printed?
	void StartingPrint(const char *filename) noexcept;		// Called to indicate a file will be printed (see M23)
	void StartedPrint() noexcept;							// Called whenever a new live print starts (see M24)
	void StoppedPrint() noexcept;							// Called whenever a file print has stopped
	void SetLayerNumber(uint32_t layerNumber) noexcept;		// Set the current layer number
	void SetLayerZ(float layerZ) noexcept;					// Set the printing height of the new layer
	float FractionOfFilePrinted() const noexcept;			// Return the fraction printed (0..1)

	// Return an estimate in seconds based on a specific estimation method
	float EstimateTimeLeft(PrintEstimationMethod method) const noexcept;
#if SUPPORT_OBJECT_MODEL
	ExpressionValue EstimateTimeLeftAsExpression(PrintEstimationMethod method) const noexcept;
#endif

	// Provide some information about the file being printed
	unsigned int GetCurrentLayer() const noexcept;
	float GetCurrentLayerTime() const noexcept;
	float GetPrintDuration() const noexcept;
	float GetWarmUpDuration() const noexcept;
	float GetFirstLayerDuration() const noexcept;
	float GetFirstLayerHeight() const noexcept;

	const char *GetPrintingFilename() const noexcept { return (isPrinting) ? filenameBeingPrinted.c_str() : nullptr; }
	bool GetPrintingFileInfo(GCodeFileInfo& info) noexcept;
	void SetPrintingFileInfo(const char *filename, GCodeFileInfo& info) noexcept;

protected:
	DECLARE_OBJECT_MODEL
	OBJECT_MODEL_ARRAY(filament)

private:
	Platform& platform;
	GCodes& gCodes;
	uint32_t lastUpdateTime;

	// Information/Events concerning the file being printed
	void FirstLayerComplete() noexcept;
	void LayerComplete() noexcept;
	void Reset() noexcept;

#if SUPPORT_OBJECT_MODEL
	int32_t GetPrintOrSimulatedDuration() const noexcept;
#endif

	bool isPrinting;
	bool heatingUp;
	uint64_t printStartTime;
	uint64_t heatingStartedTime;
	uint64_t pauseStartTime, totalPauseTime;

	unsigned int currentLayer;
	float warmUpDuration, firstLayerDuration;
	float firstLayerFilament, firstLayerProgress;
	float lastLayerChangeTime, lastLayerFilament, lastLayerZ;

	unsigned int numLayerSamples;
	float layerDurations[MAX_LAYER_SAMPLES];
	float filamentUsagePerLayer[MAX_LAYER_SAMPLES];
	float fileProgressPerLayer[MAX_LAYER_SAMPLES];
	float layerEstimatedTimeLeft;

	unsigned int lastLayerNumberNotified;
	float lastLayerStartHeightNotified;

	static ReadWriteLock printMonitorLock;

	bool printingFileParsed;
	GCodeFileInfo printingFileInfo;
	String<MaxFilenameLength> filenameBeingPrinted;
};

inline bool PrintMonitor::IsPrinting() const noexcept { return isPrinting; }
inline unsigned int PrintMonitor::GetCurrentLayer() const noexcept { return currentLayer; }

inline float PrintMonitor::GetCurrentLayerTime() const noexcept
{
	return (currentLayer == 0) ? 0.0
			: (currentLayer == 1) ? GetPrintDuration()
				: GetPrintDuration() - lastLayerChangeTime;
}

inline float PrintMonitor::GetFirstLayerHeight() const noexcept
{
	return printingFileParsed ? printingFileInfo.firstLayerHeight : 0.0;
}

#endif /* PRINTMONITOR_H */

// vim: ts=4:sw=4