

#ifndef DS3231_H_
#define DS3231_H_

#define try_count_max 200 // предельное количество попыток пообщаться с часами

#define DS3231_ADDRESS_READ 0b11010001
#define DS3231_ADDRESS_WRITE 0b11010000

#define ds3231_try_count_max 200
#define flag_12_24 0b1000000
#define flag_am_pm 0b100000



union ds3231_rtc_data_type{
	u8 raw[19];
	struct{
		u8 seconds;
		u8 minutes;
		u8 hour;
		u8 day;
		u8 date;
		u8 month;
		u8 year;
		u8 a1_seconds;
		u8 a1_minutes;
		u8 a1_hour;
		u8 a1_day_date;
		u8 a2_minutes;
		u8 a2_hour;
		u8 a2_day_date;
		u8 control;
		u8 control_status;
		s8 aging_offset;
		s8 temperature_base;
		u8 temperature_float;
		u8 hour_12_24;
		u8 a1hour_12_24;
		u8 a2hour_12_24;
		u8 hour_am_pm;
		u8 a1hour_am_pm;
		u8 a2hour_am_pm;
		u8 a1m;
		u8 a2m;
		u8 a1_flag_day_date;
		u8 a2_flag_day_date;
	};
};

union ds3231_rtc_data_type ds3231_rtc_data;

typedef enum DS3231ByteAdress {
	TIME_SECONDS = 0,
	TIME_MINUTES = 1,
	TIME_HOUR = 2,
	DATE_DAY = 3,
	DATE_DATE = 4,
	DATE_MONTH = 5,
	DATE_YEAR = 6,
	A1_SECONDS = 7,
	A1_MINUTES = 8,
	A1_HOUR = 9,
	A1_DAY_DATE = 10,
	A2_MINUTES = 11,
	A2_HOUR = 12,
	A2_DAY_DATE = 13,
	CONTROL = 14,
	CONTROL_STATUS = 15,
	AGING = 16
} DS3231ByteAdress;

typedef enum DS3231ControlStatusBits {
	EOSC = 0b10000000,
	BBSQW = 0b1000000,
	CONV = 0b100000,
	RS2 = 0b10000,
	RS1 = 0b1000,
	INTCN = 0b100,
	A2IE = 0b10,
	A1IE = 1,
	OSF = 0b10000000,
	EN32KHZ = 0b1000,
	BSY = 0b100,
	A2F = 0b10,
	A1F = 1,
	HOUR_12_24 = 0b1000000,
	STATE_ENABLE = 1,
	STATE_DISABLE = 0
} DS3231ControlStatusBits;



u8 ds3231_init(DS3231ControlStatusBits clear_en);
u8 ds3231_get_raw(void);
u8 ds3231_set_settings(DS3231ByteAdress new_byte_address, DS3231ControlStatusBits new_data, DS3231ControlStatusBits new_state);
u8 ds3231_set_time_date_alarm(DS3231ByteAdress new_byte_address, u8 new_data);
u8 dectohex(u8 dec);
u8 hextodec(u8 hex);

#endif /*DS3231_H_*/
