#ifndef EVE_H
#define	EVE_H

#include <stdint.h>
#include <stdbool.h>


#define RAM_G            0x000000
#define ROM_FONT        0x1E0000
#define ROM_FONT_ADDR   0x2FFFFC
#define RAM_DL          0x300000
#define RAM_REG         0x302000
#define RAM_CMD         0x308000

#define REG_ID                0x302000
#define REG_FRAMES            0x302004
#define REG_CLOCK             0x302008
#define REG_FREQUENCY         0x30200C
#define REG_RENDERMODE        0x302010
#define REG_SNAPY             0x302014
#define REG_SNAPSHOT          0x302018
#define REG_SNAPFORMAT        0x30201C
#define REG_CPURESET          0x302020
#define REG_TAP_CRC           0x302024
#define REG_TAP_MASK          0x302028
#define REG_HCYCLE            0x30202C
#define REG_HOFFSET           0x302030
#define REG_HSIZE             0x302034
#define REG_HSYNC0            0x302038
#define REG_HSYNC1            0x30203C
#define REG_VCYCLE            0x302040
#define REG_VOFFSET           0x302044
#define REG_VSIZE             0x302048
#define REG_VSYNC0            0x30204C
#define REG_VSYNC1            0x302050
#define REG_DLSWAP            0x302054
#define REG_ROTATE            0x302058
#define REG_OUTBITS           0x30205C
#define REG_DITHER            0x302060
#define REG_SWIZZLE           0x302064
#define REG_CSPREAD           0x302068
#define REG_PCLK_POL          0x30206C
#define REG_PCLK              0x302070
#define REG_TAG_X             0x302074
#define REG_TAG_Y             0x302078
#define REG_TAG               0x30207C
#define REG_VOL_PB            0x302080
#define REG_VOL_SOUND         0x302084
#define REG_SOUND             0x302088
#define REG_PLAY              0x30208C
#define REG_GPIO_DIR          0x302090
#define REG_GPIO              0x302094
#define REG_GPIOX_DIR         0x302098
#define REG_GPIOX             0x30209C
#define REG_INT_FLAGS         0x3020A8
#define REG_INT_EN            0x3020AC
#define REG_INT_MASK          0x3020B0
#define REG_PLAYBACK_START    0x3020B4
#define REG_PLAYBACK_LENGTH   0x3020B8
#define REG_PLAYBACK_READPTR  0x3020BC
#define REG_PLAYBACK_FREQ     0x3020C0
#define REG_PLAYBACK_FORMAT   0x3020C4
#define REG_PLAYBACK_LOOP     0x3020C8
#define REG_PLAYBACK_PLAY     0x3020CC
#define REG_PWM_HZ            0x3020D0

#define REG_PWM_DUTY          0x3020D4
#define REG_MACRO_0           0x3020D8
#define REG_MACRO_1           0x3020DC
#define REG_CMD_READ          0x3020F8
#define REG_CMD_WRITE         0x3020FC
#define REG_CMD_DL            0x302100
#define REG_TOUCH_MODE        0x302104
#define REG_TOUCH_ADC_MODE    0x302108
#define REG_TOUCH_CHARGE      0x30210C
#define REG_TOUCH_SETTLE      0x302110
#define REG_TOUCH_OVERSAMPLE  0x302114
#define REG_TOUCH_RZTHRESH    0x302118
#define REG_TOUCH_RAW_XY      0x30211C
#define REG_TOUCH_RZ          0x302120
#define REG_TOUCH_SCREEN_XY   0x302124

#define REG_TOUCH_TAG_XY      0x302128
#define REG_TOUCH_TAG         0x30212C
#define REG_TOUCH_TAG1_XY     0x302130
#define REG_TOUCH_TAG1        0x302134
#define REG_TOUCH_TAG2_XY     0x302138
#define REG_TOUCH_TAG2        0x30213C
#define REG_TOUCH_TAG3_XY     0x302140
#define REG_TOUCH_TAG3        0x302144
#define REG_TOUCH_TAG4_XY     0x302148
#define REG_TOUCH_TAG4        0x30214C

