Skip to content

Commit 25df166

Browse files
authored
relative levels for grid/arc led functions (#1873)
* quick test * add remaining functions * clang-format
1 parent 78060f7 commit 25df166

File tree

5 files changed

+60
-32
lines changed

5 files changed

+60
-32
lines changed

lua/core/arc.lua

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,15 +83,17 @@ function Arc.remove(dev) end
8383
--- set state of single LED on this arc device.
8484
-- @tparam integer ring : ring index (1-based!)
8585
-- @tparam integer x : led index (1-based!)
86-
-- @tparam integer val : LED brightness in [0, 15]
87-
function Arc:led(ring, x, val)
88-
_norns.arc_set_led(self.dev, ring, x, val)
86+
-- @tparam integer val : LED brightness level in [0, 15]
87+
-- @tparam bool rel: relative brightness (add to existing level)
88+
function Arc:led(ring, x, val, rel)
89+
_norns.arc_set_led(self.dev, ring, x, val, rel)
8990
end
9091

9192
--- set state of all LEDs on this arc device.
92-
-- @tparam integer val : LED brightness in [0, 15]
93-
function Arc:all(val)
94-
_norns.arc_all_led(self.dev, val)
93+
-- @tparam integer val : LED brightness level in [0, 15]
94+
-- @tparam bool rel: relative brightness (add to existing level)
95+
function Arc:all(val, rel)
96+
_norns.arc_all_led(self.dev, val, rel)
9597
end
9698

9799
--- update any dirty quads on this arc device.
@@ -106,7 +108,8 @@ end
106108
-- @tparam number from : from angle in radians
107109
-- @tparam number to : to angle in radians
108110
-- @tparam integer level : LED brightness in [0, 15]
109-
function Arc:segment(ring, from, to, level)
111+
-- @tparam bool rel: relative brightness (add to existing level)
112+
function Arc:segment(ring, from, to, level, rel)
110113
local tau = math.pi * 2
111114

112115
local function overlap(a, b, c, d)
@@ -137,7 +140,7 @@ function Arc:segment(ring, from, to, level)
137140

138141
local o = overlap_segments(from, to, sa, sb)
139142
m[i] = util.round(o / sl * level)
140-
self:led(ring, i, m[i])
143+
self:led(ring, i, m[i], rel)
141144
end
142145
end
143146

lua/core/grid.lua

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,15 +105,17 @@ end
105105
--- set state of single LED on this grid device.
106106
-- @tparam integer x : column index (1-based!)
107107
-- @tparam integer y : row index (1-based!)
108-
-- @tparam integer val : LED brightness in [0, 15]
109-
function Grid:led(x, y, val)
110-
_norns.grid_set_led(self.dev, x, y, val)
108+
-- @tparam integer val : LED brightness level in [0, 15]
109+
-- @tparam bool rel: relative brightness (add to existing level)
110+
function Grid:led(x, y, val, rel)
111+
_norns.grid_set_led(self.dev, x, y, val, rel)
111112
end
112113

113114
--- set state of all LEDs on this grid device.
114-
-- @tparam integer val : LED brightness in [0, 15]
115-
function Grid:all(val)
116-
_norns.grid_all_led(self.dev, val)
115+
-- @tparam integer val : LED brightness level in [0, 15]
116+
-- @tparam bool rel: relative brightness (add to existing level)
117+
function Grid:all(val, rel)
118+
_norns.grid_all_led(self.dev, val, rel)
117119
end
118120

119121
--- update any dirty quads on this grid device.

matron/src/device/device_monome.c

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@
1414
#include "device.h"
1515
#include "device_monome.h"
1616

17+
#define clamp_upper(value, max) ((value) < (max) ? (value) : (max))
18+
#define clamp_lower(value, min) ((value) > (min) ? (value) : (min))
19+
#define clamp_range(value, min, max) clamp_lower(min, clamp_upper(value, max))
20+
1721
// quad offset defaults
1822
static const int quad_xoff[] = {0, 8, 0, 8};
1923
static const int quad_yoff[] = {0, 0, 8, 8};
@@ -122,25 +126,41 @@ void dev_monome_tilt_disable(struct dev_monome *md, uint8_t sensor) {
122126
}
123127

124128
// set a given LED value
125-
void dev_monome_grid_set_led(struct dev_monome *md, uint8_t x, uint8_t y, uint8_t val) {
129+
void dev_monome_grid_set_led(struct dev_monome *md, uint8_t x, uint8_t y, int8_t val, bool rel) {
126130
uint8_t q = dev_monome_quad_idx(x, y);
127-
md->data[q][dev_monome_quad_offset(x, y)] = val;
131+
if (rel) {
132+
md->data[q][dev_monome_quad_offset(x, y)] =
133+
clamp_range(md->data[q][dev_monome_quad_offset(x, y)] + val, 0, 15);
134+
} else
135+
md->data[q][dev_monome_quad_offset(x, y)] = val;
128136
md->dirty[q] = true;
129137
}
130138

131139
// set a given LED value
132-
void dev_monome_arc_set_led(struct dev_monome *md, uint8_t n, uint8_t x, uint8_t val) {
133-
md->data[n & 3][x & 63] = val;
140+
void dev_monome_arc_set_led(struct dev_monome *md, uint8_t n, uint8_t x, int8_t val, bool rel) {
141+
if (rel)
142+
md->data[n & 3][x & 63] = clamp_range(md->data[n & 3][x & 63] + val, 0, 15);
143+
else
144+
md->data[n & 3][x & 63] = val;
134145
md->dirty[n & 3] = true;
135146
}
136147

137148
// set all LEDs to value
138-
void dev_monome_all_led(struct dev_monome *md, uint8_t val) {
139-
for (uint8_t q = 0; q < md->quads; q++) {
140-
for (uint8_t i = 0; i < 64; i++) {
141-
md->data[q][i] = val;
149+
void dev_monome_all_led(struct dev_monome *md, int8_t val, bool rel) {
150+
if (rel) {
151+
for (uint8_t q = 0; q < md->quads; q++) {
152+
for (uint8_t i = 0; i < 64; i++) {
153+
md->data[q][i] = clamp_range(md->data[q][i] + val, 0, 15);
154+
}
155+
md->dirty[q] = true;
156+
}
157+
} else {
158+
for (uint8_t q = 0; q < md->quads; q++) {
159+
for (uint8_t i = 0; i < 64; i++) {
160+
md->data[q][i] = val;
161+
}
162+
md->dirty[q] = true;
142163
}
143-
md->dirty[q] = true;
144164
}
145165
}
146166

matron/src/device/device_monome.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ struct dev_monome {
2727
};
2828

2929
// set a single grid led
30-
extern void dev_monome_grid_set_led(struct dev_monome *md, uint8_t x, uint8_t y, uint8_t val);
30+
extern void dev_monome_grid_set_led(struct dev_monome *md, uint8_t x, uint8_t y, int8_t val, bool rel);
3131
// set a single arc led
32-
extern void dev_monome_arc_set_led(struct dev_monome *md, uint8_t n, uint8_t x, uint8_t val);
32+
extern void dev_monome_arc_set_led(struct dev_monome *md, uint8_t n, uint8_t x, int8_t val, bool rel);
3333
// set all led
34-
extern void dev_monome_all_led(struct dev_monome *md, uint8_t val);
34+
extern void dev_monome_all_led(struct dev_monome *md, int8_t val, bool rel);
3535
// set all data for a quad
3636
extern void dev_monome_set_quad(struct dev_monome *md, uint8_t quad, uint8_t *data);
3737
// transmit data for all dirty quads

matron/src/weaver.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1764,25 +1764,27 @@ int _midi_clock_receive(lua_State *l) {
17641764
* @param z level (0-15)
17651765
*/
17661766
int _grid_set_led(lua_State *l) {
1767-
lua_check_num_args(4);
1767+
lua_check_num_args(5);
17681768
luaL_checktype(l, 1, LUA_TLIGHTUSERDATA);
17691769
struct dev_monome *md = lua_touserdata(l, 1);
17701770
int x = (int)luaL_checkinteger(l, 2) - 1; // convert from 1-base
17711771
int y = (int)luaL_checkinteger(l, 3) - 1; // convert from 1-base
17721772
int z = (int)luaL_checkinteger(l, 4); // don't convert value!
1773-
dev_monome_grid_set_led(md, x, y, z);
1773+
bool rel = lua_toboolean(l, 5);
1774+
dev_monome_grid_set_led(md, x, y, z, rel);
17741775
lua_settop(l, 0);
17751776
return 0;
17761777
}
17771778

17781779
int _arc_set_led(lua_State *l) {
1779-
lua_check_num_args(4);
1780+
lua_check_num_args(5);
17801781
luaL_checktype(l, 1, LUA_TLIGHTUSERDATA);
17811782
struct dev_monome *md = lua_touserdata(l, 1);
17821783
int n = (int)luaL_checkinteger(l, 2) - 1; // convert from 1-base
17831784
int x = (int)luaL_checkinteger(l, 3) - 1; // convert from 1-base
17841785
int val = (int)luaL_checkinteger(l, 4); // don't convert value!
1785-
dev_monome_arc_set_led(md, n, x, val);
1786+
bool rel = lua_toboolean(l, 5);
1787+
dev_monome_arc_set_led(md, n, x, val, rel);
17861788
lua_settop(l, 0);
17871789
return 0;
17881790
}
@@ -1794,11 +1796,12 @@ int _arc_set_led(lua_State *l) {
17941796
* @param z level (0-15)
17951797
*/
17961798
int _grid_all_led(lua_State *l) {
1797-
lua_check_num_args(2);
1799+
lua_check_num_args(3);
17981800
luaL_checktype(l, 1, LUA_TLIGHTUSERDATA);
17991801
struct dev_monome *md = lua_touserdata(l, 1);
18001802
int z = (int)luaL_checkinteger(l, 2); // don't convert value!
1801-
dev_monome_all_led(md, z);
1803+
bool rel = lua_toboolean(l, 3);
1804+
dev_monome_all_led(md, z, rel);
18021805
lua_settop(l, 0);
18031806
return 0;
18041807
}

0 commit comments

Comments
 (0)