mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-23 10:46:31 +00:00
Berry remove 'Leds.create_matrix' from the standard library waiting for reimplementation (#23114)
This commit is contained in:
parent
06aa356bc3
commit
3f93d2deee
@ -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)
|
||||
|
@ -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
Loading…
x
Reference in New Issue
Block a user