X-Git-Url: https://git.karo-electronics.de/?p=oswald.git;a=blobdiff_plain;f=ui%2Foswald_watch_faces.c;h=284323ac30787e91f9244a9950ab67af083e0212;hp=6db3196abd2d39baba91ff3e415e07866066b96c;hb=1b5790095c23913d02531727e47b79af3568e0b1;hpb=5d0ff002cee35d109f4a60eff415b2db556fb8f4 diff --git a/ui/oswald_watch_faces.c b/ui/oswald_watch_faces.c index 6db3196..284323a 100644 --- a/ui/oswald_watch_faces.c +++ b/ui/oswald_watch_faces.c @@ -3,12 +3,49 @@ #include "oswald.h" #include "oswald_main.h" -#include "Fonts.h" -#include "LcdDisplay.h" #include "oswald_hal.h" +#include "oswald_graphics.h" #include "oswald_watch_faces.h" +#if defined(__GNUC__) && (__MSP430X__ > 0) +__attribute__((__far__)) +#endif +#include "bitmaps/battery0_icon.xbm" +#if defined(__GNUC__) && (__MSP430X__ > 0) +__attribute__((__far__)) +#endif +#include "bitmaps/battery25_icon.xbm" +#if defined(__GNUC__) && (__MSP430X__ > 0) +__attribute__((__far__)) +#endif +#include "bitmaps/battery50_icon.xbm" +#if defined(__GNUC__) && (__MSP430X__ > 0) +__attribute__((__far__)) +#endif +#include "bitmaps/battery75_icon.xbm" +#if defined(__GNUC__) && (__MSP430X__ > 0) +__attribute__((__far__)) +#endif +#include "bitmaps/battery100_icon.xbm" +#if defined(__GNUC__) && (__MSP430X__ > 0) +__attribute__((__far__)) +#endif +#include "bitmaps/charger_icon.xbm" +#if defined(__GNUC__) && (__MSP430X__ > 0) +__attribute__((__far__)) +#endif +#include "bitmaps/bluetooth_icon.xbm" +#if defined(__GNUC__) && (__MSP430X__ > 0) +__attribute__((__far__)) +#endif +#include "bitmaps/bluetooth_con_icon.xbm" + + +/* sine table, per degree, factor 100 */ +#if defined(__GNUC__) && (__MSP430X__ > 0) +__attribute__((__far__)) +#endif int16_t sintab[]={ 0, 2, 3, 5, 7, 9, 10, 12, 14, 16, 17, 19, 21, 22, 24, 26, 28, 29, 31, 33, @@ -61,6 +98,43 @@ int16_t f_cos(int16_t v) return sintab[v]; } +void draw_status_icons(void) +{ + static uint8_t ci = 0; + + if (OswaldPowerState.source) { + oswald_draw_bitmap(81, 0, charger_icon_width, charger_icon_height, charger_icon_bits); + + if (OswaldPowerState.charge_state != POWER_CHARGER_DONE) { + if (ci==0) oswald_draw_bitmap(81, 0, battery0_icon_width, battery0_icon_height, battery0_icon_bits); + else if (ci==1) oswald_draw_bitmap(81, 0, battery25_icon_width, battery25_icon_height, battery25_icon_bits); + else if (ci==2) oswald_draw_bitmap(81, 0, battery50_icon_width, battery50_icon_height, battery50_icon_bits); + else if (ci==3) oswald_draw_bitmap(81, 0, battery75_icon_width, battery75_icon_height, battery75_icon_bits); + else if (ci==4) oswald_draw_bitmap(81, 0, battery100_icon_width, battery100_icon_height, battery100_icon_bits); + ci++; + ci %= 5; + } else { + oswald_draw_bitmap(81, 0, battery100_icon_width, battery100_icon_height, battery100_icon_bits); + } + } else { + if (OswaldPowerState.percent > 75) + oswald_draw_bitmap(81, 0, battery100_icon_width, battery100_icon_height, battery100_icon_bits); + else if (OswaldPowerState.percent > 50) + oswald_draw_bitmap(81, 0, battery75_icon_width, battery75_icon_height, battery75_icon_bits); + else if (OswaldPowerState.percent > 25) + oswald_draw_bitmap(81, 0, battery50_icon_width, battery50_icon_height, battery50_icon_bits); + else if (OswaldPowerState.percent > 5) + oswald_draw_bitmap(81, 0, battery25_icon_width, battery25_icon_height, battery25_icon_bits); + else + oswald_draw_bitmap(81, 0, battery0_icon_width, battery0_icon_height, battery0_icon_bits); + } + + if (hal_bluetooth_get_state() == BLUETOOTH_ON) + oswald_draw_bitmap(81, 0, bluetooth_icon_width, bluetooth_icon_height, bluetooth_icon_bits); + else if (hal_bluetooth_get_state() == BLUETOOTH_CONNECTED) + oswald_draw_bitmap(81, 0, bluetooth_con_icon_width, bluetooth_con_icon_height, bluetooth_con_icon_bits); +} + void DrawLcdAnaClock(boolean show_seconds) { int16_t i, x, y, x2, y2; @@ -85,96 +159,58 @@ void DrawLcdAnaClock(boolean show_seconds) hal_lcd_clear_display(); - SetFont(MetaWatch16); - snprintf(tstr, 16, "%02d", OswaldClk.day); - WriteLcdString(70, 40, tstr); + snprintf(tstr, 16, "%2d", OswaldClk.day); + oswald_write_string(70, 43, FONT_6x9, FALSE, tstr); + // Marker // plot(R*cos(360° * i/N), R*sin(360° * i/N)) for (i=0; i<12; i++) { - tmp = 48 + ((43 * f_cos((360 / 12) * i)) / 100); - x = tmp; - tmp = 48 + ((43 * f_sin((360 / 12) * i)) / 100); - y = tmp; - tmp = 48 + ((48 * f_cos((360 / 12) * i)) / 100); - x2 = tmp; - tmp = 48 + ((48 * f_sin((360 / 12) * i)) / 100); - y2 = tmp; - DrawLcdLineBresenhamWW(x, y, x2, y2, 2); + x = 47 + ((43 * f_cos((360 / 12) * i)) / 100); + y = 47 + ((43 * f_sin((360 / 12) * i)) / 100); + x2 = 47 + ((47 * f_cos((360 / 12) * i)) / 100); + y2 = 47 + ((47 * f_sin((360 / 12) * i)) / 100); + oswald_draw_line_ww(x, y, x2, y2, 2); + // g_printerr("br %d,%d %d,%d\n", x,y,x2,y2); }; // Hour - tmp = 48 + (30 * f_cos(((360 / 12) * hour) + ((OswaldClk.minute * 360) /12 / 60)) / 100); + tmp = 47 + (30 * f_cos(((360 / 12) * hour) + ((OswaldClk.minute * 360) /12 / 60)) / 100); x = tmp; - tmp = 48 + (30 * f_sin(((360 / 12) * hour) + ((OswaldClk.minute * 360) /12 / 60)) / 100); + tmp = 47 + (30 * f_sin(((360 / 12) * hour) + ((OswaldClk.minute * 360) /12 / 60)) / 100); y = tmp; - DrawLcdLineBresenhamWW(48, 48, x, y, 2); + oswald_draw_line_ww(47, 47, x, y, 2); + // Minute - tmp = 48 + ((40 * f_cos((360 / 60) * minute)) / 100); + tmp = 47 + ((40 * f_cos((360 / 60) * minute)) / 100); x = tmp; - tmp = 48 + ((40 * f_sin((360 / 60) * minute)) / 100); + tmp = 47 + ((40 * f_sin((360 / 60) * minute)) / 100); y = tmp; - DrawLcdLineBresenhamWW(48, 48, x, y, 2); + oswald_draw_line_ww(47, 47, x, y, 2); + if (show_seconds) { // Seconds - tmp = 48 + ((40 * f_cos((360 / 60) * seconds)) / 100); + tmp = 47 + ((40 * f_cos((360 / 60) * seconds)) / 100); x = tmp; - tmp = 48 + ((40 * f_sin((360 / 60) * seconds)) / 100); + tmp = 47 + ((40 * f_sin((360 / 60) * seconds)) / 100); y = tmp; - DrawLcdLineBresenham(48, 48, x, y); + oswald_draw_line(47, 47, x, y); }; + draw_status_icons(); + hal_lcd_update_display(); } +static const char *daynames[7] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; + void DrawLcdDigitalClock(boolean show_seconds) { - int gRow = 3; - int gColumn = 3; + int gRow = 1; + int gColumn = 1; char tstr[16]; + int i; - SetFont(MetaWatchTime); - - hal_lcd_clear_display(); - //gRow += WriteLcdCharacter(ui, gRow, gColumn, TIME_CHARACTER_SPACE_INDEX); - if (OswaldClk.clk24hr) { - gRow += WriteLcdCharacter(gRow, gColumn, (OswaldClk.hour / 10)); - gRow += WriteLcdCharacter(gRow, gColumn, (OswaldClk.hour % 10)); - } else { - unsigned char val = OswaldClk.hour; - if (val > 12) - val -= 12; - gRow += WriteLcdCharacter(gRow, gColumn, (val / 10)); - gRow += WriteLcdCharacter(gRow, gColumn, (val % 10)); - } - gRow += WriteLcdCharacter(gRow, gColumn, TIME_CHARACTER_COLON_INDEX); - gRow += WriteLcdCharacter(gRow, gColumn, (OswaldClk.minute / 10)); - gRow += WriteLcdCharacter(gRow, gColumn, (OswaldClk.minute % 10)); - - gRow += 3; - if (show_seconds) { - SetFont(MetaWatch16); - snprintf(tstr, 16, "%02d", OswaldClk.second); - WriteLcdString(gRow, 9, tstr); - }; - - SetFont(MetaWatch7); - - if (!OswaldClk.clk24hr) { - if (OswaldClk.hour > 12) { - WriteLcdString(gRow, 3, "PM"); - } else { - WriteLcdString(gRow, 3, "AM"); - } - } - - SetFont(MetaWatch16); - - if (OswaldClk.day_first) - snprintf(tstr, 16, "%d.%d.%d", OswaldClk.day, OswaldClk.month, OswaldClk.year); - else - snprintf(tstr, 16, "%d/%d %d", OswaldClk.month, OswaldClk.day, OswaldClk.year); - WriteLcdString(3, 25, tstr); - +#if 0 snprintf(tstr, 16, "%d%% (%dmV)", OswaldPowerState.percent, OswaldPowerState.level); WriteLcdString(2, 48, tstr); WriteLcdString(2, 64, OswaldPowerState.source ? "ext" : "bat"); @@ -198,6 +234,56 @@ void DrawLcdDigitalClock(boolean show_seconds) break; }; }; +#endif + hal_lcd_clear_display(); + + if (OswaldClk.clk24hr) { + gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (OswaldClk.hour / 10)); + gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (OswaldClk.hour % 10)); + } else { + unsigned char val = OswaldClk.hour; + if (val > 12) { + val -= 12; + oswald_write_string(59, 0, FONT_6x9, FALSE, "PM"); + } else { + oswald_write_string(59, 0, FONT_6x9, FALSE, "AM"); + } + gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (val / 10)); + gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (val % 10)); + } + if (OswaldClk.second % 2) + oswald_write_character(gRow-4, gColumn, FONT_LCD13x21, FALSE, 10); + gRow += 5; + gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (OswaldClk.minute / 10)); + gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (OswaldClk.minute % 10)); + + if (show_seconds) { + oswald_write_character(59, 9, FONT_LCD8x13, FALSE, (OswaldClk.second / 10)); + oswald_write_character(67, 9, FONT_LCD8x13, FALSE, (OswaldClk.second % 10)); + } + + if (OswaldClk.day_first) + snprintf(tstr, 16, "%s %d.%d.%d", daynames[OswaldClk.wday], OswaldClk.day, OswaldClk.month, OswaldClk.year); + else + snprintf(tstr, 16, "%s %d/%d %d", daynames[OswaldClk.wday], OswaldClk.month, OswaldClk.day, OswaldClk.year); + oswald_write_string(0, 25, FONT_DROID8x12, FALSE, tstr); + + gRow = 0; + gColumn = 45; + for (i=0; i 90) { + gRow = 0; + gColumn += 9; + } + if (gColumn > 86) + i = 255; + } + + draw_status_icons(); + hal_lcd_update_display(); }