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 checkDevices();
185 
187  {
188  lastTransactionEnd.start();
189  }
190 
191 private:
192  ErrorCode constructDevice(const Device::Factory& factory, const char* id, Device*& device);
193 
194  void executeNext();
195 
196  void deviceError(Device& device);
197 
198  void startDevices();
199  void stopDevices();
200 
201  const Device::Factory* findDeviceClass(const String& className);
202 
203  Device::OwnedList devices;
204  Request::OwnedList queue;
205  static DeviceFactoryList deviceClasses;
206  OneShotFastMs lastTransactionEnd;
207  SimpleTimer timer;
208  CString id;
209  uint8_t instance;
210 };
211 
212 template <class DeviceClass>
213 ErrorCode Controller::createDevice(const char* id, const typename DeviceClass::Config& config, DeviceClass*& device)
214 {
216  Device* dev;
217  auto err = constructDevice(factory, id, dev);
218  if(err) {
219  return err;
220  }
221 
222  device = static_cast<DeviceClass*>(device);
223  err = device->init(config);
224  if(err) {
225  delete device;
226  device = nullptr;
227  debug_err(err, String(factory.deviceClass()));
228  return err;
229  }
230 
231  devices.add(device);
232  debug_d("Device %s created, class %s", device->caption().c_str(), String(factory.deviceClass()).c_str());
233 
234  return err;
235 }
236 
237 } // namespace IO
static void registerDeviceClass(const Device::Factory &factory)
Register a device factory.
Definition: IOControl/include/IO/Controller.h:67
bool addElement(const Element &obj)
Definition: WVector.h:349
Definition: DeviceManager.h:31
Base class template for linked items with type casting.
Definition: LinkedObject.h:61
void submit(Request *request)
Queue a request.
const CString & getId() const
Get the fully-qualified unique controller identifier.
Definition: IOControl/include/IO/Controller.h:161
#define debug_d
Definition: debug_progmem.h:108
describes a counted string stored in flash memory
Definition: String.hpp:173
Template class to implement a polled timer.
Definition: PolledTimer.h:67
The String class.
Definition: WString.h:136
int16_t ErrorCode
Definition: Libraries/IOControl/include/IO/Error.h:27
Device::OwnedList & getDevices()
Get list of devices for this controller.
Definition: IOControl/include/IO/Controller.h:84
bool add(ObjectType *object)
Definition: LinkedObjectList.h:134
Request represents a single user request/response over a bus.
Definition: IOControl/include/IO/Request.h:79
bool operator==(const String &id) const
Definition: IOControl/include/IO/Controller.h:166
void resetTransactionTime()
Definition: IOControl/include/IO/Controller.h:186
Class to manage a NUL-terminated C-style string When storing persistent strings in RAM the regular St...
Definition: CString.h:26
virtual bool canStop() const
Check if it's OK to stop this controller.
Definition: IOControl/include/IO/Controller.h:153
uint8_t getInstance() const
Get the controller instance number.
Definition: IOControl/include/IO/Controller.h:76
Definition: IOControl/include/IO/Controller.h:25
ErrorCode createDevice(const char *id, JsonObjectConst config, Device *&device)
Create a new devicce.
Device * findDevice(const String &id)
Locate a device from its identifier.
Abstract class which allows device instances to be created.
Definition: Libraries/IOControl/include/IO/Device.h:44
virtual const FlashString & classname() const =0
Get the class name for this Controller.
Event
Definition: Event.h:36
virtual void stop()
Stop all controllers.
Definition: IOControl/include/IO/Controller.h:145
const char * c_str() const
Get a constant (un-modifiable) pointer to String content.
Definition: WString.h:616
virtual void handleEvent(Request *request, Event event)
Implementations override this method to process events as they pass through the stack.
Handles requests for a specific device; the requests are executed by the relevant controller.
Definition: Libraries/IOControl/include/IO/Device.h:35
bool isEmpty() const
Definition: LinkedObjectList.h:88
void checkDevices()
Factory * factory
Provided by ssl adapter, NULL if SSL is disabled.
#define debug_err(err, arg)
Definition: Libraries/IOControl/include/IO/Error.h:82
void freeDevices()
Destroy all devices for this controller.
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
void start()
Start the timer.
Definition: PolledTimer.h:103
Vector class template.
Definition: WVector.h:31
#define debug_i
Definition: debug_progmem.h:107
virtual ~Controller()
Definition: IOControl/include/IO/Controller.h:57
Controller(uint8_t instance)
Construct a controller instance.
Definition: IOControl/include/IO/Controller.h:53
Direction
Some controllers specify a transfer direction.
Definition: IOControl/include/IO/Controller.h:32