IOControl/include/IO/Controller.h
Go to the documentation of this file.
1 
20 #pragma once
21 
22 #include "Device.h"
23 #include <WVector.h>
24 
25 namespace IO
26 {
28 
32 enum class Direction {
33  Incoming,
34  Outgoing,
35  Idle,
36 };
37 
41 class Controller : public LinkedObjectTemplate<Controller>
42 {
43  friend class Device;
44  friend class DeviceManager;
45 
46 public:
48 
53  Controller(uint8_t instance) : instance(instance)
54  {
55  }
56 
57  virtual ~Controller()
58  {
59  }
60 
68  {
69  deviceClasses.addElement(&factory);
70  debug_i("Device class '%s' registered", String(factory.deviceClass()).c_str());
71  }
72 
77  {
78  return instance;
79  }
80 
85  {
86  return devices;
87  }
88 
92  void freeDevices();
93 
103  ErrorCode createDevice(const char* id, JsonObjectConst config, Device*& device);
104 
114  template <class DeviceClass>
115  ErrorCode createDevice(const char* id, const typename DeviceClass::Config& config, DeviceClass*& device);
116 
120  Device* findDevice(const String& id);
121 
125  virtual const FlashString& classname() const = 0;
126 
133  virtual void start()
134  {
135  startDevices();
136  }
137 
145  virtual void stop()
146  {
147  stopDevices();
148  }
149 
153  virtual bool canStop() const
154  {
155  return queue.isEmpty();
156  }
157 
161  const CString& getId() const
162  {
163  return id;
164  }
165 
166  bool operator==(const String& id) const
167  {
168  return this->id == id;
169  }
170 
171 protected:
175  virtual void handleEvent(Request* request, Event event);
176 
182  void submit(Request* request);
183 
184  void startTimer();
185  void stopTimer();
186 
187 private:
188  ErrorCode constructDevice(const Device::Factory& factory, const char* id, Device*& device);
189 
190  void executeNext();
191 
192  void deviceError(Device& device);
193 
194  void startDevices();
195  void stopDevices();
196 
197  const Device::Factory* findDeviceClass(const String& className);
198 
199  Device::OwnedList devices;
200  Request::OwnedList queue;
201  static DeviceFactoryList deviceClasses;
202  std::unique_ptr<SimpleTimer> deviceCheckTimer;
203  CString id;
204  uint8_t instance;
205 };
206 
207 template <class DeviceClass>
208 ErrorCode Controller::createDevice(const char* id, const typename DeviceClass::Config& config, DeviceClass*& device)
209 {
211  Device* dev;
212  auto err = constructDevice(factory, id, dev);
213  if(err) {
214  return err;
215  }
216 
217  device = static_cast<DeviceClass*>(device);
218  err = device->init(config);
219  if(err) {
220  delete device;
221  device = nullptr;
222  debug_err(err, String(factory.deviceClass()));
223  return err;
224  }
225 
226  devices.add(device);
227  debug_d("Device %s created, class %s", device->caption().c_str(), String(factory.deviceClass()).c_str());
228 
229  return err;
230 }
231 
232 } // namespace IO
Controller(uint8_t instance)
Construct a controller instance.
Definition: IOControl/include/IO/Controller.h:53
static void registerDeviceClass(const Device::Factory &factory)
Register a device factory.
Definition: IOControl/include/IO/Controller.h:67
Device::OwnedList & getDevices()
Get list of devices for this controller.
Definition: IOControl/include/IO/Controller.h:84
Vector class template.
Definition: WVector.h:31
virtual const FlashString & deviceClass() const =0
Return the Device class name, e.g. &#39;r421a&#39;.
Definition: IOControl/include/IO/Controller.h:25
ErrorCode createDevice(const char *id, JsonObjectConst config, Device *&device)
Create a new devicce.
The String class.
Definition: WString.h:136
Handles requests for a specific device; the requests are executed by the relevant controller...
Definition: Libraries/IOControl/include/IO/Device.h:35
Abstract class which allows device instances to be created.
Definition: Libraries/IOControl/include/IO/Device.h:44
Device * findDevice(const String &name)
Find a registered device.
bool operator==(const String &id) const
Definition: IOControl/include/IO/Controller.h:166
virtual bool canStop() const
Check if it&#39;s OK to stop this controller.
Definition: IOControl/include/IO/Controller.h:153
#define debug_d
Definition: debug_progmem.h:100
Class to manage a NUL-terminated C-style string When storing persistent strings in RAM the regular St...
Definition: CString.h:26
uint8_t getInstance() const
Get the controller instance number.
Definition: IOControl/include/IO/Controller.h:76
virtual void stop()
Stop all controllers.
Definition: IOControl/include/IO/Controller.h:145
virtual void start()
Start the controller.
Definition: IOControl/include/IO/Controller.h:133
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
#define debug_i
Definition: debug_progmem.h:99
Base class template for linked items with type casting.
Definition: LinkedObject.h:61
Definition: DeviceManager.h:31
describes a counted string stored in flash memory
Definition: String.hpp:173
int16_t ErrorCode
Definition: Libraries/IOControl/include/IO/Error.h:27
Direction
Some controllers specify a transfer direction.
Definition: IOControl/include/IO/Controller.h:32
Event
Definition: Event.h:36
#define debug_err(err, arg)
Definition: Libraries/IOControl/include/IO/Error.h:81
virtual ~Controller()
Definition: IOControl/include/IO/Controller.h:57
Factory * factory
Provided by ssl adapter, NULL if SSL is disabled.
const CString & getId() const
Get the fully-qualified unique controller identifier.
Definition: IOControl/include/IO/Controller.h:161