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::DMX512
28 {
29 class Request;
30 
31 struct NodeData {
32  enum class State {
33  disabled,
34  enabling,
35  enabled,
36  disabling,
37  };
38 
39  enum class Option {
40  fade,
41  };
43 
48 
49  bool changed() const
50  {
51  return (state == State::enabling) || (state == State::disabling) || (target != value);
52  }
53 
54  void enable()
55  {
56  if(state != State::enabled) {
58  }
59  }
60 
61  void disable()
62  {
63  if(state != State::disabled) {
65  }
66  }
67 
68  void setTarget(int newTarget)
69  {
70  target = TRange(0, 0xff).clip(newTarget);
71  }
72 
73  uint8_t getValue() const
74  {
75  return (state == State::enabled || state == State::enabling) ? target : 0;
76  }
77 
78  void setValue(uint8_t newValue)
79  {
80  value = newValue;
81  target = value;
82  state = newValue ? State::enabling : State::disabling;
83  }
84 
85  bool adjust()
86  {
87  if(state == State::disabled) {
88  return false;
89  }
90 
91  uint8_t adjustTarget = (state == State::disabling) ? 0 : target;
92 
93  if(value == adjustTarget) {
94  if(state == State::disabling) {
96  } else if(state == State::enabling) {
98  }
99  return false;
100  }
101 
102  if(options[Option::fade]) {
103  int step = (state == State::enabled) ? 1 : 4;
104  int newValue = value + ((value < adjustTarget) ? step : -step);
105  value = TRange(0, 0xff).clip(newValue);
106  } else {
107  value = adjustTarget;
108  }
109 
110  return true;
111  }
112 };
113 
114 class Device : public RS485::Device
115 {
116  friend Request;
117 
118 public:
119  class Factory : public FactoryTemplate<Device>
120  {
121  public:
122  const FlashString& deviceClass() const override
123  {
124  return FS("dmx");
125  }
126  };
127 
128  static const Factory factory;
129 
130  static constexpr size_t MaxPacketSize{520};
131 
135  struct Config {
137 
144  bool fade;
145  };
146 
148 
149  const DeviceType type() const override
150  {
151  return DeviceType::DMX512;
152  }
153 
154  ErrorCode init(const Config& config);
155  ErrorCode init(JsonObjectConst config) override;
156 
157  IO::Request* createRequest() override;
158 
159  uint16_t maxNodes() const override
160  {
161  return nodeCount;
162  }
163 
164  const NodeData& getNodeData(uint8_t nodeId) const
165  {
166  assert(nodeId < nodeCount);
167  return nodeData[nodeId];
168  }
169 
170  bool isValid(DevNode node) const
171  {
172  return node == DevNode_ALL || node.id < nodeCount;
173  }
174 
175  void handleEvent(IO::Request* request, Event event) override;
176 
177 protected:
178  void parseJson(JsonObjectConst json, Config& cfg);
179 
180  ErrorCode start() override
181  {
182  return Error::success;
183  }
184 
189  bool update();
190 
191  void updateSlaves();
192 
193  ErrorCode execute(Request& request);
194 
195 private:
196  uint8_t nodeCount{1};
197  std::unique_ptr<NodeData[]> nodeData;
198  static SimpleTimer timer;
199  static bool dataChanged;
200  static bool updating;
201 };
202 
203 } // namespace IO::DMX512
State state
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:46
ErrorCode execute(Request &request)
static constexpr size_t MaxPacketSize
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:130
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:31
@ success
Definition: Libraries/IOControl/include/IO/Error.h:71
describes a counted string stored in flash memory
Definition: String.hpp:173
static constexpr DevNode DevNode_ALL
Definition: DevNode.h:53
uint8_t target
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:44
void disable()
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:61
ErrorCode init(const Config &config)
uint8_t getValue() const
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:73
void parseJson(JsonObjectConst json, Config &cfg)
bool adjust()
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:85
int16_t ErrorCode
Definition: Libraries/IOControl/include/IO/Error.h:27
Option
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:39
DeviceType
Definition: DeviceType.h:24
State
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:32
const NodeData & getNodeData(uint8_t nodeId) const
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:164
Request represents a single user request/response over a bus.
Definition: IOControl/include/IO/Request.h:79
Base device class for communicating with an RS485 slave.
Definition: Libraries/IOControl/include/IO/RS485/Device.h:33
Manage a range of numbers between specified limits.
Definition: Range.h:21
ErrorCode start() override
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:180
const FlashString & deviceClass() const override
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:122
bool update()
controller calls this before performing an update, typically for effects processing....
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:119
Identifies a device node.
Definition: DevNode.h:30
IO::Request * createRequest() override
Create a request object for this device.
#define FS(str)
Define an inline FSTR::String and return it as a copy.
Definition: String.hpp:56
bool fade
Default node fade enable.
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:144
Event
Definition: Event.h:36
T clip(T value) const
Clip values to within the range.
Definition: Range.h:109
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:114
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:27
Json json
uint8_t nodeCount
Number of nodes controlled by this device.
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:140
RS485 configuration.
Definition: Libraries/IOControl/include/IO/RS485/Device.h:53
uint16_t maxNodes() const override
Determine maximum number of nodes supported by the device.
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:159
DMX512 Device Configuration.
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:135
uint8_t value
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:45
void handleEvent(IO::Request *request, Event event) override
Implementations may override this method to customise event handling.
void setTarget(int newTarget)
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:68
bool changed() const
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:49
Options options
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:47
bool isValid(DevNode node) const
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:170
static const Factory factory
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:128
Definition: IOControl/include/IO/DMX512/Request.h:29
ID id
Definition: DevNode.h:33
Device(Controller &controller, const char *id)
Definition: Libraries/IOControl/include/IO/RS485/Device.h:80
const DeviceType type() const override
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:149
void setValue(uint8_t newValue)
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:78
void enable()
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:54
IO::RS485::Device::Config rs485
RS485 config.
Definition: Libraries/IOControl/include/IO/DMX512/Device.h:136