#define REG_TOUCH_TRANSFORM_A   0x302150
#define REG_TOUCH_TRANSFORM_B   0x302154
#define REG_TOUCH_TRANSFORM_C   0x302158
#define REG_TOUCH_TRANSFORM_D   0x30215C
#define REG_TOUCH_TRANSFORM_E   0x302160
#define REG_TOUCH_TRANSFORM_F   0x302164
#define REG_TOUCH_CONFIG        0x302168
#define REG_CTOUCH_TOUCH4_X     0x30216C
#define REG_BIST_EN             0x302174
#define REG_TRIM                0x302180
#define REG_ANA_COMP            0x302184
#define REG_SPI_WIDTH           0x302188
#define REG_TOUCH_DIRECT_XY     0x30218C
#define REG_TOUCH_DIRECT_Z1Z2   0x302190
#define REG_DATES_STAMP         0x302564
#define REG_CMDB_SPACE          0x302574
#define REG_CMDB_WRITE          0x302578

#define DL_CLEAR		  0x26000000UL // requires OR'd arguments
#define DL_CLEAR_RGB	0x02000000UL // requires OR'd arguments
#define DL_COLOR_RGB	0x04000000UL // requires OR'd arguments
#define DL_POINT_SIZE	0x0D000000UL // requires OR'd arguments
#define DL_END			  0x21000000UL
#define DL_BEGIN		  0x1F000000UL // requires OR'd arguments
#define DL_DISPLAY		0x00000000UL

#define CLR_COL              0x4
#define CLR_STN              0x2
#define CLR_TAG              0x1


// Host command
#define FT_ACTIVE	  0x00	// Place FT800 in active state
#define FT_STANDBY	0x41	// Place FT800 in Standby (clk running)
#define FT_SLEEP	  0x42	// Place FT800 in Sleep (clk off)
#define FT_PWRDOWN	0x50	// Place FT800 in Power Down (core off)
#define FT_CLKEXT	  0x44	// Select external clock source
#define FT_CLKINT	  0x48	// Select internal clock source
#define FT_CORERST	0x68	// Reset core - all registers default and processors reset
#define FT_CLK48M	  0x62	// Select 48MHz PLL output
#define FT_CLK36M	  0x61	// Select 36MHz PLL output


// defines for graphics command

#define NEVER                0x00
#define LESS                 0x01
#define LEQUAL               0x02
#define GREATER              0x03
#define GEQUAL               0x04
#define EQUAL                0x05
#define NOTEQUAL             0x06
#define ALWAYS               0x07

/* Bitmap formats */
#define ARGB1555             0x00
#define L1                   0x01
#define L4                   0x02
#define L8                   0x03
#define RGB332               0x04
#define ARGB2                0x05
#define ARGB4                0x06
#define RGB565               0x07
#define PALETTED             0x08
#define TEXT8X8              0x09
#define TEXTVGA              0x0A
#define BARGRAPH             0x0B


/* Bitmap filter types */
#define NEAREST              0x00
#define BILINEAR             0x01


/* Bitmap wrap types */
#define BORDER               0x00
#define REPEATE              0x01


/* Stencil defines */
#define KEEP                 0x01
#define REPLACE              0x01
#define INCR                 0x02
#define DECR                 0x04
#define INVERT               0x05


/* Graphics display list swap defines */
#define DLSWAP_DONE          0x00
#define DLSWAP_LINE          0x01
#define DLSWAP_FRAME         0x02


/* Interrupt bits */
#define INT_SWAP             0x01
#define INT_TOUCH            0x02
#define INT_TAG              0x04
#define INT_SOUND            0x08
#define INT_PLAYBACK         0x10
#define INT_CMDEMPTY         0x20
#define INT_CMDFLAG          0x40
#define INT_CONVCOMPLETE     0x80


