#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;
	u8t	year;
} clock_state;

typedef enum {
	IDLE_SCREEN = 0,
	ACCEL_DISPLAY_SCREEN,
	DATETIME_SETTING_SCREEN,
	MENU_TEST_SCREEN,
//	SCREEN2_SCREEN,
//	SCREEN3_SCREEN,
//	APPLICATION_SCREEN,
	LAST_SCREEN,		// a marker for the last (not valid) 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)
#define EVENT_MS_TIMER			(1<<3)
#define EVENT_USER_BUTTONS		(1<<4)
#define EVENT_ACCEL_UPDATE		(1<<5)
#define EVENT_AMBIENTLIGHT_UPDATE	(1<<6)
#define EVENT_POWER_CHANGE		(1<<7)
#define EVENT_COMMS			(1<<8)

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;

#endif