void GetDay( Calendar *date ){ int dayNum = BCDtoInt(date->DayOfMonth); int month = BCDtoInt(date->Month); int year = BCDtoInt(date->Year); int dayName; int d, m, y, c; d = GetdNumber(dayNum); m = GetmNumber(month, year); y = GetyNumber(year); c = GetcNumber(year); dayName = (d + m + y + (y/4) + c) % 7; date->DayOfWeek = dayName; }
void IncrementReminderMonth( y_reminder *reminder ){ int month = BCDtoInt( reminder->Time.Month ); if( month < 12 ) { month++; reminder->Time.Month = IntToBCD( month ); } else { reminder->Time.Month = 1; IncrementReminderYear( reminder ); } }
void IncrementReminderYear( y_reminder *reminder ){ int year = BCDtoInt( reminder->Time.Year & 0xFF ); if( year < 99 ) { year++; reminder->Time.Year &= 0xff00; reminder->Time.Year |= IntToBCD( year ); } else { int century = BCDtoInt( reminder->Time.Year >> 8 ); century++; reminder->Time.Year &= 0x0000; reminder->Time.Year |= ( IntToBCD( century ) << 8 ); } }
void IncrementReminderDay( y_reminder *reminder ){ int day = BCDtoInt( reminder->Time.DayOfMonth ); if ( day < 28 ) reminder->Time.DayOfMonth = IntToBCD( ++day ); else { if ( reminder->Time.Month == 0x04 || reminder->Time.Month == 0x06 || reminder->Time.Month == 0x09 || reminder->Time.Month == 0x11 ){ if ( day < 30 ) reminder->Time.DayOfMonth = IntToBCD( ++day ); else { reminder->Time.DayOfMonth = 1; IncrementReminderMonth( reminder ); } } else if ( reminder->Time.Month == 0x02 ){ int year = BCDtoInt( reminder->Time.Year ); if ( IsLeapYear(year) ){ if ( day < 29 ) reminder->Time.DayOfMonth = IntToBCD( ++day ); else { reminder->Time.DayOfMonth = 1; IncrementReminderMonth( reminder ); } } else { if ( day < 28 ) reminder->Time.DayOfMonth = IntToBCD( ++day ); else { reminder->Time.DayOfMonth = 1; IncrementReminderMonth( reminder ); } } } else { if ( day < 31 ) reminder->Time.DayOfMonth = IntToBCD( ++day ); else { reminder->Time.DayOfMonth = 1; IncrementReminderMonth( reminder ); } } } }
void Sync_RTC(void){ time_t ltime; struct tm *rtc_tm; ltime = time(NULL); rtc_tm = localtime(<ime); int fd; unsigned char buff[10]; unsigned char data[10]; buff[0] = 0x02; /* Open I2C-BUS */ I2C_Open(&fd, 0x51); /* Write register */ I2C_Send(&fd, buff, 1) ; /* Read the RTC */ I2C_Read(&fd, data, 7); /* Close I2C-BUS */ I2C_Close(&fd); data[0] &= 0x7F; data[1] &= 0x7F; data[2] &= 0x3F; data[3] &= 0x3F; data[4] &= 0x07; data[5] &= 0x1F; data[6] &= 0xFF; rtc_tm -> tm_sec = BCDtoInt(data[0]); rtc_tm -> tm_min = BCDtoInt(data[1]); rtc_tm -> tm_hour = BCDtoInt(data[2]); rtc_tm -> tm_mday = BCDtoInt(data[3]); rtc_tm -> tm_wday = BCDtoInt(data[4]); rtc_tm -> tm_mon = BCDtoInt(data[5]); rtc_tm -> tm_year = BCDtoInt(data[6]); const struct timeval tv = {mktime(rtc_tm), 0}; settimeofday(&tv, 0); }
void Read_RTC(void){ int fd; unsigned char buff[10]; unsigned char data[10]; buff[0] = 0x02; /* Open I2C-BUS */ I2C_Open(&fd, 0x51); /* Write register */ I2C_Send(&fd, buff, 1) ; /* Read the RTC */ I2C_Read(&fd, data, 7); /* Close I2C-BUS */ I2C_Close(&fd); data[0] &= 0x7F; data[1] &= 0x7F; data[2] &= 0x3F; data[3] &= 0x3F; data[4] &= 0x07; data[5] &= 0x1F; data[6] &= 0xFF; printf("Sec: %d\n",BCDtoInt(data[0])); printf("Min: %d\n",BCDtoInt(data[1])); printf("Hour: %d\n",BCDtoInt(data[2])); printf("MDays: %d\n",BCDtoInt(data[3])); printf("WDays: %d\n",BCDtoInt(data[4])); printf("Month: %d\n",BCDtoInt(data[5])); printf("Year: %d\n",BCDtoInt(data[6])); }