/* Touch mode */
#define TMODE_OFF          0x00
#define TMODE_ONESHOT      0x01
#define TMODE_FRAME        0x02
#define TMODE_CONTINUOUS   0x03


/* Alpha blending */
#define ZERO                 0x00
#define ONE                  0x01
#define SRC_ALPHA            0x02
#define DST_ALPHA            0x03
#define ONE_MINUS_SRC_ALPHA  0x04
#define ONE_MINUS_DST_ALPHA  0x05


/* Graphics primitives */
#define BITMAPS              0x01
#define POINTS               0x02
#define LINES                0x03
#define LINE_STRIP           0x04
#define EDGE_STRIP_R         0x05
#define EDGE_STRIP_L         0x06
#define EDGE_STRIP_A         0x07
#define EDGE_STRIP_B         0x08
#define RECTS                0x09


/* Widget command */
#define OPT_MONO             0x01
#define OPT_NODL             0x02
#define OPT_FLAT             0x100
#define OPT_CENTERX          0x200
#define OPT_CENTERY          0x400
#define OPT_CENTER           (OPT_CENTERX | OPT_CENTERY)
#define OPT_NOBACK           0x1000
#define OPT_NOTICKS          0x2000
#define OPT_NOHM             0x4000
#define OPT_NOPOINTER        0x4000
#define OPT_NOSECS           0x8000
#define OPT_NOHANDS          0xC000
#define OPT_RIGHTX           0x800
#define OPT_SIGNED           0x100


/* Defines related to inbuilt font */
#define NUMCHAR_PERFONT     (128L)  /* number of font characters per bitmap handle */
#define FONT_TABLE_SIZE     (148L)  /* size of the font table - utilized for loopup by the graphics engine */
#define FONT_TABLE_POINTER  (0xFFFFCUL) /* pointer to the inbuilt font tables starting from bitmap handle 16 */

// Setting Graphics State
#define ALPHA_FUNC            0x09  
#define BITMAP_HANDLE         0x05
#define BITMAP_LAYOUT         0x07
#define BITMAP_LAYOUT_H       0x28
#define BITMAP_SIZE           0x08
#define BITMAP_SIZE_H         0x29
#define BITMAP_SOURCE         0x01
#define BITMAP_TRASFORM_A     0x15
#define BITMAP_TRASFORM_B     0x16
#define BITMAP_TRASFORM_C     0x17
#define BITMAP_TRASFORM_D     0x18
#define BITMAP_TRASFORM_E     0x19
#define BITMAP_TRASFORM_F     0x1A
#define BLEND_FUNC            0x0B
#define CELL                  0x06
#define CLEAR                 0x26
#define CLEAR_COLOR_A         0x0F
#define CLEAR_COLOR_RGB       0x02
#define CLEAR_STENCIL         0x11
#define CLEAR_TAG             0x12
#define COLOR_A               0x10
#define COLOR_MASK            0x20
#define COLOR_RGB             0x04
#define LINE_WIDTH            0x0E
#define PALETTE_SOURCE        0x2A
#define POINT_SIZE            0x0D
#define RESTORE_CONTEX        0x23
#define SAVE_CONTEXT          0x22
#define SCISSOR_SIZE          0x1C
#define SCISSOR_XY            0x1B
#define STENCIL_FUNC          0x0A
#define STENCIL_MASK          0x13
#define STENCIL_OP            0x0C
#define TAG                   0x03
#define TAG_MASK              0x14
#define VERTEX_FORMAT         0x27
#define VERTEX_TRANLATE_X     0x2B
#define VERTEX_TRANLATE_Y     0x2C

// Setting Drawing Actions
#define BEGIN                 0x1F
#define END                   0x21
#define VERTEX2F              0x01
#define VERTEX2II             0x02


// Setting Execution Controll
#define NOP                   0x2D
#define JUMP                  0x1E
#define MACRO                 0x31
#define CALL                  0x1D
#define RETURN                0x24
#define DISPLAY               0x00

// Setting Coprocessor Commands

