/*
Diplomova prace : Palubni pocitac

gui.h

Atmega128A 10 MHz XTAL

Autor: Ondrej Lutera

2011/2012

*/


#ifndef GUI_H_INCLUDED
#define GUI_H_INCLUDED

/* LCD library */
#include "lib/dogm128.h"
#include "keys.h"
#include "temp.h"

#include <avr/pgmspace.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "i2clib/pcf8563.h"
#include "define.h"

#define BIGCOL  80
#define BIGROW  20
#define ROWSIZE 21

#define XMAX    (DOG_WIDTH-1)
#define YMAX    (DOG_HEIGHT-1)

#define FORMAT_TIME 0xff
#define FORMAT_TEMP 0xfe

#define MODE_UINT   1
#define MODE_SINT   2
#define MODE_TEXT   3
#define MODE_TIME   4
#define MODE_DATE   5
#define MODE_UCHAR  6
#define MODE_UI32   7

typedef union{

    uint32_t ui32;
    pcf_t * pTime;
    int16_t temp;

}unival_t;
typedef union{

    DOG_PSTR_P flash;
    char * ram;

}txt_t;
/* struktura jednoho prvku hlavni obrazovky*/
typedef struct{

    unival_t value;                 // kreslena hodnota
    unsigned char prec;             // vykresleni des. carky
    txt_t text;                // flash ci ram
    DOG_PSTR_P unit;        // text ve flash


}item_t;
/* struktura obrazovky, ktera obsahuje ukazatele na prvky - z duvodu dynamicke zmeny pozic prvku v obraze*/
#define MAX_ITEMS 5
typedef struct{

    item_t item[MAX_ITEMS];     // prvky obrazovky s provoznimi hodnotami
    uint8_t edit;               // flag pro zobrazeni kurzoru ktery je vykreslen v pripade editace obrazovek
    DOG_PGM_P valFont;          // font hodnoty
    DOG_PGM_P bigValFont;       // font hodnoty nejvetsi bunky
    DOG_PGM_P unitFont;         // font jednotek
    DOG_PGM_P textFont;         // font textu

}vscreen_t;
typedef union{

    unsigned int * val;
    int * sval;
    char * text;
    uint8_t * ui8;
    uint32_t * ui32;
    pcf_t *time;


}val_t;
#define VAL_T_MAX   (menu->editMax)

typedef struct{

    DOG_PSTR_P text;       // prvek menu text ve flash
    val_t edit;             // hodnota prvku ktera muze byt editovana
    unsigned char mode;     // mod hodnoty prvku.. viz val_t
    unsigned char prec;     // des. carka hodnoty

}list_t;

#define F_EDIT  1
#define MENU_TEXT_OFFSET    10
#define CURSOR_OFFSET       3
#define MENU_VAL_OFFSET     (XMAX-2)

typedef struct{

    char * titleText;       // titulek v sram
    DOG_PGM_P titleFont;        // druh fontu titulku

    DOG_PGM_P font;     // font polozek menu
    list_t * list;      // pointer na pole polozek menu
    unsigned char list_size;        // velikost pole
    unsigned char cursor;           // pozice kurzoru
    unsigned char flags;            //  flagy..flag ze je prvek editovan apod
    unsigned char edit_pos;         // pozice kurzoru v editovane hodnote
    unsigned char max_edit_pos;     // max pozice kurzoru v editovane hodnote
    uint16_t editMax;               // max hodnota editovane polozky



}menu_t;

void drawFrame(void);               // vykresli ram kolem LCD

void drawVscreen(vscreen_t * screen);       /* funkce vykreslujici hlavni obrazovky s merenymi daty dle predane struktury*/

void drawMenu(menu_t * menu);           // vykresli menu

unsigned char editMenuVal(menu_t * menu,key_t *keys, unsigned char backup);     // editace polozky menu

void drawWait(unsigned char x,unsigned char y);     // vykresli presipaci hodiny

#endif // GUI_H_INCLUDED
