126 lines
3.5 KiB
Lua
126 lines
3.5 KiB
Lua
-- luacheck: new globals z T r disp lcg_rnd millis
|
|
z = 127 -- start value
|
|
T = 1000
|
|
r = 0
|
|
disp = nil
|
|
|
|
local loop_idx = 0
|
|
|
|
function lcg_rnd()
|
|
z = bit.band(65 * z + 17, 255)
|
|
return z
|
|
end
|
|
|
|
function millis()
|
|
local usec = tmr.now()
|
|
return usec/1000
|
|
end
|
|
|
|
-- setup SPI and connect display
|
|
local function init_spi_display()
|
|
-- Hardware SPI CLK = GPIO14
|
|
-- Hardware SPI MOSI = GPIO13
|
|
-- Hardware SPI MISO = GPIO12 (not used)
|
|
-- Hardware SPI /CS = GPIO15 (not used)
|
|
-- CS, D/C, and RES can be assigned freely to available GPIOs
|
|
local cs = 8 -- GPIO15, pull-down 10k to GND
|
|
local dc = 4 -- GPIO2
|
|
local res = 0 -- GPIO16
|
|
local bus = 1
|
|
|
|
spi.setup(bus, spi.MASTER, spi.CPOL_LOW, spi.CPHA_LOW, 8, 8)
|
|
-- we won't be using the HSPI /CS line, so disable it again
|
|
gpio.mode(8, gpio.INPUT, gpio.PULLUP)
|
|
|
|
-- initialize the matching driver for your display
|
|
-- see app/include/ucg_config.h
|
|
--disp = ucg.ili9341_18x240x320_hw_spi(bus, cs, dc, res)
|
|
disp = ucg.st7735_18x128x160_hw_spi(bus, cs, dc, res)
|
|
end
|
|
|
|
-- switch statement http://lua-users.org/wiki/SwitchStatement
|
|
local function switch(c)
|
|
local swtbl = {
|
|
casevar = c,
|
|
caseof = function (self, code)
|
|
local f
|
|
if (self.casevar) then
|
|
f = code[self.casevar] or code.default
|
|
else
|
|
f = code.missing or code.default
|
|
end
|
|
if f then
|
|
if type(f)=="function" then
|
|
return f(self.casevar,self)
|
|
else
|
|
error("case "..tostring(self.casevar).." not a function")
|
|
end
|
|
end
|
|
end
|
|
}
|
|
return swtbl
|
|
end
|
|
|
|
local function set_clip_range()
|
|
local x, y, w, h
|
|
w = bit.band(lcg_rnd(), 31)
|
|
h = bit.band(lcg_rnd(), 31)
|
|
w = w + 25
|
|
h = h + 25
|
|
x = bit.rshift(lcg_rnd() * (disp:getWidth() - w), 8)
|
|
y = bit.rshift(lcg_rnd() * (disp:getHeight() - h), 8)
|
|
|
|
disp:setClipRange(x, y, w, h)
|
|
end
|
|
|
|
local function loop()
|
|
|
|
if (loop_idx == 0) then
|
|
switch(bit.band(r, 3)) : caseof {
|
|
[0] = function() disp:undoRotate() end,
|
|
[1] = function() disp:setRotate90() end,
|
|
[2] = function() disp:setRotate180() end,
|
|
default = function() disp:setRotate270() end
|
|
}
|
|
|
|
if ( r > 3 ) then
|
|
disp:clearScreen()
|
|
set_clip_range()
|
|
else
|
|
disp:undoClipRange()
|
|
end
|
|
|
|
r = bit.band(r + 1, 7)
|
|
end
|
|
|
|
switch(loop_idx) : caseof {
|
|
[0] = function() end,
|
|
[1] = function() require("GT_graphics_test").run() end,
|
|
[2] = function() require("GT_cross").run() end,
|
|
[3] = function() require("GT_pixel_and_lines").run() end,
|
|
[4] = function() require("GT_color_test").run() end,
|
|
[5] = function() require("GT_triangle").run() end,
|
|
[6] = function() require("GT_fonts").run() end,
|
|
[7] = function() require("GT_text").run() end,
|
|
[8] = function() if r <= 3 then require("GT_clip").run() end end,
|
|
[9] = function() require("GT_box").run() end,
|
|
[10] = function() require("GT_gradient").run() end,
|
|
[11] = function() disp:setMaxClipRange() end,
|
|
default = function() loop_idx = -1 end
|
|
}
|
|
|
|
loop_idx = loop_idx + 1
|
|
|
|
print("Heap: " .. node.heap())
|
|
end
|
|
|
|
do
|
|
init_spi_display()
|
|
|
|
disp:begin(ucg.FONT_MODE_TRANSPARENT)
|
|
disp:setFont(ucg.font_ncenR14_hr)
|
|
disp:clearScreen()
|
|
|
|
tmr.create():alarm(3000, tmr.ALARM_AUTO, function() loop() end)
|
|
end
|