123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- -- 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
|