]> git.karo-electronics.de Git - oswald.git/blobdiff - ui/oswald_screens.c
Power saving changes, add new fonts, bitmaps and screens
[oswald.git] / ui / oswald_screens.c
index 5a29d39f3eeb0b96e7c0a26f38fcdc151a6839c5..ab7140847b2bc4e6d9aac37779b284045e4eefa6 100644 (file)
 #if defined(__GNUC__) && (__MSP430X__ > 0)
 __attribute__((__far__))
 #endif
-#include "bitmaps/timesetup_icon.xbm"
+#include "bitmaps/startstopbutton_icon.xbm"
 
 #if defined(__GNUC__) && (__MSP430X__ > 0)
 __attribute__((__far__))
 #endif
-#include "bitmaps/stopwatch_icon.xbm"
+#include "bitmaps/lapsebutton_icon.xbm"
 
 #if defined(__GNUC__) && (__MSP430X__ > 0)
 __attribute__((__far__))
 #endif
-#include "bitmaps/alarm_icon.xbm"
+#include "bitmaps/upbutton_icon.xbm"
 
 #if defined(__GNUC__) && (__MSP430X__ > 0)
 __attribute__((__far__))
 #endif
-#include "bitmaps/startstopbutton_icon.xbm"
+#include "bitmaps/downbutton_icon.xbm"
 
 #if defined(__GNUC__) && (__MSP430X__ > 0)
 __attribute__((__far__))
 #endif
-#include "bitmaps/lapsebutton_icon.xbm"
+#include "bitmaps/leftbutton_icon.xbm"
 
 #if defined(__GNUC__) && (__MSP430X__ > 0)
 __attribute__((__far__))
 #endif
-#include "bitmaps/upbutton_icon.xbm"
+#include "bitmaps/rightbutton_icon.xbm"
 
 #if defined(__GNUC__) && (__MSP430X__ > 0)
 __attribute__((__far__))
 #endif
-#include "bitmaps/downbutton_icon.xbm"
+#include "bitmaps/enterbutton_icon.xbm"
+
+#if defined(__GNUC__) && (__MSP430X__ > 0)
+__attribute__((__far__))
+#endif
+#include "bitmaps/checked_icon.xbm"
+
+#if defined(__GNUC__) && (__MSP430X__ > 0)
+__attribute__((__far__))
+#endif
+#include "bitmaps/unchecked_icon.xbm"
+
+#if defined(__GNUC__) && (__MSP430X__ > 0)
+__attribute__((__far__))
+#endif
+#include "bitmaps/main_menu_icon.xbm"
+
+#if defined(__GNUC__) && (__MSP430X__ > 0)
+__attribute__((__far__))
+#endif
+#include "bitmaps/timesetup_icon.xbm"
+
+#if defined(__GNUC__) && (__MSP430X__ > 0)
+__attribute__((__far__))
+#endif
+#include "bitmaps/stopwatch_icon.xbm"
+
+#if defined(__GNUC__) && (__MSP430X__ > 0)
+__attribute__((__far__))
+#endif
+#include "bitmaps/alarm_icon.xbm"
 
 #if defined(__GNUC__) && (__MSP430X__ > 0)
 __attribute__((__far__))
@@ -58,6 +88,15 @@ __attribute__((__far__))
 #endif
 #include "bitmaps/acc_icon.xbm"
 
