summaryrefslogtreecommitdiffstats
path: root/apps/plugins/lua/include_lua/lcd.lua
blob: 62fa988ec1140861ac83415904ed11e5544bf40b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
--[[ 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