E3 Designers / TimeManagement

Dependents:   mbed_escm2000

Committer:
WiredHome
Date:
Wed Nov 02 01:32:07 2011 +0000
Revision:
6:a517fee06e2e
Parent:
5:fbbdf57675c3
v1.04 Minor changes to the adjustment logic for complexity reduction

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WiredHome 0:108436d3cea9 1 /// @file TimeUtilities.h contains a real time clock interface for the mbed
WiredHome 0:108436d3cea9 2 ///
WiredHome 1:6d3d16f4b27c 3 /// @mainpage Time Management of the Real Time Clock module
WiredHome 1:6d3d16f4b27c 4 ///
WiredHome 0:108436d3cea9 5 /// APIs for showing the time from the RTC, or from a passed in value.
WiredHome 0:108436d3cea9 6 /// Also supports setting the clock, timezone offsets and calibration
WiredHome 0:108436d3cea9 7 /// of the RTC subsystem.
WiredHome 0:108436d3cea9 8 ///
WiredHome 1:6d3d16f4b27c 9 /// @note Copyright &copr; 2011 by Smartware Computing, all rights reserved.
WiredHome 1:6d3d16f4b27c 10 /// Individuals may use this application for evaluation or non-commercial
WiredHome 1:6d3d16f4b27c 11 /// purposes. Within this restriction, changes may be made to this application
WiredHome 1:6d3d16f4b27c 12 /// as long as this copyright notice is retained. The user shall make
WiredHome 1:6d3d16f4b27c 13 /// clear that their work is a derived work, and not the original.
WiredHome 1:6d3d16f4b27c 14 /// Users of this application and sources accept this application "as is" and
WiredHome 1:6d3d16f4b27c 15 /// shall hold harmless Smartware Computing, for any undesired results while
WiredHome 1:6d3d16f4b27c 16 /// using this application - whether real or imagined.
WiredHome 1:6d3d16f4b27c 17 ///
WiredHome 1:6d3d16f4b27c 18 /// @author David Smart, Smartware Computing
WiredHome 1:6d3d16f4b27c 19 ///
WiredHome 1:6d3d16f4b27c 20 /// @note
WiredHome 1:6d3d16f4b27c 21 /// History
WiredHome 6:a517fee06e2e 22 /// v1.04 20111101
WiredHome 6:a517fee06e2e 23 /// \li Minor change to the APIs to reduce some of the complexity
WiredHome 5:fbbdf57675c3 24 /// v1.03 20111030
WiredHome 5:fbbdf57675c3 25 /// \li Adding an API to adjust time and calibration based on how far it is
WiredHome 5:fbbdf57675c3 26 /// off "now", based on when it was set.
WiredHome 3:524ad47afdc7 27 /// v1.02
WiredHome 4:dfb2e93f804a 28 /// \li 20110716 Minor documentation update
WiredHome 3:524ad47afdc7 29 /// \li 20110616 Minor documentation updates
WiredHome 1:6d3d16f4b27c 30 /// v1.01 29 May 2011
WiredHome 1:6d3d16f4b27c 31 /// \li Slightly improved documentation.
WiredHome 1:6d3d16f4b27c 32 /// unlabeled 29 May 2011
WiredHome 1:6d3d16f4b27c 33 /// \li Initial release as a library
WiredHome 0:108436d3cea9 34 ///
WiredHome 0:108436d3cea9 35 #ifndef TIMEUTILITIES_H
WiredHome 0:108436d3cea9 36 #define TIMEUTILITIES_H
WiredHome 0:108436d3cea9 37
WiredHome 0:108436d3cea9 38 #ifndef WIN32
WiredHome 0:108436d3cea9 39 #include "mbed.h"
WiredHome 0:108436d3cea9 40 #else
WiredHome 0:108436d3cea9 41 typedef int int32_t;
WiredHome 0:108436d3cea9 42 #endif
WiredHome 0:108436d3cea9 43
WiredHome 0:108436d3cea9 44 #include <time.h>
WiredHome 0:108436d3cea9 45
WiredHome 1:6d3d16f4b27c 46 /// RealTimeClock is an interface to the mbed RTC module
WiredHome 1:6d3d16f4b27c 47 ///
WiredHome 1:6d3d16f4b27c 48 /// It provides interfaces to get and set the time in text representation
WiredHome 3:524ad47afdc7 49 /// as well as a means to get and set the timezone offset so that it
WiredHome 1:6d3d16f4b27c 50 /// maintains time in UTC format.
WiredHome 1:6d3d16f4b27c 51 ///
WiredHome 1:6d3d16f4b27c 52 /// Additionally, it provides an interface to adjust the calibration
WiredHome 1:6d3d16f4b27c 53 /// registers of the RTC, to compensate for 32 kHz clock error, whether
WiredHome 1:6d3d16f4b27c 54 /// based on the oscillator itself or on some bias to ambient temperature.
WiredHome 1:6d3d16f4b27c 55 ///
WiredHome 3:524ad47afdc7 56 /// @note It is recommended that the system has a battery connected to
WiredHome 3:524ad47afdc7 57 /// the mbed battery backup pin.
WiredHome 3:524ad47afdc7 58 ///
WiredHome 3:524ad47afdc7 59 /// @note The timezone offset is stored in RTC register GPREG0 which
WiredHome 3:524ad47afdc7 60 /// is battery backed, permitting recovery on the next startup.
WiredHome 1:6d3d16f4b27c 61 ///
WiredHome 1:6d3d16f4b27c 62 /// Example:
WiredHome 1:6d3d16f4b27c 63 /// @code
WiredHome 1:6d3d16f4b27c 64 /// RealTimeClock rtc;
WiredHome 1:6d3d16f4b27c 65 ///
WiredHome 1:6d3d16f4b27c 66 /// void main() {
WiredHome 4:dfb2e93f804a 67 /// bool success;
WiredHome 4:dfb2e93f804a 68 /// char TimeTest[] = "05/29/2011 14:15:18 (-6:00)";
WiredHome 4:dfb2e93f804a 69 /// char buf[50];
WiredHome 4:dfb2e93f804a 70 /// success = rtc.SetTime(TimeTest);
WiredHome 1:6d3d16f4b27c 71 /// rtc.GetTimeString(buf);
WiredHome 1:6d3d16f4b27c 72 /// printf("success: %i, time: %s\n", success, buf);
WiredHome 1:6d3d16f4b27c 73 /// }
WiredHome 4:dfb2e93f804a 74 /// prints the following:
WiredHome 4:dfb2e93f804a 75 /// success: 1, time: Sun May 29 14:15:18 2011 (tzo: -6:00)
WiredHome 1:6d3d16f4b27c 76 /// @endcode
WiredHome 1:6d3d16f4b27c 77 ///
WiredHome 0:108436d3cea9 78 class RealTimeClock
WiredHome 0:108436d3cea9 79 {
WiredHome 0:108436d3cea9 80 public:
WiredHome 3:524ad47afdc7 81 /// Constructor for the RealTimeClock interface, usually implemented
WiredHome 3:524ad47afdc7 82 /// outside of main( )
WiredHome 3:524ad47afdc7 83 ///
WiredHome 1:6d3d16f4b27c 84 RealTimeClock();
WiredHome 1:6d3d16f4b27c 85
WiredHome 3:524ad47afdc7 86 /// Destructor for the RealTimeClock, usually not executed
WiredHome 3:524ad47afdc7 87 ///
WiredHome 1:6d3d16f4b27c 88 ~RealTimeClock();
WiredHome 1:6d3d16f4b27c 89
WiredHome 5:fbbdf57675c3 90 /// GetTimeValue gets the current time in time_t format
WiredHome 5:fbbdf57675c3 91 ///
WiredHome 5:fbbdf57675c3 92 /// Gets the current time from the rtc and returns the time in time_t format.
WiredHome 5:fbbdf57675c3 93 /// This is functionally identical to "return time(NULL);",
WiredHome 5:fbbdf57675c3 94 /// simply wrapped in this class for convenience.
WiredHome 5:fbbdf57675c3 95 ///
WiredHome 5:fbbdf57675c3 96 /// @returns current time in time_t format
WiredHome 5:fbbdf57675c3 97 ///
WiredHome 5:fbbdf57675c3 98 time_t GetTimeValue();
WiredHome 5:fbbdf57675c3 99
WiredHome 1:6d3d16f4b27c 100 /// GetTimeString gets the formatted time applying the internal time-zone offset of hours and minutes
WiredHome 1:6d3d16f4b27c 101 ///
WiredHome 1:6d3d16f4b27c 102 /// It places the formatted string into the buffer in the format of
WiredHome 1:6d3d16f4b27c 103 /// Sun May 29 07:19:24 2011 (tzo: -6:00)
WiredHome 3:524ad47afdc7 104 ///
WiredHome 1:6d3d16f4b27c 105 /// The internal timezone offset can be set with SetTimeOffset
WiredHome 1:6d3d16f4b27c 106 ///
WiredHome 1:6d3d16f4b27c 107 /// @param buffer is a pointer to a buffer large enough (>= 40 chars) for the formatted time string
WiredHome 1:6d3d16f4b27c 108 /// @param tValue is the optional time value to convert to text, if zero, then the current
WiredHome 1:6d3d16f4b27c 109 /// time is used.
WiredHome 1:6d3d16f4b27c 110 /// @returns nothing
WiredHome 1:6d3d16f4b27c 111 ///
WiredHome 1:6d3d16f4b27c 112 void GetTimeString(char * buffer, time_t tValue = 0);
WiredHome 0:108436d3cea9 113
WiredHome 1:6d3d16f4b27c 114 /// GetTimeString gets the formatted time applying the time-zone offset of hours and minutes
WiredHome 1:6d3d16f4b27c 115 ///
WiredHome 1:6d3d16f4b27c 116 /// It places the formatted string into the buffer in the format of
WiredHome 1:6d3d16f4b27c 117 /// Sun May 29 07:19:24 2011 (tzo: -6:00)
WiredHome 1:6d3d16f4b27c 118 ///
WiredHome 1:6d3d16f4b27c 119 /// @param buffer is a pointer to a buffer large enough (>= 40 chars) for the formatted time string
WiredHome 1:6d3d16f4b27c 120 /// @param hOffset is the hours offset
WiredHome 1:6d3d16f4b27c 121 /// @param mOffset is the minutes offset
WiredHome 1:6d3d16f4b27c 122 /// @returns nothing
WiredHome 1:6d3d16f4b27c 123 ///
WiredHome 1:6d3d16f4b27c 124 void GetTimeString(char * buffer, int hOffset, int mOffset);
WiredHome 0:108436d3cea9 125
WiredHome 1:6d3d16f4b27c 126 /// GetTimeString gets the formatted time value applying the time-zone offset of hours and minutes
WiredHome 1:6d3d16f4b27c 127 ///
WiredHome 1:6d3d16f4b27c 128 /// It places the formatted string into the buffer in the format of
WiredHome 1:6d3d16f4b27c 129 /// Sun May 29 07:19:24 2011 (tzo: -6:00)
WiredHome 1:6d3d16f4b27c 130 ///
WiredHome 1:6d3d16f4b27c 131 /// @param buffer is a pointer to a buffer large enough (>= 40 chars) for the formatted time string
WiredHome 1:6d3d16f4b27c 132 /// @param tValue is the time value to convert to text, if zero, then the current
WiredHome 1:6d3d16f4b27c 133 /// time is used.
WiredHome 1:6d3d16f4b27c 134 /// @param hOffset is the hours offset
WiredHome 1:6d3d16f4b27c 135 /// @param mOffset is the minutes offset
WiredHome 1:6d3d16f4b27c 136 /// @returns nothing
WiredHome 1:6d3d16f4b27c 137 ///
WiredHome 1:6d3d16f4b27c 138 void GetTimeString(char * buffer, time_t tValue, int hOffset, int mOffset);
WiredHome 0:108436d3cea9 139
WiredHome 6:a517fee06e2e 140 /// GetTimeLastSet will extract the time_t when last set from RTC ram
WiredHome 6:a517fee06e2e 141 ///
WiredHome 6:a517fee06e2e 142 /// When the clock is correctly set, the time value will have been stored
WiredHome 6:a517fee06e2e 143 /// which permits later adjustments to the calibration based on
WiredHome 6:a517fee06e2e 144 /// elapsed time and knowing when it was set. This function retrieves it.
WiredHome 6:a517fee06e2e 145 ///
WiredHome 6:a517fee06e2e 146 /// @returns time_t value when the time was last set
WiredHome 6:a517fee06e2e 147 ///
WiredHome 6:a517fee06e2e 148 time_t GetTimeLastSet();
WiredHome 6:a517fee06e2e 149
WiredHome 1:6d3d16f4b27c 150 /// SetTimeOffset will set the hour and minute timezone offset
WiredHome 1:6d3d16f4b27c 151 ///
WiredHome 1:6d3d16f4b27c 152 /// @param offsetHour is the timezone offset in hours
WiredHome 1:6d3d16f4b27c 153 /// @param offsetMinute is the timezone offset in minutes
WiredHome 1:6d3d16f4b27c 154 /// @returns nothing
WiredHome 1:6d3d16f4b27c 155 ///
WiredHome 1:6d3d16f4b27c 156 void SetTimeOffset(int offsetHour, int offsetMinute);
WiredHome 0:108436d3cea9 157
WiredHome 1:6d3d16f4b27c 158 /// GetTimeCalibration will return the calibration register value
WiredHome 1:6d3d16f4b27c 159 ///
WiredHome 1:6d3d16f4b27c 160 /// This is the raw register value as a signed 32-bit value (even though
WiredHome 1:6d3d16f4b27c 161 /// it is actually a 17-bit unsigned value with an additional 'direction' flag).
WiredHome 1:6d3d16f4b27c 162 ///
WiredHome 1:6d3d16f4b27c 163 /// @returns calibration settings ranging from -131071 to +131071
WiredHome 1:6d3d16f4b27c 164 ///
WiredHome 1:6d3d16f4b27c 165 int32_t GetTimeCalibration();
WiredHome 0:108436d3cea9 166
WiredHome 1:6d3d16f4b27c 167 /// SetTimeCalibration will set the calibration register value
WiredHome 1:6d3d16f4b27c 168 ///
WiredHome 1:6d3d16f4b27c 169 /// This accepts a signed value to be used to set the calibration
WiredHome 1:6d3d16f4b27c 170 /// registers. Setting the calibration value to zero disables the
WiredHome 5:fbbdf57675c3 171 /// calibration function.
WiredHome 5:fbbdf57675c3 172 /// It is important to know the register function in order to use
WiredHome 5:fbbdf57675c3 173 /// this command, and this API is normally not used by external
WiredHome 5:fbbdf57675c3 174 /// application code. @See AdjustBySeconds for a user-friendly
WiredHome 5:fbbdf57675c3 175 /// API.
WiredHome 1:6d3d16f4b27c 176 ///
WiredHome 1:6d3d16f4b27c 177 /// @param calibration value to use ranging from -131071 to +131071
WiredHome 1:6d3d16f4b27c 178 /// @returns nothing
WiredHome 1:6d3d16f4b27c 179 ///
WiredHome 1:6d3d16f4b27c 180 void SetTimeCalibration(int32_t calibration);
WiredHome 0:108436d3cea9 181
WiredHome 0:108436d3cea9 182
WiredHome 1:6d3d16f4b27c 183 /// SetTime will set the Real Time Clock from a well formatted string
WiredHome 1:6d3d16f4b27c 184 ///
WiredHome 1:6d3d16f4b27c 185 /// This will read a string, and if it is well formed, it will then
WiredHome 1:6d3d16f4b27c 186 /// set the RTC based on this string. The string should be of the form:
WiredHome 1:6d3d16f4b27c 187 /// 'MM/DD/YYYY HH:MM:SS' and may have the optional timezone offset
WiredHome 1:6d3d16f4b27c 188 /// of the form '(+/-HH:MM)'
WiredHome 1:6d3d16f4b27c 189 ///
WiredHome 1:6d3d16f4b27c 190 /// example: 05/29/2011 13:15:07 (-6:00)
WiredHome 1:6d3d16f4b27c 191 ///
WiredHome 1:6d3d16f4b27c 192 /// @param timestring is the string to parse
WiredHome 1:6d3d16f4b27c 193 /// @returns true if the time was set
WiredHome 1:6d3d16f4b27c 194 ///
WiredHome 1:6d3d16f4b27c 195 bool SetTime(char * timestring);
WiredHome 5:fbbdf57675c3 196
WiredHome 5:fbbdf57675c3 197
WiredHome 5:fbbdf57675c3 198 /// AdjustBySeconds adjusts both the time and the calibration by seconds
WiredHome 5:fbbdf57675c3 199 ///
WiredHome 5:fbbdf57675c3 200 /// This will take a signed value, which is the current adjustment in seconds
WiredHome 5:fbbdf57675c3 201 /// to put the clock on the correct time. So, if the clock is behind by
WiredHome 5:fbbdf57675c3 202 /// 3 seconds, the value should be +3 to advance the clock accordingly.
WiredHome 5:fbbdf57675c3 203 /// It will then adjust the time, and it will attempt to adjust the
WiredHome 5:fbbdf57675c3 204 /// calibration factor to make the time more accurate.
WiredHome 5:fbbdf57675c3 205 ///
WiredHome 5:fbbdf57675c3 206 /// The adjustment can only be made if it has retained when the clock was
WiredHome 5:fbbdf57675c3 207 /// last set, in order to know by how much to adjust it. It is also most
WiredHome 5:fbbdf57675c3 208 /// accurate if several days have elapsed since the time was set.
WiredHome 5:fbbdf57675c3 209 ///
WiredHome 5:fbbdf57675c3 210 /// @note The current version only works if the calibration value
WiredHome 5:fbbdf57675c3 211 /// is zero when this adjustment is made.
WiredHome 5:fbbdf57675c3 212 ///
WiredHome 5:fbbdf57675c3 213 /// @param adjustSeconds is the signed value by which to adjust the time to
WiredHome 5:fbbdf57675c3 214 /// correct it to the current actual time.
WiredHome 5:fbbdf57675c3 215 /// @returns true if the adjustment was made
WiredHome 5:fbbdf57675c3 216 /// @returns false if the adjustment could not be made
WiredHome 5:fbbdf57675c3 217 ///
WiredHome 5:fbbdf57675c3 218 bool AdjustBySeconds(int32_t adjustSeconds);
WiredHome 5:fbbdf57675c3 219
WiredHome 5:fbbdf57675c3 220 /// GetVersion will return a pointer to a constant text string
WiredHome 5:fbbdf57675c3 221 ///
WiredHome 5:fbbdf57675c3 222 /// This returns a pointer to a constant string which represents
WiredHome 5:fbbdf57675c3 223 /// the version of this component.
WiredHome 5:fbbdf57675c3 224 ///
WiredHome 5:fbbdf57675c3 225 /// @returns pointer to a character string holding the version.
WiredHome 5:fbbdf57675c3 226 ///
WiredHome 5:fbbdf57675c3 227 const char * GetVersion();
WiredHome 5:fbbdf57675c3 228
WiredHome 5:fbbdf57675c3 229 private:
WiredHome 5:fbbdf57675c3 230
WiredHome 5:fbbdf57675c3 231 /// SetTimeOffsetStore will store the timezone offset values in RTC ram
WiredHome 5:fbbdf57675c3 232 ///
WiredHome 5:fbbdf57675c3 233 /// This takes the current timezone offset values and stores them in
WiredHome 5:fbbdf57675c3 234 /// the RTC battery backed ram.
WiredHome 5:fbbdf57675c3 235 ///
WiredHome 5:fbbdf57675c3 236 /// @returns nothing
WiredHome 5:fbbdf57675c3 237 ///
WiredHome 5:fbbdf57675c3 238 void SetTimeOffsetStore();
WiredHome 5:fbbdf57675c3 239
WiredHome 5:fbbdf57675c3 240 /// GetTimeOffsetStore will extract the timezone offset values from RTC ram
WiredHome 5:fbbdf57675c3 241 ///
WiredHome 5:fbbdf57675c3 242 /// This extracts the timezone offset values that were stored in RTC
WiredHome 5:fbbdf57675c3 243 /// battery backed ram and uses them for time information.
WiredHome 5:fbbdf57675c3 244 ///
WiredHome 5:fbbdf57675c3 245 /// @returns nothing
WiredHome 5:fbbdf57675c3 246 ///
WiredHome 5:fbbdf57675c3 247 void GetTimeOffsetStore();
WiredHome 5:fbbdf57675c3 248
WiredHome 6:a517fee06e2e 249 /// SetTimeLastSet will store the time_t when last set in RTC ram
WiredHome 5:fbbdf57675c3 250 ///
WiredHome 5:fbbdf57675c3 251 /// When the clock is correctly set, the time value will be stored
WiredHome 5:fbbdf57675c3 252 /// which permits later adjustments to the calibration based on
WiredHome 5:fbbdf57675c3 253 /// elapsed time and knowing when it was set.
WiredHome 5:fbbdf57675c3 254 ///
WiredHome 6:a517fee06e2e 255 /// @param t is the time_t value that should be saved
WiredHome 5:fbbdf57675c3 256 /// @returns nothing
WiredHome 5:fbbdf57675c3 257 ///
WiredHome 6:a517fee06e2e 258 void SetTimeLastSet(time_t);
WiredHome 5:fbbdf57675c3 259
WiredHome 0:108436d3cea9 260 };
WiredHome 0:108436d3cea9 261
WiredHome 0:108436d3cea9 262 #endif