summaryrefslogtreecommitdiffstats
path: root/apps/plugins/lua/include_lua/lcd.lua
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/lua/include_lua/lcd.lua')
-rw-r--r--apps/plugins/lua/include_lua/lcd.lua154
1 files changed, 154 insertions, 0 deletions
diff --git a/apps/plugins/lua/include_lua/lcd.lua b/apps/plugins/lua/include_lua/lcd.lua
new file mode 100644
index 0000000000..bbf0f240aa
--- /dev/null
+++ b/apps/plugins/lua/include_lua/lcd.lua
@@ -0,0 +1,154 @@
+--[[ Lua LCD Wrapper functions
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2017 William Wilgus
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+]]
+
+--[[ Exposed Functions
+
+ _lcd.clear
+ _lcd.duplicate
+ _lcd.image
+ _lcd.set_viewport
+ _lcd.splashf
+ _lcd.text_extent
+ _lcd.update
+ _lcd.update_rect
+
+-- Exposed Constants
+ _lcd.CX
+ _lcd.CY
+ _lcd.DEPTH
+ _lcd.W
+ _lcd.H
+
+ _lcd
+ _LCD
+
+]]
+if not rb.lcd_framebuffer then rb.splash(rb.HZ, "No Support!") return nil end
+
+_LCD = rb.lcd_framebuffer()
+
+local _lcd = {} do
+
+ --internal constants
+ local _NIL = nil -- _NIL placeholder
+ local LCD_W, LCD_H = rb.LCD_WIDTH, rb.LCD_HEIGHT
+
+ -- clamps value to >= min and <= max
+ local function clamp(val, min, max)
+ -- Warning doesn't check if min < max
+ if val < min then
+ return min
+ elseif val < max then
+ return val
+ end
+ return max
+ end
+
+ -- return a copy of lcd screen
+ local function duplicate(t, screen_img)
+ screen_img = screen_img or rb.new_image()
+ screen_img:copy(rb.lcd_framebuffer())
+ return screen_img
+ end
+
+ -- updates screen in specified rectangle
+ local function update_rect(t, x, y, w, h)
+ rb.lcd_update_rect(x - 1, y - 1,
+ clamp(x + w, 1, LCD_W) - 1,
+ clamp(y + h, 1, LCD_H) - 1)
+ end
+
+ -- clears lcd, optional.. ([color, x1, y1, x2, y2, clip])
+ local function clear(t, clr, ...)
+ if clr == _NIL and ... == _NIL then
+ rb.lcd_clear_display()
+ else
+ rb.lcd_scroll_stop() --rb really doesn't like bg change while scroll
+ _LCD:clear(clr, ...)
+ end
+ end
+
+ -- loads an image to the screen
+ local function image(t, src, x, y)
+ if not src then --make sure an image was passed, otherwise bail
+ rb.splash(rb.HZ, "No Image!")
+ return _NIL
+ end
+ _LCD:copy(src,x,y,1,1)
+ end
+
+ -- Formattable version of splash
+ local function splashf(t, timeout, ...)
+ rb.splash(timeout, string.format(...))
+ end
+
+ -- Gets size of text
+ local function text_extent(t, msg, font)
+ font = font or rb.FONT_UI
+
+ return rb.font_getstringsize(msg, font)
+ end
+
+ -- Sets viewport size
+ local function set_viewport(t, vp)
+ if not vp then rb.set_viewport() return end
+ if rb.LCD_DEPTH == 2 then -- invert 2-bit screens
+ --vp.drawmode = bit.bxor(vp.drawmode, 4)
+ vp.fg_pattern = 3 - vp.fg_pattern
+ vp.bg_pattern = 3 - vp.bg_pattern
+ end
+ rb.set_viewport(vp)
+ end
+
+ -- allows the use of _lcd() as a identifier for the screen
+ local function index(k, v)
+ return function(x, ...)
+ _LCD[v](_LCD, ...)
+ end
+ end
+
+ -- allows the use of _lcd() as a identifier for the screen
+ local function call()
+ return rb.lcd_framebuffer()
+ end
+
+ --expose functions to the outside through _lcd table
+ _lcd.text_extent = text_extent
+ _lcd.set_viewport = set_viewport
+ _lcd.duplicate = duplicate
+ _lcd.update = rb.lcd_update
+ _lcd.update_rect = update_rect
+ _lcd.clear = clear
+ _lcd.splashf = splashf
+ _lcd.image = image
+ _lcd.DEPTH = rb.LCD_DEPTH
+ _lcd.W = rb.LCD_WIDTH
+ _lcd.H = rb.LCD_HEIGHT
+ _lcd.CX = (rb.LCD_WIDTH / 2)
+ _lcd.CY = (rb.LCD_HEIGHT / 2)
+ _lcd = setmetatable(_lcd,{__index = index, __call = call})
+
+end -- _lcd functions
+
+return _lcd
+