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  };
83 
84  /*
85  * Device state is used to automate initialisation and fault recovery.
86  *
87  * uninitialised -> initialising -> normal
88  *
89  * First initialisation fails, retried
90  *
91  * uninitialised -> initialising -> fault -> initialising -> normal
92  *
93  * Failed during operation, re-initialised
94  *
95  * normal -> fault -> initialising -> normal
96  */
97  enum class State {
98  stopped,
99  starting,
100  fault,
101  normal,
102  };
103 
109  Device(Controller& controller, const char* id) : controller(controller), id(id)
110  {
111  }
112 
113  virtual ~Device()
114  {
115  }
116 
117  virtual const DeviceType type() const = 0;
118 
119  ErrorCode init(const Config& config);
120  virtual ErrorCode init(JsonObjectConst config) = 0;
121 
126  virtual Request* createRequest() = 0;
127 
131  const CString& getId() const
132  {
133  return id;
134  }
135 
136  bool operator==(const String& id) const
137  {
138  return this->id == id;
139  }
140 
144  const CString& getName() const
145  {
146  return name ?: id;
147  }
148 
152  virtual uint16_t address() const
153  {
154  return 0;
155  }
156 
160  String caption() const;
161 
166  {
167  return controller;
168  }
169 
174  {
175  return state;
176  }
177 
183  virtual DevNode::ID nodeIdMin() const
184  {
185  return 0;
186  }
187 
191  virtual DevNode::ID nodeIdMax() const
192  {
193  return 0;
194  }
195 
200  virtual uint16_t maxNodes() const
201  {
202  return 0;
203  }
204 
211  {
212  return DevNode::States{};
213  }
214 
218  virtual void handleEvent(Request* request, Event event);
219 
220 protected:
221  void parseJson(JsonObjectConst json, Config& cfg);
222 
223  virtual ErrorCode start();
224  virtual ErrorCode stop();
225 
226  void submit(Request* request);
227 
229 
230 private:
231  CString id;
232  CString name;
233  State state{};
234 };
235 
236 } // namespace IO
Controller & controller
Definition: Libraries/IOControl/include/IO/Device.h:228
virtual DevNode::ID nodeIdMin() const
Get minimum valid Node ID for this device.
Definition: Libraries/IOControl/include/IO/Device.h:183
State getState()
Get current device state.
Definition: Libraries/IOControl/include/IO/Device.h:173
Controller & getController() const
Obtain the owning controller.
Definition: Libraries/IOControl/include/IO/Device.h:165
Identifies a device node.
Definition: DevNode.h:30
virtual ErrorCode stop()
Device(Controller &controller, const char *id)
Device constructor.
Definition: Libraries/IOControl/include/IO/Device.h:109
const CString & getName() const
Optional descriptive name for the device.
Definition: Libraries/IOControl/include/IO/Device.h:144
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:210
virtual const FlashString & deviceClass() const =0
Return the Device class name, e.g. &#39;r421a&#39;.
virtual const DeviceType type() const =0
Definition: IOControl/include/IO/Controller.h:25
The String class.
Definition: WString.h:136
bool operator==(const String &className) const
Definition: Libraries/IOControl/include/IO/Device.h:69
virtual DevNode::ID nodeIdMax() const
Get maximum valid Node ID for this device.
Definition: Libraries/IOControl/include/IO/Device.h:191
Handles requests for a specific device; the requests are executed by the relevant controller...
Definition: Libraries/IOControl/include/IO/Device.h:35
virtual ~Device()
Definition: Libraries/IOControl/include/IO/Device.h:113
String name
Definition: Libraries/IOControl/include/IO/Device.h:81
void parseJson(JsonObjectConst json, Config &cfg)
Abstract class which allows device instances to be created.
Definition: Libraries/IOControl/include/IO/Device.h:44
virtual void handleEvent(Request *request, Event event)
Implementations may override this method to customise event handling.
virtual ErrorCode start()
Class to manage a NUL-terminated C-style string When storing persistent strings in RAM the regular St...
Definition: CString.h:26
Json json
State
Definition: Libraries/IOControl/include/IO/Device.h:97
virtual Request * createRequest()=0
Create a request object for this device.
A Controller is responsible for serialising requests for a physical bus.
Definition: IOControl/include/IO/Controller.h:41
Request represents a single user request/response over a bus.
Definition: IOControl/include/IO/Request.h:75
String caption() const
Obtain a descriptive caption for this device.
Base class template for linked items with type casting.
Definition: LinkedObject.h:61
Inherited classes expand this definition as required.
Definition: Libraries/IOControl/include/IO/Device.h:80
Manage a set of bit values using enumeration.
Definition: BitSet.h:44
virtual uint16_t address() const
Devices with a numeric address should implement this method.
Definition: Libraries/IOControl/include/IO/Device.h:152
ErrorCode init(const Config &config)
describes a counted string stored in flash memory
Definition: String.hpp:173
int16_t ErrorCode
Definition: Libraries/IOControl/include/IO/Error.h:27
DeviceType
Definition: DeviceType.h:24
Event
Definition: Event.h:36
virtual uint16_t maxNodes() const
Determine maximum number of nodes supported by the devicce.
Definition: Libraries/IOControl/include/IO/Device.h:200
bool operator==(const String &id) const
Definition: Libraries/IOControl/include/IO/Device.h:136
void submit(Request *request)
const CString & getId() const
The unique device identifier.
Definition: Libraries/IOControl/include/IO/Device.h:131
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. &#39;rs485&#39;.