]> git.karo-electronics.de Git - oswald.git/blob - ui/oswald_watch_faces.c
8be07ea1cf07774b0da8011a375ec0451014383e
[oswald.git] / ui / oswald_watch_faces.c
1 #include <stdio.h>
2 #include <stdint.h>
3
4 #include "oswald.h"
5 #include "oswald_main.h"
6 #include "oswald_hal.h"
7 #include "oswald_graphics.h"
8
9 #include "oswald_watch_faces.h"
10
11 #if defined(__GNUC__) && (__MSP430X__ > 0)
12 __attribute__((__far__))
13 #endif
14 #include "bitmaps/battery0_icon.xbm"
15 #if defined(__GNUC__) && (__MSP430X__ > 0)
16 __attribute__((__far__))
17 #endif
18 #include "bitmaps/battery25_icon.xbm"
19 #if defined(__GNUC__) && (__MSP430X__ > 0)
20 __attribute__((__far__))
21 #endif
22 #include "bitmaps/battery50_icon.xbm"
23 #if defined(__GNUC__) && (__MSP430X__ > 0)
24 __attribute__((__far__))
25 #endif
26 #include "bitmaps/battery75_icon.xbm"
27 #if defined(__GNUC__) && (__MSP430X__ > 0)
28 __attribute__((__far__))
29 #endif
30 #include "bitmaps/battery100_icon.xbm"
31 #if defined(__GNUC__) && (__MSP430X__ > 0)
32 __attribute__((__far__))
33 #endif
34 #include "bitmaps/charger_icon.xbm"
35 #if defined(__GNUC__) && (__MSP430X__ > 0)
36 __attribute__((__far__))
37 #endif
38 #include "bitmaps/bluetooth_icon.xbm"
39 #if defined(__GNUC__) && (__MSP430X__ > 0)
40 __attribute__((__far__))
41 #endif
42 #include "bitmaps/bluetooth_con_icon.xbm"
43
44
45 /* sine table, per degree, factor 100 */
46 #if defined(__GNUC__) && (__MSP430X__ > 0)
47 __attribute__((__far__))
48 #endif
49 int16_t sintab[]={
50             0,   2,   3,   5,   7,   9,  10,  12,  14,  16,
51            17,  19,  21,  22,  24,  26,  28,  29,  31,  33,
52            34,  36,  37,  39,  41,  42,  44,  45,  47,  48,
53            50,  52,  53,  54,  56,  57,  59,  60,  62,  63,
54            64,  66,  67,  68,  69,  71,  72,  73,  74,  75,
55            77,  78,  79,  80,  81,  82,  83,  84,  85,  86,
56            87,  87,  88,  89,  90,  91,  91,  92,  93,  93,
57            94,  95,  95,  96,  96,  97,  97,  97,  98,  98,
58            98,  99,  99,  99,  99, 100, 100, 100, 100, 100,
59           100, 100, 100, 100, 100, 100,  99,  99,  99,  99,
60            98,  98,  98,  97,  97,  97,  96,  96,  95,  95,
61            94,  93,  93,  92,  91,  91,  90,  89,  88,  87,
62            87,  86,  85,  84,  83,  82,  81,  80,  79,  78,
63            77,  75,  74,  73,  72,  71,  69,  68,  67,  66,
64            64,  63,  62,  60,  59,  57,  56,  54,  53,  52,
65            50,  48,  47,  45,  44,  42,  41,  39,  37,  36,
66            34,  33,  31,  29,  28,  26,  24,  22,  21,  19,
67            17,  16,  14,  12,  10,   9,   7,   5,   3,   2,
68             0,  -2,  -3,  -5,  -7,  -9, -10, -12, -14, -16,
69           -17, -19, -21, -22, -24, -26, -28, -29, -31, -33,
70           -34, -36, -37, -39, -41, -42, -44, -45, -47, -48,
71           -50, -52, -53, -54, -56, -57, -59, -60, -62, -63,
72           -64, -66, -67, -68, -69, -71, -72, -73, -74, -75,
73           -77, -78, -79, -80, -81, -82, -83, -84, -85, -86,
74           -87, -87, -88, -89, -90, -91, -91, -92, -93, -93,
75           -94, -95, -95, -96, -96, -97, -97, -97, -98, -98,
76           -98, -99, -99, -99, -99,-100,-100,-100,-100,-100,
77          -100,-100,-100,-100,-100,-100, -99, -99, -99, -99,
78           -98, -98, -98, -97, -97, -97, -96, -96, -95, -95,
79           -94, -93, -93, -92, -91, -91, -90, -89, -88, -87,
80           -87, -86, -85, -84, -83, -82, -81, -80, -79, -78,
81           -77, -75, -74, -73, -72, -71, -69, -68, -67, -66,
82           -64, -63, -62, -60, -59, -57, -56, -54, -53, -52,
83           -50, -48, -47, -45, -44, -42, -41, -39, -37, -36,
84           -34, -33, -31, -29, -28, -26, -24, -22, -21, -19,
85           -17, -16, -14, -12, -10,  -9,  -7,  -5,  -3,  -2
86 };
87
88 int16_t f_sin(int16_t v)
89 {
90         v %= 360;
91         return sintab[v];
92 }
93
94 int16_t f_cos(int16_t v)
95 {
96         v += 90;
97         v %= 360;
98         return sintab[v];
99 }
100
101 void draw_status_icons(void)
102 {
103         static uint8_t ci = 0;
104         
105         if (OswaldPowerState.source) {
106                 oswald_draw_bitmap(81, 0, charger_icon_width, charger_icon_height, charger_icon_bits);
107
108                 if (OswaldPowerState.charge_state != POWER_CHARGER_DONE) {
109                         if (ci==0) oswald_draw_bitmap(81, 0, battery0_icon_width, battery0_icon_height, battery0_icon_bits);
110                         else if (ci==1) oswald_draw_bitmap(81, 0, battery25_icon_width, battery25_icon_height, battery25_icon_bits);
111                         else if (ci==2) oswald_draw_bitmap(81, 0, battery50_icon_width, battery50_icon_height, battery50_icon_bits);
112                         else if (ci==3) oswald_draw_bitmap(81, 0, battery75_icon_width, battery75_icon_height, battery75_icon_bits);
113                         else if (ci==4) oswald_draw_bitmap(81, 0, battery100_icon_width, battery100_icon_height, battery100_icon_bits);
114                         ci++;
115                         ci %= 5;
116                 } else {
117                         oswald_draw_bitmap(81, 0, battery100_icon_width, battery100_icon_height, battery100_icon_bits);
118                 }
119         } else {
120                 if (OswaldPowerState.percent > 75)
121                         oswald_draw_bitmap(81, 0, battery100_icon_width, battery100_icon_height, battery100_icon_bits);
122                 else if (OswaldPowerState.percent > 50)
123                         oswald_draw_bitmap(81, 0, battery75_icon_width, battery75_icon_height, battery75_icon_bits);
124                 else if (OswaldPowerState.percent > 25)
125                         oswald_draw_bitmap(81, 0, battery50_icon_width, battery50_icon_height, battery50_icon_bits);
126                 else if (OswaldPowerState.percent > 5)
127                         oswald_draw_bitmap(81, 0, battery25_icon_width, battery25_icon_height, battery25_icon_bits);
128                 else
129                         oswald_draw_bitmap(81, 0, battery0_icon_width, battery0_icon_height, battery0_icon_bits);
130         }
131
132         if (hal_bluetooth_get_state() == BLUETOOTH_ON)
133                 oswald_draw_bitmap(81, 0, bluetooth_icon_width, bluetooth_icon_height, bluetooth_icon_bits);
134         else if (hal_bluetooth_get_state() == BLUETOOTH_CONNECTED)
135                 oswald_draw_bitmap(81, 0, bluetooth_con_icon_width, bluetooth_con_icon_height, bluetooth_con_icon_bits);
136 }
137
138 void DrawLcdAnaClock(boolean show_seconds)
139 {
140         int16_t i, x, y, x2, y2;
141         int16_t tmp;
142         int8_t hour, minute, seconds;
143         char tstr[16];
144
145         hour = OswaldClk.hour;
146         minute = OswaldClk.minute;
147         seconds = OswaldClk.second;
148
149         hour -= 3;
150         if (hour < 0)
151                 hour += 12;
152         // mf = (1. / 59.) * (double)minute;
153         minute -= 15;
154         if (minute < 0)
155                 minute += 60;
156         seconds -= 15;
157         if (seconds < 0)
158                 seconds += 60;
159
160         hal_lcd_clear_display();
161
162         snprintf(tstr, 16, "%2d", OswaldClk.day);
163 #if 0
164         SetFont(MetaWatch16);
165         WriteLcdString(70, 40, tstr);
166 #else
167         oswald_write_string(70, 43, FONT_6x9, tstr);
168 #endif
169
170         // Marker
171         // plot(R*cos(360° * i/N), R*sin(360° * i/N))
172         for (i=0; i<12; i++) {
173                 x = 47 + ((43 * f_cos((360 / 12) * i)) / 100);
174                 y = 47 + ((43 * f_sin((360 / 12) * i)) / 100);
175                 x2 = 47 + ((47 * f_cos((360 / 12) * i)) / 100);
176                 y2 = 47 + ((47 * f_sin((360 / 12) * i)) / 100);
177                 oswald_draw_line_ww(x, y, x2, y2, 2);
178                 // g_printerr("br %d,%d %d,%d\n", x,y,x2,y2);
179         };
180
181         // Hour
182         tmp = 47 + (30 * f_cos(((360 / 12) * hour) + ((OswaldClk.minute * 360) /12 / 60)) / 100);
183         x =  tmp;
184         tmp = 47 + (30 * f_sin(((360 / 12) * hour) + ((OswaldClk.minute * 360) /12 / 60)) / 100);
185         y =  tmp;
186         oswald_draw_line_ww(47, 47, x, y, 2);
187
188         // Minute
189         tmp = 47 + ((40 * f_cos((360 / 60) * minute)) / 100);
190         x =  tmp;
191         tmp = 47 + ((40 * f_sin((360 / 60) * minute)) / 100);
192         y =  tmp;
193         oswald_draw_line_ww(47, 47, x, y, 2);
194
195         if (show_seconds) {
196                 // Seconds
197                 tmp = 47 + ((40 * f_cos((360 / 60) * seconds)) / 100);
198                 x =  tmp;
199                 tmp = 47 + ((40 * f_sin((360 / 60) * seconds)) / 100);
200                 y =  tmp;
201                 oswald_draw_line(47, 47, x, y);
202         };
203
204         draw_status_icons();
205
206         hal_lcd_update_display();
207 }
208
209 void DrawLcdDigitalClock(boolean show_seconds)
210 {
211         int gRow = 1;
212         int gColumn = 1;
213         char tstr[16];
214         int i;
215
216 #if 0
217         SetFont(MetaWatchTime);
218
219         hal_lcd_clear_display();
220         //gRow += WriteLcdCharacter(ui, gRow, gColumn, TIME_CHARACTER_SPACE_INDEX);
221         if (OswaldClk.clk24hr) {
222                 gRow += WriteLcdCharacter(gRow, gColumn, (OswaldClk.hour / 10));
223                 gRow += WriteLcdCharacter(gRow, gColumn, (OswaldClk.hour % 10));
224         } else {
225                 unsigned char val = OswaldClk.hour;
226                 if (val > 12)
227                         val -= 12;
228                 gRow += WriteLcdCharacter(gRow, gColumn, (val / 10));
229                 gRow += WriteLcdCharacter(gRow, gColumn, (val % 10));
230         }
231         gRow += WriteLcdCharacter(gRow, gColumn, TIME_CHARACTER_COLON_INDEX);
232         gRow += WriteLcdCharacter(gRow, gColumn, (OswaldClk.minute / 10));
233         gRow += WriteLcdCharacter(gRow, gColumn, (OswaldClk.minute % 10));
234
235         gRow += 3;
236         if (show_seconds) {
237                 SetFont(MetaWatch16);
238                 snprintf(tstr, 16, "%02d", OswaldClk.second);
239                 WriteLcdString(gRow, 9, tstr);
240         };
241
242         SetFont(MetaWatch7);
243
244         if (!OswaldClk.clk24hr) {
245                 if (OswaldClk.hour > 12) {
246                         WriteLcdString(gRow, 3, "PM");
247                 } else {
248                         WriteLcdString(gRow, 3, "AM");
249                 }
250         }
251
252         SetFont(MetaWatch16);
253
254         if (OswaldClk.day_first)
255                 snprintf(tstr, 16, "%d.%d.%d", OswaldClk.day, OswaldClk.month, OswaldClk.year);
256         else
257                 snprintf(tstr, 16, "%d/%d %d", OswaldClk.month, OswaldClk.day, OswaldClk.year);
258         WriteLcdString(3, 25, tstr);
259
260         draw_status_icons();
261
262         gRow = 0;
263         gColumn = 45;
264         SetFont(MetaWatch5);
265         for (i=0; i<strlen(MainMessage); i++) {
266                 gRow += WriteLcdCharacter(gRow, gColumn, MainMessage[i]);
267                 if (gRow > 90) {
268                         gRow = 0;
269                         gColumn += 7;
270                 }
271                 if (gColumn > 95)
272                         i = 255;
273         }
274 #if 0
275         snprintf(tstr, 16, "%d%% (%dmV)", OswaldPowerState.percent, OswaldPowerState.level);
276         WriteLcdString(2, 48, tstr);
277         WriteLcdString(2, 64, OswaldPowerState.source ? "ext" : "bat");
278
279         /* this makes only sense when the charger is active */
280         if (OswaldPowerState.source) {
281                 switch (OswaldPowerState.charge_state) {
282                         case POWER_CHARGER_DONE:
283                                 WriteLcdString(2, 80, "charge done");
284                                 break;
285                         case POWER_CHARGER_PRECHARGE:
286                                 WriteLcdString(2, 80, "precharging");
287                                 break;
288                         case POWER_CHARGER_CHARGING:
289                                 WriteLcdString(2, 80, "charging");
290                                 break;
291                         case POWER_CHARGER_UNK:
292                                 WriteLcdString(2, 80, "charge unkn.");
293                                 break;
294                         default:
295                                 break;
296                 };
297         };
298 #endif
299 #else
300         hal_lcd_clear_display();
301
302         if (OswaldClk.clk24hr) {
303                 gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, (OswaldClk.hour / 10));
304                 gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, (OswaldClk.hour % 10));
305         } else {
306                 unsigned char val = OswaldClk.hour;
307                 if (val > 12)
308                         val -= 12;
309                 gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, (val / 10));
310                 gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, (val % 10));
311         }
312         if (OswaldClk.second % 2)
313                 oswald_write_character(gRow-4, gColumn, FONT_LCD13x21, 10);
314         gRow += 5;
315         gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, (OswaldClk.minute / 10));
316         gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, (OswaldClk.minute % 10));
317 #endif
318         if (show_seconds) {
319                 oswald_write_character(59, 9, FONT_LCD8x13, (OswaldClk.second / 10));
320                 oswald_write_character(67, 9, FONT_LCD8x13, (OswaldClk.second % 10));
321         }
322
323         if (OswaldClk.day_first)
324                 snprintf(tstr, 16, "%2d.%2d.%4d", OswaldClk.day, OswaldClk.month, OswaldClk.year);
325         else
326                 snprintf(tstr, 16, "%2d/%2d %4d", OswaldClk.month, OswaldClk.day, OswaldClk.year);
327         oswald_write_string(0, 25, FONT_6x9, tstr);
328
329         gRow = 0;
330         gColumn = 45;
331         for (i=0; i<strlen(MainMessage); i++) {
332                 if (gRow == 0 && MainMessage[i] == ' ')
333                         continue;
334                 gRow += oswald_write_character(gRow, gColumn, FONT_DROID8x12, MainMessage[i]);
335                 if (gRow > 90) {
336                         gRow = 0;
337                         gColumn += 9;
338                 }
339                 if (gColumn > 86)
340                         i = 255;
341         }
342
343         draw_status_icons();
344
345         hal_lcd_update_display();
346 }
347