X-Git-Url: https://git.karo-electronics.de/?p=oswald.git;a=blobdiff_plain;f=ui%2Foswald_watch_faces.c;h=b955c74af738776008b35a775c8617b7c6d7dbf4;hp=f8897df77513fdc50ab0f17123ea6ffb7b517f5e;hb=5cb2f89d7c30198f08f6b11b558e84e884adbfc7;hpb=e09935ae9396421171a3bc4e32320874a0bfd193 diff --git a/ui/oswald_watch_faces.c b/ui/oswald_watch_faces.c index f8897df..b955c74 100644 --- a/ui/oswald_watch_faces.c +++ b/ui/oswald_watch_faces.c @@ -1,88 +1,298 @@ -#include +#include +#include #include "oswald.h" #include "oswald_main.h" -#include "oswald-ui.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, + 34, 36, 37, 39, 41, 42, 44, 45, 47, 48, + 50, 52, 53, 54, 56, 57, 59, 60, 62, 63, + 64, 66, 67, 68, 69, 71, 72, 73, 74, 75, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 87, 88, 89, 90, 91, 91, 92, 93, 93, + 94, 95, 95, 96, 96, 97, 97, 97, 98, 98, + 98, 99, 99, 99, 99, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 99, 99, 99, 99, + 98, 98, 98, 97, 97, 97, 96, 96, 95, 95, + 94, 93, 93, 92, 91, 91, 90, 89, 88, 87, + 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, + 77, 75, 74, 73, 72, 71, 69, 68, 67, 66, + 64, 63, 62, 60, 59, 57, 56, 54, 53, 52, + 50, 48, 47, 45, 44, 42, 41, 39, 37, 36, + 34, 33, 31, 29, 28, 26, 24, 22, 21, 19, + 17, 16, 14, 12, 10, 9, 7, 5, 3, 2, + 0, -2, -3, -5, -7, -9, -10, -12, -14, -16, + -17, -19, -21, -22, -24, -26, -28, -29, -31, -33, + -34, -36, -37, -39, -41, -42, -44, -45, -47, -48, + -50, -52, -53, -54, -56, -57, -59, -60, -62, -63, + -64, -66, -67, -68, -69, -71, -72, -73, -74, -75, + -77, -78, -79, -80, -81, -82, -83, -84, -85, -86, + -87, -87, -88, -89, -90, -91, -91, -92, -93, -93, + -94, -95, -95, -96, -96, -97, -97, -97, -98, -98, + -98, -99, -99, -99, -99,-100,-100,-100,-100,-100, + -100,-100,-100,-100,-100,-100, -99, -99, -99, -99, + -98, -98, -98, -97, -97, -97, -96, -96, -95, -95, + -94, -93, -93, -92, -91, -91, -90, -89, -88, -87, + -87, -86, -85, -84, -83, -82, -81, -80, -79, -78, + -77, -75, -74, -73, -72, -71, -69, -68, -67, -66, + -64, -63, -62, -60, -59, -57, -56, -54, -53, -52, + -50, -48, -47, -45, -44, -42, -41, -39, -37, -36, + -34, -33, -31, -29, -28, -26, -24, -22, -21, -19, + -17, -16, -14, -12, -10, -9, -7, -5, -3, -2 +}; + +int16_t f_sin(int16_t v) +{ + v %= 360; + return sintab[v]; +} + +int16_t f_cos(int16_t v) +{ + v += 90; + v %= 360; + 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) { - unsigned char *bbuf; - char daystr[5]; - int len; - register i, x, y, x2, y2; - double tmp, mf; - s8t hour, minute, seconds; + int16_t i, x, y, x2, y2; + int16_t tmp; + int8_t hour, minute, seconds; + char tstr[16]; hour = OswaldClk.hour; minute = OswaldClk.minute; seconds = OswaldClk.second; hour -= 3; - mf = (1. / 59.) * (double)minute; + if (hour < 0) + hour += 12; + // mf = (1. / 59.) * (double)minute; minute -= 15; + if (minute < 0) + minute += 60; seconds -= 15; + if (seconds < 0) + seconds += 60; - lcd_clear_display(); + hal_lcd_clear_display(); + 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. * cos(((2. * M_PI) / 12.) * (double)i)); - x = tmp; - tmp = 48 + (43. * sin(((2. * M_PI) / 12.) * (double)i)); - y = tmp; - tmp = 48. + (48. * cos(((2. * M_PI) / 12.) * (double)i)); - x2 = tmp; - tmp = 48 + (48. * sin(((2. * M_PI) / 12.) * (double)i)); - 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. * cos(((2. * M_PI) / 12.) * ((double)hour + mf))); + tmp = 47 + (30 * f_cos(((360 / 12) * hour) + ((OswaldClk.minute * 360) /12 / 60)) / 100); x = tmp; - tmp = 48 + (30. * sin(((2. * M_PI) / 12.) * ((double)hour + mf))); + 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. * cos(((2. * M_PI) / 60.) * (double)minute)); + tmp = 47 + ((40 * f_cos((360 / 60) * minute)) / 100); x = tmp; - tmp = 48 + (40. * sin(((2. * M_PI) / 60.) * (double)minute)); + 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. * cos(((2. * M_PI) / 60.) * (double)seconds)); + tmp = 47 + ((40 * f_cos((360 / 60) * seconds)) / 100); x = tmp; - tmp = 48 + (40. * sin(((2. * M_PI) / 60.) * (double)seconds)); + tmp = 47 + ((40 * f_sin((360 / 60) * seconds)) / 100); y = tmp; - DrawLcdLineBresenham(48, 48, x, y); + oswald_draw_line(47, 47, x, y); }; - //snprintf(daystr, 5, "%d", day); - // mw_buf_print(mwbuf, 74, 45, daystr, 0, MW_WHITE, MW_BLACK); + draw_status_icons(); + + hal_lcd_update_display(); } +static const char *daynames[7] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; + void DrawLcdDigitalClock(boolean show_seconds) { - gint gRow = 3; - gint gColumn = 4; - - SetFont(MetaWatchTime); - - lcd_clear_display(); - //gRow += WriteLcdCharacter(ui, gRow, gColumn, TIME_CHARACTER_SPACE_INDEX); - gRow += WriteLcdCharacter(gRow, gColumn, (OswaldClk.hour / 10)); - gRow += WriteLcdCharacter(gRow, gColumn, (OswaldClk.hour % 10)); - gRow += WriteLcdCharacter(gRow, gColumn, TIME_CHARACTER_COLON_INDEX); - gRow += WriteLcdCharacter(gRow, gColumn, (OswaldClk.minute / 10)); - gRow += WriteLcdCharacter(gRow, gColumn, (OswaldClk.minute % 10)); - if (show_seconds) { - gRow += WriteLcdCharacter(gRow, gColumn, TIME_CHARACTER_COLON_INDEX); - gRow += WriteLcdCharacter(gRow, gColumn, (OswaldClk.second / 10)); - gRow += WriteLcdCharacter(gRow, gColumn, (OswaldClk.second % 10)); + int gRow = 1; + int gColumn = 1; + char tstr[16]; + int i; + +#if 0 + snprintf(tstr, 16, "%d%% (%dmV)", OswaldPowerState.percent, OswaldPowerState.level); + WriteLcdString(2, 48, tstr); + WriteLcdString(2, 64, OswaldPowerState.source ? "ext" : "bat"); + + /* this makes only sense when the charger is active */ + if (OswaldPowerState.source) { + switch (OswaldPowerState.charge_state) { + case POWER_CHARGER_DONE: + WriteLcdString(2, 80, "charge done"); + break; + case POWER_CHARGER_PRECHARGE: + WriteLcdString(2, 80, "precharging"); + break; + case POWER_CHARGER_CHARGING: + WriteLcdString(2, 80, "charging"); + break; + case POWER_CHARGER_UNK: + WriteLcdString(2, 80, "charge unkn."); + break; + default: + 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; + } + // OK, screen ends, leave the loop, no matter what + if (gColumn > 86) + i = 255; + } + + draw_status_icons(); + + hal_lcd_update_display(); }