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

LaserFilamentMonitor.h « FilamentMonitors « src - github.com/Duet3D/RepRapFirmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 3264d1cf62c9446255702f28cb065c6abca62245 (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
/*
 * LaserFilamentMonitor.h
 *
 *  Created on: 9 Jan 2018
 *      Author: David
 */

#ifndef SRC_FILAMENTSENSORS_LASERFILAMENTMONITOR_H_
#define SRC_FILAMENTSENSORS_LASERFILAMENTMONITOR_H_

#include "Duet3DFilamentMonitor.h"

class LaserFilamentMonitor : public Duet3DFilamentMonitor
{
public:
	LaserFilamentMonitor(unsigned int extruder, unsigned int type);

	bool Configure(GCodeBuffer& gb, const StringRef& reply, bool& seen) override;
	FilamentSensorStatus Check(bool isPrinting, bool fromIsr, uint32_t isrMillis, float filamentConsumed) override;
	FilamentSensorStatus Clear() override;
	void Diagnostics(MessageType mtype, unsigned int extruder) override;

private:
	static constexpr float DefaultMinMovementAllowed = 0.6;
	static constexpr float DefaultMaxMovementAllowed = 1.6;
	static constexpr float DefaultMinimumExtrusionCheckLength = 3.0;

	// This is the received data format:
	//  v1 Data word:			P00S 00pp pppp pppp		S = switch open, pppppppppp = 10-bit filament position (50 counts/mm)
	//  v2 Data word:			P00S 1ppp pppp pppp		S = switch open, ppppppppppp = 11-bit filament position (100 counts/mm)
	//  v1 Error word:			P010 0000 0000 0000
	//  v2 Error word:			P010 0000 0000 eeee		eeee = error code, will not be zero
	//  v1 Quality word:		P10s ssss bbbb bbbb		sssss = shutter, bbbbbbbb = brightness
	//	v2 Version word:		P110 0000 vvvv vvvv		vvvvvvvv = sensor/firmware version, at least 2
	//  v2 Image quality word:	P110 0001 qqqq qqqq		qqqqqqqq = image quality
	//  v2 Brightness word:		P110 0010 bbbb bbbb		bbbbbbbb = brightness
	//  v2 Shutter word:		P110 0011 ssss ssss		ssssssss = shutter

	// Definitions for all messages
	static constexpr uint16_t TypeLaserParityMask = 0x8000;

	// Definitions for identifying the top level type of a message
	static constexpr uint16_t TypeLaserMessageTypeMask = 0x6000;
	static constexpr uint16_t TypeLaserMessageTypePosition = 0x0000;
	static constexpr uint16_t TypeLaserMessageTypeError = 0x2000;
	static constexpr uint16_t TypeLaserMessageTypeQuality = 0x4000;
	static constexpr uint16_t TypeLaserMessageTypeInfo = 0x6000;

	// Definitions for position data messages
	static constexpr uint16_t TypeLaserSwitchOpenBitMask = 0x1000;
	static constexpr uint16_t TypeLaserLargeDataRangeBitMask = 0x0800;
	static constexpr uint16_t TypeLaserDefaultRange = 1024;			// 10-bit sensor position
	static constexpr uint16_t TypeLaserLargeRange = 2048;			// 11-bit sensor position

	// Definitions for info message types
	static constexpr uint16_t TypeLaserInfoTypeMask = 0x1F00;
	static constexpr uint16_t TypeLaserInfoTypeVersion = 0x0000;
	static constexpr uint16_t TypeLaserInfoTypeImageQuality = 0x0100;
	static constexpr uint16_t TypeLaserInfoTypeBrightness = 0x0200;
	static constexpr uint16_t TypeLaserInfoTypeShutter = 0x0300;

	static constexpr size_t EdgeCaptureBufferSize = 64;				// must be a power of 2

	void Init();
	void Reset();
	void HandleIncomingData();
	float GetCurrentPosition() const;
	FilamentSensorStatus CheckFilament(float amountCommanded, float amountMeasured, bool overdue);

	// Configuration parameters
	float minMovementAllowed, maxMovementAllowed;
	float minimumExtrusionCheckLength;
	bool comparisonEnabled;
	bool checkNonPrintingMoves;

	// Other data
	uint32_t framingErrorCount;								// the number of framing errors we received
	uint32_t parityErrorCount;								// the number of words with bad parity we received
	uint32_t overdueCount;									// the number of times a position report was overdue

	uint32_t candidateStartBitTime;							// the time that we received a possible start bit
	float extrusionCommandedAtCandidateStartBit;			// the amount of extrusion commanded since the previous comparison when we received the possible start bit

	uint32_t lastSyncTime;									// the last time we took a measurement that was synced to a start bit
	float extrusionCommandedSinceLastSync;
	float movementMeasuredSinceLastSync;

	uint32_t lastMeasurementTime;							// the last time we received a value
	uint16_t sensorValue;									// last known filament position (10 or 11 bits)
	uint16_t switchOpenMask;								// mask to isolate the switch open bit(s) from the sensor value
	uint8_t version;										// sensor/firmware version
	uint8_t imageQuality;									// image quality returned by version 2 prototype sensor
	uint8_t shutter;										// shutter value returned by sensor
	uint8_t brightness;										// brightness returned by sensor
	uint8_t lastErrorCode;									// the last error code received
	bool sensorError;										// true if received an error report (cleared by a position report)

	bool wasPrintingAtStartBit;
	bool haveStartBitData;
	bool synced;

	float extrusionCommandedThisSegment;					// the amount of extrusion commanded since we last did a comparison
	float movementMeasuredThisSegment;						// the accumulated movement since the previous comparison

	// Values measured for calibration
	float minMovementRatio, maxMovementRatio;
	float totalExtrusionCommanded;
	float totalMovementMeasured;

	bool dataReceived;
	bool backwards;

	enum class LaserMonitorState : uint8_t
	{
		idle,
		calibrating,
		comparing
	};
	LaserMonitorState laserMonitorState;
};

#endif /* SRC_FILAMENTSENSORS_LASERFILAMENTMONITOR_H_ */