Berry remove 'Leds.create_matrix' from the standard library waiting for reimplementation (#23114)

This commit is contained in:
s-hadinger 2025-03-06 23:11:16 +01:00 committed by GitHub
parent 06aa356bc3
commit 3f93d2deee
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 533 additions and 1810 deletions

View File

@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file.
- Berry load `.tapp` files in `/.extensions/` then in `/`
### Breaking Changed
- Berry remove `Leds.create_matrix` from the standard library waiting for reimplementation
### Changed
- ESP32 Platform from 2025.02.30 to 2025.03.30, Framework (Arduino Core) from v3.1.1.250203 to v3.1.3.250302 and IDF from v5.3.2.250120 to 5.3.2.250228 (#23088)

View File

@ -158,18 +158,6 @@ class Leds : Leds_ntv
def get_gamma()
return self.gamma
end
# def rotate_left(rot, first, last)
# self.call_native(20, rot, first, last)
# end
# def rotate_right(rot, first, last)
# self.call_native(21, rot, first, last)
# end
# def shift_left(rot, first, last)
# self.call_native(22, rot, first, last)
# end
# def shift_right(rot, first, last)
# self.call_native(22, rot, first, last)
# end
# apply gamma and bri
def to_gamma(rgb, bri)
@ -252,217 +240,6 @@ class Leds : Leds_ntv
end
def create_matrix(w, h, offset)
offset = int(offset)
w = int(w)
h = int(h)
if offset == nil offset = 0 end
if w * h + offset > self.leds || h < 0 || w < 0 || offset < 0
raise "value_error", "out of range"
end
# inner class
class Leds_matrix
var strip
var offset
var h, w
var alternate # are rows in alternate mode (even/odd are reversed)
var pix_buffer
var pix_size
def init(strip, w, h, offset)
self.strip = strip
self.offset = offset
self.h = h
self.w = w
self.alternate = false
self.pix_buffer = self.strip.pixels_buffer()
self.pix_size = self.strip.pixel_size()
end
def clear()
self.clear_to(0x000000)
self.show()
end
def begin()
# do nothing, already being handled by physical strip
end
def show(force)
# don't trigger on segment, you will need to trigger on full strip instead
if bool(force) || (self.offset == 0 && self.w * self.h == self.strip.leds)
self.strip.show()
self.pix_buffer = self.strip.pixels_buffer(self.pix_buffer) # update buffer after show()
end
end
def can_show()
return self.strip.can_show()
end
def is_dirty() ## DEPRECATED
return self.strip.is_dirty()
end
def dirty() ## DEPRECATED
self.strip.dirty()
end
def pixels_buffer()
return self.strip.pixels_buffer()
end
def pixel_size()
return self.pix_size
end
def pixel_count()
return self.w * self.h
end
def pixel_offset()
return self.offset
end
def clear_to(col, bri)
if (bri == nil) bri = self.strip.bri end
self.strip.call_native(9, self.strip.to_gamma(col, bri), self.offset, self.w * self.h)
end
def set_pixel_color(idx, col, bri)
if (bri == nil) bri = self.strip.bri end
self.strip.set_pixel_color(idx + self.offset, col, bri)
end
def get_pixel_color(idx)
return self.strip.get_pixel_color(idx + self.offseta)
end
# setbytes(row, bytes)
# sets the raw bytes for `row`, copying at most 3 or 4 x col bytes
def set_bytes(row, buf, offset, len)
var h_bytes = self.h * self.pix_size
if (len > h_bytes) len = h_bytes end
var offset_in_matrix = (self.offset + row) * h_bytes
self.pix_buffer.setbytes(offset_in_matrix, buf, offset, len)
end
# Leds_matrix specific
def set_alternate(alt)
self.alternate = alt
end
def get_alternate()
return self.alternate
end
def set_matrix_pixel_color(x, y, col, bri)
if (bri == nil) bri = self.strip.bri end
if self.alternate && (y & 0x1)
# reversed line
self.strip.set_pixel_color(x * self.w + self.h - y - 1 + self.offset, col, bri)
else
self.strip.set_pixel_color(x * self.w + y + self.offset, col, bri)
end
end
def scroll(direction, outshift, inshift) # 0 - up, 1 - left, 2 - down, 3 - right ; outshift mandatory, inshift optional
var buf = self.pix_buffer
var h = self.h
var sz = self.w * 3 # row size in bytes
var pos
if direction%2 == 0 #up/down
if direction == 0 #up
outshift.setbytes(0,(buf[0..sz-1]).reverse(0,nil,3))
var line = 0
while line < (h-1)
pos = 0
var offset_dst = line * sz
var offset_src = ((line+2) * sz) - 3
while pos < sz
var dst = pos + offset_dst
var src = offset_src - pos
buf[dst] = buf[src]
buf[dst+1] = buf[src+1]
buf[dst+2] = buf[src+2]
pos += 3
end
line += 1
end
var lastline = inshift ? inshift : outshift
if h%2 == 1
lastline.reverse(0,nil,3)
end
buf.setbytes((h-1) * sz, lastline)
else # down
outshift.setbytes(0,(buf[size(buf)-sz..]).reverse(0,nil,3))
var line = h - 1
while line > 0
buf.setbytes(line * sz,(buf[(line-1) * sz..line * sz-1]).reverse(0,nil,3))
line -= 1
end
var lastline = inshift ? inshift : outshift
if h%2 == 1
lastline.reverse(0,nil,3)
end
buf.setbytes(0, lastline)
end
else # left/right
var line = 0
var step = 3
if direction == 3 # right
step *= -1
end
while line < h
pos = line * sz
if step > 0
var line_end = pos + sz - step
outshift[(line * 3)] = buf[pos]
outshift[(line * 3) + 1] = buf[pos+1]
outshift[(line * 3) + 2] = buf[pos+2]
while pos < line_end
buf[pos] = buf[pos+3]
buf[pos+1] = buf[pos+4]
buf[pos+2] = buf[pos+5]
pos += step
end
if inshift == nil
buf[line_end] = outshift[(line * 3)]
buf[line_end+1] = outshift[(line * 3) + 1]
buf[line_end+2] = outshift[(line * 3) + 2]
else
buf[line_end] = inshift[(line * 3)]
buf[line_end+1] = inshift[(line * 3) + 1]
buf[line_end+2] = inshift[(line * 3) + 2]
end
else
var line_end = pos
pos = pos + sz + step
outshift[(line * 3)] = buf[pos]
outshift[(line * 3) + 1] = buf[pos+1]
outshift[(line * 3) + 2] = buf[pos+2]
while pos > line_end
buf[pos] = buf[pos-3]
buf[pos+1] = buf[pos-2]
buf[pos+2] = buf[pos-1]
pos += step
end
if inshift == nil
buf[line_end] = outshift[(line * 3)]
buf[line_end+1] = outshift[(line * 3) + 1]
buf[line_end+2] = outshift[(line * 3) + 2]
else
buf[line_end] = inshift[(line * 3)]
buf[line_end+1] = inshift[(line * 3) + 1]
buf[line_end+2] = inshift[(line * 3) + 2]
end
end
step *= -1
line += 1
end
end
end
end
return Leds_matrix(self, w, h, offset)
end
static def matrix(w, h, gpio, rmt)
var strip = Leds(w * h, gpio, rmt)
var matrix = strip.create_matrix(w, h, 0)
return matrix
end
end
@ -483,26 +260,3 @@ end
anim()
-#
#-
var s = Leds(25, gpio.pin(gpio.WS2812, 1)).create_matrix(5, 5)
s.set_alternate(true)
s.clear_to(0x400000)
s.show()
x = 0
y = 0
def anim()
s.clear_to(0x400000)
s.set_matrix_pixel_color(x, y, 0x004000)
s.show()
y = (y + 1) % 5
if y == 0
x = (x + 1) % 5
end
tasmota.set_timer(200, anim)
end
anim()
-#

File diff suppressed because it is too large Load Diff