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() = default;
58 
66  {
67  deviceClasses.addElement(&factory);
68  debug_i("Device class '%s' registered", String(factory.deviceClass()).c_str());
69  }
70 
74  uint8_t getInstance() const
75  {
76  return instance;
77  }
78 
83  {
84  return devices;
85  }
86 
90  void freeDevices();
91 
101  ErrorCode createDevice(const char* id, JsonObjectConst config, Device*& device);
102 
112  template <class DeviceClass>
113  ErrorCode createDevice(const char* id, const typename DeviceClass::Config& config, DeviceClass*& device);
114 
118  Device* findDevice(const String& id);
119 
123  virtual const FlashString& classname() const = 0;
124 
131  virtual void start()
132  {
133  startDevices();
134  }
135 
143  virtual void stop()
144  {
145  stopDevices();
146  }
147 
151  virtual bool canStop() const
152  {
153  return queue.isEmpty();
154  }
155 
159  const CString& getId() const
160  {
161  return id;
162  }
163 
164  bool operator==(const String& id) const
165  {
166  return this->id == id;
167  }
168 
169 protected:
173  virtual void handleEvent(Request* request, Event event);
174 
180  void submit(Request* request);
181 
182  void checkDevices();
183 
185  {
186  lastTransactionEnd.start();
187  }
188 
189 private:
190  ErrorCode constructDevice(const Device::Factory& factory, const char* id, Device*& device);
191 
192  void executeNext();
193 
194  void deviceError(Device& device);
195 
196  void startDevices();
197  void stopDevices();
198 
199  const Device::Factory* findDeviceClass(const String& className);
200 
201  Device::OwnedList devices;
202  Request::OwnedList queue;
203  static DeviceFactoryList deviceClasses;
204  OneShotFastMs lastTransactionEnd;
205  SimpleTimer timer;
206  CString id;
207  uint8_t instance;
208 };
209 
210 template <class DeviceClass>
211 ErrorCode Controller::createDevice(const char* id, const typename DeviceClass::Config& config, DeviceClass*& device)
212 {
214  Device* dev;
215  auto err = constructDevice(factory, id, dev);
216  if(err) {
217  return err;
218  }
219 
220  device = static_cast<DeviceClass*>(device);
221  err = device->init(config);
222  if(err) {
223  delete device;
224  device = nullptr;
225  debug_err(err, String(factory.deviceClass()));
226  return err;
227  }
228 
229  devices.add(device);
230  debug_d("Device %s created, class %s", device->caption().c_str(), String(factory.deviceClass()).c_str());
231 
232  return err;
233 }
234 
235 } // namespace IO
#define debug_err(err, arg)
Definition: Libraries/IOControl/include/IO/Error.h:82
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
void freeDevices()
Destroy all devices for this controller.
Device::OwnedList & getDevices()
Get list of devices for this controller.
Definition: IOControl/include/IO/Controller.h:82
ErrorCode createDevice(const char *id, JsonObjectConst config, Device *&device)
Create a new devicce.
virtual const FlashString & classname() const =0
Get the class name for this Controller.
const CString & getId() const
Get the fully-qualified unique controller identifier.
Definition: IOControl/include/IO/Controller.h:159
Controller(uint8_t instance)
Construct a controller instance.
Definition: IOControl/include/IO/Controller.h:53
virtual void handleEvent(Request *request, Event event)
Implementations override this method to process events as they pass through the stack.
virtual ~Controller()=default
virtual void stop()
Stop all controllers.
Definition: IOControl/include/IO/Controller.h:143
bool operator==(const String &id) const
Definition: IOControl/include/IO/Controller.h:164
uint8_t getInstance() const
Get the controller instance number.
Definition: IOControl/include/IO/Controller.h:74
void resetTransactionTime()
Definition: IOControl/include/IO/Controller.h:184
Device * findDevice(const String &id)
Locate a device from its identifier.
static void registerDeviceClass(const Device::Factory &factory)
Register a device factory.
Definition: IOControl/include/IO/Controller.h:65
void checkDevices()
virtual bool canStop() const
Check if it's OK to stop this controller.
Definition: IOControl/include/IO/Controller.h:151
virtual void start()
Start the controller.
Definition: IOControl/include/IO/Controller.h:131
void submit(Request *request)
Queue a request.
Definition: DeviceManager.h:32
Abstract class which allows device instances to be created.
Definition: Libraries/IOControl/include/IO/Device.h:45
Handles requests for a specific device; the requests are executed by the relevant controller.
Definition: Libraries/IOControl/include/IO/Device.h:36
Request represents a single user request/response over a bus.
Definition: IOControl/include/IO/Request.h:80
bool add(ObjectType *object)
Definition: LinkedObjectList.h:132
bool isEmpty() const
Definition: LinkedObjectList.h:78
Base class template for linked items with type casting.
Definition: LinkedObject.h:60
Template class to implement a polled timer.
Definition: PolledTimer.h:68
void start()
Start the timer.
Definition: PolledTimer.h:103
The String class.
Definition: WString.h:133
const char * c_str() const
Get a constant (un-modifiable) pointer to String content.
Definition: WString.h:609
Vector class template.
Definition: WVector.h:32
bool addElement(const Element &obj)
Definition: WVector.h:357
#define debug_d
Definition: debug_progmem.h:100
#define debug_i
Definition: debug_progmem.h:99
Definition: IOControl/include/IO/Controller.h:26
Direction
Some controllers specify a transfer direction.
Definition: IOControl/include/IO/Controller.h:32
Event
Definition: Event.h:36
int16_t ErrorCode
Definition: Libraries/IOControl/include/IO/Error.h:27
Factory * factory
Provided by ssl adapter, NULL if SSL is disabled.