#ifndef _XTAL_FREQ
  // Unless specified elsewhere, 4MHz system frequency is assumed
  #define _XTAL_FREQ 4000000
#endif

#ifndef _DRV_DS12887_H_
#define _DRV_DS12887_H_

#include  <pic.h> 

#define T_ASD					_delay(1)	// min. 20 ns
#define T_ASL					_delay(1)// min. 30 ns
#define PW_ASH				_delay(1)	// min. 60 ns
#define T_AHL					_delay(1)	// min. 10 ns, muxed address hold time
#define T_ASED				_delay(1)	// min. 40 ns
#define PW_EL					_delay(1)	// min. 150 ns
#define T_DSW					_delay(1)	// min. 100 ns, data setup time
#define PW_EH					_delay(1)	// min. 125 ns
#define T_DHW					0		// 0 ns, write-data hold time
#define T_CS					_delay(1)	// min. 20 ns
#define T_CH					0		// 0 ns, chip-select hold time
#define T_DDR					_delay(1)	// max. 120 ns
#define T_DHR					_delay(1)	// max. 80 ns

/*
 * DS12887 regiszterei
 */
#define	SECONDS_REG				    0x00	// 0..59

/* "don't care" alarm code = 0b11XXXXXX */
#define	SECONDS_ALARM_REG		  0x01	// 0..59
#define	MINUTES_REG				    0x02	// 0..59

/* "don't care" alarm code = 0b11XXXXXX */
#define	MINUTES_ALARM_REG		  0x03	// 0..59
#define	HOURS_REG				      0x04	// 1..12, vagy 0..23

/* "don't care" alarm code = 0b11XXXXXX */
#define	HOURS_ALARM_REG		    0x05	// 1..12, vagy 0..23

#define	DAY_OF_THE_WEEK_REG	  0x06	// 1..7, 1 - vasárnap
#define	DAY_OF_THE_MONTH_REG	0x07	// 1..31
#define	MONTH_REG				      0x08	// 1..12
#define	YEAR_REG				      0x09	// 0..99
#define	REGISTER_A			      0x0A
#define	REGISTER_B			      0x0B
#define	REGISTER_C			      0x0C
#define	REGISTER_D			      0x0D

/*
 * REGISTER_A                 // eyeket kene modositani
 */
#define	UIP		BIT(7)	// Update-In-Progress, ha 1, akkor tart egy időfrissítési ciklus

// oszcillátor vezérlő bitek, '010' beírása után 500 msec múlva indul a frissítés
#define	DV2		BIT(6)
#define	DV1		BIT(5)
#define	DV0		BIT(4)

#define	RS3		BIT(3)
#define	RS2		BIT(2)
#define	RS1		BIT(1)
#define	RS0		BIT(0)

/*
 * REGISTER_B
 */
// 0 - másodpercenként frissít, 1 - letiltja a frissítést, ekkor lehet inicializálni
// illetve olvasni, miután az UIP bit is 0-ba vonult
#define SET		BIT(7)

#define PIE		BIT(6)	// periodic interrupt enable      //ezeket kene modositani
#define AIE		BIT(5)	// alarm interrupt enable
#define UIE		BIT(4)	// update-ended interrupt enable
#define SQWE	BIT(3)
#define DM		BIT(2)	// 1 - bináris, 0 - BCD
#define M2412	BIT(1)	// 1 - 24 órás mód, 0 - 12 órás mód
//#define DSE		BIT(0)	// Daylight Savings Enable, téli-nyári időszámítás engedélyezése
#define DSE (1)	// Daylight Savings Enable, téli-nyári időszámítás engedélyezése

/*
 * REGISTER_C
 * az összes IT jelző flag törlődik, ha az IRQ alacsony szintje mellett
 * olvassuk a REGISTER_C-t
 */
#define	IRQF	BIT(7)    // ezeket kene modositani
#define	PF		BIT(6)
#define	AF		BIT(5)
#define	UF		BIT(4)  

/*
 * REGISTER_D
 */
#define	VRT		BIT(7)	// Valid RAM and Time, 1 = minden jó, 0 - valószínű lemerült az elem

typedef struct DS12887 {
	unsigned char Year;
	unsigned char Month;
	unsigned char Day_of_the_Month;
	unsigned char Day_of_the_Week;
	unsigned char Hours;
	unsigned char Minutes;
	unsigned char Seconds;
} DS12887_t;

struct RTCStatus {
	unsigned RTC_IRQ_REQUEST:1;
	unsigned RTC_SEC:1;
	unsigned RTC_ALARM:1;
};

extern struct RTCStatus RTCStatus;
extern int rtc_Hours;
extern int rtc_Minutes;
extern int rtc_Seconds;

void DS12887_INT_handler(void);
unsigned char batteryCheck(void);
void DS12887_Init(void);
void setDate(DS12887_t *date);
void getDate(DS12887_t *date);
void SetRTCAlarm(unsigned char hours, unsigned char minutes, unsigned char seconds);
void DisableRTCAlarm(void);

#endif