+#if defined(__GNUC__) && (__MSP430X__ > 0)
+__attribute__((__far__))
+#endif
+#include "bitmaps/Message_icon.xbm"
+
+#if defined(__GNUC__) && (__MSP430X__ > 0)
+__attribute__((__far__))
+#endif
+#include "bitmaps/Exit_icon.xbm"
 
 
 /*
@@ -93,7 +132,10 @@ event_ret_t idle_handle_user_buttons(watch_button button)
                        };
                        break;
                case BUTTON_C:
-                       return EVENT_RET_UNHANDLED;
+                       OswaldState.screen_id = MAIN_MENU_SCREEN;
+                       OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
+                       OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
+                       return EVENT_RET_HANDLED;
                        break;
                case BUTTON_F:
                        OswaldState.screen_id = DATETIME_SETTING_SCREEN;
@@ -131,6 +173,141 @@ event_ret_t idle_handle_events(uint16_t event, void *data)
 }
 
 
+/*
+ * Main Menu Screen
+ */
+typedef struct {
+       int8_t pos;
+       uint8_t tmo;
+} main_menu_data_t;
+static main_menu_data_t main_menu_screen = {
+       ALARM_SETUP_SCREEN,
+       0,
+};
+
+#define MAIN_MENU_GRID_PIXEL   84
+#define MAIN_MENU_GRID_X       3
+// GRID_Y is +1 since there is one empty row for title icon
+#define MAIN_MENU_GRID_Y       3
+#define MAIN_MENU_GRID_SPACING 0
+#define MAIN_MENU_OFFSET_X     3
+#define MAIN_MENU_OFFSET_Y     10
+
+void draw_main_menu_screen(main_menu_data_t *sdata)
+{
+       uint8_t pf = sdata->pos - 2;
+
+       hal_lcd_clear_display();
+
+//     oswald_draw_bitmap(36, 0, main_menu_icon_width, main_menu_icon_height, main_menu_icon_bits);
+
+       oswald_draw_bitmap(81, 6, rightbutton_icon_width, rightbutton_icon_height, rightbutton_icon_bits);
+       oswald_draw_bitmap(81, 38, leftbutton_icon_width, leftbutton_icon_height, leftbutton_icon_bits);
+       oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
+
+       oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((0+1) * MAIN_MENU_GRID_SPACING) + (0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
+               MAIN_MENU_OFFSET_Y+(0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
+               alarm_icon_width, alarm_icon_height, alarm_icon_bits, (sdata->pos == ALARM_SETUP_SCREEN));
+       oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((1+1) * MAIN_MENU_GRID_SPACING) + (1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
+               MAIN_MENU_OFFSET_Y+(0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
+               stopwatch_icon_width, stopwatch_icon_height, stopwatch_icon_bits, (sdata->pos == STOP_WATCH_SCREEN));
+       oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((2+1) * MAIN_MENU_GRID_SPACING) + (2 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
+               MAIN_MENU_OFFSET_Y+(0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
+               Bluetooth_icon_width, Bluetooth_icon_height, Bluetooth_icon_bits, (sdata->pos == BLUETOOTH_SCREEN));
+       oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((0+1) * MAIN_MENU_GRID_SPACING) + (0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
+               MAIN_MENU_OFFSET_Y+(1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
+               acc_icon_width, acc_icon_height, acc_icon_bits, (sdata->pos == ACCEL_DISPLAY_SCREEN));
+       oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((1+1) * MAIN_MENU_GRID_SPACING) + (1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
+               MAIN_MENU_OFFSET_Y+(1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
+               Message_icon_width, Message_icon_height, Message_icon_bits, (sdata->pos == MESSAGES_SCREEN));
+       oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((2+1) * MAIN_MENU_GRID_SPACING) + (2 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
+               MAIN_MENU_OFFSET_Y+(1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
+               info_icon_width, info_icon_height, info_icon_bits, (sdata->pos == INFO_SCREEN));
+       oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((0+1) * MAIN_MENU_GRID_SPACING) + (0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
+               MAIN_MENU_OFFSET_Y+(2 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
+               Exit_icon_width, Exit_icon_height, Exit_icon_bits, (sdata->pos == LAST_SCREEN));
+
+       // round the corners of the inverted icon a little
+       hal_lcd_set_pixel(MAIN_MENU_OFFSET_X+((pf%MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)) % (MAIN_MENU_GRID_X*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
+               MAIN_MENU_OFFSET_Y+((pf/MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)) % (MAIN_MENU_GRID_Y*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)), FALSE);
+       hal_lcd_set_pixel(MAIN_MENU_OFFSET_X+23+((pf%MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)) % (MAIN_MENU_GRID_X*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
+               MAIN_MENU_OFFSET_Y+((pf/MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)) % (MAIN_MENU_GRID_Y*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)), FALSE);
+       hal_lcd_set_pixel(MAIN_MENU_OFFSET_X+((pf%MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)) % (MAIN_MENU_GRID_X*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
+               MAIN_MENU_OFFSET_Y+23+((pf/MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)) % (MAIN_MENU_GRID_Y*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)), FALSE);
+       hal_lcd_set_pixel(MAIN_MENU_OFFSET_X+23+((pf%MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)) % (MAIN_MENU_GRID_X*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
+               MAIN_MENU_OFFSET_Y+23+((pf/MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)) % (MAIN_MENU_GRID_Y*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)), FALSE);
+
+       hal_lcd_update_display();
+}
+
+event_ret_t handle_main_menu_buttons(watch_button button, main_menu_data_t *sdata)
+{
+       switch (button) {
+               case BUTTON_A:
+                       sdata->pos++;
+                       if (sdata->pos > LAST_SCREEN)
+                               sdata->pos = 2;
+                       draw_main_menu_screen(&main_menu_screen);
+                       return EVENT_RET_HANDLED;
+                       break;
+               case BUTTON_B:
+                       sdata->pos--;
+                       if (sdata->pos < 2)
+                               sdata->pos = LAST_SCREEN;
+                       draw_main_menu_screen(&main_menu_screen);
+                       return EVENT_RET_HANDLED;
+                       break;
+               case BUTTON_C:
+                       if (sdata->pos < LAST_SCREEN) {
+                               OswaldState.screen_id = sdata->pos;
+                               OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
+                               OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
+                       } else {
+                               OswaldState.screen_id = IDLE_SCREEN;
+                               OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
+                               OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
+                       }
+                       return EVENT_RET_HANDLED;
+                       break;
+               default:
+                       break;
+       }
+
+       return EVENT_RET_UNHANDLED;
+}
+
+/* after MAIN_MENU_TIMEOUT seconds return to IDLE_SCREEN */
+#define MAIN_MENU_TIMEOUT      10
+
+event_ret_t main_menu_handle_events(uint16_t event, void *data)
+{
+       switch (event) {
+               case EVENT_SCREEN_VISIBLE:
+                       main_menu_screen.tmo = 0;
+                       main_menu_screen.pos = 2;
+                       draw_main_menu_screen(&main_menu_screen);
+                       return EVENT_RET_HANDLED;
+                       break;
+               case EVENT_USER_BUTTONS:
+                       dbg_out("button event %d\n", *(int *)data);
+                       main_menu_screen.tmo = 0;
+                       return handle_main_menu_buttons(*(watch_button *)data, &main_menu_screen);
+                       break;
+               case EVENT_ONE_SEC_TIMER:
+                       main_menu_screen.tmo++;
+                       if (main_menu_screen.tmo > MAIN_MENU_TIMEOUT) {
+                               OswaldState.screen_id = IDLE_SCREEN;
+                               OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
+                               OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
+                       }
+                       return EVENT_RET_HANDLED;
+               default:
+                       break;
+       };
+       return EVENT_RET_UNHANDLED;
+}
+
+
 /*
  * Accelerometer and sensor display screen
  */
@@ -149,15 +326,17 @@ void draw_accel_screen(accel_data_t *accel_data)
 
        oswald_draw_bitmap(36, 0, acc_icon_width, acc_icon_height, acc_icon_bits);
 
-       oswald_write_string(1, 40, FONT_6x9, "X:");
-       oswald_write_number(15, 40, FONT_6x9, accel_data->x);
-       oswald_write_string(1, 52, FONT_6x9, "Y:");
-       oswald_write_number(15, 52, FONT_6x9, accel_data->y);
-       oswald_write_string(1, 64, FONT_6x9, "Z:");
-       oswald_write_number(15, 64, FONT_6x9, accel_data->z);
+       oswald_draw_bitmap(81, 79, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
+
+       oswald_write_string(1, 40, FONT_6x9, FALSE, "X:");
+       oswald_write_number(15, 40, FONT_6x9, FALSE, accel_data->x);
+       oswald_write_string(1, 52, FONT_6x9, FALSE, "Y:");
+       oswald_write_number(15, 52, FONT_6x9, FALSE, accel_data->y);
+       oswald_write_string(1, 64, FONT_6x9, FALSE, "Z:");
+       oswald_write_number(15, 64, FONT_6x9, FALSE, accel_data->z);
 
-       oswald_write_string(1, 85, FONT_6x9, "Light:");
-       oswald_write_number(50, 85, FONT_6x9, 0);
+       oswald_write_string(1, 85, FONT_6x9, FALSE, "Light:");
+       oswald_write_number(50, 85, FONT_6x9, FALSE, 0);
 
        oswald_draw_line(40, 30, 92, 30);
        oswald_draw_line(92, 30, 92, 82);
@@ -166,11 +345,11 @@ void draw_accel_screen(accel_data_t *accel_data)
 
        x = 41+25+((accel_data->x * 50) / (254));
        y = 31+25-((accel_data->y * 50) / (254));
-       oswald_draw_pixel(x, y);
-       oswald_draw_pixel(x+1, y);
-       oswald_draw_pixel(x-1, y);
-       oswald_draw_pixel(x, y+1);
-       oswald_draw_pixel(x, y-1);
+       oswald_draw_pixel(x, y, TRUE);
+       oswald_draw_pixel(x+1, y, TRUE);
+       oswald_draw_pixel(x-1, y, TRUE);
+       oswald_draw_pixel(x, y+1, TRUE);
+       oswald_draw_pixel(x, y-1, TRUE);
 
        hal_lcd_update_display();
 }
@@ -229,53 +408,54 @@ void draw_datetime_setup_screen(datetime_setup_data_t *sdata)
 
        oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
        oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
+       oswald_draw_bitmap(81, 70, rightbutton_icon_width, rightbutton_icon_height, rightbutton_icon_bits);
 
        if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
-               oswald_write_character(2, 30, FONT_LCD13x21, (OswaldClk.hour / 10));
-               oswald_write_character(15, 30, FONT_LCD13x21, (OswaldClk.hour % 10));
+               oswald_write_character(2, 30, FONT_LCD13x21, FALSE, (OswaldClk.hour / 10));
+               oswald_write_character(15, 30, FONT_LCD13x21, FALSE, (OswaldClk.hour % 10));
        }
-       oswald_write_character(25, 30, FONT_LCD13x21, 10);
+       oswald_write_character(25, 30, FONT_LCD13x21, FALSE, 10);
 
        if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
-               oswald_write_character(34, 30, FONT_LCD13x21, (OswaldClk.minute / 10));
-               oswald_write_character(47, 30, FONT_LCD13x21, (OswaldClk.minute % 10));
+               oswald_write_character(34, 30, FONT_LCD13x21, FALSE, (OswaldClk.minute / 10));
+               oswald_write_character(47, 30, FONT_LCD13x21, FALSE, (OswaldClk.minute % 10));
        }
 
        if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2) {
-               oswald_write_character(61, 38, FONT_LCD8x13, (OswaldClk.second / 10));
-               oswald_write_character(69, 38, FONT_LCD8x13, (OswaldClk.second % 10));
+               oswald_write_character(61, 38, FONT_LCD8x13, FALSE, (OswaldClk.second / 10));
+               oswald_write_character(69, 38, FONT_LCD8x13, FALSE, (OswaldClk.second % 10));
        }
 
 
        if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3) {
-               oswald_write_number(2, 55, FONT_DROID8x12, OswaldClk.day);
+               oswald_write_number(2, 55, FONT_DROID8x12, FALSE, OswaldClk.day);
        }
-       oswald_write_character(15, 55, FONT_DROID8x12, '.');
+       oswald_write_character(15, 55, FONT_DROID8x12, FALSE, '.');
        if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4) {
-               oswald_write_number(21, 55, FONT_DROID8x12, OswaldClk.month);
+               oswald_write_number(21, 55, FONT_DROID8x12, FALSE, OswaldClk.month);
        }
-       oswald_write_character(36, 55, FONT_DROID8x12, '.');
+       oswald_write_character(36, 55, FONT_DROID8x12, FALSE, '.');
        if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5) {
-               oswald_write_number(43, 55, FONT_DROID8x12, OswaldClk.year);
+               oswald_write_number(43, 55, FONT_DROID8x12, FALSE, OswaldClk.year);
        }
 
        if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6) {
                if (OswaldClk.clk24hr) {
-                       oswald_write_character(2, 76, FONT_6x9, 'x');
+                       oswald_draw_bitmap(2, 76, checked_icon_width, checked_icon_height, checked_icon_bits);
                } else {
-                       oswald_write_character(2, 76, FONT_6x9, '_');
+                       oswald_draw_bitmap(2, 76, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
                }
        }
-       oswald_write_string(15, 73, FONT_DROID8x12, "24hr");
+       oswald_write_string(15, 73, FONT_DROID8x12, FALSE, "24hr");
 
        if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7) {
                if (OswaldClk.day_first) {
-                       oswald_write_character(2, 86, FONT_6x9, 'x');
+                       oswald_draw_bitmap(2, 86, checked_icon_width, checked_icon_height, checked_icon_bits);
                } else {
-                       oswald_write_character(2, 86, FONT_6x9, '_');
+                       oswald_draw_bitmap(2, 86, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
                }
        }
-       oswald_write_string(15, 83, FONT_DROID8x12, "dd.mm.  mm/dd");
+       oswald_write_string(15, 83, FONT_DROID8x12, FALSE, "dd.mm.  mm/dd");
 
        hal_lcd_update_display();
 }
