#ifndef SPYGLASS_H
#define SPYGLASS_H

#define RPRINTF_USELCD(expression) 			\
	({										\
		rprintfInit(uiboardLcdWriteChar2); \
		expression;							\
		rprintfInit(uartSendByte); 			\
	})


// Base I2C node addresses
#define PCF8574_I2C_BASE_ADDR	0x70

// PCF8574 node addresses
#define PCF_NODE_LCD			0x00
#define PCF_NODE_BUTTONS		0x01

// Control node bit-defines
#define UIBOARD_DB4		(1 << 0)
#define UIBOARD_DB5		(1 << 1)
#define UIBOARD_DB6		(1 << 2)
#define UIBOARD_DB7		(1 << 3)
#define UIBOARD_LCD_RW		(1 << 4)
#define UIBOARD_LCD_RS		(1 << 5)
#define UIBOARD_LCD_E		(1 << 6)

#define UIBOARD_BUTTON1	(1 << 0)
#define UIBOARD_BUTTON2	(1 << 1)
#define UIBOARD_BUTTON3	(1 << 2)
#define UIBOARD_BUTTON4	(1 << 3)

// map lcd.c commands to uiboard.c LCD commands
#define lcdInit			uiboardLcdInit
#define lcdHome			uiboardLcdHome
#define lcdClear		uiboardLcdClear
#define lcdGotoXY		uiboardLcdGotoXY
#define lcdDataWrite	uiboardLcdWriteChar

// functions
//! initialize the I2C bus for communication with the uiboard UI.
void uiboardInit(void);

u08 uiboardGetPushbuttons(void);

// *********** LCD commands ***********

//! Initialize LCD for operation.
void uiboardLcdInit(void);
//! Set write/cursor position to upper left. 
void uiboardLcdHome(void);
//! Clear LCD display.
void uiboardLcdClear(void);
//! Set write/cursor posision on LCD display (x=col, y=line).
void uiboardLcdGotoXY(u08 x, u08 y);
//! Write control or display data to LCD.
void uiboardLcdWrite(u08 rs, u08 data, u08 init);
//! Write character to LCD.
void uiboardLcdWriteChar(u08 c);

void uiboardLcdWriteChar2(u08 c);

void uiboardWriteFromXY(u08 x, u08 y);

void uiboard_lcdProgressBar(u16 progress, u16 maxprogress, u08 length);
void uiboard_lcdLoadCustomChar(u08* lcdCustomCharArray, u08 romCharNum, u08 lcdCharNum);

// *********** LOW-LEVEL ACCESS ***********

//! Write I/O Data to PCF8574 I2C<->Digital I/O chip.
u08 pcf8574Write(u08 nodeAddr, u08 data);
//! Read I/O Data from PCF8574 I2C<->Digital I/O chip.
u08 pcf8574Read(u08 nodeAddr);

#endif
//@}
