X-Git-Url: https://git.karo-electronics.de/?p=oswald.git;a=blobdiff_plain;f=ui%2Foswald_watch_faces.c;h=b955c74af738776008b35a775c8617b7c6d7dbf4;hp=7e27fd40ca58a80cd81cc421fbde2c37693103e7;hb=HEAD;hpb=b83e605bc8ba69950a84b6ed268f0c196f68762c diff --git a/ui/oswald_watch_faces.c b/ui/oswald_watch_faces.c index 7e27fd4..b955c74 100644 --- a/ui/oswald_watch_faces.c +++ b/ui/oswald_watch_faces.c @@ -3,22 +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" -#include "battery0_icon.xbm" -#include "battery25_icon.xbm" -#include "battery50_icon.xbm" -#include "battery75_icon.xbm" -#include "battery100_icon.xbm" -#include "charger_icon.xbm" -#include "bluetooth_icon.xbm" +#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, @@ -71,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; @@ -95,127 +159,57 @@ 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 (OswaldPowerState.source) - oswald_draw_bitmap(81, 4, charger_icon_width, charger_icon_height, charger_icon_bits); - - if (OswaldPowerState.percent > 75) - oswald_draw_bitmap(81, 4, battery100_icon_width, battery100_icon_height, battery100_icon_bits); - else if (OswaldPowerState.percent > 50) - oswald_draw_bitmap(81, 4, battery75_icon_width, battery75_icon_height, battery75_icon_bits); - else if (OswaldPowerState.percent > 25) - oswald_draw_bitmap(81, 4, battery50_icon_width, battery50_icon_height, battery50_icon_bits); - else if (OswaldPowerState.percent > 5) - oswald_draw_bitmap(81, 4, battery25_icon_width, battery25_icon_height, battery25_icon_bits); - else - oswald_draw_bitmap(81, 4, battery0_icon_width, battery0_icon_height, battery0_icon_bits); - - - if (hal_bluetooth_get_state() >= BLUETOOTH_ON) - oswald_draw_bitmap(81, 4, bluetooth_icon_width, bluetooth_icon_height, bluetooth_icon_bits); - - gRow = 0; - gColumn = 45; - SetFont(MetaWatch5); - for (i=0; i 90) { - gRow = 0; - gColumn += 7; - } - if (gColumn > 95) - i = 255; - } #if 0 snprintf(tstr, 16, "%d%% (%dmV)", OswaldPowerState.percent, OswaldPowerState.level); WriteLcdString(2, 48, tstr); @@ -241,6 +235,64 @@ void DrawLcdDigitalClock(boolean show_seconds) }; }; #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; + } + // OK, screen ends, leave the loop, no matter what + if (gColumn > 86) + i = 255; + } + + draw_status_icons(); + hal_lcd_update_display(); }