DeviceManager.h
Go to the documentation of this file.
1 
20 #pragma once
21 
22 #include <WString.h>
23 #include "Controller.h"
24 #include "Request.h"
25 #include <ArduinoJson.h>
26 
27 namespace IO
28 {
29 class Request;
30 
32 {
33 public:
38  void registerController(Controller& controller);
39 
43  void registerDeviceClass(const Device::Factory& devclass);
44 
46  {
47  return std::find(controllers.begin(), controllers.end(), id);
48  }
49 
53  ErrorCode begin(JsonObjectConst config);
54 
56 
57  void start();
58 
60 
61  bool canStop() const;
62 
63  Device* findDevice(const String& id);
64 
65  template <class DeviceClass> bool findDevice(const String& id, DeviceClass*& dev)
66  {
67  dev = static_cast<DeviceClass*>(findDevice(id));
68  if(dev == nullptr) {
69  return false;
70  }
71  // Check found device is compatible with the requested one
72  if(&dev->factory != &DeviceClass::factory) {
73  dev = nullptr;
74  return false;
75  }
76  return true;
77  }
78 
79  ErrorCode createRequest(const String& devid, Request*& request);
80 
81  /*
82  * Generally, requests should fit into the general model so that IO::Request can be used.
83  * If more custom behaviour is required then this method can be used to up-cast to the appropriate
84  * Request object.
85  * NOTE: At present there is no type checking on this, so use care.
86  */
87  template <class RequestClass> ErrorCode createRequest(const String& devid, RequestClass*& request)
88  {
89  Request* req;
90  auto err = createRequest(devid, req);
91  if(!err) {
92  request = static_cast<RequestClass*>(req);
93  } else {
94  debug_w("createRequest('%s'): %s", devid.c_str(), Error::toString(err).c_str());
95  }
96  return err;
97  }
98 
104  {
105  requestCallback = callback;
106  }
107 
112  void invokeCallback(Request& request)
113  {
114  if(requestCallback) {
115  requestCallback(request);
116  }
117  }
118 
120 
121 private:
122  Controller::List controllers;
123  Request::Callback requestCallback;
124 };
125 
126 extern DeviceManager devmgr;
127 
128 } // namespace IO
A Controller is responsible for serialising requests for a physical bus.
Definition: IOControl/include/IO/Controller.h:42
Definition: DeviceManager.h:32
ErrorCode begin(JsonObjectConst config)
Load device config and create device tree.
void registerDeviceClass(const Device::Factory &devclass)
Device classes call this to register themselves.
ErrorCode stop()
Device * findDevice(const String &id)
ErrorCode createRequest(const String &devid, RequestClass *&request)
Definition: DeviceManager.h:87
void registerController(Controller &controller)
Controllers register themselves so they can be located.
bool findDevice(const String &id, DeviceClass *&dev)
Definition: DeviceManager.h:65
bool canStop() const
ErrorCode handleMessage(JsonObject json, Request::Callback callback)
ErrorCode end()
void setCallback(Request::Callback callback)
set the callback handler function for all I/O requests
Definition: DeviceManager.h:103
Controller * findController(const String &id)
Definition: DeviceManager.h:45
void invokeCallback(Request &request)
invoke the callback, if one is registered
Definition: DeviceManager.h:112
ErrorCode createRequest(const String &devid, Request *&request)
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
Iterator begin()
Definition: LinkedObjectList.h:114
Iterator end()
Definition: LinkedObjectList.h:119
The String class.
Definition: WString.h:137
const char * c_str() const
Get a constant (un-modifiable) pointer to String content.
Definition: WString.h:616
#define debug_w
Definition: debug_progmem.h:98
Json json
String toString(ErrorCode err)
Definition: IOControl/include/IO/Controller.h:26
DeviceManager devmgr
int16_t ErrorCode
Definition: Libraries/IOControl/include/IO/Error.h:27
Factory * factory
Provided by ssl adapter, NULL if SSL is disabled.