blob: 8ae880efb3e785cc80cf1df697b01b0c709a7b1a [file] [log] [blame]
Jens Arnoldc368bc72008-04-06 15:36:53 +00001/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2008 Jens Arnold
11 *
Daniel Stenberg2acc0ac2008-06-28 18:10:04 +000012 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
Jens Arnoldc368bc72008-04-06 15:36:53 +000016 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21#include "plugin.h"
22#include "grey.h"
23#include "helper.h"
24
25PLUGIN_HEADER
26
27#if (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) \
28 || (CONFIG_KEYPAD == IPOD_1G2G_PAD)
29#define GREY_QUIT BUTTON_MENU
30#define GREY_OK BUTTON_SELECT
31#define GREY_PREV BUTTON_LEFT
32#define GREY_NEXT BUTTON_RIGHT
33#define GREY_UP BUTTON_SCROLL_FWD
34#define GREY_DOWN BUTTON_SCROLL_BACK
35
36#elif CONFIG_KEYPAD == IRIVER_H100_PAD
37#define GREY_QUIT BUTTON_OFF
38#define GREY_OK BUTTON_SELECT
39#define GREY_PREV BUTTON_LEFT
40#define GREY_NEXT BUTTON_RIGHT
41#define GREY_UP BUTTON_UP
42#define GREY_DOWN BUTTON_DOWN
43
44#elif CONFIG_KEYPAD == RECORDER_PAD
45#define GREY_QUIT BUTTON_OFF
46#define GREY_OK BUTTON_PLAY
47#define GREY_PREV BUTTON_LEFT
48#define GREY_NEXT BUTTON_RIGHT
49#define GREY_UP BUTTON_UP
50#define GREY_DOWN BUTTON_DOWN
51
52#elif CONFIG_KEYPAD == ONDIO_PAD
53#define GREY_QUIT BUTTON_OFF
54#define GREY_OK BUTTON_MENU
55#define GREY_PREV BUTTON_LEFT
56#define GREY_NEXT BUTTON_RIGHT
57#define GREY_UP BUTTON_UP
58#define GREY_DOWN BUTTON_DOWN
59
60#elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) \
61 || (CONFIG_KEYPAD == MROBE100_PAD)
62#define GREY_QUIT BUTTON_POWER
63#define GREY_OK BUTTON_SELECT
64#define GREY_PREV BUTTON_LEFT
65#define GREY_NEXT BUTTON_RIGHT
66#define GREY_UP BUTTON_UP
67#define GREY_DOWN BUTTON_DOWN
68
69#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
70#define GREY_QUIT BUTTON_RC_REC
71#define GREY_OK BUTTON_RC_PLAY
72#define GREY_PREV BUTTON_RC_REW
73#define GREY_NEXT BUTTON_RC_FF
74#define GREY_UP BUTTON_RC_VOL_UP
75#define GREY_DOWN BUTTON_RC_VOL_DOWN
76
77#else
78#error unsupported keypad
79#endif
80
81#define BLOCK_WIDTH (LCD_WIDTH/8)
82#define BLOCK_HEIGHT (LCD_HEIGHT/8)
83
84#define STEPS 16
85
86GREY_INFO_STRUCT
87
88static const unsigned char dither_matrix[16][16] = {
89 { 0,192, 48,240, 12,204, 60,252, 3,195, 51,243, 15,207, 63,255 },
90 { 128, 64,176,112,140, 76,188,124,131, 67,179,115,143, 79,191,127 },
91 { 32,224, 16,208, 44,236, 28,220, 35,227, 19,211, 47,239, 31,223 },
92 { 160, 96,144, 80,172,108,156, 92,163, 99,147, 83,175,111,159, 95 },
93 { 8,200, 56,248, 4,196, 52,244, 11,203, 59,251, 7,199, 55,247 },
94 { 136, 72,184,120,132, 68,180,116,139, 75,187,123,135, 71,183,119 },
95 { 40,232, 24,216, 36,228, 20,212, 43,235, 27,219, 39,231, 23,215 },
96 { 168,104,152, 88,164,100,148, 84,171,107,155, 91,167,103,151, 87 },
97 { 2,194, 50,242, 14,206, 62,254, 1,193, 49,241, 13,205, 61,253 },
98 { 130, 66,178,114,142, 78,190,126,129, 65,177,113,141, 77,189,125 },
99 { 34,226, 18,210, 46,238, 30,222, 33,225, 17,209, 45,237, 29,221 },
100 { 162, 98,146, 82,174,110,158, 94,161, 97,145, 81,173,109,157, 93 },
101 { 10,202, 58,250, 6,198, 54,246, 9,201, 57,249, 5,197, 53,245 },
102 { 138, 74,186,122,134, 70,182,118,137, 73,185,121,133, 69,181,117 },
103 { 42,234, 26,218, 38,230, 22,214, 41,233, 25,217, 37,229, 21,213 },
104 { 170,106,154, 90,166,102,150, 86,169,105,153, 89,165,101,149, 85 }
105};
106
107static unsigned char input_levels[STEPS+1];
108static unsigned char lcd_levels[STEPS+1];
109
Steve Bavin65265772008-05-13 09:57:56 +0000110static const struct plugin_api* rb;
Jens Arnoldc368bc72008-04-06 15:36:53 +0000111static unsigned char *gbuf;
112static size_t gbuf_size = 0;
113
114static void fill_rastered(int bx, int by, int bw, int bh, int step)
115{
116 int x, xmax, y, ymax;
117 int level;
118
119 if (step < 0)
120 step = 0;
121 else if (step > STEPS)
122 step = STEPS;
123
124 level = input_levels[step];
125 level += (level-1) >> 7;
126
127 for (y = (LCD_HEIGHT/2) + by * BLOCK_HEIGHT, ymax = y + bh * BLOCK_HEIGHT;
128 y < ymax; y++)
129 {
130 for (x = (LCD_WIDTH/2) + bx * BLOCK_WIDTH, xmax = x + bw * BLOCK_WIDTH;
131 x < xmax; x++)
132 {
133 grey_set_foreground((level > dither_matrix[y & 0xf][x & 0xf])
134 ? 255 : 0);
135 grey_drawpixel(x, y);
136 }
137 }
138}
139
140/* plugin entry point */
Steve Bavin65265772008-05-13 09:57:56 +0000141enum plugin_status plugin_start(const struct plugin_api* api, const void* parameter)
Jens Arnoldc368bc72008-04-06 15:36:53 +0000142{
143 bool done = false;
144 int cur_step = 1;
145 int button, i, l, fd;
146 unsigned char filename[MAX_PATH];
147
148 /* standard stuff */
149 (void)parameter;
150 rb = api;
151
152 gbuf = (unsigned char *) rb->plugin_get_buffer(&gbuf_size);
153
154 if (!grey_init(rb, gbuf, gbuf_size,
155 GREY_BUFFERED|GREY_RAWMAPPED|GREY_ON_COP,
156 LCD_WIDTH, LCD_HEIGHT, NULL))
157 {
158 rb->splash(HZ, "Not enough memory.");
159 return PLUGIN_ERROR;
160 }
161 for (i = 0; i <= STEPS; i++)
162 input_levels[i] = lcd_levels[i] = (255 * i + (STEPS/2)) / STEPS;
163
164 backlight_force_on(rb); /* backlight control in lib/helper.c */
165
166 grey_set_background(0); /* set background to black */
167 grey_clear_display();
168 grey_show(true);
169
170 while (!done)
171 {
172 fill_rastered(-3, -3, 2, 2, cur_step - 1);
173 fill_rastered(-1, -3, 2, 2, cur_step);
174 fill_rastered(1, -3, 2, 2, cur_step + 1);
175 fill_rastered(-3, -1, 2, 2, cur_step);
176 grey_set_foreground(lcd_levels[cur_step]);
177 grey_fillrect(LCD_WIDTH/2-BLOCK_WIDTH, LCD_HEIGHT/2-BLOCK_HEIGHT,
178 2*BLOCK_WIDTH, 2*BLOCK_HEIGHT);
179 fill_rastered(1, -1, 2, 2, cur_step);
180 fill_rastered(-3, 1, 2, 2, cur_step + 1);
181 fill_rastered(-1, 1, 2, 2, cur_step);
182 fill_rastered(1, 1, 2, 2, cur_step - 1);
183 grey_update();
184
185 button = rb->button_get(true);
186 switch (button)
187 {
188 case GREY_PREV:
189 if (cur_step > 0)
190 cur_step--;
191 break;
192
193 case GREY_NEXT:
194 if (cur_step < STEPS)
195 cur_step++;
196 break;
197
198 case GREY_UP:
199 case GREY_UP|BUTTON_REPEAT:
200 l = lcd_levels[cur_step];
201 if (l < 255)
202 {
203 l++;
204 for (i = cur_step; i <= STEPS; i++)
205 if (lcd_levels[i] < l)
206 lcd_levels[i] = l;
207 }
208 break;
209
210 case GREY_DOWN:
211 case GREY_DOWN|BUTTON_REPEAT:
212 l = lcd_levels[cur_step];
213 if (l > 0)
214 {
215 l--;
216 for (i = cur_step; i >= 0; i--)
217 if (lcd_levels[i] > l)
218 lcd_levels[i] = l;
219 }
220 break;
221
222 case GREY_OK:
223 rb->create_numbered_filename(filename, "/", "test_grey_",
224 ".txt", 2 IF_CNFN_NUM_(, NULL));
225 fd = rb->open(filename, O_RDWR|O_CREAT|O_TRUNC);
226 if (fd >= 0)
227 {
228 for (i = 0; i <= STEPS; i++)
229 rb->fdprintf(fd, "%3d: %3d\n", input_levels[i],
230 lcd_levels[i]);
231 rb->close(fd);
232 }
233 /* fall through */
234
235 case GREY_QUIT:
236 done = true;
237 break;
238 }
239 }
240
241 grey_release();
242 backlight_use_settings(rb); /* backlight control in lib/helper.c */
243 return PLUGIN_OK;
244}