#ifndef _OSWALD_H
#define _OSWALD_H

#define DEBUG 1
#ifdef DEBUG
#define dbg_out( args... ) fprintf(stderr, args)
#else
#define dbg_out( args... ) do {} while (0)
#endif

typedef signed char s8t;
typedef unsigned char u8t;
typedef signed short s16t;
typedef unsigned short u16t;
typedef u8t boolean;
#ifdef TRUE
#undef TRUE
#endif
#define TRUE 1
#ifdef FALSE
#undef FALSE
#endif
#define FALSE 0
#ifndef NULL
#define NULL 0
#endif

typedef struct {
	u8t	hour;
	u8t	minute;
	u8t	second;
	u8t	day;
	u8t	month;
	u16t	year;
	boolean	clk24hr;
	boolean day_first;
} clock_state;

typedef enum {
	IDLE_SCREEN = 0,
	ACCEL_DISPLAY_SCREEN,
	MENU_TEST_SCREEN,
//	SCREEN2_SCREEN,
//	SCREEN3_SCREEN,
//	APPLICATION_SCREEN,
	LAST_SCREEN,		// a marker for the last (not valid) screen)
	DATETIME_SETTING_SCREEN,
} screen_number;

typedef enum {
	BUTTON_A = 0,
	BUTTON_B,
	BUTTON_C,
	BUTTON_D,
	BUTTON_E,
	BUTTON_F,
} watch_button;

#define EVENT_SCREEN_VISIBLE		(1<<0)		// screen just became visible
#define EVENT_SCREEN_DESTROY		(1<<1)		// screen is destroyed
#define EVENT_ONE_SEC_TIMER		(1<<2)		// one second timer for reguler clock
#define EVENT_HALF_SEC_TIMER		(1<<3)		// half second timer for blinking displays
#define EVENT_CS_TIMER			(1<<4)		// centisecond timer, e.g. for stop watch
#define EVENT_USER_BUTTONS		(1<<5)		// button presses
#define EVENT_ACCEL_UPDATE		(1<<6)		// accelerometer updates
#define EVENT_AMBIENTLIGHT_UPDATE	(1<<7)		// ambient light sensor updates
#define EVENT_POWER_CHANGE		(1<<8)		// power source status change
#define EVENT_COMMS			(1<<9)		// communication, like Bluetooth I/O

typedef struct {
	u16t event_mask;				// the event the screen wants to receive
	void (*event_func)(u16t event, void *data);	// callback for events
	void *user_data;
} watch_screen;

typedef struct {
	screen_number	screen_id;
	watch_screen *screen;		// the current screen
	boolean pending_idle;
} watch_state;

typedef struct {
	u8t	x;
	u8t	y;
	u8t	z;
} accel_data_t;

#endif