Add volatile software RTC to the TempDataLogger application if the dummy RTC mode...
[pub/USBasp.git] / Projects / TempDataLogger / Lib / DS1307.c
index 0a702a3..d3ee95a 100644 (file)
@@ -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