# 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
#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
########################################################################################
# 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"
-$(RM) $(TARGET).*
-$(RM) $(SOURCES:.c=.lst)
-$(RM) $(DEPEND)
+
+.buildno: $(OBJECTS)
+ @if ! test -f .buildno; then echo 0 > .buildno; fi
+ @echo $$(($$(cat .buildno) + 1)) > .buildno
// init script created from bluetooth_init_cc2560_2.44.bts
#include <stdint.h>
+const char *cc256x_version = "CC2560 v2.44";
+
#if defined(__GNUC__) && (__MSP430X__ > 0)
__attribute__((__far__))
#endif
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
#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
#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;
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
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)
{
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);
#include <string.h>
#include <stdint.h>
+#define OSWALD_VERSION "v0.3"
+
//#define DEBUG 1
#ifdef DEBUG
#define dbg_out( args... ) fprintf(stderr, args)
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,
} 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
#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;
// #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);
* 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);
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];
#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;
}
+/*
+ * Accelerometer and sensor display screen
+ */
typedef struct {
accel_data_t accdata;
} accelscreen_data_t;
{
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();
}
}
+/*
+ * Date / time setup screen
+ */
typedef struct {
uint8_t pos;
boolean set_mode;
/*
- * Alarm setup
+ * Alarm setup screen
*/
-
typedef struct {
uint8_t pos;
boolean set_mode;
/*
* Test menu
*/
-
typedef struct {
uint8_t menu_pos;
} test_menu_t;
/*
* Stop Watch
*/
-
typedef struct {
uint8_t hr;
uint8_t min;
/*
- * when alarm is fired
+ * Alarm screen, shown when alarm is fired
*/
void draw_alarm_screen(void)
{
/*
- * Bluetooth screen
+ * Bluetooth setup screen
*/
typedef struct {
uint8_t pos;
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;
+}
+
event_ret_t bluetooth_screen_events(uint16_t event, void *data);
+event_ret_t info_screen_handle_events(uint16_t event, void *data);
+
#endif