|
23 | 23 | #include "internal.h" |
24 | 24 | #include "platform.h" |
25 | 25 | #include "rotation.h" |
| 26 | +#include "monobright.h" |
26 | 27 |
|
27 | 28 | #include "40h.h" |
28 | 29 |
|
@@ -143,6 +144,71 @@ static monome_led_functions_t proto_40h_led_functions = { |
143 | 144 | .intensity = proto_40h_intensity |
144 | 145 | }; |
145 | 146 |
|
| 147 | +/** |
| 148 | + * led level functions |
| 149 | + */ |
| 150 | +static int proto_40h_led_level_set(monome_t *monome, uint_t x, uint_t y, |
| 151 | + uint_t level) { |
| 152 | + return proto_40h_led_set(monome, x, y, reduce_level_to_bit(level)); |
| 153 | +} |
| 154 | + |
| 155 | +static int proto_40h_led_level_all(monome_t *monome, uint_t level) { |
| 156 | + return proto_40h_led_all(monome, reduce_level_to_bit(level)); |
| 157 | +} |
| 158 | + |
| 159 | +static int proto_40h_led_level_map(monome_t *monome, uint_t x_off, |
| 160 | + uint_t y_off, const uint8_t *data) { |
| 161 | + uint8_t levels[64]; |
| 162 | + uint8_t masks[8]; |
| 163 | + uint_t i; |
| 164 | + |
| 165 | + /* don't rotate coords here like you would in mext, since rotate happens |
| 166 | + * in the call to the normal led_map function |
| 167 | + */ |
| 168 | + ROTSPEC(monome).level_map_cb(monome, levels, data); |
| 169 | + |
| 170 | + /* reduce the level data into a bitmask */ |
| 171 | + for (i = 0; i < 8; ++i) { |
| 172 | + masks[i] = reduce_levels_to_bitmask(&levels[i * 8]); |
| 173 | + }; |
| 174 | + return proto_40h_led_map(monome, x_off, y_off, masks); |
| 175 | +} |
| 176 | + |
| 177 | + |
| 178 | +static int proto_40h_led_level_row(monome_t *monome, uint_t x_off, |
| 179 | + uint_t row, size_t count, const uint8_t *data) { |
| 180 | + uint_t i, chunks; |
| 181 | + uint8_t masks[2]; |
| 182 | + |
| 183 | + chunks = count / 8; |
| 184 | + for (i = 0; i < chunks; ++i) { |
| 185 | + masks[i] = reduce_levels_to_bitmask(&data[i*8]); |
| 186 | + } |
| 187 | + |
| 188 | + return proto_40h_led_row(monome, x_off, row, chunks, masks); |
| 189 | +} |
| 190 | + |
| 191 | +static int proto_40h_led_level_col(monome_t *monome, uint_t col, |
| 192 | + uint_t y_off, size_t count, const uint8_t *data) { |
| 193 | + uint_t i, chunks; |
| 194 | + uint8_t masks[2]; |
| 195 | + |
| 196 | + chunks = count / 8; |
| 197 | + for (i = 0; i < chunks; ++i) { |
| 198 | + masks[i] = reduce_levels_to_bitmask(&data[i*8]); |
| 199 | + } |
| 200 | + |
| 201 | + return proto_40h_led_col(monome, col, y_off, chunks, masks); |
| 202 | +} |
| 203 | + |
| 204 | +static monome_led_level_functions_t proto_40h_led_level_functions = { |
| 205 | + .set = proto_40h_led_level_set, |
| 206 | + .all = proto_40h_led_level_all, |
| 207 | + .map = proto_40h_led_level_map, |
| 208 | + .row = proto_40h_led_level_row, |
| 209 | + .col = proto_40h_led_level_col |
| 210 | +}; |
| 211 | + |
146 | 212 | /** |
147 | 213 | * tilt functions |
148 | 214 | * |
@@ -248,7 +314,7 @@ monome_t *monome_protocol_new(void) { |
248 | 314 | monome->next_event = proto_40h_next_event; |
249 | 315 |
|
250 | 316 | monome->led = &proto_40h_led_functions; |
251 | | - monome->led_level = NULL; |
| 317 | + monome->led_level = &proto_40h_led_level_functions; |
252 | 318 | monome->led_ring = NULL; |
253 | 319 | monome->tilt = &proto_40h_tilt_functions; |
254 | 320 |
|
|
0 commit comments