@@ -427,42 +607,82 @@ void draw_alarm_setup_screen(alarm_setup_data_t *sdata)
 
        oswald_draw_bitmap(36, 0, alarm_icon_width, alarm_icon_height, alarm_icon_bits);
 
-       oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
-       oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
+       if (sdata->set_mode) {
+               oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
+               oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
+               oswald_draw_bitmap(81, 70, rightbutton_icon_width, rightbutton_icon_height, rightbutton_icon_bits);
+       } else {
+               oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
+       }
 
        if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
-               oswald_write_character(18, 30, FONT_LCD13x21, (OswaldAlarm.hour / 10));
-               oswald_write_character(32, 30, FONT_LCD13x21, (OswaldAlarm.hour % 10));
+               oswald_write_character(18, 30, FONT_LCD13x21, FALSE, (OswaldAlarm.hour / 10));
+               oswald_write_character(32, 30, FONT_LCD13x21, FALSE, (OswaldAlarm.hour % 10));
        }
-       oswald_write_character(42, 30, FONT_LCD13x21, 10);
+       oswald_write_character(42, 30, FONT_LCD13x21, FALSE, 10);
 
        if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
-               oswald_write_character(53, 30, FONT_LCD13x21, (OswaldAlarm.minute / 10));
-               oswald_write_character(67, 30, FONT_LCD13x21, (OswaldAlarm.minute % 10));
+               oswald_write_character(53, 30, FONT_LCD13x21, FALSE, (OswaldAlarm.minute / 10));
+               oswald_write_character(67, 30, FONT_LCD13x21, FALSE, (OswaldAlarm.minute % 10));
        }
 
