Open Lighting Architecture 0.10.9
Loading...
Searching...
No Matches
ResponderSensor.h
Go to the documentation of this file.
1/*
2 * This library is free software; you can redistribute it and/or
3 * modify it under the terms of the GNU Lesser General Public
4 * License as published by the Free Software Foundation; either
5 * version 2.1 of the License, or (at your option) any later version.
6 *
7 * This library is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10 * Lesser General Public License for more details.
11 *
12 * You should have received a copy of the GNU Lesser General Public
13 * License along with this library; if not, write to the Free Software
14 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15 *
16 * ResponderSensor.h
17 * Manages a sensor for a RDM responder.
18 * Copyright (C) 2013 Peter Newman
19 */
20
29#ifndef INCLUDE_OLA_RDM_RESPONDERSENSOR_H_
30#define INCLUDE_OLA_RDM_RESPONDERSENSOR_H_
31
32#include <ola/rdm/RDMEnums.h>
33#include <stdint.h>
34
35#include <algorithm>
36#include <string>
37#include <vector>
38
39namespace ola {
40namespace rdm {
41
45class Sensor {
46 public:
48 public:
49 bool recorded_value_support;
50 bool recorded_range_support;
51 int16_t range_min;
52 int16_t range_max;
53 int16_t normal_min;
54 int16_t normal_max;
55
56 // SensorOptions constructor to set all options, for use in
57 // initialisation lists. This also sets the defaults if called with no
58 // args
59 SensorOptions(bool _recorded_value_support = true,
60 bool _recorded_range_support = true,
61 int16_t _range_min = SENSOR_DEFINITION_RANGE_MIN_UNDEFINED,
62 int16_t _range_max = SENSOR_DEFINITION_RANGE_MAX_UNDEFINED,
63 int16_t _normal_min =
64 SENSOR_DEFINITION_NORMAL_MIN_UNDEFINED,
65 int16_t _normal_max =
66 SENSOR_DEFINITION_NORMAL_MAX_UNDEFINED)
67 : recorded_value_support(_recorded_value_support),
68 recorded_range_support(_recorded_range_support),
69 range_min(_range_min),
70 range_max(_range_max),
71 normal_min(_normal_min),
72 normal_max(_normal_max) {
73 }
74 };
75
76 Sensor(ola::rdm::rdm_sensor_type type,
77 ola::rdm::rdm_pid_unit unit,
78 ola::rdm::rdm_pid_prefix prefix,
79 const std::string &description,
80 const SensorOptions &options)
81 : m_type(type),
82 m_unit(unit),
83 m_prefix(prefix),
84 m_description(description),
85 m_recorded_value_support(options.recorded_value_support),
86 m_recorded_range_support(options.recorded_range_support),
87 m_range_min(options.range_min),
88 m_range_max(options.range_max),
89 m_normal_min(options.normal_min),
90 m_normal_max(options.normal_max),
91 m_lowest(0),
92 m_highest(0),
93 m_recorded(0) {
94 }
95 virtual ~Sensor() {}
96
97 rdm_sensor_type Type() const { return m_type; }
98 rdm_pid_unit Unit() const { return m_unit; }
99 rdm_pid_prefix Prefix() const { return m_prefix; }
100 int16_t RangeMin() const { return m_range_min; }
101 int16_t RangeMax() const { return m_range_max; }
102 int16_t NormalMin() const { return m_normal_min; }
103 int16_t NormalMax() const { return m_normal_max; }
104 const std::string& Description() const { return m_description; }
105
106 int16_t Lowest() const {
107 if (m_recorded_range_support) {
108 return m_lowest;
109 } else {
110 return SENSOR_RECORDED_RANGE_UNSUPPORTED;
111 }
112 }
113
114 int16_t Highest() const {
115 if (m_recorded_range_support) {
116 return m_highest;
117 } else {
118 return SENSOR_RECORDED_RANGE_UNSUPPORTED;
119 }
120 }
121
122 int16_t Recorded() const {
123 if (m_recorded_value_support) {
124 return m_recorded;
125 } else {
126 return SENSOR_RECORDED_UNSUPPORTED;
127 }
128 }
129
134 int16_t FetchValue() {
135 int16_t value = PollSensor();
136 m_lowest = std::min(value, m_lowest);
137 m_highest = std::max(value, m_highest);
138 return value;
139 }
140
144 void Record() {
145 uint16_t value = FetchValue();
146 m_recorded = value;
147 }
148
152 int16_t Reset() {
153 int16_t value = PollSensor();
154 m_lowest = value;
155 m_highest = value;
156 m_recorded = value;
157 return value;
158 }
159
160 uint8_t RecordedSupportBitMask() const {
161 uint8_t bit_mask = 0;
162 if (m_recorded_value_support) {
163 bit_mask |= SENSOR_RECORDED_VALUE;
164 }
165 if (m_recorded_range_support) {
166 bit_mask |= SENSOR_RECORDED_RANGE_VALUES;
167 }
168 return bit_mask;
169 }
170
171 protected:
176 virtual int16_t PollSensor() = 0;
177
178 const ola::rdm::rdm_sensor_type m_type;
179 const ola::rdm::rdm_pid_unit m_unit;
180 const ola::rdm::rdm_pid_prefix m_prefix;
181 const std::string m_description;
182 const bool m_recorded_value_support;
183 const bool m_recorded_range_support;
184 const int16_t m_range_min;
185 const int16_t m_range_max;
186 const int16_t m_normal_min;
187 const int16_t m_normal_max;
188 int16_t m_lowest;
189 int16_t m_highest;
190 int16_t m_recorded;
191};
192
193typedef std::vector<ola::rdm::Sensor*> Sensors;
194} // namespace rdm
195} // namespace ola
196#endif // INCLUDE_OLA_RDM_RESPONDERSENSOR_H_
Various constants used in RDM.
Holds information about a single sensor.
Definition ResponderSensor.h:45
int16_t FetchValue()
Get the current value, store any new min or max and return it.
Definition ResponderSensor.h:134
virtual int16_t PollSensor()=0
Actually get the value from the Sensor.
int16_t Reset()
Definition ResponderSensor.h:152
void Record()
Definition ResponderSensor.h:144
The namespace containing all OLA symbols.
Definition Credentials.cpp:44
Definition ResponderSensor.h:47