Skip to content

Commit 4f9ec94

Browse files
committed
appears to be consistent channel/index calculations throughout
1 parent 3766a96 commit 4f9ec94

4 files changed

Lines changed: 38 additions & 30 deletions

File tree

example.project.json

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,5 @@
1818
"controllerStart": 48,
1919
"noteStart": 49
2020
},
21-
"artnetConfig": {
22-
"Unicast": [
23-
"10.0.0.105",
24-
"10.0.0.99"
25-
]
26-
}
21+
"artnetConfig": "Broadcast"
2722
}

src/artnet.rs

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ impl ArtNetInterface {
108108
match c {
109109
ChannelWithResolution::LoRes(single_channel) => {
110110
let target_channel =
111-
(*single_channel + f.start_channel - 1) as usize;
111+
(*single_channel - 1 + f.start_channel - 1) as usize;
112112
let scaled_value = ((control_macro.current_value as f32
113113
/ u16::MAX as f32)
114114
* 255.0)
@@ -120,15 +120,17 @@ impl ArtNetInterface {
120120
control_macro.current_value,
121121
scaled_value
122122
);
123-
self.channels[target_channel - 1] = scaled_value;
123+
self.channels[target_channel] = scaled_value;
124124
}
125125
ChannelWithResolution::HiRes((c1, c2)) => {
126126
// Assume coarse+fine 16-bit values are "big endian" (be):
127127
let [b1, b2] = control_macro.current_value.to_be_bytes();
128128
// coarse channel:
129-
self.channels[(*c1 + f.start_channel - 2) as usize] = b1;
129+
self.channels[(*c1 - 1 + f.start_channel - 1) as usize] =
130+
b1;
130131
// fine channel:
131-
self.channels[(*c2 + f.start_channel - 2) as usize] = b2;
132+
self.channels[(*c2 - 1 + f.start_channel - 1) as usize] =
133+
b2;
132134
}
133135
}
134136
}
@@ -146,21 +148,24 @@ impl ArtNetInterface {
146148
// Convert all rgb values from "opaque" version (ignoring alpha)
147149
let opaque = colour_macro.current_value.to_opaque();
148150
for c in red.iter() {
149-
self.channels[(*c + f.start_channel) as usize] = opaque.r();
151+
self.channels[(*c - 1 + f.start_channel - 1) as usize] =
152+
opaque.r();
150153
}
151154
for c in green.iter() {
152-
self.channels[(*c + f.start_channel) as usize] = opaque.g();
155+
self.channels[(*c - 1 + f.start_channel - 1) as usize] =
156+
opaque.g();
153157
}
154158
for c in blue.iter() {
155-
self.channels[(*c + f.start_channel) as usize] = opaque.b();
159+
self.channels[(*c - 1 + f.start_channel - 1) as usize] =
160+
opaque.b();
156161
}
157162

158163
// Use inverse of alpha for "white mix" , i.e.
159164
// alpha = 100% => full saturation, no white
160165
// alpha = 0% => RGB the same, but mix in full white
161166
let white_inverse = 255 - colour_macro.current_value.a();
162167
for c in white.iter() {
163-
self.channels[(*c + f.start_channel) as usize] =
168+
self.channels[(*c - 1 + f.start_channel - 1) as usize] =
164169
white_inverse;
165170
}
166171
}
@@ -178,15 +183,18 @@ impl ArtNetInterface {
178183
let opaque = colour_macro.current_value.to_opaque();
179184

180185
for channel in cyan.iter() {
181-
self.channels[(*channel + f.start_channel) as usize] =
186+
self.channels
187+
[(*channel - 1 + f.start_channel - 1) as usize] =
182188
255 - opaque.r();
183189
}
184190
for channel in magenta.iter() {
185-
self.channels[(*channel + f.start_channel) as usize] =
191+
self.channels
192+
[(*channel - 1 + f.start_channel - 1) as usize] =
186193
255 - opaque.g();
187194
}
188195
for channel in yellow.iter() {
189-
self.channels[(*channel + f.start_channel) as usize] =
196+
self.channels
197+
[(*channel - 1 + f.start_channel - 1) as usize] =
190198
255 - opaque.b();
191199
}
192200
}
@@ -217,13 +225,16 @@ impl ArtNetInterface {
217225
// Convert all rgb values from "opaque" version (ignoring alpha)
218226
let opaque = colour_macro.current_value.to_opaque();
219227
for c in red.iter() {
220-
self.channels[(*c + f.start_channel) as usize] = opaque.r();
228+
self.channels[(*c - 1 + f.start_channel - 1) as usize] =
229+
opaque.r();
221230
}
222231
for c in green.iter() {
223-
self.channels[(*c + f.start_channel) as usize] = opaque.g();
232+
self.channels[(*c - 1 + f.start_channel - 1) as usize] =
233+
opaque.g();
224234
}
225235
for c in blue.iter() {
226-
self.channels[(*c + f.start_channel) as usize] = opaque.b();
236+
self.channels[(*c - 1 + f.start_channel - 1) as usize] =
237+
opaque.b();
227238
}
228239
// Ignore lime, since we don't represent it in standard colour macros
229240
}

src/model.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -593,7 +593,7 @@ impl Model {
593593
let current_mode = &fixture.config.active_mode;
594594
for m in &current_mode.mappings {
595595
if let Some(default_value) = m.home {
596-
let channel_index = m.channel + fixture.start_channel - 2;
596+
let channel_index = (m.channel - 1) + (fixture.start_channel - 1);
597597
self.channels_state[channel_index as usize] = default_value;
598598
}
599599
}

src/ui/fixture_controls.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -97,32 +97,34 @@ fn fixture_controls_in_project(model: &mut Model, ui: &mut Ui) {
9797
ui.heading("Mappings");
9898

9999
Grid::new(format!("mappings_{}", i))
100-
.num_columns(3)
100+
.num_columns(4)
101101
.show(ui, |ui| {
102102
for m in &current_mode.mappings {
103-
let channel_index = m.channel + fixture.start_channel - 2;
103+
let channel_zero_index = (m.channel - 1) + (fixture.start_channel - 1);
104+
let channel_one_index = channel_zero_index + 1;
104105
ui.horizontal(|ui| {
105106
ui.label(&m.label);
106-
if let Some(notes) = &m.notes {
107-
ui.label("ℹ")
108-
.on_hover_text(format!("#Channel {}: {}", channel_index, notes));
109-
}
107+
ui.label("ℹ").on_hover_text(format!(
108+
"Fixture CH{} => DMX CH{} (idx [{}])",
109+
m.channel, channel_one_index, channel_zero_index
110+
));
110111
});
111112
if ui
112113
.add(Slider::new(
113-
&mut model.channels_state[(channel_index) as usize],
114+
&mut model.channels_state[(channel_zero_index) as usize],
114115
0..=255,
115116
))
116117
.changed()
117118
{
118119
model.apply_macros = false;
119120
};
121+
ui.label(m.notes.as_deref().unwrap_or(" "));
120122
if let Some(range_sections) = &m.ranges {
121123
ui.label("Mode/Programme:");
122124
let current_range = range_sections.iter().find(|x| {
123125
let [start, end] = x.range;
124-
model.channels_state[(channel_index) as usize] >= start
125-
&& model.channels_state[(channel_index) as usize] <= end
126+
model.channels_state[(channel_zero_index) as usize] >= start
127+
&& model.channels_state[(channel_zero_index) as usize] <= end
126128
});
127129
match current_range {
128130
Some(r) => {

0 commit comments

Comments
 (0)