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() = default;
115 
116  virtual const DeviceType type() const = 0;
117 
118  ErrorCode init(const Config& config);
119  virtual ErrorCode init(JsonObjectConst config) = 0;
120 
125  virtual Request* createRequest() = 0;
126 
130  const CString& getId() const
131  {
132  return id;
133  }
134 
135  bool operator==(const String& id) const
136  {
137  return this->id == id;
138  }
139 
143  const CString& getName() const
144  {
145  return name ?: id;
146  }
147 
151  virtual uint16_t address() const
152  {
153  return 0;
154  }
155 
156  unsigned minTransactionInterval() const
157  {
158  return interval;
159  }
160 
164  String caption() const;
165 
170  {
171  return controller;
172  }
173 
178  {
179  return state;
180  }
181 
187  virtual DevNode::ID nodeIdMin() const
188  {
189  return 0;
190  }
191 
196  {
197  return nodeIdMin() + maxNodes() - 1;
198  }
199 
204  virtual uint16_t maxNodes() const
205  {
206  return 0;
207  }
208 
215  {
216  return DevNode::States{};
217  }
218 
222  virtual void handleEvent(Request* request, Event event);
223 
224 protected:
225  void parseJson(JsonObjectConst json, Config& cfg);
226 
227  virtual ErrorCode start();
228  virtual ErrorCode stop();
229 
230  void submit(Request* request);
231 
233 
234 private:
235  CString id;
236  CString name;
237  unsigned interval;
238  State state{};
239 };
240 
241 } // namespace IO
242 
String toString(IO::Device::State state)
Manage a set of bit values using enumeration.
Definition: BitSet.h:45
Class to manage a NUL-terminated C-style string When storing persistent strings in RAM the regular St...
Definition: CString.h:27
describes a counted string stored in flash memory
Definition: String.hpp:174
A Controller is responsible for serialising requests for a physical bus.
Definition: IOControl/include/IO/Controller.h:42
Abstract class which allows device instances to be created.
Definition: Libraries/IOControl/include/IO/Device.h:45
virtual const FlashString & deviceClass() const =0
Return the Device class name, e.g. 'r421a'.
bool operator==(const String &className) const
Definition: Libraries/IOControl/include/IO/Device.h:69
virtual Device * createDevice(IO::Controller &controller, const char *id) const =0
Create a new device instance.
virtual const FlashString & controllerClass() const =0
Return the expected controller type for this device class, e.g. 'rs485'.
Handles requests for a specific device; the requests are executed by the relevant controller.
Definition: Libraries/IOControl/include/IO/Device.h:36
const CString & getId() const
The unique device identifier.
Definition: Libraries/IOControl/include/IO/Device.h:130
State getState()
Get current device state.
Definition: Libraries/IOControl/include/IO/Device.h:177
const CString & getName() const
Optional descriptive name for the device.
Definition: Libraries/IOControl/include/IO/Device.h:143
unsigned minTransactionInterval() const
Definition: Libraries/IOControl/include/IO/Device.h:156
virtual Request * createRequest()=0
Create a request object for this device.
virtual ErrorCode start()
virtual ErrorCode stop()
virtual void handleEvent(Request *request, Event event)
Implementations may override this method to customise event handling.
virtual DevNode::States getNodeStates(DevNode) const
Return the current set of states for all nodes controlled by this device.
Definition: Libraries/IOControl/include/IO/Device.h:214
Controller & getController() const
Obtain the owning controller.
Definition: Libraries/IOControl/include/IO/Device.h:169
Device(Controller &controller, const char *id)
Device constructor.
Definition: Libraries/IOControl/include/IO/Device.h:110
virtual DevNode::ID nodeIdMin() const
Get minimum valid Node ID for this device.
Definition: Libraries/IOControl/include/IO/Device.h:187
bool operator==(const String &id) const
Definition: Libraries/IOControl/include/IO/Device.h:135
Controller & controller
Definition: Libraries/IOControl/include/IO/Device.h:232
void submit(Request *request)
void parseJson(JsonObjectConst json, Config &cfg)
String caption() const
Obtain a descriptive caption for this device.
virtual const DeviceType type() const =0
virtual ~Device()=default
State
Definition: Libraries/IOControl/include/IO/Device.h:98
@ starting
Initialisation in progress.
@ fault
Initialisation or other request failed.
@ stopped
Awaiting initialisation by controller.
@ normal
Normal operation.
virtual uint16_t maxNodes() const
Determine maximum number of nodes supported by the device.
Definition: Libraries/IOControl/include/IO/Device.h:204
ErrorCode init(const Config &config)
DevNode::ID nodeIdMax() const
Get maximum valid Node ID for this device.
Definition: Libraries/IOControl/include/IO/Device.h:195
virtual ErrorCode init(JsonObjectConst config)=0
virtual uint16_t address() const
Devices with a numeric address should implement this method.
Definition: Libraries/IOControl/include/IO/Device.h:151
Request represents a single user request/response over a bus.
Definition: IOControl/include/IO/Request.h:80
Base class template for linked items with type casting.
Definition: LinkedObject.h:60
The String class.
Definition: WString.h:133
Json json
Definition: IOControl/include/IO/Controller.h:26
Event
Definition: Event.h:36
DeviceType
Definition: DeviceType.h:24
int16_t ErrorCode
Definition: Libraries/IOControl/include/IO/Error.h:27
Identifies a device node.
Definition: DevNode.h:30
uint16_t ID
Definition: DevNode.h:32
Inherited classes expand this definition as required.
Definition: Libraries/IOControl/include/IO/Device.h:80
String name
Definition: Libraries/IOControl/include/IO/Device.h:81
unsigned interval
Minimum interval between transactions.
Definition: Libraries/IOControl/include/IO/Device.h:82