
#include "mcu_i2c.h"
#include "ds3231.h"

u8 ds3231_init(DS3231ControlStatusBits clear_en){
	u16 try_count=0;
	u8 echo=3,i,n;
	u8 send_data[18];
	for (i=0;i<18;i++){
		send_data[i] = 0;
	}
	if (clear_en == DISABLE){
		send_data[0] = CONTROL;
		n = 3;
		send_data[1] = CONV;														// все остальные биты должны быть = 0
	} else {
		send_data[15] = CONV;
		n = 18;
	}
// сбрасываем все флаги и генератор 32кгц
	while ((echo!=0)&&(try_count<ds3231_try_count_max)){						// защита от зависшего или вышедшего из строя RTC
		echo=mcu_i2c_write_byte(DS3231_ADDRESS_WRITE, n, send_data);
		try_count++;
	}
	if (try_count>=ds3231_try_count_max){
		return echo;
	}
	return 0;
}

u8 ds3231_get_raw(void){
	u16 try_count=0;
	u8 echo=3;
	u8 raw_data[19];
	u8 i;
	while ((echo!=0)&&(try_count<ds3231_try_count_max)){												// защита от зависшего или вышедшего из строя датчика
		echo=mcu_i2c_read_addr_byte(DS3231_ADDRESS_READ, 19, raw_data, 0);
		try_count++;
	}
	if (try_count>=ds3231_try_count_max){
		return echo;
	}
//	if (asdfg==0)
//		uart1_sendstr(raw_data, 19);
	for (i=0;i<=6;i++){
		if ((i==2)||(i==5)) i++;
		ds3231_rtc_data.raw[i]=hextodec(raw_data[i]);
	}
/*	ds3231_rtc_data.raw[1]=hextodec(raw_data[1]);
	ds3231_rtc_data.raw[3]=hextodec(raw_data[3]);
	ds3231_rtc_data.raw[4]=hextodec(raw_data[4]);*/
	ds3231_rtc_data.raw[5]=hextodec(raw_data[5]&0b11111);
//	ds3231_rtc_data.raw[6]=hextodec(raw_data[6]);
	ds3231_rtc_data.raw[7]=hextodec(raw_data[7]&0b1111111);
	ds3231_rtc_data.raw[8]=hextodec(raw_data[8]&0b1111111);
	ds3231_rtc_data.raw[10]=hextodec(raw_data[10]&0b111111);
	ds3231_rtc_data.raw[11]=hextodec(raw_data[11]&0b1111111);
	ds3231_rtc_data.raw[13]=hextodec(raw_data[13]&0b111111);
	if (raw_data[2]&flag_12_24){
		ds3231_rtc_data.hour_12_24=1;
		ds3231_rtc_data.raw[2]=hextodec(raw_data[2]&0b11111);
		if (raw_data[2]&flag_am_pm)
			ds3231_rtc_data.hour_am_pm=1;
		else
			ds3231_rtc_data.hour_am_pm=0;
	}
	else{
		ds3231_rtc_data.hour_12_24=0;
		ds3231_rtc_data.raw[2]=hextodec(raw_data[2]&0b111111);
	}
	if (raw_data[9]&flag_12_24){
		ds3231_rtc_data.a1hour_12_24=1;
		ds3231_rtc_data.raw[9]=hextodec(raw_data[9]&0b11111);
		if (raw_data[9]&flag_am_pm)
			ds3231_rtc_data.a1hour_am_pm=1;
		else
			ds3231_rtc_data.a1hour_am_pm=0;
	}
	else{
		ds3231_rtc_data.a1hour_12_24=0;
		ds3231_rtc_data.raw[9]=hextodec(raw_data[9]&0b111111);
	}
	if (raw_data[12]&flag_12_24){
		ds3231_rtc_data.a2hour_12_24=1;
		ds3231_rtc_data.raw[12]=hextodec(raw_data[12]&0b11111);
		if (raw_data[12]&flag_am_pm)
			ds3231_rtc_data.a2hour_am_pm=1;
		else
			ds3231_rtc_data.a2hour_am_pm=0;
	}
	else{
		ds3231_rtc_data.a2hour_12_24=0;
		ds3231_rtc_data.raw[12]=hextodec(raw_data[12]&0b111111);
	}
	if (raw_data[7]&0b10000000){
		ds3231_rtc_data.a1m|=0b1;
	}
	else{
		ds3231_rtc_data.a1m&=(~0b1);
	}
	if (raw_data[8]&0b10000000){
		ds3231_rtc_data.a1m|=0b10;
	}
	else{
		ds3231_rtc_data.a1m&=(~0b10);
	}
	if (raw_data[9]&0b10000000){
		ds3231_rtc_data.a1m|=0b100;
	}
	else{
		ds3231_rtc_data.a1m&=(~0b100);
	}
	if (raw_data[10]&0b10000000){
		ds3231_rtc_data.a1m|=0b1000;
	}
	else{
		ds3231_rtc_data.a1m&=(~0b1000);
	}
	if (raw_data[11]&0b10000000){
		ds3231_rtc_data.a2m|=0b1;
	}
	else{
		ds3231_rtc_data.a2m&=(~0b1);
	}
	if (raw_data[12]&0b10000000){
		ds3231_rtc_data.a2m|=0b10;
	}
	else{
		ds3231_rtc_data.a2m&=(~0b10);
	}
	if (raw_data[13]&0b10000000){
		ds3231_rtc_data.a2m|=0b100;
	}
	else{
		ds3231_rtc_data.a2m&=(~0b100);
	}
	if (raw_data[10]&0b1000000){
		ds3231_rtc_data.a1_flag_day_date=1;
	}
	else{
		ds3231_rtc_data.a1_flag_day_date=0;
	}
	if (raw_data[13]&0b1000000){
		ds3231_rtc_data.a2_flag_day_date=1;
	}
	else{
		ds3231_rtc_data.a2_flag_day_date=0;
	}
	for (i=14;i<=18;i++){
		ds3231_rtc_data.raw[i]=raw_data[i];
	}
	return 0;
}

