-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathDMXUniverse.h
130 lines (96 loc) · 3.46 KB
/
DMXUniverse.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
==============================================================================
DMXUniverse.h
Created: 10 Dec 2022 6:31:37pm
Author: bkupe
==============================================================================
*/
#pragma once
#define DMX_MAX_NET 128
#define DMX_MAX_SUBNET_PER_NET 16
#define DMX_MAX_UNIVERSES_PER_SUBNET 16
#define DMX_MAX_UNIVERSES DMX_MAX_NET * DMX_MAX_SUBNET_PER_NET * DMX_MAX_UNIVERSES_PER_SUBNET
#define DMX_NUM_CHANNELS 512
enum DMXByteOrder { BIT8, MSB, LSB };
class DMXValueParameter :
public IntParameter
{
public:
DMXValueParameter(const String& name, const String& description, int channel, int value, const DMXByteOrder t) :
IntParameter(name, description, value, 0, t == BIT8 ? 255 : 65535),
type(t),
channel(channel)
{
}
~DMXValueParameter() {}
var getJSONDataInternal() override
{
var data = IntParameter::getJSONDataInternal();
data.getDynamicObject()->setProperty("channel", channel);
data.getDynamicObject()->setProperty("DMXType", type);
return data;
}
void loadJSONDataInternal(var data) override
{
Parameter::loadJSONDataInternal(data);
channel = data.getProperty("channel", false);
setType(static_cast<DMXByteOrder>((int)data.getProperty("DMXType", BIT8)));
}
void setType(DMXByteOrder t)
{
type = t;
if (type != BIT8) isOverriden = true;
setRange(0, t == BIT8 ? 255 : 65535);
notifyStateChanged();
}
void setValueFrom2Channels(int channel1, int channel2)
{
setValue(type == MSB ? ((channel1 << 8) + channel2) : ((channel2 << 8) + channel1));
DBG("Set values from channels " << channel1 << ", " << channel2 << " : " << (int)value);
}
DMXByteOrder type;
int channel;
ControllableUI* createDefaultUI(Array<Controllable*> controllables = {}) override;
static DMXValueParameter* create() { return new DMXValueParameter("DMX Value Parameter", "", 0, 1, BIT8); }
virtual String getTypeString() const override { return getTypeStringStatic(); }
static String getTypeStringStatic() { return "DMX Value"; }
};
class DMXUniverse
{
public:
DMXUniverse(int net, int subnet, int universe);
DMXUniverse(int universeIndex);
DMXUniverse(DMXUniverse* universeToCopy);
virtual ~DMXUniverse() {}
int net;
int subnet;
int universe;
bool isDirty;
SpinLock valuesLock;
Array<uint8> values;
virtual void updateValue(int channel, uint8 value, bool dirtyIfDifferent = false);
virtual void updateValues(Array<uint8> values, bool dirtyIfDifferent = false);
int getUniverseIndex();
static int getUniverseIndex(int net, int subnet, int universe);
bool checkSignature(int net, int subnet, int universe);
String toString() const;
};
class DMXUniverseItem :
public BaseItem,
public DMXUniverse
{
public:
DMXUniverseItem(bool useParams = false, int firstUniverse = 0);
~DMXUniverseItem();
IntParameter* netParam;
IntParameter* subnetParam;
IntParameter* universeParam;
bool useParams;
Array<DMXValueParameter*> valueParams;
virtual void setFirstUniverse(int firstUniverse);
virtual void updateValue(int channel, uint8 value, bool dirtyIfDifferent = false) override;
virtual void updateValues(Array<uint8> values, bool dirtyIfDifferent = false) override;
void onContainerParameterChangedInternal(Parameter*) override;
InspectableEditor* getEditorInternal(bool isRoot, Array<Inspectable*> inspectables = Array<Inspectable*>()) override;
DECLARE_TYPE("DMXUniverse")
};