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