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 
55  ErrorCode end();
56 
57  void start();
58 
59  ErrorCode stop();
60 
61  bool canStop() const;
62 
63  Device* findDevice(const String& id);
64 
65  ErrorCode createRequest(const String& devid, Request*& request);
66 
67  /*
68  * Generally, requests should fit into the general model so that IO::Request can be used.
69  * If more custom behaviour is required then this method can be used to up-cast to the appropriate
70  * Request object.
71  * NOTE: At present there is no type checking on this, so use care.
72  */
73  template <class RequestClass> ErrorCode createRequest(const String& devid, RequestClass*& request)
74  {
75  Request* req;
76  auto err = createRequest(devid, req);
77  if(!err) {
78  request = static_cast<RequestClass*>(req);
79  } else {
80  debug_w("createRequest('%s'): %s", devid.c_str(), Error::toString(err).c_str());
81  }
82  return err;
83  }
84 
90  {
91  requestCallback = callback;
92  }
93 
98  void invokeCallback(Request& request)
99  {
100  if(requestCallback) {
101  requestCallback(request);
102  }
103  }
104 
105  ErrorCode handleMessage(JsonObject json, Request::Callback callback);
106 
107 private:
108  Controller::List controllers;
109  Request::Callback requestCallback;
110 };
111 
112 extern DeviceManager devmgr;
113 
114 } // namespace IO
Controller * findController(const String &id)
Definition: DeviceManager.h:45
ErrorCode createRequest(const String &devid, Request *&request)
void registerDeviceClass(const Device::Factory &devclass)
Device classes call this to register themselves.
const char * c_str() const
Get a constant (un-modifiable) pointer to String content.
Definition: WString.h:616
String toString(ErrorCode err)
ErrorCode stop()
#define debug_w
Definition: debug_progmem.h:98
Definition: IOControl/include/IO/Controller.h:25
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
bool canStop() const
Iterator end()
Definition: LinkedObjectList.h:119
void invokeCallback(Request &request)
invoke the callback, if one is registered
Definition: DeviceManager.h:98
ErrorCode createRequest(const String &devid, RequestClass *&request)
Definition: DeviceManager.h:73
Json json
void setCallback(Request::Callback callback)
set the callback handler function for all I/O requests
Definition: DeviceManager.h:89
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
Definition: DeviceManager.h:31
DeviceManager devmgr
int16_t ErrorCode
Definition: Libraries/IOControl/include/IO/Error.h:27
Device * findDevice(const String &id)
ErrorCode begin(JsonObjectConst config)
Load device config and create device tree.
void registerController(Controller &controller)
Controllers register themselves so they can be located.
ErrorCode handleMessage(JsonObject json, Request::Callback callback)
Iterator begin()
Definition: LinkedObjectList.h:114
ErrorCode end()