#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"
-#include "bluetooth_con_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,
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))
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);
- DrawLcdLineBresenhamWW(x, y, x2, y2, 2);
+ oswald_draw_line_ww(x, y, x2, y2, 2);
// g_printerr("br %d,%d %d,%d\n", x,y,x2,y2);
};
x = tmp;
tmp = 47 + (30 * f_sin(((360 / 12) * hour) + ((OswaldClk.minute * 360) /12 / 60)) / 100);
y = tmp;
- DrawLcdLineBresenhamWW(47, 47, x, y, 2);
+ oswald_draw_line_ww(47, 47, x, y, 2);
// Minute
tmp = 47 + ((40 * f_cos((360 / 60) * minute)) / 100);
x = tmp;
tmp = 47 + ((40 * f_sin((360 / 60) * minute)) / 100);
y = tmp;
- DrawLcdLineBresenhamWW(47, 47, x, y, 2);
+ oswald_draw_line_ww(47, 47, x, y, 2);
if (show_seconds) {
// Seconds
x = tmp;
tmp = 47 + ((40 * f_sin((360 / 60) * seconds)) / 100);
y = tmp;
- DrawLcdLineBresenham(47, 47, 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
- 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);
-#else
- draw_status_icons();
-#endif
-
- gRow = 0;
- gColumn = 45;
- SetFont(MetaWatch5);
- for (i=0; i<strlen(MainMessage); i++) {
- gRow += WriteLcdCharacter(gRow, gColumn, MainMessage[i]);
- if (gRow > 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);
};
};
#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<strlen(MainMessage); i++) {
+ // do not draw a whitespace as first character of a row
+ if (gRow == 0 && MainMessage[i] == ' ')
+ continue;
+ // interpret new line
+ if (MainMessage[i] == '\n') {
+ gRow = 0;
+ gColumn += 9;
+ continue;
+ }
+ gRow += oswald_write_character(gRow, gColumn, FONT_DROID8x12, FALSE, MainMessage[i]);
+ // wrap to new line if line is full
+ if (gRow > 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();
}