-       oswald_write_character(3, 55, FONT_6x9, 'S');
-       oswald_write_character(15, 55, FONT_6x9, 'M');
-       oswald_write_character(27, 55, FONT_6x9, 'T');
-       oswald_write_character(39, 55, FONT_6x9, 'W');
-       oswald_write_character(51, 55, FONT_6x9, 'T');
-       oswald_write_character(63, 55, FONT_6x9, 'F');
-       oswald_write_character(75, 55, FONT_6x9, 'S');
-
-       if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2)
-               oswald_write_character(3, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_SUNDAY) ? 'x' : '_');
-       if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3)
-               oswald_write_character(15, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_MONDAY) ? 'x' : '_');
-       if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4)
-               oswald_write_character(27, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_TUESDAY) ? 'x' : '_');
-       if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5)
-               oswald_write_character(39, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_WEDNESDAY) ? 'x' : '_');
-       if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6)
-               oswald_write_character(51, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_THURSDAY) ? 'x' : '_');
-       if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7)
-               oswald_write_character(63, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_FRIDAY) ? 'x' : '_');
-       if ((sdata->pos == 8 && sdata->on) || sdata->pos != 8)
-               oswald_write_character(75, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_SATURDAY) ? 'x' : '_');
+       oswald_write_character(3, 55, FONT_6x9, FALSE, 'S');
+       oswald_write_character(15, 55, FONT_6x9, FALSE, 'M');
+       oswald_write_character(27, 55, FONT_6x9, FALSE, 'T');
+       oswald_write_character(39, 55, FONT_6x9, FALSE, 'W');
+       oswald_write_character(51, 55, FONT_6x9, FALSE, 'T');
+       oswald_write_character(63, 55, FONT_6x9, FALSE, 'F');
+       oswald_write_character(75, 55, FONT_6x9, FALSE, 'S');
+
+       if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2) {
+               // oswald_write_character(3, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_SUNDAY) ? 'x' : '_');
+               if ((OswaldAlarm.wday & WDAY_SUNDAY))
+                       oswald_draw_bitmap(3, 66, checked_icon_width, checked_icon_height, checked_icon_bits);
+               else
+                       oswald_draw_bitmap(3, 66, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
+       }
+       if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3) {
+               // oswald_write_character(15, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_MONDAY) ? 'x' : '_');
+               if ((OswaldAlarm.wday & WDAY_MONDAY))
+                       oswald_draw_bitmap(15, 66, checked_icon_width, checked_icon_height, checked_icon_bits);
+               else
+                       oswald_draw_bitmap(15, 66, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
+       }
+       if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4) {
+               // oswald_write_character(27, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_TUESDAY) ? 'x' : '_');
+               if ((OswaldAlarm.wday & WDAY_TUESDAY))
+                       oswald_draw_bitmap(27, 66, checked_icon_width, checked_icon_height, checked_icon_bits);
+               else
+                       oswald_draw_bitmap(27, 66, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
+       }
+       if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5) {
+               // oswald_write_character(39, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_WEDNESDAY) ? 'x' : '_');
+               if ((OswaldAlarm.wday & WDAY_WEDNESDAY))
+                       oswald_draw_bitmap(39, 66, checked_icon_width, checked_icon_height, checked_icon_bits);
+               else
+                       oswald_draw_bitmap(39, 66, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
+       }
+       if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6) {
+               // oswald_write_character(51, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_THURSDAY) ? 'x' : '_');
+               if ((OswaldAlarm.wday & WDAY_THURSDAY))
+                       oswald_draw_bitmap(51, 66, checked_icon_width, checked_icon_height, checked_icon_bits);
+               else
+                       oswald_draw_bitmap(51, 66, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
+       }
+       if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7) {
+               // oswald_write_character(63, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_FRIDAY) ? 'x' : '_');
+               if ((OswaldAlarm.wday & WDAY_FRIDAY))
+                       oswald_draw_bitmap(63, 66, checked_icon_width, checked_icon_height, checked_icon_bits);
+               else
+                       oswald_draw_bitmap(63, 66, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
+       }
+       if ((sdata->pos == 8 && sdata->on) || sdata->pos != 8) {
+               // oswald_write_character(75, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_SATURDAY) ? 'x' : '_');
+               if ((OswaldAlarm.wday & WDAY_SATURDAY))
+                       oswald_draw_bitmap(75, 66, checked_icon_width, checked_icon_height, checked_icon_bits);
+               else
+                       oswald_draw_bitmap(75, 66, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
+       }
 
        hal_lcd_update_display();
 }
@@ -611,15 +831,15 @@ void draw_menu_test_screen(void)
 
        WriteLcdString(50, 20+(9*test_menu.menu_pos), "*");
 #endif
-       oswald_write_string(2, 2, FONT_DROID11x14b, "Menu");
+       oswald_write_string(2, 2, FONT_DROID8x12, FALSE, "Menu");
 
-       oswald_write_string(2, 20, FONT_DROID8x12, "Item 1");
-       oswald_write_string(2, 29, FONT_DROID8x12, "Item 2");
-       oswald_write_string(2, 38, FONT_DROID8x12, "Item 3");
-       oswald_write_string(2, 47, FONT_DROID8x12, "Item 4");
-       oswald_write_string(2, 56, FONT_DROID8x12, "Item 5");
+       oswald_write_string(2, 20, FONT_DROID8x12, FALSE, "Item 1");
+       oswald_write_string(2, 29, FONT_DROID8x12, FALSE, "Item 2");
+       oswald_write_string(2, 38, FONT_DROID8x12, FALSE, "Item 3");
+       oswald_write_string(2, 47, FONT_DROID8x12, FALSE, "Item 4");
+       oswald_write_string(2, 56, FONT_DROID8x12, FALSE, "Item 5");
 
-       oswald_write_character(50, 18+(9*test_menu.menu_pos), FONT_6x9, 0x11);
+       oswald_write_character(50, 18+(9*test_menu.menu_pos), FONT_6x9, FALSE, 0x11);
 
        hal_lcd_update_display();
 }
