/*
Diplomova prace : Palubni pocitac

user - api pro spravu uzivatelu

Atmega128A 10 MHz XTAL

Autor: Ondrej Lutera

2011/2012

*/
#ifndef USER_H_INCLUDED
#define USER_H_INCLUDED

#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include <string.h>
#include <stdio.h>

#include "i2clib/pcf8563.h"
#include "storage.h"
#include "ibutton.h"
#include "ds18lib/crc8.h"
#include "gui.h"
#include "backlight.h"
#include "define.h"
#include "car_meas.h"

#define NAME_LEN    6
#define MAX_USERS   10

#define DEFAULT_ADMIN_INDEX   0

#define ROOT_FOLDER     "/"
#define USERS_FOLDER    "/users"
#define DATA_FOLDER     "data"
#define CONFIG_FOLDER   "config"

#define LOGIN_OK    1
#define LOGIN_ERR   0
#define NEW_USER    2
#define EXP_USER    3

#define G_ROOT      1
#define G_READ      2

#define USER_INIT_SET    'Y'

typedef uint16_t id_t;

typedef struct
{

    uint8_t scr[MAX_SCREENS][MAX_ITEMS];

} scr_t;

typedef struct
{

    uint8_t init;
    char name[NAME_LEN];    /* jmeno uzivatele jako string */
    id_t uid;               /* unikatni identifikacni cislo uzivatele */
    id_t gid;               /* prava uzivatele */
    pcf_t lastLogin;        /* posledni doba nalogovani */
    pcf_t expTime;          /* doba kdy vyprsi tento ucet */
    ibutton_t iButton;      /* seriove cislo jeho prihlasovaciho iButton cipu */
    data_t lastData;        /* struktura obsahujici vsechna uklada data automobilu */
    scr_t scrData;          /* kazdy uzivatel ma svoje konfigurovatelne obrazovky*/
    odat_t opto;            /* kazdy uzivatel si muze upravit jas */
    pcf_t tripStart;        /* zaznamenal pocatek posledniho startu mereni vyletu */
    uint8_t trackDelay;
    uint8_t suspendDelay;
    uint8_t freeBuff[15];    /* volne misto pro dalsi funkce - z duvodu nemozne realokace*/

} user_t;

unsigned char userLogin(void);      // testuje login a vraci 1 pokud byl login korektni
unsigned char userLogout(void);     // odhlasuje aktivniho uzivatele
char * getActiveUserName(void);     // vraci jmeno aktivniho uzivatele

id_t getActiveUid(void);            // vraci uid aktiv. uzivatele
id_t getActiveGid(void);                // vraci gid aktiv. uzivatele
id_t getUserGid(uint8_t index);     // vraci gid uzivatele daneho indexem
id_t getUserUid(uint8_t index);     // vraci uid uziv. daneho indexem
uint8_t geActiveUserIndex(void);        // vraci index akt. uzivatele kterym je specifikovana jeho pozice v eeprom
uint8_t *getActiveTrackDelay(void);     // vraci zpozdeni mezi starou a novou trasou pri vyplem motoru pro aktivniho uzivatele
pcf_t * getActiveExpTime(void);         // vraci cas a datum expirace uctu aktiv. uzivatele
uint8_t* getActiveSuspendMin(void);     // vraci minuty prodleby pred provedenim Power-down pro aktivv. uzivatele
uint8_t checkRoot(void);                // testuje zda existuje admin
uint8_t initUser(uint8_t index, user_t * user);     // init uzivatele

void getUser(uint8_t index,user_t * data);      // vraci data uzivatele daneho indexem
void getUserName(uint8_t index,char * name);        // nastavi jmeno uzivatele

uint8_t getUserInitSet(uint8_t index);      // vraci udaj zda je uzivatel z dane pozice indexu EEPROM jiz nastaven nebo zda je karta prazdna
uint8_t useriButtonIsSet(ibutton_t *iButton);       // vraci udaj o tom zda je ibutton klic uzivatele nasteven spravne

void setUserIbutton(uint8_t index,ibutton_t * ib);          // nastavi ibutton uzivatele
void getUserIbutton(uint8_t index,ibutton_t * ib);      // vraci ibutton uzivatele
void clearUserIbutton(uint8_t index);           // smaze  nastaveny ibutton

void resetActiveUserTripData(void);     // reset trasy uzivatele.. uzivatel si muze nezavisle definovat pocatek mereni hodnot zobrazenych na LCD pod nazvem Tras ci Trip
void resetScrData(scr_t * data);        // reset prednastaveni obrazovek
void resetUserScrData(uint8_t index);       // reset prednastaveni obrazovek pro uzivatele daneho indexem
scr_t * getActiveUserScrData(void);     // vraci prednastaveni obrazovek pro aktiv. uzivatele
odat_t * getActiveUserOpto(void);           // vraci prednastaveni regulace jasu pro aktiv. uzivatele
void setActiveUserOpto(odat_t * opto);      // nastevuje reg. jasu pro aktiv. uzivatele
void saveActiveUser(void);          // uklada kartu aktiv uzivatele do eeprom
void setActiveUserScrData(uint8_t scr,uint8_t box,uint8_t val);     // nastavuje rozlozeni obrazovek pro aktiv. uzivatele
unsigned char checkUserDataYearFolder(user_t * user, uint16_t year);        // kontrola validyty slozek na SD karte vuci aktualnimu roku
unsigned char checkUserDataMonthFolder(user_t * user,uint16_t year,uint8_t month);      // kontrola validity slozek vuci akt. mesici
unsigned char checkActiveUserDataYearFolder(uint16_t year);         //  kontrola validity slozek let aktiv. uzivatele
unsigned char checkActiveUserDataMonthFolder(uint16_t year,uint8_t month);      // kontrola validity slozek mesicu aktiv. uziv.
cm_t * getActiveUserMeas(void);         // vraci ulozene namerene veliciny pro aktiv. uzivatele
void storeActiveUserMeas(uint8_t state);            // uklada namerene veliciny do SD karty

void clearActiveUserAvgMeas(void); // maze Avg hodnoty
void clearActiveUserTripMeas(void); // maze trasa trip hodnoty

void activeUserPollData(void);      // polling merenych dat pro uzivatele.. stara se o vyzvednuti mereni od knihovny car_meas

#endif // USER_H_INCLUDED
