Libraries/IOControl/include/IO/DMX512/Device.h
Go to the documentation of this file.
1 
22 #pragma once
23 
24 #include "../RS485/Device.h"
25 #include <Data/Range.h>
26 
27 namespace IO
28 {
29 namespace DMX512
30 {
31 class Request;
32 
33 struct NodeData {
34  enum class State {
35  disabled,
36  enabling,
37  enabled,
38  disabling,
39  };
40 
44 
45  bool changed() const
46  {
47  return (state == State::enabling) || (state == State::disabling) || (target != value);
48  }
49 
50  void enable()
51  {
52  if(state != State::enabled) {
53  state = State::enabling;
54  }
55  }
56 
57  void disable()
58  {
59  if(state != State::disabled) {
60  state = State::disabling;
61  }
62  }
63 
64  void setTarget(int newTarget)
65  {
66  target = TRange(0, 0xff).clip(newTarget);
67  }
68 
69  void setValue(uint8_t newValue)
70  {
71  value = newValue;
72  target = value;
73  state = newValue ? State::enabling : State::disabling;
74  }
75 
76  bool adjust()
77  {
78  if(state == State::disabled) {
79  return false;
80  }
81 
82  uint8_t adjustTarget = (state == State::disabling) ? 0 : target;
83 
84  if(value == adjustTarget) {
85  if(state == State::disabling) {
86  state = State::disabled;
87  } else if(state == State::enabling) {
88  state = State::enabled;
89  }
90  return false;
91  }
92 
93  int step = (state == State::enabled) ? 1 : 4;
94  int newValue = value + ((value < adjustTarget) ? step : -step);
95  value = TRange(0, 0xff).clip(newValue);
96  return true;
97  }
98 };
99 
100 class Device : public RS485::Device
101 {
102  friend Request;
103 
104 public:
106  {
107  public:
108  IO::Device* createDevice(IO::Controller& controller, const char* id) const override
109  {
110  return new Device(reinterpret_cast<RS485::Controller&>(controller), id);
111  }
112 
113  const FlashString& controllerClass() const override
114  {
115  return RS485::CONTROLLER_CLASSNAME;
116  }
117 
118  const FlashString& deviceClass() const override
119  {
120  DEFINE_FSTR_LOCAL(DEVICE_CLASSNAME, "dmx")
121  return DEVICE_CLASSNAME;
122  }
123  };
124 
125  static const Factory factory;
126 
127  static constexpr size_t MaxPacketSize{520};
128 
132  struct Config {
134 
138  };
139 
141 
142  const DeviceType type() const override
143  {
144  return DeviceType::DMX512;
145  }
146 
147  ErrorCode init(const Config& config);
148  ErrorCode init(JsonObjectConst config) override;
149 
150  IO::Request* createRequest() override;
151 
152  DevNode::ID nodeIdMax() const override
153  {
154  return nodeCount - 1;
155  }
156 
157  uint16_t maxNodes() const override
158  {
159  return nodeCount;
160  }
161 
162  const NodeData& getNodeData(uint8_t nodeId) const
163  {
164  assert(nodeId < nodeCount);
165  return nodeData[nodeId];
166  }
167 
168  bool isValid(DevNode node) const
169  {
170  return node == DevNode_ALL || node.id < nodeCount;
171  }
172 
173  void handleEvent(IO::Request* request, Event event) override;
174 
175 protected:
176  void parseJson(JsonObjectConst json, Config& cfg);
177 
178  ErrorCode start() override
179  {
180  return Error::success;
181  }
182 
187  bool update();
188 
189  void updateSlaves();
190 
191  ErrorCode execute(Request& request);
192 
193 private:
194  uint8_t nodeCount{1};
195  std::unique_ptr<NodeData[]> nodeData;
196  static SimpleTimer timer;
197  static bool dataChanged;
198  static bool updating;
199 };
200 
201 } // namespace DMX512
202 } // namespace IO
void disable()
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:57
Device(Controller &controller, const char *id)
Definition: Libraries/IOControl/include/IO/RS485/Device.h:67
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:105
uint16_t maxNodes() const override
Determine maximum number of nodes supported by the devicce.
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:157
Manage a range of numbers between specified limits.
Definition: Range.h:21
Identifies a device node.
Definition: DevNode.h:30
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:33
static constexpr DevNode DevNode_ALL
Definition: DevNode.h:53
ID id
Definition: DevNode.h:33
static const Factory factory
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:125
Definition: IOControl/include/IO/Controller.h:25
IO::RS485::Device::Config rs485
RS485 config.
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:133
Handles requests for a specific device; the requests are executed by the relevant controller...
Definition: Libraries/IOControl/include/IO/Device.h:35
Base device class for communicating with an RS485 slave.
Definition: Libraries/IOControl/include/IO/RS485/Device.h:34
Abstract class which allows device instances to be created.
Definition: Libraries/IOControl/include/IO/Device.h:44
State
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:34
bool isValid(DevNode node) const
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:168
uint8_t value
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:42
RS485 configuration.
Definition: Libraries/IOControl/include/IO/RS485/Device.h:40
Json json
const FlashString & deviceClass() const override
Return the Device class name, e.g. &#39;r421a&#39;.
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:118
void setValue(uint8_t newValue)
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:69
A Controller is responsible for serialising requests for a physical bus.
Definition: IOControl/include/IO/Controller.h:41
DevNode::ID nodeIdMax() const override
Get maximum valid Node ID for this device.
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:152
Request represents a single user request/response over a bus.
Definition: IOControl/include/IO/Request.h:75
Definition: IOControl/include/IO/DMX512/Request.h:31
const DeviceType type() const override
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:142
#define DEFINE_FSTR_LOCAL(name, str)
Like DEFINE_FSTR except reference is declared static constexpr.
Definition: String.hpp:84
DMX512 Device Configuration.
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:132
describes a counted string stored in flash memory
Definition: String.hpp:173
int16_t ErrorCode
Definition: Libraries/IOControl/include/IO/Error.h:27
uint8_t nodeCount
Number of nodes controlled by this device.
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:137
void enable()
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:50
DeviceType
Definition: DeviceType.h:24
void init(IDataSourceStream *stream)
Application calls this method to set source for graphics resourcess.
bool adjust()
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:76
Definition: Libraries/IOControl/include/IO/Error.h:70
void setTarget(int newTarget)
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:64
Event
Definition: Event.h:36
ErrorCode start() override
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:178
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:100
uint8_t target
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:41
IO::Device * createDevice(IO::Controller &controller, const char *id) const override
Create a new device instance.
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:108
const NodeData & getNodeData(uint8_t nodeId) const
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:162
bool changed() const
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:45
const FlashString & controllerClass() const override
Return the expected controller type for this device class, e.g. &#39;rs485&#39;.
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:113
State state
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:43
T clip(T value) const
Clip values to within the range.
Definition: Range.h:93