@@ -678,29 +898,6 @@ typedef struct {
 } stopwatch_data_t;
 static stopwatch_data_t stopwatch_screen = { 0, 0, 0, 0, 0, 0, 0, 0, FALSE };
 
-#if 0
-static void update_stop_watch_screen(stopwatch_data_t *sdata)
-{
-       //char tstr[16];
-#if 0
-       SetFont(MetaWatchMonospaced10);
-
-       snprintf(tstr, 16, "%02d:%02d:%02d.%1d", sdata->hr, sdata->min, sdata->sec, sdata->csec / 10);
-       WriteLcdString(5, 40, tstr);
-       snprintf(tstr, 16, "%02d:%02d:%02d.%02d", sdata->lapse_hr, sdata->lapse_min, sdata->lapse_sec, sdata->lapse_csec);
-       WriteLcdString(5, 60, tstr);
-#endif
-#if 0
-       snprintf(tstr, 16, "%02d:%02d:%02d.%1d", sdata->hr, sdata->min, sdata->sec, sdata->csec / 10);
-       oswald_write_string(5, 40, FONT_6x9, tstr);
-
-       snprintf(tstr, 16, "%02d:%02d:%02d.%02d", sdata->lapse_hr, sdata->lapse_min, sdata->lapse_sec, sdata->lapse_csec);
-       oswald_write_string(5, 60, FONT_6x9, tstr);
-#endif
-
-       hal_lcd_update_display();
-}
-#endif
 
 static void draw_stop_watch_screen(stopwatch_data_t *sdata)
 {
@@ -710,31 +907,29 @@ static void draw_stop_watch_screen(stopwatch_data_t *sdata)
        hal_lcd_clear_display();
 
        oswald_draw_bitmap(36, 0, stopwatch_icon_width, stopwatch_icon_height, stopwatch_icon_bits);
+
        oswald_draw_bitmap(81, 6, startstopbutton_icon_width, startstopbutton_icon_height, startstopbutton_icon_bits);
        oswald_draw_bitmap(81, 38, lapsebutton_icon_width, lapsebutton_icon_height, lapsebutton_icon_bits);
+       oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
 
-#if 0
-       update_stop_watch_screen(sdata);
-#else
-       gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->hr % 10));
-       gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->min / 10));
-       gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->min % 10));
-       gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->sec / 10));
-       gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->sec % 10));
-       gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->csec / 10));
+       gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->hr % 10));
+       gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->min / 10));
+       gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->min % 10));
+       gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->sec / 10));
+       gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->sec % 10));
+       gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->csec / 10));
 
        gRow = 6;
-       gColumn = 62;
-       gRow += 13 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_hr % 10));
-       gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_min / 10));
-       gRow += 13 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_min % 10));
-       gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_sec / 10));
-       gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_sec % 10));
-       gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_csec / 10));
-       gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_csec % 10));
+       gColumn = 61;
+       gRow += 13 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_hr % 10));
+       gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_min / 10));
+       gRow += 13 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_min % 10));
+       gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_sec / 10));
+       gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_sec % 10));
+       gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_csec / 10));
+       gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_csec % 10));
 
        hal_lcd_update_display();
-#endif
 }
 
 event_ret_t handle_stop_watch_buttons(watch_button button)
@@ -780,12 +975,10 @@ event_ret_t stop_watch_handle_events(uint16_t event, void *data)
        switch (event) {
                case EVENT_USER_BUTTONS:
                        dbg_out("button event %d\n", *(int *)data);
-                       return handle_stop_watch_buttons(*(watch_button *)data);
-                       //update_stop_watch_screen(&stopwatch_screen);
                        draw_stop_watch_screen(&stopwatch_screen);
+                       return handle_stop_watch_buttons(*(watch_button *)data);
                        break;
                case EVENT_SCREEN_VISIBLE:
-                       hal_lcd_clear_display();
                        draw_stop_watch_screen(&stopwatch_screen);
                        return EVENT_RET_HANDLED;
                        break;
@@ -833,6 +1026,8 @@ void draw_alarm_screen(void)
 
        oswald_draw_bitmap(36, 20, alarm_icon_width, alarm_icon_height, alarm_icon_bits);
 
+       oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
+
        hal_lcd_update_display();
 }
 
