Libraries/IOControl/include/IO/Device.h
Go to the documentation of this file.
1 
20 #pragma once
21 
22 #include "Request.h"
23 #include "DeviceType.h"
24 #include <ArduinoJson.h>
25 #include <Data/LinkedObjectList.h>
26 
27 namespace IO
28 {
29 class Device;
30 class Controller;
31 
35 class Device : public LinkedObjectTemplate<Device>
36 {
37  friend Request;
38  friend Controller;
39 
40 public:
44  class Factory
45  {
46  public:
55  virtual Device* createDevice(IO::Controller& controller, const char* id) const = 0;
56 
62  virtual const FlashString& controllerClass() const = 0;
63 
67  virtual const FlashString& deviceClass() const = 0;
68 
69  bool operator==(const String& className) const
70  {
71  return this->deviceClass() == className;
72  }
73  };
74 
76 
80  struct Config {
82  unsigned interval;
83  };
84 
85  /*
86  * Device state is used to automate initialisation and fault recovery.
87  *
88  * uninitialised -> initialising -> normal
89  *
90  * First initialisation fails, retried
91  *
92  * uninitialised -> initialising -> fault -> initialising -> normal
93  *
94  * Failed during operation, re-initialised
95  *
96  * normal -> fault -> initialising -> normal
97  */
98  enum class State {
99  stopped,
100  starting,
101  fault,
102  normal,
103  };
104 
110  Device(Controller& controller, const char* id) : controller(controller), id(id)
111  {
112  }
113 
114  virtual ~Device()
115  {
116  }
117 
118  virtual const DeviceType type() const = 0;
119 
120  ErrorCode init(const Config& config);
121  virtual ErrorCode init(JsonObjectConst config) = 0;
122 
127  virtual Request* createRequest() = 0;
128 
132  const CString& getId() const
133  {
134  return id;
135  }
136 
137  bool operator==(const String& id) const
138  {
139  return this->id == id;
140  }
141 
145  const CString& getName() const
146  {
147  return name ?: id;
148  }
149 
153  virtual uint16_t address() const
154  {
155  return 0;
156  }
157 
158  unsigned minTransactionInterval() const
159  {
160  return interval;
161  }
162 
166  String caption() const;
167 
172  {
173  return controller;
174  }
175 
180  {
181  return state;
182  }
183 
189  virtual DevNode::ID nodeIdMin() const
190  {
191  return 0;
192  }
193 
198  {
199  return nodeIdMin() + maxNodes() - 1;
200  }
201 
206  virtual uint16_t maxNodes() const
207  {
208  return 0;
209  }
210 
217  {
218  return DevNode::States{};
219  }
220 
224  virtual void handleEvent(Request* request, Event event);
225 
226 protected:
227  void parseJson(JsonObjectConst json, Config& cfg);
228 
229  virtual ErrorCode start();
230  virtual ErrorCode stop();
231 
232  void submit(Request* request);
233 
235 
236 private:
237  CString id;
238  CString name;
239  unsigned interval;
240  State state{};
241 };
242 
243 } // namespace IO
244 
virtual Device * createDevice(IO::Controller &controller, const char *id) const =0
Create a new device instance.
Base class template for linked items with type casting.
Definition: LinkedObject.h:61
Controller & getController() const
Obtain the owning controller.
Definition: Libraries/IOControl/include/IO/Device.h:171
virtual void handleEvent(Request *request, Event event)
Implementations may override this method to customise event handling.
State
Definition: Libraries/IOControl/include/IO/Device.h:98
virtual Request * createRequest()=0
Create a request object for this device.
describes a counted string stored in flash memory
Definition: String.hpp:173
void submit(Request *request)
virtual const FlashString & deviceClass() const =0
Return the Device class name, e.g. 'r421a'.
String name
Definition: Libraries/IOControl/include/IO/Device.h:81
String toString(IO::Device::State state)
bool operator==(const String &id) const
Definition: Libraries/IOControl/include/IO/Device.h:137
virtual const DeviceType type() const =0
The String class.
Definition: WString.h:136
int16_t ErrorCode
Definition: Libraries/IOControl/include/IO/Error.h:27
String caption() const
Obtain a descriptive caption for this device.
DeviceType
Definition: DeviceType.h:24
virtual uint16_t address() const
Devices with a numeric address should implement this method.
Definition: Libraries/IOControl/include/IO/Device.h:153
Request represents a single user request/response over a bus.
Definition: IOControl/include/IO/Request.h:79
virtual ErrorCode start()
bool operator==(const String &className) const
Definition: Libraries/IOControl/include/IO/Device.h:69
Class to manage a NUL-terminated C-style string When storing persistent strings in RAM the regular St...
Definition: CString.h:26
virtual DevNode::States getNodeStates(DevNode node) const
Return the current set of states for all nodes controlled by this device.
Definition: Libraries/IOControl/include/IO/Device.h:216
const CString & getId() const
The unique device identifier.
Definition: Libraries/IOControl/include/IO/Device.h:132
Identifies a device node.
Definition: DevNode.h:30
Definition: IOControl/include/IO/Controller.h:25
virtual ~Device()
Definition: Libraries/IOControl/include/IO/Device.h:114
Inherited classes expand this definition as required.
Definition: Libraries/IOControl/include/IO/Device.h:80
ErrorCode init(const Config &config)
Abstract class which allows device instances to be created.
Definition: Libraries/IOControl/include/IO/Device.h:44
Manage a set of bit values using enumeration.
Definition: BitSet.h:44
DevNode::ID nodeIdMax() const
Get maximum valid Node ID for this device.
Definition: Libraries/IOControl/include/IO/Device.h:197
Event
Definition: Event.h:36
const CString & getName() const
Optional descriptive name for the device.
Definition: Libraries/IOControl/include/IO/Device.h:145
Handles requests for a specific device; the requests are executed by the relevant controller.
Definition: Libraries/IOControl/include/IO/Device.h:35
@ normal
Normal operation.
Json json
@ fault
Initialisation or other request failed.
void parseJson(JsonObjectConst json, Config &cfg)
State getState()
Get current device state.
Definition: Libraries/IOControl/include/IO/Device.h:179
Device(Controller &controller, const char *id)
Device constructor.
Definition: Libraries/IOControl/include/IO/Device.h:110
A Controller is responsible for serialising requests for a physical bus.
Definition: IOControl/include/IO/Controller.h:41
virtual DevNode::ID nodeIdMin() const
Get minimum valid Node ID for this device.
Definition: Libraries/IOControl/include/IO/Device.h:189
virtual uint16_t maxNodes() const
Determine maximum number of nodes supported by the device.
Definition: Libraries/IOControl/include/IO/Device.h:206
Controller & controller
Definition: Libraries/IOControl/include/IO/Device.h:234
unsigned minTransactionInterval() const
Definition: Libraries/IOControl/include/IO/Device.h:158
virtual ErrorCode stop()
unsigned interval
Minimum interval between transactions.
Definition: Libraries/IOControl/include/IO/Device.h:82
virtual const FlashString & controllerClass() const =0
Return the expected controller type for this device class, e.g. 'rs485'.
@ stopped
Awaiting initialisation by controller.
@ starting
Initialisation in progress.