299 lines
9.4 KiB
C
299 lines
9.4 KiB
C
![]() |
#include <stdio.h>
|
||
|
#include <stdint.h>
|
||
|
|
||
|
#include "oswald.h"
|
||
|
#include "oswald_main.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)
|
||
|
{
|
||
|
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;
|
||
|
if (hour < 0)
|
||
|
hour += 12;
|
||
|
// mf = (1. / 59.) * (double)minute;
|
||
|
minute -= 15;
|
||
|
if (minute < 0)
|
||
|
minute += 60;
|
||
|
seconds -= 15;
|
||
|
if (seconds < 0)
|
||
|
seconds += 60;
|
||
|
|
||
|
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++) {
|
||
|
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 = 47 + (30 * f_cos(((360 / 12) * hour) + ((OswaldClk.minute * 360) /12 / 60)) / 100);
|
||
|
x = tmp;
|
||
|
tmp = 47 + (30 * f_sin(((360 / 12) * hour) + ((OswaldClk.minute * 360) /12 / 60)) / 100);
|
||
|
y = tmp;
|
||
|
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;
|
||
|
oswald_draw_line_ww(47, 47, x, y, 2);
|
||
|
|
||
|
if (show_seconds) {
|
||
|
// Seconds
|
||
|
tmp = 47 + ((40 * f_cos((360 / 60) * seconds)) / 100);
|
||
|
x = tmp;
|
||
|
tmp = 47 + ((40 * f_sin((360 / 60) * seconds)) / 100);
|
||
|
y = tmp;
|
||
|
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 = 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<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();
|
||
|
}
|
||
|
|