u8 ds3231_set_settings(DS3231ByteAdress new_byte_address, DS3231ControlStatusBits new_data, DS3231ControlStatusBits new_state){
	u8 send_data[2];
	u8 echo=3;
	u8 state[3]={0,0,0};
	u16 try_count=0;
	while ((echo!=0)&&(try_count<ds3231_try_count_max)){
		echo=mcu_i2c_read_addr_byte(DS3231_ADDRESS_READ, 3, state, new_byte_address);
		try_count++;
	}
	if (new_state==STATE_DISABLE)
		state[0]&=~new_data;
	else
		state[0]|=new_data;
//	while ((echo!=0)&&(try_count<ds3231_try_count_max)){												// защита от зависшего или вышедшего из строя датчика
//		echo=mcu_i2c_read_addr_byte(DS3231_ADDRESS_READ, 2, send_data, CONTROL);
//		try_count++;
//	}
//	if (try_count>=ds3231_try_count_max){
//		return echo;
//	}
	send_data[0]=new_byte_address;
	send_data[1]=state[0];
	echo=3;
	try_count=0;
	while ((echo!=0)&&(try_count<ds3231_try_count_max)){						// защита от зависшего или вышедшего из строя RTC
		echo=mcu_i2c_write_byte(DS3231_ADDRESS_WRITE, 2, send_data);
		try_count++;
	}
	if (try_count>=ds3231_try_count_max){
		return echo;
	}
	return 0;
}

u8 ds3231_set_time_date_alarm(DS3231ByteAdress new_byte_address, u8 new_data){
	u8 send_data[2];
	u8 echo=3;
	u16 try_count=0;
	send_data[0]=new_byte_address;
	send_data[1]=0;
	if ((new_byte_address==TIME_SECONDS)
			||(new_byte_address==TIME_MINUTES)
			||(new_byte_address==DATE_DAY)
			||(new_byte_address==DATE_DATE)
			||(new_byte_address==DATE_MONTH)
			||(new_byte_address==DATE_YEAR)
			||(new_byte_address==A1_SECONDS)
			||(new_byte_address==A1_MINUTES)
			||(new_byte_address==A2_MINUTES)
			||(new_byte_address==A1_DAY_DATE)
			||(new_byte_address==A2_DAY_DATE))
	{
		send_data[1]=dectohex(new_data);
	}
	if ((new_byte_address==A1_SECONDS)&&(ds3231_rtc_data.a1m&1)){
		send_data[1]|=0b10000000;
	}
	if ((new_byte_address==A1_MINUTES)&&(ds3231_rtc_data.a1m&0b10)){
		send_data[1]|=0b10000000;
	}
	if ((new_byte_address==A2_MINUTES)&&(ds3231_rtc_data.a2m&1)){
		send_data[1]|=0b10000000;
	}
	if((new_byte_address==TIME_HOUR))
	{
		send_data[1]=dectohex(new_data);
		if (ds3231_rtc_data.hour_12_24){
			send_data[1]|=0b1000000;
			if (ds3231_rtc_data.hour_am_pm){
				send_data[1]|=0b100000;
			}
		}
	}
	if((new_byte_address==A1_HOUR))
	{
		send_data[1]=dectohex(new_data);
		if (ds3231_rtc_data.a1hour_12_24){
			send_data[1]|=0b1000000;
			if (ds3231_rtc_data.a1hour_am_pm){
				send_data[1]|=0b100000;
			}
		}
		if (ds3231_rtc_data.a1m&0b100){
			send_data[1]|=0b10000000;
		}
	}
	if((new_byte_address==A2_HOUR))
	{
		send_data[1]=dectohex(new_data);
		if (ds3231_rtc_data.a2hour_12_24){
			send_data[1]|=0b1000000;
			if (ds3231_rtc_data.a2hour_am_pm){
				send_data[1]|=0b100000;
			}
		}
		if (ds3231_rtc_data.a2m&0b10){
			send_data[1]|=0b10000000;
		}
	}
	if(new_byte_address==A1_DAY_DATE){
		if (ds3231_rtc_data.a1_flag_day_date){
			send_data[1]|=0b1000000;
		}
		if (ds3231_rtc_data.a1m&0b1000){
			send_data[1]|=0b10000000;
		}
	}
	if(new_byte_address==A2_DAY_DATE){
		if (ds3231_rtc_data.a2_flag_day_date){
			send_data[1]|=0b1000000;
		}
		if (ds3231_rtc_data.a2m&0b100){
			send_data[1]|=0b10000000;
		}
	}
	if(new_byte_address==AGING){
		send_data[1]=new_data;
	}
	while ((echo!=0)&&(try_count<ds3231_try_count_max)){						// защита от зависшего или вышедшего из строя RTC
		echo=mcu_i2c_write_byte(DS3231_ADDRESS_WRITE, 2, send_data);
		try_count++;
	}
	if (try_count<ds3231_try_count_max){
		return 0;
	}
	return echo;
}

//==================hextodec====================
u8 hextodec(u8 hex) {
return hex-(hex/0x10)*6;
};
//----------------------------------------------

//==================dectohex====================
u8 dectohex(u8 dec) {
return (dec/10)*6+dec;
};