#define CMD_DLSTART         0x00000000  
#define CMD_DLSWAP          0x01000000  
#define CMD_COLDSTART       0x32000000
#define CMD_INTERRUPT       0x02000000
#define CMD_APPEND          0x1E000000
#define CMD_REGREAD         0x19000000
#define CMD_MEMWRITE        0x1A000000
#define CMD_INFLATE         0x22000000
#define CMD_LOADIMAGE       0x24000000
#define CMD_MEDIAFIFO       0x39000000
#define CMD_PLAYVIDEO       0x3A000000
#define CMD_VIDEOSTART      0x40000000
#define CMD_VIDEOFRAME      0x41000000
#define CMD_MEMCRC          0x18000000
#define CMD_MEMZERO         0x1C000000
#define CMD_MEMSET          0x1B000000
#define CMD_MEMCPY          0x1D000000
#define CMD_BUTTON          0x0D000000
#define CMD_CLOCK           0x14000000
#define CMD_FGCOLOR         0x0A000000
#define CMD_BGCOLOR         0x09000000
#define CMD_GRADCOLOR       0x34000000
#define CMD_GAUGE           0x13000000
#define CMD_GRADIENT        0x0B000000
#define CMD_KEYS            0x0E000000
#define CMD_PROGRESS        0x0F000000
#define CMD_SCROLLBAR       0x11000000
#define CMD_SLIDER          0x10000000
#define CMD_DIAL            0x2D000000
#define CMD_TOGGLE          0x12000000
#define CMD_TEXT            0x0C000000
#define CMD_SETBASE         0x38000000
#define CMD_NUMBER          0x2E000000
#define CMD_LOADIDENTIY     0x26000000
#define CMD_SETMATRIX       0x2A000000
#define CMD_GETMATRIX       0x33000000
#define CMD_GETPTR          0x23000000
#define CMD_GETPROPS        0x25000000
#define CMD_SCALE           0x28000000
#define CMD_ROTATE          0x29000000
#define CMD_TRANSLATE       0x27000000
#define CMD_CALIBRATE       0x15000000
#define CMD_SETROTATE       0x36000000
#define CMD_SPINNER         0x16000000
#define CMD_SCREENSAVER     0x2F000000
#define CMD_SKETCH          0x30000000
#define CMD_STOP            0x17000000
#define CMD_SETFONT         0x2B000000
#define CMD_SETFONT2        0x3B000000
#define CMD_SETSCRATCH      0x3C000000
#define CMD_ROMFONT         0x3F000000
#define CMD_TRACK           0x2C000000
#define CMD_SNAPSHOT        0x1F000000
#define CMD_SNAPSHOT2       0x37000000
#define CMD_SETBITMAP       0x43000000
#define CMD_LOGO            0x31000000
#define CMD_CSKETCH         0x35000000

