Index: RTC.c =================================================================== diff -u -r6abc34804f57c48e9faf927e8e788d0de757026c -rfab687e5e82471ff0fda2205baf9d47f52cee8fc --- RTC.c (.../RTC.c) (revision 6abc34804f57c48e9faf927e8e788d0de757026c) +++ RTC.c (.../RTC.c) (revision fab687e5e82471ff0fda2205baf9d47f52cee8fc) @@ -23,6 +23,7 @@ #include "SystemCommMessages.h" #include "Timers.h" #include "Utilities.h" +#include /** * @addtogroup RTC @@ -124,6 +125,8 @@ #define LEAP_YEAR_MONTH ( 2 - 1 ) ///< Leap year month is February. Subtract 1 month for zero-based months. #define SECONDS_IN_NORMAL_YEAR ( SECONDS_IN_A_DAY * 365 ) ///< Number of seconds in a normal year. #define SECONDS_IN_LEAP_YEAR ( SECONDS_IN_A_DAY * 366 ) ///< Number of seconds in a leap year. +#define DAYS_IN_NORMAL_YEAR (365) ///< Number of days in a normal year. +#define DAYS_IN_LEAP_YEAR (366) ///< Number of days in a leap year. /// Number of seconds in 4 years. Includes an extra day for 1 leap within any 4 year period. static const U32 SECONDS_IN_4_YEARS = SECONDS_IN_NORMAL_YEAR * 3 + SECONDS_IN_LEAP_YEAR; /// Number of seconds in 2 years. Assumes no leap year in 2 year period. @@ -312,21 +315,22 @@ * @brief * The setRTCEpoch sets the clock from a given epoch. * @details Inputs: none -* @details Outputs: RTCNewTimestampStruct +* @details Outputs: none * @param epoch date/time stamp epoch -* @return TRUE if clock set, FALSE if not. +* @return TRUE if valid epoch time received, FALSE if not. +* @note If the epoch time is valid, the RTCNewTimeStampStruct updated *************************************************************************/ BOOL setRTCEpoch( U32 epoch ) { BOOL result; result = convertEpoch2DateTime( epoch ); - result = setRTCTimestamp( RTCNewTimestampStruct.seconds, - RTCNewTimestampStruct.minutes, - RTCNewTimestampStruct.hours, - RTCNewTimestampStruct.days, - RTCNewTimestampStruct.months, - RTCNewTimestampStruct.years); +// result = setRTCTimestamp( RTCNewTimestampStruct.seconds, +// RTCNewTimestampStruct.minutes, +// RTCNewTimestampStruct.hours, +// RTCNewTimestampStruct.days, +// RTCNewTimestampStruct.months, +// RTCNewTimestampStruct.years); return result; } @@ -881,24 +885,41 @@ BOOL result; RTC_TIMESTAMP_T dtTime; U32 i, dayCnt; - U32 fourYears = epoch / SECONDS_IN_4_YEARS; - U32 twoYrEpoch = epoch - ( fourYears * SECONDS_IN_4_YEARS ); - U32 twoYears = twoYrEpoch / SECONDS_IN_2_YEARS; - U32 oneYrEpoch = twoYrEpoch - ( twoYears * SECONDS_IN_2_YEARS ); - U32 oneYears = ( twoYears > 0 ? oneYrEpoch / SECONDS_IN_LEAP_YEAR : oneYrEpoch / SECONDS_IN_NORMAL_YEAR ); - U32 days = ( twoYears > 0 ? ( oneYrEpoch - SECONDS_IN_LEAP_YEAR ) / SECONDS_IN_A_DAY : ( oneYrEpoch - SECONDS_IN_NORMAL_YEAR ) / SECONDS_IN_A_DAY ); - U32 wholeYears = ( fourYears * 4 ) + ( twoYears * 2 ) + oneYears; - BOOL leapYear = ( twoYears > 0 && 0 == oneYears ? TRUE : FALSE ); - U32 oneDayEpoch= oneYrEpoch % SECONDS_IN_A_DAY; - U32 hours = oneDayEpoch / SECS_IN_HOUR; - U32 oneHrEpoch = oneDayEpoch - ( hours * SECS_IN_HOUR ); - U32 mins = oneHrEpoch / SEC_PER_MIN; - U32 secs = oneHrEpoch - ( mins * SEC_PER_MIN ); + U32 days; + U32 fourYears = epoch / SECONDS_IN_4_YEARS; + U32 twoYrEpoch = epoch - ( fourYears * SECONDS_IN_4_YEARS ); + U32 twoYears = twoYrEpoch / SECONDS_IN_2_YEARS; + U32 oneYrEpoch = twoYrEpoch - ( twoYears * SECONDS_IN_2_YEARS ); + U32 oneYears = ( twoYears > 0 ? oneYrEpoch / SECONDS_IN_LEAP_YEAR : oneYrEpoch / SECONDS_IN_NORMAL_YEAR ); + U32 remainDays = ( twoYears > 0 ? ( SECONDS_IN_LEAP_YEAR - oneYrEpoch ) / SECONDS_IN_A_DAY : ( SECONDS_IN_NORMAL_YEAR - oneYrEpoch ) / SECONDS_IN_A_DAY ); + U32 wholeYears = ( fourYears * 4 ) + ( twoYears * 2 ) + oneYears; + BOOL leapYear = ( twoYears > 0 && 0 == oneYears ? TRUE : FALSE ); + U32 oneDayEpoch = oneYrEpoch % SECONDS_IN_A_DAY; + U32 hours = oneDayEpoch / SECS_IN_HOUR; + U32 oneHrEpoch = oneDayEpoch - ( hours * SECS_IN_HOUR ); + U32 mins = oneHrEpoch / SEC_PER_MIN; + U32 secs = oneHrEpoch - ( mins * SEC_PER_MIN ); + dtTime.years = EPOCH_BASE_YEAR + wholeYears; dtTime.months = 0; dayCnt = 0; - daysInMonth[ LEAP_YEAR_MONTH ] = ( TRUE == leapYear ? 29 : 28 ); + + /* + * Adjust days in February and calculate actual day of the + * year based upon whether or not the year is a leap year. + */ + if (leapYear) + { + daysInMonth[ LEAP_YEAR_MONTH ] = 29; + days = DAYS_IN_LEAP_YEAR - remainDays; + } + else + { + daysInMonth[ LEAP_YEAR_MONTH ] = 28; + days = DAYS_IN_NORMAL_YEAR - remainDays; + } + for ( i = 0; i < MONTHS_IN_YEAR; i++ ) { if ( days >= dayCnt ) @@ -908,12 +929,14 @@ } dayCnt += daysInMonth[ i ]; } - dtTime.days += 1; // days will be number of full days in current month so need to add 1 for the partial current day to get day of month +//wjb dtTime.days += 1; // days will be number of full days in current month so need to add 1 for the partial current day to get day of month dtTime.hours = hours; dtTime.minutes = mins; dtTime.seconds = secs; result = setRTCTimestamp( dtTime.seconds, dtTime.minutes, dtTime.hours, dtTime.days, dtTime.months, dtTime.years ); + printf("epoch: %d, sec: %d, min: %d, days: %d, mon: %d, year: %d\n", epoch, dtTime.seconds, dtTime.minutes, dtTime.hours, dtTime.days, dtTime.months, dtTime.years); + return result; }