summaryrefslogtreecommitdiff
path: root/apps/plugins/helloworld.lua
blob: ed8726c022f1d8171ae6b59b10195766de2417ea (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
159
160
161
162
163
164
165
166
167
168
169
170
--[[
             __________               __   ___.
   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

-- Example function which splashes a message for x seconds
function sayhello(seconds)
    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
    if(func == nil) then
        func = rb.lcd_bitmap_part -- Fallback version for grayscale targets
        if(func == nil) then
            func = rb.lcd_mono_bitmap_part -- Fallback version for mono targets
        end
    end
    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
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)
    if(not rb.file_exists(filename)) then
        return nil
    end

    local fd = rb.open(filename, rb.O_RDONLY)
    if(fd == -1) then
        return nil
    end

    local contents = rb.read(fd, rb.filesize(fd))
    rb.close(fd)

    return contents
end

-- Helper function which saves contents to a file
function file_put_contents(filename, contents)
    local flags = rb.O_WRONLY
    if(rb.file_exists(filename)) then
        flags = bit.bor(flags, rb.O_APPEND) -- binary OR O_APPEND if the file exists
    else
        flags = bit.bor(flags, rb.O_CREAT) -- binary OR O_CREAT if the file doesn't exist
    end

    local fd = rb.open(filename, flags)
    if(fd == -1) then
        return false
    end

    local ret = rb.write(fd, contents) ~= string.len(contents)
    rb.close(fd)
    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?
if(backdrop == nil) then
    backdrop = rb.read_bmp_file("/.rockbox/icons/tango_small_viewers_mono.bmp") -- Try using the mono version
    if(backdrop == nil) then
        backdrop = rb.read_bmp_file("/.rockbox/icons/viewers.bmp") -- Try using the builtin version
    end
end
-- 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
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 -- empty line

-- Display some long lines
local tmp = ""
for i=1, 5 do
    printf("This is a %s long line!", tmp)
    tmp = tmp .. " very very very"
    rb.yield()
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)