// FT8xx graphics engine specific macros useful for static display list generation
#define ALPHA_FUNC(func,ref) ((9UL<<24)|(((func)&7UL)<<8)|(((ref)&255UL)<<0))
#define BEGIN(prim) ((31UL<<24)|(((prim)&15UL)<<0))
#define BITMAP_HANDLE(handle) ((5UL<<24)|(((handle)&31UL)<<0))
#define BITMAP_LAYOUT(format,linestride,height) ((7UL<<24)|(((format)&31UL)<<19)|(((linestride)&1023UL)<<9)|(((height)&511UL)<<0))
#define BITMAP_SIZE(filter,wrapx,wrapy,width,height) ((8UL<<24)|(((filter)&1UL)<<20)|(((wrapx)&1UL)<<19)|(((wrapy)&1UL)<<18)|(((width)&511UL)<<9)|(((height)&511UL)<<0))
#define BITMAP_TRANSFORM_A(a) ((21UL<<24)|(((a)&131071UL)<<0))
#define BITMAP_TRANSFORM_B(b) ((22UL<<24)|(((b)&131071UL)<<0))
#define BITMAP_TRANSFORM_C(c) ((23UL<<24)|(((c)&16777215UL)<<0))
#define BITMAP_TRANSFORM_D(d) ((24UL<<24)|(((d)&131071UL)<<0))
#define BITMAP_TRANSFORM_E(e) ((25UL<<24)|(((e)&131071UL)<<0))
#define BITMAP_TRANSFORM_F(f) ((26UL<<24)|(((f)&16777215UL)<<0))
#define BLEND_FUNC(src,dst) ((11UL<<24)|(((src)&7UL)<<3)|(((dst)&7UL)<<0))
#define CALL(dest) ((29UL<<24)|(((dest)&65535UL)<<0))
#define CELL(cell) ((6UL<<24)|(((cell)&127UL)<<0))
#define CLEAR(c,s,t) ((38UL<<24)|(((c)&1UL)<<2)|(((s)&1UL)<<1)|(((t)&1UL)<<0))
#define CLEAR_COLOR_A(alpha) ((15UL<<24)|(((alpha)&255UL)<<0))
#define CLEAR_COLOR_RGB(red,green,blue) ((2UL<<24)|(((red)&255UL)<<16)|(((green)&255UL)<<8)|(((blue)&255UL)<<0))
#define CLEAR_STENCIL(s) ((17UL<<24)|(((s)&255UL)<<0))
#define CLEAR_TAG(s) ((18UL<<24)|(((s)&255UL)<<0))
#define COLOR_A(alpha) ((16UL<<24)|(((alpha)&255UL)<<0))
#define COLOR_MASK(r,g,b,a) ((32UL<<24)|(((r)&1UL)<<3)|(((g)&1UL)<<2)|(((b)&1UL)<<1)|(((a)&1UL)<<0))
#define COLOR_RGB(red,green,blue) ((4UL<<24)|(((red)&255UL)<<16)|(((green)&255UL)<<8)|(((blue)&255UL)<<0))
#define DISPLAY() ((0UL<<24))
#define END() ((33UL<<24))
#define JUMP(dest) ((30UL<<24)|(((dest)&65535UL)<<0))
#define LINE_WIDTH(width) ((14UL<<24)|(((width)&4095UL)<<0))
#define MACRO(m) ((37UL<<24)|(((m)&1UL)<<0))
#define POINT_SIZE(size) ((13UL<<24)|(((size)&8191UL)<<0))
#define RESTORE_CONTEXT() ((35UL<<24))
#define RETURN() ((36UL<<24))
#define SAVE_CONTEXT() ((34UL<<24))
#define STENCIL_FUNC(func,ref,mask) ((10UL<<24)|(((func)&7UL)<<16)|(((ref)&255UL)<<8)|(((mask)&255UL)<<0))
#define STENCIL_MASK(mask) ((19UL<<24)|(((mask)&255UL)<<0))
#define STENCIL_OP(sfail,spass) ((12UL<<24)|(((sfail)&7UL)<<3)|(((spass)&7UL)<<0))
#define TAG(s) ((3UL<<24)|(((s)&255UL)<<0))
#define TAG_MASK(mask) ((20UL<<24)|(((mask)&1UL)<<0))
#define VERTEX2F(x,y) ((1UL<<30)|(((x)&32767UL)<<15)|(((y)&32767UL)<<0))
#define VERTEX2II(x,y,handle,cell) ((2UL<<30)|(((x)&511UL)<<21)|(((y)&511UL)<<12)|(((handle)&31UL)<<7)|(((cell)&127UL)<<0))

