LOM2M  0.8.0
IPE.h
Go to the documentation of this file.
1 /*
2  Copyright (c) 2013-2021 LAAS-CNRS (www.laas.fr)
3  7 Colonel Roche 31077 Toulouse - France
4 
5  The use of this source code requires an agreement with the CNRS.
6 
7  Initial Contributors:
8  David Gauchard, Guillaume Garzone, Thierry Monteil.
9 */
10 
11 #ifndef __LOM2M_IPE_H
12 #define __LOM2M_IPE_H
13 
14 
15 #include "configuration.h"
16 #include "Entity.h"
17 #include "Enum.h"
18 #include "Observer.h"
19 
20 extern String DATA_UP;
21 extern String DATA_DOWN;
22 extern String MSG_CNT;
23 
24 class IPEUtil
25 {
26 public:
27  static Application* createAELocal(const String& name);
28  static Container* createCntLocal(Entity* parent, const String& name, int mni = 5);
29  static ContentInstance* createCinLocal(Container* parent, const String& name, const String& contentFormat, const String& content);
30 };
31 
32 struct Sensor
33 {
34 protected:
35  String id;
39 
40 public:
41  Sensor(const String& name);
42  Sensor(Entity* parent, const String& name);
43  virtual ~Sensor();
44 
45  String valueToContent(const String& value);
46  void updateValue(const String& newValue);
47 };
48 
49 class Actuator : public Sensor, public Observer
50 {
51 protected:
54  bool m_on;
55 
56 public:
57  Actuator(Entity* parent, const String& name, bool initialOn = false) : Sensor(parent, name), m_on(initialOn)
58  {
59  Container* op = IPEUtil::createCntLocal(this->sensorCnt, "operations");
60  op->m_acps = parent->m_acps;
61  this->powerOn = IPEUtil::createCntLocal(op, "powerON");
62  this->powerOn->register_observer(*this);
63  this->powerOn->m_acps = parent->m_acps;
64  this->powerOn->m_maxNumberOfInstances = 1;
65  this->powerOff = IPEUtil::createCntLocal(op, "powerOFF");
66  this->powerOff->register_observer(*this);
67  this->powerOff->m_maxNumberOfInstances = 1;
68  this->powerOff->m_acps = parent->m_acps;
69  };
70  virtual ~Actuator() { };
71  virtual bool powerSet(bool on)
72  {
73  m_on = on;
74  return false;
75  }
76  void powerToggle()
77  {
78  if (m_on && powerSet(false))
79  m_on = false;
80  else if (!m_on && powerSet(true))
81  m_on = true;
82  }
83  bool powerState()
84  {
85  return m_on;
86  }
87  virtual void notify(const String& id) override
88  {
89 #if DEBUG
90  printf("DEBUG: received notification: %s\n", id.c_str());
91 #endif
92  if (id.equalsIgnoreCase(this->powerOn->m_name))
93  {
94  this->powerSet(true);
95  }
96  else if (id.equalsIgnoreCase(this->powerOff->m_name))
97  {
98  this->powerSet(false);
99  }
100  }
101 };
102 
104 {
105  // use "on" member as state
106 
107 protected:
108  int m_gpio;
109 
110  virtual bool powerSet(bool on) override
111  {
112  digitalWrite(m_gpio, !on);
113  m_on = on;
114  String boolVal = String(on);
115  this->updateValue(valueToContent(boolVal));
116  return true;
117  }
118 
119 public:
120 
121  BinaryActuator(Entity* parent, int gpio, const String& name, bool initialOn = false): Actuator(parent, name), m_gpio(gpio)
122  {
123  pinMode(gpio, OUTPUT);
124  BinaryActuator::powerSet(initialOn);
125  }
126  virtual ~BinaryActuator()
127  {
128  pinMode(m_gpio, INPUT);
129  }
130 
131  void on()
132  {
133  powerSet(true);
134  }
135  void off()
136  {
137  powerSet(false);
138  }
139  void set(bool on)
140  {
141  powerSet(on);
142  }
143  void toggle()
144  {
145  powerSet(!m_on);
146  }
147  bool get()
148  {
149  return powerState();
150  }
151 };
152 
154 // (like Java interface, possible with C++ at least as a doc ref for
155 // templates or as a less efficient abstract class)
156 
158 {
159  // use "on" member as state
160 
161 protected:
162  int m_gpio;
163 
164 public:
165 
166  // mode can be INPUT, INPUT_PULLUP, INPUT_PULLDOWN with constraints on gpio (Arduino API)
167  BinaryDigitalSensor(Entity* parent, int gpio, const String& name, int mode = INPUT): Sensor(parent, name), m_gpio(gpio)
168  {
169  pinMode(gpio, mode);
170  }
171 
173  {
174  // leave gpio floating
175  pinMode(m_gpio, INPUT);
176  }
177 
178  int getGPIO() const
179  {
180  return m_gpio;
181  }
182 
183  float get()
184  {
185  return digitalRead(m_gpio);
186  }
187  String toString()
188  {
189  return String(get());
190  }
191  void publish(const String& val)
192  {
194  }
195  void publish()
196  {
197  publish(toString());
198  }
199 };
200 
201 class IPE
202 {
203 protected:
204  String IPEId;
206  std::list<Sensor*> devices;
207 
208 public:
209  IPE(const String& name);
210  ~IPE();
211 
213  {
214  return this->ipeAE;
215  }
216 
217  Sensor* addSensor(String& name)
218  {
219  Sensor* result = new Sensor(this->ipeAE, name);
220  devices.push_back(result);
221  return result;
222  }
223 
224  void addSensor(Sensor* sensor)
225  {
226  devices.push_back(sensor);
227  }
228 
229  void addActuator(Actuator* actuator)
230  {
231  devices.push_back(static_cast<Sensor*>(actuator));
232  }
233 
234  Actuator* addActuator(String& name)
235  {
236  Actuator* result = new Actuator(this->ipeAE, name);
237  devices.push_back(result);
238  return result;
239  }
240 };
241 
242 #endif
String DATA_UP
Definition: IPE.cpp:13
String DATA_DOWN
Definition: IPE.cpp:14
String MSG_CNT
Definition: IPE.cpp:15
Definition: IPE.h:50
Container * powerOff
Definition: IPE.h:53
Container * powerOn
Definition: IPE.h:52
void powerToggle()
Definition: IPE.h:76
virtual void notify(const String &id) override
Definition: IPE.h:87
virtual bool powerSet(bool on)
Definition: IPE.h:71
bool m_on
Definition: IPE.h:54
virtual ~Actuator()
Definition: IPE.h:70
bool powerState()
Definition: IPE.h:83
Actuator(Entity *parent, const String &name, bool initialOn=false)
Definition: IPE.h:57
Definition: IPE.h:104
void off()
Definition: IPE.h:135
void toggle()
Definition: IPE.h:143
bool get()
Definition: IPE.h:147
virtual ~BinaryActuator()
Definition: IPE.h:126
void set(bool on)
Definition: IPE.h:139
void on()
Definition: IPE.h:131
BinaryActuator(Entity *parent, int gpio, const String &name, bool initialOn=false)
Definition: IPE.h:121
int m_gpio
Definition: IPE.h:108
virtual bool powerSet(bool on) override
Definition: IPE.h:110
XXX FIXME an interface for sensor / actuator is needed.
Definition: IPE.h:158
BinaryDigitalSensor(Entity *parent, int gpio, const String &name, int mode=INPUT)
Definition: IPE.h:167
virtual ~BinaryDigitalSensor()
Definition: IPE.h:172
String toString()
Definition: IPE.h:187
float get()
Definition: IPE.h:183
void publish()
Definition: IPE.h:195
int m_gpio
Definition: IPE.h:162
void publish(const String &val)
Definition: IPE.h:191
int getGPIO() const
Definition: IPE.h:178
Definition: IPE.h:202
String IPEId
Definition: IPE.h:204
Application * getIpeAe()
Definition: IPE.h:212
Sensor * addSensor(String &name)
Definition: IPE.h:217
IPE(const String &name)
Definition: IPE.cpp:105
~IPE()
Definition: IPE.cpp:115
void addActuator(Actuator *actuator)
Definition: IPE.h:229
Actuator * addActuator(String &name)
Definition: IPE.h:234
Application * ipeAE
Definition: IPE.h:205
void addSensor(Sensor *sensor)
Definition: IPE.h:224
std::list< Sensor * > devices
Definition: IPE.h:206
Definition: IPE.h:25
static Container * createCntLocal(Entity *parent, const String &name, int mni=5)
Definition: IPE.cpp:38
static ContentInstance * createCinLocal(Container *parent, const String &name, const String &contentFormat, const String &content)
Definition: IPE.cpp:56
static Application * createAELocal(const String &name)
Definition: IPE.cpp:17
Definition: Observer.h:21
Definition: Entity.h:755
Definition: Entity.h:576
int m_maxNumberOfInstances
Definition: Entity.h:578
Definition: Entity.h:698
Definition: Entity.h:235
String m_name
Definition: Entity.h:270
void register_observer(Observer &o)
Definition: Entity.h:243
std::list< AccessControlPolicy * > m_acps
Definition: Entity.h:277
Definition: IPE.h:33
String valueToContent(const String &value)
Definition: IPE.cpp:86
Container * sensorCnt
Definition: IPE.h:36
String id
Definition: IPE.h:35
Container * dataUpCnt
Definition: IPE.h:37
Container * messagesCnt
Definition: IPE.h:38
Sensor(const String &name)
Definition: IPE.cpp:65
virtual ~Sensor()
Definition: IPE.cpp:82
void updateValue(const String &newValue)
Definition: IPE.cpp:96