From 84e4829f9f2bbf104d05b4bbb9a2551b3759d792 Mon Sep 17 00:00:00 2001 From: Nils Faerber Date: Sun, 5 May 2013 03:54:24 +0200 Subject: [PATCH] Add version information and info screen, some more work on the accel screen --- metawatch/Makefile | 15 +++-- metawatch/bluetooth_init_cc2560_2.44.c | 2 + metawatch/bluetooth_init_cc256x.h | 2 +- metawatch/mw_main.h | 2 + metawatch/oswald_hal.c | 17 +++++ ui/Makefile.am | 12 +++- ui/oswald-ui.c | 22 +++++- ui/oswald.h | 13 ++-- ui/oswald_graphics.c | 5 ++ ui/oswald_graphics.h | 2 + ui/oswald_hal.h | 4 ++ ui/oswald_main.c | 3 + ui/oswald_screens.c | 93 ++++++++++++++++++++++---- ui/oswald_screens.h | 2 + 14 files changed, 165 insertions(+), 29 deletions(-) diff --git a/metawatch/Makefile b/metawatch/Makefile index e230211..70a7775 100644 --- a/metawatch/Makefile +++ b/metawatch/Makefile @@ -17,10 +17,10 @@ MEMMODEL = -mmemory-model=huge -fdata-sections -ffunction-sections # -mdata-re # MEMMODEL = -mmemory-model=medium -misr20 #MEMMODEL = -mmemory-model=medium -#APPCONFIG = -DDIGITAL -DMW_DEVBOARD_V2 +APPCONFIG = -DDIGITAL -DMW_DEVBOARD_V2 #APPCONFIG = -DDIGITAL -DMW_DEVBOARD_V2 -DWITH_BTSTACK #APPCONFIG = -DDIGITAL -DMW_DEVBOARD_V2 -DCC256x_TRANSP -APPCONFIG = -DDIGITAL -DMW_DIGITAL_V2 +#APPCONFIG = -DDIGITAL -DMW_DIGITAL_V2 # List all the source files here # eg if you have a source file foo.c then list it here @@ -48,9 +48,12 @@ SOURCES = mw_main.c mw_uart.c mw_lcd.c mw_adc.c mw_bt.c \ #INCLUDES = $(BT_SMALLTOOTH_INV) INCLUDES = -I../ui/ +# BUILDNO = \"\#$(shell cat .buildno)-$(shell date +%y%m%d)\" +BUILDNO = \"$(shell date +%y%m%d)-\#$(shell cat .buildno)\" + # Add or subtract whatever MSPGCC flags you want. There are plenty more ####################################################################################### -CFLAGS = -mmcu=$(MCU) $(MEMMODEL) -g -Os -Wall -Wunused $(INCLUDES) $(APPCONFIG) +CFLAGS = -mmcu=$(MCU) $(MEMMODEL) -g -Os -Wall -Wunused $(INCLUDES) $(APPCONFIG) -DBUILDNO=$(BUILDNO) ASFLAGS = -mmcu=$(MCU) $(MEMMODEL) -x assembler-with-cpp -Wa,-gstabs LDFLAGS = -mmcu=$(MCU) $(MEMMODEL) -Wl,-gc-sections -Wl,-Map=$(TARGET).map ######################################################################################## @@ -76,7 +79,7 @@ DEPEND = $(SOURCES:.c=.d) # all the object files OBJECTS = $(SOURCES:.c=.o) -all: $(TARGET).elf $(TARGET).hex $(TARGET).txt +all: .buildno $(TARGET).elf $(TARGET).hex $(TARGET).txt prog: $(TARGET).hex mspdebug tilib -d /dev/ttyACM3 -v 2500 "prog $(TARGET).hex" @@ -126,3 +129,7 @@ clean: -$(RM) $(TARGET).* -$(RM) $(SOURCES:.c=.lst) -$(RM) $(DEPEND) + +.buildno: $(OBJECTS) + @if ! test -f .buildno; then echo 0 > .buildno; fi + @echo $$(($$(cat .buildno) + 1)) > .buildno diff --git a/metawatch/bluetooth_init_cc2560_2.44.c b/metawatch/bluetooth_init_cc2560_2.44.c index ae04c6a..858309c 100644 --- a/metawatch/bluetooth_init_cc2560_2.44.c +++ b/metawatch/bluetooth_init_cc2560_2.44.c @@ -1,6 +1,8 @@ // init script created from bluetooth_init_cc2560_2.44.bts #include +const char *cc256x_version = "CC2560 v2.44"; + #if defined(__GNUC__) && (__MSP430X__ > 0) __attribute__((__far__)) #endif diff --git a/metawatch/bluetooth_init_cc256x.h b/metawatch/bluetooth_init_cc256x.h index 6e70257..fcc092c 100644 --- a/metawatch/bluetooth_init_cc256x.h +++ b/metawatch/bluetooth_init_cc256x.h @@ -6,6 +6,6 @@ extern const uint8_t cc256x_init_script[]; extern const uint8_t cc256x_init_script_2[]; - extern const uint32_t cc256x_init_script_size; +extern const char *cc256x_version; #endif diff --git a/metawatch/mw_main.h b/metawatch/mw_main.h index 902c469..23dcf5e 100644 --- a/metawatch/mw_main.h +++ b/metawatch/mw_main.h @@ -1,6 +1,8 @@ #ifndef _GCCFWTEST_LCD_H #define _GCCFWTEST_LCD_H +#define MW_MAIN_VERSION "MW v0.4" + #if defined MW_DEVBOARD_V2 #include "hal_devboard_v2_defs.h" #elif defined MW_DIGITAL_V2 diff --git a/metawatch/oswald_hal.c b/metawatch/oswald_hal.c index d731b51..449355d 100644 --- a/metawatch/oswald_hal.c +++ b/metawatch/oswald_hal.c @@ -13,12 +13,29 @@ #include "mw_bt.h" #include "bt_hci.h" #include "bt_l2cap.h" +#include "bluetooth_init_cc256x.h" #include "oswald.h" #include "oswald_hal.h" #include "calendar.h" + +const char *hal_get_version_string(void) +{ + return MW_MAIN_VERSION; +} + +const char *hal_get_buildno_string(void) +{ + return BUILDNO; +} + +const char *hal_get_radio_version_string(void) +{ + return cc256x_version; +} + void hal_lcd_set_pixel(uint8_t x, uint8_t y, uint8_t color) { x %= 96; diff --git a/ui/Makefile.am b/ui/Makefile.am index d03d914..ac6e296 100644 --- a/ui/Makefile.am +++ b/ui/Makefile.am @@ -1,15 +1,23 @@ ACLOCAL_AMFLAGS = -I m4 -bin_PROGRAMS = oswald-gui +bin_PROGRAMS = .buildno oswald-gui oswald_gui_SOURCES = oswald-ui.c oswald_main.c \ oswald_watch_faces.c oswald_strings.c oswald_screens.c \ embedvm.c oswald_graphics.c calendar.c oswald_fonts.c -oswald_gui_CFLAGS = -g $(GTK_CFLAGS) +# BUILDNO = \"$(shell cat .buildno)\" +BUILDNO = \"$(shell date +%y%m%d)-\#$(shell cat .buildno)\" + +oswald_gui_CFLAGS = -DBUILDNO=$(BUILDNO) -g $(GTK_CFLAGS) + oswald_gui_LDADD = $(GTK_LIBS) EXTRA_DIST = config.rpath m4/ChangeLog \ AUTHORS \ COPYING \ README.txt + +.buildno: $(oswald_gui_OBJECTS) + @if ! test -f .buildno; then echo 0 > .buildno; fi + @echo $$(($$(cat .buildno) + 1)) > .buildno diff --git a/ui/oswald-ui.c b/ui/oswald-ui.c index 285d844..c482c78 100644 --- a/ui/oswald-ui.c +++ b/ui/oswald-ui.c @@ -94,6 +94,22 @@ void hal_bluetooth_send_data(const void *mdat, uint16_t mlen) g_printerr("write comm %d\n", mlen); } +const char *hal_get_version_string(void) +{ + return "GTK v0.3"; +} + +const char *hal_get_buildno_string(void) +{ + return BUILDNO; +} + +const char *hal_get_radio_version_string(void) +{ + return "BlueZ"; +} + + static gint configure_event (GtkWidget *widget, GdkEventConfigure *event, gpointer user_data) { @@ -311,19 +327,19 @@ static void create_mainwin(oswald_ui *ui) l = gtk_label_new("X:"); gtk_box_pack_start (GTK_BOX(hb), l, FALSE, FALSE, 5); - sc = gtk_hscale_new_with_range (0, 255, 1); + sc = gtk_hscale_new_with_range (-128, 127, 1); gtk_box_pack_start (GTK_BOX(hb), sc, TRUE, TRUE, 5); g_signal_connect(G_OBJECT(sc), "value-changed", G_CALLBACK(accelX_value_changed), ui); l = gtk_label_new("Y:"); gtk_box_pack_start (GTK_BOX(hb), l, FALSE, FALSE, 5); - sc = gtk_hscale_new_with_range (0, 255, 1); + sc = gtk_hscale_new_with_range (-128, 127, 1); gtk_box_pack_start (GTK_BOX(hb), sc, TRUE, TRUE, 5); g_signal_connect(G_OBJECT(sc), "value-changed", G_CALLBACK(accelY_value_changed), ui); l = gtk_label_new("Z:"); gtk_box_pack_start (GTK_BOX(hb), l, FALSE, FALSE, 5); - sc = gtk_hscale_new_with_range (0, 255, 1); + sc = gtk_hscale_new_with_range (-128, 127, 1); gtk_box_pack_start (GTK_BOX(hb), sc, TRUE, TRUE, 5); g_signal_connect(G_OBJECT(sc), "value-changed", G_CALLBACK(accelZ_value_changed), ui); diff --git a/ui/oswald.h b/ui/oswald.h index b03a6b3..8d16b2e 100644 --- a/ui/oswald.h +++ b/ui/oswald.h @@ -4,6 +4,8 @@ #include #include +#define OSWALD_VERSION "v0.3" + //#define DEBUG 1 #ifdef DEBUG #define dbg_out( args... ) fprintf(stderr, args) @@ -55,9 +57,10 @@ typedef enum { STOP_WATCH_SCREEN, BLUETOOTH_SCREEN, ACCEL_DISPLAY_SCREEN, - MENU_TEST_SCREEN, -// APPLICATION_SCREEN, + INFO_SCREEN, LAST_SCREEN, // a marker for the last (not valid) screen) + MENU_TEST_SCREEN, + APPLICATION_SCREEN, DATETIME_SETTING_SCREEN, ALARM_SCREEN, SCREENS_END, @@ -103,9 +106,9 @@ typedef struct { } watch_state; typedef struct { - uint8_t x; - uint8_t y; - uint8_t z; + int8_t x; + int8_t y; + int8_t z; } accel_data_t; #define POWER_SOURCE_BATTERY 0 diff --git a/ui/oswald_graphics.c b/ui/oswald_graphics.c index 238d1ea..e64476d 100644 --- a/ui/oswald_graphics.c +++ b/ui/oswald_graphics.c @@ -6,6 +6,11 @@ #include "oswald_graphics.h" +void oswald_draw_pixel(const unsigned int xstart, const unsigned int ystart) +{ + hal_lcd_set_pixel(xstart, ystart, TRUE); +} + void oswald_draw_bitmap_opts(const unsigned int xstart, const unsigned int ystart, const unsigned int xoff, const unsigned int yoff, const unsigned int width, const unsigned int height, const unsigned int bmp_width, const unsigned int bmp_height, const void *bmp) { unsigned int x, y; diff --git a/ui/oswald_graphics.h b/ui/oswald_graphics.h index 91b209f..cea57cb 100644 --- a/ui/oswald_graphics.h +++ b/ui/oswald_graphics.h @@ -9,6 +9,8 @@ // #include "Fonts.h" +void oswald_draw_pixel(const unsigned int xstart, const unsigned int ystart); + void oswald_draw_bitmap(const unsigned int xstart, const unsigned int ystart, const unsigned int width, const unsigned int height, const void *bmp); void oswald_draw_line(const uint8_t xstart, const uint8_t ystart, const uint8_t xend, const uint8_t yend); diff --git a/ui/oswald_hal.h b/ui/oswald_hal.h index f0ab7a4..ad877d0 100644 --- a/ui/oswald_hal.h +++ b/ui/oswald_hal.h @@ -5,6 +5,10 @@ * these functions must be implemented for a concrete hardware */ +const char *hal_get_version_string(void); +const char *hal_get_buildno_string(void); +const char *hal_get_radio_version_string(void); + void hal_lcd_set_pixel(uint8_t x, uint8_t y, uint8_t color); void hal_lcd_clear_display(void); void hal_lcd_update_display(void); diff --git a/ui/oswald_main.c b/ui/oswald_main.c index 9381636..f26603b 100644 --- a/ui/oswald_main.c +++ b/ui/oswald_main.c @@ -211,6 +211,9 @@ void oswald_init(void) OswaldScreens[ALARM_SCREEN].event_mask = EVENT_USER_BUTTONS | EVENT_HALF_SEC_TIMER; OswaldScreens[ALARM_SCREEN].event_func = alarm_handle_events; + OswaldScreens[INFO_SCREEN].event_mask = 0x00; // this one does not consume any events + OswaldScreens[INFO_SCREEN].event_func = info_screen_handle_events; + OswaldState.screen_id = IDLE_SCREEN; OswaldState.screen = &OswaldScreens[OswaldState.screen_id]; diff --git a/ui/oswald_screens.c b/ui/oswald_screens.c index 1da4827..9952365 100644 --- a/ui/oswald_screens.c +++ b/ui/oswald_screens.c @@ -48,7 +48,21 @@ __attribute__((__far__)) #endif #include "bitmaps/Bluetooth_icon.xbm" +#if defined(__GNUC__) && (__MSP430X__ > 0) +__attribute__((__far__)) +#endif +#include "bitmaps/info_icon.xbm" + +#if defined(__GNUC__) && (__MSP430X__ > 0) +__attribute__((__far__)) +#endif +#include "bitmaps/acc_icon.xbm" + + +/* + * Common event handler part of the watch faces + */ typedef struct { void (*screendraw_func)(boolean show_seconds); boolean show_seconds; @@ -117,6 +131,9 @@ event_ret_t idle_handle_events(uint16_t event, void *data) } +/* + * Accelerometer and sensor display screen + */ typedef struct { accel_data_t accdata; } accelscreen_data_t; @@ -128,15 +145,24 @@ void draw_accel_screen(accel_data_t *accel_data) { hal_lcd_clear_display(); - oswald_write_string(0, 2, FONT_6x9, "X:"); - oswald_write_number(20, 2, FONT_6x9, accel_data->x); - oswald_write_string(0, 16, FONT_6x9, "Y:"); - oswald_write_number(20, 16, FONT_6x9, accel_data->y); - oswald_write_string(0, 32, FONT_6x9, "Z:"); - oswald_write_number(20, 32, FONT_6x9, accel_data->z); + 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_write_string(1, 85, FONT_6x9, "Light:"); + oswald_write_number(50, 85, FONT_6x9, 0); - oswald_write_string(0, 54, FONT_6x9, "Light:"); - oswald_write_number(50, 54, FONT_6x9, accel_data->z); + oswald_draw_line(40, 30, 92, 30); + oswald_draw_line(92, 30, 92, 82); + oswald_draw_line(40, 82, 92, 82); + oswald_draw_line(40, 82, 40, 30); + + oswald_draw_pixel(41+25+((accel_data->x * 50) / (254)), 31+25+((accel_data->y * 50) / (254))); hal_lcd_update_display(); } @@ -168,6 +194,9 @@ event_ret_t accel_handle_events(uint16_t event, void *data) } +/* + * Date / time setup screen + */ typedef struct { uint8_t pos; boolean set_mode; @@ -366,9 +395,8 @@ event_ret_t datetime_setup_events(uint16_t event, void *data) /* - * Alarm setup + * Alarm setup screen */ - typedef struct { uint8_t pos; boolean set_mode; @@ -550,7 +578,6 @@ event_ret_t alarm_setup_events(uint16_t event, void *data) /* * Test menu */ - typedef struct { uint8_t menu_pos; } test_menu_t; @@ -625,7 +652,6 @@ event_ret_t test_menu_handle_events(uint16_t event, void *data) /* * Stop Watch */ - typedef struct { uint8_t hr; uint8_t min; @@ -786,7 +812,7 @@ event_ret_t stop_watch_handle_events(uint16_t event, void *data) /* - * when alarm is fired + * Alarm screen, shown when alarm is fired */ void draw_alarm_screen(void) { @@ -832,7 +858,7 @@ event_ret_t alarm_handle_events(uint16_t event, void *data) /* - * Bluetooth screen + * Bluetooth setup screen */ typedef struct { uint8_t pos; @@ -1000,3 +1026,42 @@ event_ret_t bluetooth_screen_events(uint16_t event, void *data) return EVENT_RET_HANDLED; } + +/* + * Info Screen + */ +void draw_info_screen(accel_data_t *accel_data) +{ + 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()); + + hal_lcd_update_display(); +} + +event_ret_t info_screen_handle_events(uint16_t event, void *data) +{ + switch (event) { + case EVENT_SCREEN_VISIBLE: + draw_info_screen(&accel_screen.accdata); + return EVENT_RET_HANDLED; + break; + case EVENT_USER_BUTTONS: + dbg_out("button event %d\n", *(int *)data); + break; + default: + return EVENT_RET_UNHANDLED; + break; + }; + return EVENT_RET_UNHANDLED; +} + diff --git a/ui/oswald_screens.h b/ui/oswald_screens.h index b8a38ba..47a71e3 100644 --- a/ui/oswald_screens.h +++ b/ui/oswald_screens.h @@ -18,4 +18,6 @@ event_ret_t alarm_handle_events(uint16_t event, void *data); event_ret_t bluetooth_screen_events(uint16_t event, void *data); +event_ret_t info_screen_handle_events(uint16_t event, void *data); + #endif -- 2.39.2