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
|
/*
* LinearAnalogSensor.cpp
*
* Created on: 16 Apr 2019
* Author: David
*/
#include "LinearAnalogSensor.h"
#include "GCodes/GCodeBuffer/GCodeBuffer.h"
#include "Pins.h"
#include "RepRap.h"
#include "Platform.h"
LinearAnalogSensor::LinearAnalogSensor(unsigned int sensorNum) noexcept
: SensorWithPort(sensorNum, "Linear analog"), lowTemp(DefaultLowTemp), highTemp(DefaultHighTemp), filtered(true), adcFilterChannel(-1)
{
CalcDerivedParameters();
}
GCodeResult LinearAnalogSensor::Configure(GCodeBuffer& gb, const StringRef& reply)
{
bool seen = false;
if (!ConfigurePort(gb, reply, PinAccess::readAnalog, seen))
{
return GCodeResult::error;
}
gb.TryGetFValue('B', lowTemp, seen);
gb.TryGetFValue('C', highTemp, seen);
TryConfigureSensorName(gb, seen);
if (gb.Seen('F'))
{
seen = true;
filtered = gb.GetIValue() >= 1;
}
if (seen)
{
CalcDerivedParameters();
if (adcFilterChannel >= 0)
{
reprap.GetPlatform().GetAdcFilter(adcFilterChannel).Init(0);
}
}
else
{
CopyBasicDetails(reply);
reply.catf(", %sfiltered, range %.1f to %.1f", (filtered) ? "" : "un", (double)lowTemp, (double)highTemp);
}
return GCodeResult::ok;
}
void LinearAnalogSensor::Poll() noexcept
{
if (filtered && adcFilterChannel >= 0)
{
const volatile ThermistorAveragingFilter& tempFilter = reprap.GetPlatform().GetAdcFilter(adcFilterChannel);
if (tempFilter.IsValid())
{
const int32_t averagedTempReading = tempFilter.GetSum()/(ThermistorAverageReadings >> AdcOversampleBits);
SetResult((averagedTempReading * linearIncreasePerCount) + lowTemp, TemperatureError::success);
}
else
{
SetResult(TemperatureError::notReady);
}
}
else
{
SetResult((port.ReadAnalog() * linearIncreasePerCount) + lowTemp, TemperatureError::success);
}
}
void LinearAnalogSensor::CalcDerivedParameters() noexcept
{
adcFilterChannel = reprap.GetPlatform().GetAveragingFilterIndex(port);
linearIncreasePerCount = (highTemp - lowTemp)/((filtered) ? FilteredAdcRange : UnfilteredAdcRange);
}
// End
|