diff options
Diffstat (limited to 'Projects/TempDataLogger/Lib/DS1307.c')
-rw-r--r-- | Projects/TempDataLogger/Lib/DS1307.c | 107 |
1 files changed, 93 insertions, 14 deletions
diff --git a/Projects/TempDataLogger/Lib/DS1307.c b/Projects/TempDataLogger/Lib/DS1307.c index 0a702a333..d3ee95a77 100644 --- a/Projects/TempDataLogger/Lib/DS1307.c +++ b/Projects/TempDataLogger/Lib/DS1307.c @@ -7,9 +7,98 @@ #include "DS1307.h" -bool DS1307_SetTimeDate(const TimeDate_t* NewTimeDate) +#if defined(DUMMY_RTC) + +/** Current dummy RTC time and date */ +static volatile TimeDate_t DummyRTC_Count; + +void RTC_Init(void) +{ + DummyRTC_Count.Hour = 0; + DummyRTC_Count.Minute = 0; + DummyRTC_Count.Second = 0; + DummyRTC_Count.Day = 1; + DummyRTC_Count.Month = 1; + DummyRTC_Count.Year = 00; +} + +void RTC_Tick500ms(void) +{ + static bool HalfSecondElapsed = false; + + HalfSecondElapsed = !HalfSecondElapsed; + if (HalfSecondElapsed == false) + return; + + if (++DummyRTC_Count.Second < 60) + return; + + DummyRTC_Count.Second = 0; + + if (++DummyRTC_Count.Minute < 60) + return; + + DummyRTC_Count.Minute = 0; + + if (++DummyRTC_Count.Hour < 24) + return; + + DummyRTC_Count.Hour = 0; + + static const char MonthLength[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + uint8_t DaysInMonth = MonthLength[DummyRTC_Count.Month - 1]; + + /* Check if we need to account for a leap year */ + if ((DummyRTC_Count.Month == 2) && + ((!(DummyRTC_Count.Year % 400)) || ((DummyRTC_Count.Year % 100) && !(DummyRTC_Count.Year % 4)))) + { + DaysInMonth++; + } + + if (++DummyRTC_Count.Day <= DaysInMonth) + return; + + DummyRTC_Count.Day = 1; + + if (++DummyRTC_Count.Month <= 12) + return; + + DummyRTC_Count.Month = 1; + DummyRTC_Count.Year++; +} + +bool RTC_SetTimeDate(const TimeDate_t* NewTimeDate) +{ + GlobalInterruptDisable(); + DummyRTC_Count = *NewTimeDate; + GlobalInterruptEnable(); + + return true; +} + +bool RTC_GetTimeDate(TimeDate_t* const TimeDate) +{ + GlobalInterruptDisable(); + *TimeDate = DummyRTC_Count; + GlobalInterruptEnable(); + + return true; +} + +#else + +void RTC_Init(void) +{ + /* Unused for a real external DS1307 RTC device */ +} + +void RTC_Tick500ms(void) +{ + /* Unused for a real external DS1307 RTC device */ +} + +bool RTC_SetTimeDate(const TimeDate_t* NewTimeDate) { -#if !defined(DUMMY_RTC) DS1307_DateTimeRegs_t NewRegValues; const uint8_t WriteAddress = 0; @@ -38,22 +127,12 @@ bool DS1307_SetTimeDate(const TimeDate_t* NewTimeDate) { return false; } -#endif return true; } -bool DS1307_GetTimeDate(TimeDate_t* const TimeDate) +bool RTC_GetTimeDate(TimeDate_t* const TimeDate) { -#if defined(DUMMY_RTC) - TimeDate->Hour = 1; - TimeDate->Minute = 1; - TimeDate->Second = 1; - - TimeDate->Day = 1; - TimeDate->Month = 1; - TimeDate->Year = 1; -#else DS1307_DateTimeRegs_t CurrentRegValues; const uint8_t ReadAddress = 0; @@ -73,8 +152,8 @@ bool DS1307_GetTimeDate(TimeDate_t* const TimeDate) TimeDate->Day = (CurrentRegValues.Byte5.Fields.TenDay * 10) + CurrentRegValues.Byte5.Fields.Day; TimeDate->Month = (CurrentRegValues.Byte6.Fields.TenMonth * 10) + CurrentRegValues.Byte6.Fields.Month; TimeDate->Year = (CurrentRegValues.Byte7.Fields.TenYear * 10) + CurrentRegValues.Byte7.Fields.Year; -#endif return true; } +#endif |