@@ -894,36 +1089,48 @@ void draw_bluetooth_screen(bluetooth_data_t *sdata)
 
        oswald_draw_bitmap(36, 0, Bluetooth_icon_width, Bluetooth_icon_height, Bluetooth_icon_bits);
 
-       oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
-       oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
+       if (sdata->set_mode) {
+               oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
+               oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
+               oswald_draw_bitmap(81, 70, rightbutton_icon_width, rightbutton_icon_height, rightbutton_icon_bits);
+       } else {
+               oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
+       }
 
-       oswald_write_string(1, 30, FONT_DROID8x12, "Enable:");
+       oswald_write_string(1, 30, FONT_DROID8x12, FALSE, "Enable:");
        if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
-               oswald_write_character(53, 30, FONT_DROID8x12, bluetooth_screen.bt_en ? 'x' : '_');
+               if (bluetooth_screen.bt_en)
+                       oswald_draw_bitmap(53, 33, checked_icon_width, checked_icon_height, checked_icon_bits);
+               else
+                       oswald_draw_bitmap(53, 33, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
        }
-       oswald_write_string(1, 40, FONT_DROID8x12, "State:");
+       oswald_write_string(1, 40, FONT_DROID8x12, FALSE, "State:");
        switch (hal_bluetooth_get_state()) {
                case BLUETOOTH_OFF:
-                       oswald_write_string(53, 40, FONT_DROID8x12, "off");
+                       oswald_write_string(53, 40, FONT_DROID8x12, FALSE, "off");
                        break;
                case BLUETOOTH_ON:
-                       oswald_write_string(53, 40, FONT_DROID8x12, "on");
+                       oswald_write_string(53, 40, FONT_DROID8x12, FALSE, "on");
                        break;
                case BLUETOOTH_CONNECTED:
-                       oswald_write_string(53, 40, FONT_DROID8x12, "conn.");
+                       oswald_write_string(53, 40, FONT_DROID8x12, FALSE, "conn.");
                        break;
                default:
                        break;
        };
-       oswald_write_string(1, 50, FONT_DROID8x12, "Visible:");
+       oswald_write_string(1, 50, FONT_DROID8x12, FALSE, "Visible:");
        if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
-               oswald_write_character(53, 50, FONT_DROID8x12, hal_bluetooth_get_visible() ? 'x' : '_');
+               // oswald_write_character(53, 50, FONT_DROID8x12, hal_bluetooth_get_visible() ? 'x' : '_');
+               if (hal_bluetooth_get_visible())
+                       oswald_draw_bitmap(53, 53, checked_icon_width, checked_icon_height, checked_icon_bits);
+               else
+                       oswald_draw_bitmap(53, 53, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
        }
 
        if (hal_bluetooth_get_state() >= BLUETOOTH_ON) {
                bd_addr = hal_bluetooth_get_local_bdaddr();
                snprintf(bstr, 20, "%02x:%02x:%02x:%02x:%02x:%02x", bd_addr[5], bd_addr[4], bd_addr[3], bd_addr[2], bd_addr[1], bd_addr[0]);
-               oswald_write_string(2, 85, FONT_5x7, bstr);
+               oswald_write_string(2, 85, FONT_5x7, FALSE, bstr);
        } else {
        }
 
@@ -949,20 +1156,6 @@ void bluetooth_handle_updown(uint8_t pos, int8_t incr)
                                hal_bluetooth_set_visible(FALSE);
                        }
                        break;
-               case 2:
-                       break;
-               case 3:
-                       break;
-               case 4:
-                       break;
-               case 5:
-                       break;
-               case 6:
-                       break;
-               case 7:
-                       break;
-               case 8:
-                       break;
                default:
                        break;
        };
@@ -1042,20 +1235,22 @@ event_ret_t bluetooth_screen_events(uint16_t event, void *data)
 /*
  * Info Screen
  */
-void draw_info_screen(accel_data_t *accel_data)
+void draw_info_screen(void)
 {
        hal_lcd_clear_display();
 
        oswald_draw_bitmap(36, 0, info_icon_width, info_icon_height, info_icon_bits);
 
-       oswald_write_string(2, 29, FONT_DROID8x12, "Oswald");
-       oswald_write_string(35, 29, FONT_DROID8x12, OSWALD_VERSION);
-       oswald_write_string(2, 41, FONT_DROID8x12, "HAL");
-       oswald_write_string(35, 41, FONT_DROID8x12, (char *)hal_get_version_string());
-       oswald_write_string(2, 53, FONT_DROID8x12, "Build");
-       oswald_write_string(35, 53, FONT_DROID8x12, (char *)hal_get_buildno_string());
-       oswald_write_string(2, 65, FONT_DROID8x12, "Radio");
-       oswald_write_string(35, 65, FONT_DROID8x12, (char *)hal_get_radio_version_string());
+       oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
+
+       oswald_write_string(2, 29, FONT_DROID8x12, FALSE, "Oswald");
+       oswald_write_string(35, 29, FONT_DROID8x12, FALSE, OSWALD_VERSION);
+       oswald_write_string(2, 41, FONT_DROID8x12, FALSE, "HAL");
+       oswald_write_string(35, 41, FONT_DROID8x12, FALSE, (char *)hal_get_version_string());
+       oswald_write_string(2, 53, FONT_DROID8x12, FALSE, "Build");
+       oswald_write_string(35, 53, FONT_DROID8x12, FALSE, (char *)hal_get_buildno_string());
+       oswald_write_string(2, 65, FONT_DROID8x12, FALSE, "Radio");
+       oswald_write_string(35, 65, FONT_DROID8x12, FALSE, (char *)hal_get_radio_version_string());
 
        hal_lcd_update_display();
 }
