summaryrefslogtreecommitdiffstats
path: root/apps/plugins/helloworld.lua
blob: aa2ef446d3d422c27be7358383764c7cf92d638a (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
154
155
156
157
158
--[[
             __________               __   ___.
   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
                     \/            \/     \/    \/            \/
 $Id$

 Example Lua script

 Copyright (C) 2009 by Maurus Cuelenaere

 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.

]]--

require("actions")   -- Contains rb.actions & rb.contexts
--require("buttons") -- Contains rb.buttons; not needed in this example

-- Example function which splashes a message for x seconds
function sayhello(seconds)
    local message = string.format("Hello world from LUA for %d seconds", seconds)
    rb.splash(seconds * rb.HZ, message)
end

-- Helper function which draws a (transparent) image at the center of the screen
function draw_image(img)
    local x, y = (rb.LCD_WIDTH - img:width()) / 2, (rb.LCD_HEIGHT - img:height()) / 2

    local func = rb.lcd_bitmap_transparent_part
              or rb.lcd_bitmap_part      -- Fallback version for grayscale targets
              or rb.lcd_mono_bitmap_part -- Fallback version for mono targets

    func(img, 0, 0, img:width(), x, y, img:width(), img:height())
    rb.lcd_update()
end

-- Helper function that acts like a normal printf() would do
local line = 0
function printf(...)
    local msg = string.format(...)
    local res, w, h = rb.font_getstringsize(msg, rb.FONT_UI)

    if(w >= rb.LCD_WIDTH) then
        rb.lcd_puts_scroll(0, line, msg)
    else
        rb.lcd_puts(0, line, msg)
    end
    rb.lcd_update()

    line = line + 1

    if(h * line >= rb.LCD_HEIGHT) then
        line = 0
    end
end

-- Helper function which reads the contents of a file
function file_get_contents(filename)
    local file = io.open(filename, "r")
    if not file then
        return nil
    end

    local contents = file:read("*all") -- See Lua manual for more information
    file:close() -- GC takes care of this if you would've forgotten it

    return contents
end

-- Helper function which saves contents to a file
function file_put_contents(filename, contents)
    local file = io.open(filename, "w+") -- See Lua manual for more information
    if not file then
        return false
    end

    local ret = file:write(contents) == true
    file:close() -- GC takes care of this if you would've forgotten it
    return ret
end

-- Clear the screen
rb.lcd_clear_display()

-- Draw an X on the screen
rb.lcd_drawline(0, 0, rb.LCD_WIDTH, rb.LCD_HEIGHT)
rb.lcd_drawline(rb.LCD_WIDTH, 0, 0, rb.LCD_HEIGHT)

if(rb.lcd_rgbpack ~= nil) then -- Only do this when we're on a color target, i.e. when LCD_RGBPACK is available
    local rectangle = rb.new_image(10, 15) -- Create a new image with width 10 and height 15
    for i=1, 10 do
        for j=1, 15 do
            rectangle:set(i, j, rb.lcd_rgbpack(200, i*20, j*20)) -- Set the pixel at position i, j to the specified color
        end
    end

    -- rb.lcd_bitmap_part(src, src_x, src_y, stride, x, y, width, height)
    rb.lcd_bitmap_part(rectangle, 0, 0, 10, rb.LCD_WIDTH/2-5, rb.LCD_HEIGHT/10-1, 10, 10) -- Draws our rectangle at the top-center of the screen
end

-- Load a BMP file in the variable backdrop
local backdrop = rb.read_bmp_file("/.rockbox/icons/tango_small_viewers.bmp")      -- This image should always be present...
              or rb.read_bmp_file("/.rockbox/icons/tango_small_viewers_mono.bmp") -- ... if not, try using the mono version...
              or rb.read_bmp_file("/.rockbox/icons/viewers.bmp")                  -- ... or try using the builtin version

-- Draws the image using our own draw_image() function; see up
draw_image(backdrop)

-- Flush the contents from the framebuffer to the LCD
rb.lcd_update()

-- Sleep for 2 seconds
local seconds = 2
rb.sleep(seconds * rb.HZ) -- rb.HZ equals to the amount of ticks that fit in 1 second

-- Call the function sayhello() with arguments seconds
sayhello(seconds)

-- Clear display
rb.lcd_clear_display()

-- Construct a pathname using the current path and a file name
local pathname = rb.current_path() .. "test.txt"

-- Put the string 'Hello from Lua!' in pathname
file_put_contents(pathname, "Hello from Lua!")

-- Splash the contents of pathname
printf(file_get_contents(pathname))

line = line + 1 -- Add empty line

-- Some examples of how bitlib works
printf("1 | 2 = %d <> 7 & 3 = %d", bit.bor(1, 2), bit.band(7, 3))
printf("~8 = %d <> 5 ^ 1 = %d", bit.bnot(8), bit.bxor(5, 1))

line = line + 1 -- Add empty line

-- Display some long lines
for i=0, 4 do
    printf("This is a %slong line!", string.rep("very very very ", i))
    rb.yield() -- Always try to yield to give other threads some breathing space!
end

-- Loop until the user exits the program
repeat
    local action = rb.get_action(rb.contexts.CONTEXT_STD, rb.HZ)
until action == rb.actions.ACTION_STD_CANCEL

-- For a reference list of all functions available, see apps/plugins/lua/rocklib.c (and apps/plugin.h)