uint8_t fetch_flash_byte(const uint8_t *data);
unsigned long get_touch_tag(void);
unsigned int cmd_busy(void);
void cmd_execute(void);
void inc_cmdOffset(unsigned int increment);
void start_cmd(unsigned long command);
void cmd_dl(unsigned long command);
void write_string(const char *text);
void cmd_romfont(uint32_t font, uint32_t romslot);
void cmd_text(int16_t x0, int16_t y0, int16_t font, uint16_t options, const char* text);
void cmd_button(int16_t x0, int16_t y0, int16_t w0, int16_t h0, int16_t font, uint16_t options, const char* text);
void cmd_clock(int16_t x0, int16_t y0, int16_t r0, uint16_t options, uint16_t hours, uint16_t minutes, uint16_t seconds);
void cmd_bgcolor(uint32_t color);
void cmd_fgcolor(uint32_t color);
void cmd_gradcolor(uint32_t color);
void cmd_gauge(int16_t x0, int16_t y0, int16_t r0, uint16_t options, uint16_t major, uint16_t minor, uint16_t val, uint16_t range);
void cmd_gradient(int16_t x0, int16_t y0, uint32_t rgb0, int16_t x1, int16_t y1, uint32_t rgb1);
void cmd_keys(int16_t x0, int16_t y0, int16_t w0, int16_t h0, int16_t font, uint16_t options, const char* text);
void cmd_progress(int16_t x0, int16_t y0, int16_t w0, int16_t h0, uint16_t options, uint16_t val, uint16_t range);
void cmd_scrollbar(int16_t x0, int16_t y0, int16_t w0, int16_t h0, uint16_t options, uint16_t val, uint16_t size, uint16_t range);
void cmd_slider(int16_t x1, int16_t y1, int16_t w1, int16_t h1, uint16_t options, uint16_t val, uint16_t range);
void cmd_dial(int16_t x0, int16_t y0, int16_t r0, uint16_t options, uint16_t val);
void cmd_toggle(int16_t x0, int16_t y0, int16_t w0, int16_t font, uint16_t options, uint16_t state, const char* text);
void cmd_setbase(uint32_t base);
void cmd_setbitmap(uint32_t addr, uint16_t fmt, uint16_t width, uint16_t height);
void cmd_number(int16_t x0, int16_t y0, int16_t font, uint16_t options, int32_t number);
void cmd_memzero(uint32_t ptr, uint32_t num);
void cmd_memset(uint32_t ptr, uint8_t value, uint32_t num);
void cmd_memcpy(uint32_t dest, uint32_t src, uint32_t num);
void cmd_append(uint32_t ptr, uint32_t num);
void spi_flash_write(const uint8_t *data, uint16_t len);
void cmd_inflate(uint32_t ptr, const uint8_t *data, uint16_t len);
void cmd_loadimage(uint32_t ptr, uint32_t options, const uint8_t *data, uint16_t len);
void cmd_mediafifo(uint32_t ptr, uint32_t size);
void cmd_loadidentity(void);
void cmd_translate(int32_t tx, int32_t ty);
void cmd_scale(int32_t sx, int32_t sy);
void cmd_rotate(int32_t ang);
void cmd_setmatrix(void);
void cmd_getmatrix(int32_t a, int32_t b, int32_t c, int32_t d, int32_t e, int32_t f);
void cmd_calibrate(void);
void cmd_coldstart(void);
void cmd_interrupt(uint32_t ms);
void cmd_logo(void);
void cmd_screensaver(void);
void cmd_setrotate(uint32_t r);
void cmd_sketch(int16_t x0, int16_t y0, uint16_t w0, uint16_t h0, uint32_t ptr, uint16_t format);
void cmd_snapshot(uint32_t ptr);
void cmd_spinner(int16_t x0, int16_t y0, uint16_t style, uint16_t scale);
void cmd_stop(void);
void cmd_track(int16_t x0, int16_t y0, int16_t w0, int16_t h0, int16_t tag);
void cmd_swap(void);
// meta-commands, including several commands at one
//void cmd_point(int16_t x0, int16_t y0, uint16_t size);
//void cmd_line(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t w0);
//void cmd_rect(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t corner);

void host_command(unsigned char data);                                   
void wr8(unsigned long address, unsigned char data);
void wr16(unsigned long address, unsigned int data); 
void wr32(unsigned long address, unsigned long data);
unsigned char rd8(unsigned long address);
unsigned int rd16(unsigned long address);
unsigned int rd32(unsigned long address);

#endif  /* EVE_H */