@@ -1064,7 +1259,7 @@ event_ret_t info_screen_handle_events(uint16_t event, void *data)
 {
        switch (event) {
                case EVENT_SCREEN_VISIBLE:
-                       draw_info_screen(&accel_screen.accdata);
+                       draw_info_screen();
                        return EVENT_RET_HANDLED;
                        break;
                case EVENT_USER_BUTTONS:
@@ -1077,3 +1272,248 @@ event_ret_t info_screen_handle_events(uint16_t event, void *data)
        return EVENT_RET_UNHANDLED;
 }
 
+
+/*
+ * Messages Screens
+ */
+typedef struct {
+       int8_t pos;     // marker position
+       int8_t offset;  // offset in msg list
+} messages_data_t;
+static messages_data_t messages_screen = {
+       0,
+       0,
+};
+
+typedef struct {
+       uint8_t day;
+       uint8_t month;
+       uint8_t year;   // without century, add +1900
+       uint8_t hour;
+       uint8_t minute;
+} msg_timedate_t;
+
+#define MSG_TYPE_READ          0
+#define MSG_TYPE_NEW           1
+#define MSG_TYPE_END           127
+
+typedef struct {
+       uint8_t type;
+       msg_timedate_t td;
+       char *msg;
+} message_t;
+
+uint8_t Msgs = 15;
+message_t Msg[] = {
+       { MSG_TYPE_READ, {9,5,113,0,38}, "Testmessage with more text than fits into the menu." },
+       { MSG_TYPE_NEW, {9,5,113,0,39}, "Sitting in the train waiting to arrive." },
+       { MSG_TYPE_READ, {9,5,113,0,40}, "People in the train are annoying!" },
+       { MSG_TYPE_READ, {9,5,113,0,40}, "Auch auf Deutsch geht das hier und Text können lang sein." },
+       { MSG_TYPE_NEW, {8,5,113,0,40}, "Und hier noch eine neue Nachricht, die nun wirklich lang ist, laenger als die anderen." },
+       { MSG_TYPE_READ, {9,5,113,0,38}, "Testmessage with more text than fits into the menu." },
+       { MSG_TYPE_NEW, {9,5,113,0,39}, "Sitting in the train waiting to arrive." },
+       { MSG_TYPE_READ, {9,5,113,0,40}, "People in the train are annoying!" },
+       { MSG_TYPE_READ, {9,5,113,0,40}, "Auch auf Deutsch geht das hier und Text können lang sein." },
+       { MSG_TYPE_NEW, {8,5,113,0,40}, "Und hier noch eine neue Nachricht, die nun wirklich lang ist, laenger als die anderen." },
+       { MSG_TYPE_READ, {9,5,113,0,38}, "Testmessage with more text than fits into the menu." },
+       { MSG_TYPE_NEW, {9,5,113,0,39}, "Sitting in the train waiting to arrive." },
+       { MSG_TYPE_READ, {9,5,113,0,40}, "People in the train are annoying!" },
+       { MSG_TYPE_READ, {9,5,113,0,40}, "Auch auf Deutsch geht das hier und Text können lang sein." },
+       { MSG_TYPE_NEW, {8,5,113,0,40}, "Und hier noch eine neue Nachricht, die nun wirklich lang ist, laenger als die anderen." },
+       { MSG_TYPE_END, {0,0,0,0,0}, "Exit" },
+};
+
+void draw_message_screen(messages_data_t *sdata)
+{
+       char dstr[32];
+       uint8_t strpos, msglen;
+       uint8_t line;
+
+       hal_lcd_clear_display();
+
+#if 0
+       oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
+       oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
+#endif
+       oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
+
+       Msg[sdata->offset + sdata->pos].type = MSG_TYPE_READ;
+       snprintf(dstr, 19, "#%02d/%02d", sdata->pos + sdata->offset + 1, Msgs);
+       oswald_write_string(30, 0, FONT_5x7, FALSE, dstr);
+       oswald_draw_line(0,7,95,7);
+
+
+       // here goes the text
+       msglen = strlen(Msg[sdata->pos+sdata->offset].msg);
+       strpos=0;
+       line=0;
+       while ((strpos < msglen) && (line < 6)) {
+               strpos += oswald_write_string_length(4, 9+(line*12), 84, FONT_DROID8x12, FALSE, &Msg[sdata->pos+sdata->offset].msg[strpos]);
+               line++;
+       }
+
+
+       oswald_draw_line(0,87,95,87);
+
+       if (Msg[sdata->offset + sdata->pos].type != MSG_TYPE_END) {
+               snprintf(dstr, 19, "%c %02d.%02d.%04d,%02d:%02d", (Msg[sdata->pos+sdata->offset].type == MSG_TYPE_NEW) ? '*':' ', Msg[sdata->pos+sdata->offset].td.day, Msg[sdata->pos+sdata->offset].td.month, Msg[sdata->pos+sdata->offset].td.year+1900, Msg[sdata->pos+sdata->offset].td.hour, Msg[sdata->pos+sdata->offset].td.minute);
+               oswald_write_string(2, 89, FONT_5x7, FALSE, dstr);
+       }
+
+       hal_lcd_update_display();
+}
+
+event_ret_t handle_message_screen_buttons(watch_button button, messages_data_t *sdata)
+{
+       switch (button) {
+               case BUTTON_A:
+                       break;
+               case BUTTON_B:
+                       return EVENT_RET_HANDLED;
+                       break;
+               case BUTTON_C:
+                       // OswaldState.screen->event_func(EVENT_SCREEN_DESTROY, NULL);
+                       OswaldState.screen_id = MESSAGES_SCREEN;
+                       OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
+                       OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
+                       return EVENT_RET_HANDLED;
+                       break;
+               default:
+                       break;
+       }
+
+       return EVENT_RET_UNHANDLED;
+}
+
+event_ret_t message_screen_handle_events(uint16_t event, void *data)
+{
+       switch (event) {
+               case EVENT_SCREEN_VISIBLE:
+                       draw_message_screen(&messages_screen);
+                       return EVENT_RET_HANDLED;
+                       break;
+               case EVENT_USER_BUTTONS:
+                       dbg_out("button event %d\n", *(int *)data);
+                       return handle_message_screen_buttons(*(watch_button *)data, &messages_screen);
+                       break;
+               default:
+                       break;
+       };
+       return EVENT_RET_UNHANDLED;
+}
+
+void draw_messages_screen(messages_data_t *sdata)
+{
+       char dstr[32];
+       int i;
+
+       hal_lcd_clear_display();
+
+       // oswald_draw_bitmap(36, 0, Message_icon_width, Message_icon_height, Message_icon_bits);
+
+       oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
+       oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
+       oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
+
+       if (Msg[sdata->offset + sdata->pos].type != MSG_TYPE_END) {
+               snprintf(dstr, 19, "#%02d/%02d", sdata->pos + sdata->offset + 1, Msgs);
+               oswald_write_string(30, 0, FONT_5x7, FALSE, dstr);
+       }
+       oswald_draw_line(0,7,95,7);
+
+       for (i=0; i<6; i++) {
+               if (Msg[i+sdata->offset].type != MSG_TYPE_END) {
+                       //oswald_write_string_length(4, 9+(i*12), 84, FONT_DROID8x12, (Msg[i+sdata->offset].type == MSG_TYPE_NEW), Msg[i+sdata->offset].msg);
+                       if (Msg[i+sdata->offset].type == MSG_TYPE_NEW)
+                               oswald_write_string_length(4, 9+(i*12), 84, FONT_DROID8x12b, (i+sdata->offset) == (sdata->offset + sdata->pos), Msg[i+sdata->offset].msg);
+                       else
+                               oswald_write_string_length(4, 9+(i*12), 84, FONT_DROID8x12, (i+sdata->offset) == (sdata->offset + sdata->pos), Msg[i+sdata->offset].msg);
+               } else {
+                       oswald_draw_bitmap(0, 66, leftbutton_icon_width, leftbutton_icon_height, leftbutton_icon_bits);
+               }
+       }
+
+       // marker selected msg
+       oswald_draw_line(1,9,1,81);
+       oswald_draw_line_ww(1,10+(sdata->pos*12),1,20+(sdata->pos*12),2);
+
+       oswald_draw_line(0,87,95,87);
+
+       if (Msg[sdata->offset + sdata->pos].type != MSG_TYPE_END) {
+               snprintf(dstr, 19, "%c %02d.%02d.%04d,%02d:%02d", (Msg[sdata->pos+sdata->offset].type == MSG_TYPE_NEW) ? '*':' ', Msg[sdata->pos+sdata->offset].td.day, Msg[sdata->pos+sdata->offset].td.month, Msg[sdata->pos+sdata->offset].td.year+1900, Msg[sdata->pos+sdata->offset].td.hour, Msg[sdata->pos+sdata->offset].td.minute);
+               oswald_write_string(2, 89, FONT_5x7, FALSE, dstr);
+       }
+
+       hal_lcd_update_display();
+}
+
+event_ret_t handle_messages_screen_buttons(watch_button button, messages_data_t *sdata)
+{
+       switch (button) {
+               case BUTTON_A:
+                       sdata->pos--;
+                       if (sdata->pos < 0) {
+                               if (sdata->offset > 0) {
+                                       sdata->pos = 0;
+                                       sdata->offset--;
+                                       if (sdata->offset < 0)
+                                               sdata->offset = 0;
+                               } else {
+                                       sdata->pos = 5;
+                                       sdata->offset = (Msgs - 5);
+                                       if (sdata->offset < 0)
+                                               sdata->offset = 0;
+                               }
+                       }
+                       draw_messages_screen(&messages_screen);
+                       return EVENT_RET_HANDLED;
+                       break;
+               case BUTTON_B:
+                       sdata->pos++;
+                       if (sdata->pos > 5) {
+                               sdata->pos = 5;
+                               sdata->offset++;
+                               if ((sdata->offset + 5) > Msgs) {
+                                       sdata->offset = 0;
+                                       sdata->pos = 0;
+                               }
+                       }
+                       draw_messages_screen(&messages_screen);
+                       return EVENT_RET_HANDLED;
+                       break;
+               case BUTTON_C:
+                       if (Msg[sdata->offset + sdata->pos].type == MSG_TYPE_END)
+                               return EVENT_RET_UNHANDLED;
+                       else
+                               // OswaldState.screen->event_func(EVENT_SCREEN_DESTROY, NULL);
+                               OswaldState.screen_id = MESSAGE_SCREEN;
+                               OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
+                               OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
+                               return EVENT_RET_HANDLED;
+                       break;
+               default:
+                       break;
+       }
+
+       return EVENT_RET_UNHANDLED;
+}
+
+event_ret_t messages_screen_handle_events(uint16_t event, void *data)
+{
+       switch (event) {
+               case EVENT_SCREEN_VISIBLE:
+//                     messages_screen.pos = 0;
+//                     messages_screen.offset = 0;
+                       draw_messages_screen(&messages_screen);
+                       return EVENT_RET_HANDLED;
+                       break;
+               case EVENT_USER_BUTTONS:
+                       dbg_out("button event %d\n", *(int *)data);
+                       return handle_messages_screen_buttons(*(watch_button *)data, &messages_screen);
+                       break;
+               default:
+                       break;
+       };
+       return EVENT_RET_UNHANDLED;
+}
+