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