Alarm library for use with mbed.

Committer:
charlesgt
Date:
Sun Oct 31 08:13:17 2010 +0000
Revision:
1:f4c7f13e5553
Parent:
0:33dddd0644c5
Child:
2:23e65cacea5a
Alpha version most not tested. Should move to using lists for expired, set and unset alarms, but example code should work now

Who changed what in which revision?

UserRevisionLine numberNew contents of line
charlesgt 0:33dddd0644c5 1 /* mbed AlarmTimeDate Library
charlesgt 0:33dddd0644c5 2 * Copyright (c) 2010 Charles Garcia-Tobin
charlesgt 0:33dddd0644c5 3 *
charlesgt 0:33dddd0644c5 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
charlesgt 0:33dddd0644c5 5 * of this software and associated documentation files (the "Software"), to deal
charlesgt 0:33dddd0644c5 6 * in the Software without restriction, including without limitation the rights
charlesgt 0:33dddd0644c5 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
charlesgt 0:33dddd0644c5 8 * copies of the Software, and to permit persons to whom the Software is
charlesgt 0:33dddd0644c5 9 * furnished to do so, subject to the following conditions:
charlesgt 0:33dddd0644c5 10 *
charlesgt 0:33dddd0644c5 11 * The above copyright notice and this permission notice shall be included in
charlesgt 0:33dddd0644c5 12 * all copies or substantial portions of the Software.
charlesgt 0:33dddd0644c5 13 *
charlesgt 0:33dddd0644c5 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
charlesgt 0:33dddd0644c5 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
charlesgt 0:33dddd0644c5 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
charlesgt 0:33dddd0644c5 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
charlesgt 0:33dddd0644c5 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
charlesgt 0:33dddd0644c5 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
charlesgt 0:33dddd0644c5 20 * THE SOFTWARE.
charlesgt 0:33dddd0644c5 21 */
charlesgt 0:33dddd0644c5 22
charlesgt 0:33dddd0644c5 23 #ifndef __ALARM_TIME_DATE_H__
charlesgt 0:33dddd0644c5 24 #define __ALARM_TIME_DATE_H__
charlesgt 0:33dddd0644c5 25
charlesgt 0:33dddd0644c5 26 /**
charlesgt 0:33dddd0644c5 27 * Alarm callback function pointer type
charlesgt 0:33dddd0644c5 28 */
charlesgt 0:33dddd0644c5 29 typedef void (*AlarmCbFn)(void*);
charlesgt 0:33dddd0644c5 30
charlesgt 0:33dddd0644c5 31 /**
charlesgt 0:33dddd0644c5 32 * Alarm callback function pointer type
charlesgt 0:33dddd0644c5 33 */
charlesgt 0:33dddd0644c5 34 typedef void (*SleepFn)(void*);
charlesgt 0:33dddd0644c5 35
charlesgt 0:33dddd0644c5 36 /**
charlesgt 0:33dddd0644c5 37 * AlarmTimeDate class
charlesgt 0:33dddd0644c5 38 * Alarm class, alarms can be set for a specific date and time and can be set to repeat
charlesgt 0:33dddd0644c5 39 * daily, weekly, fortnightly, monthly or yearly. It is also possible to repeat
charlesgt 0:33dddd0644c5 40 * daily skip whilst skipping weekends.
charlesgt 0:33dddd0644c5 41 * The main program loop needs to call the Tick function below. However the function
charlesgt 0:33dddd0644c5 42 * does take a SleepFn function pointer which can be used to to sleep the device
charlesgt 0:33dddd0644c5 43 * the class will generate an RTC interrupt when an alarm goes off
charlesgt 0:33dddd0644c5 44 * Example usage:
charlesgt 1:f4c7f13e5553 45 * \code
charlesgt 0:33dddd0644c5 46 * #include "mbed.h"
charlesgt 0:33dddd0644c5 47 * #include "AlarmTimeDate.h"
charlesgt 0:33dddd0644c5 48 *
charlesgt 0:33dddd0644c5 49 * DigitalOut led1(LED1);
charlesgt 0:33dddd0644c5 50 *
charlesgt 0:33dddd0644c5 51 * void __DoSleep(void *) {
charlesgt 0:33dddd0644c5 52 * __WFE();
charlesgt 0:33dddd0644c5 53 * }
charlesgt 0:33dddd0644c5 54 *
charlesgt 0:33dddd0644c5 55 * void AlarmFn(void *) {
charlesgt 0:33dddd0644c5 56 * led1 = !led1;
charlesgt 0:33dddd0644c5 57 * time_t now = time(NULL);
charlesgt 0:33dddd0644c5 58 * printf("Expiring %s! ",ctime(&now));
charlesgt 0:33dddd0644c5 59 * }
charlesgt 0:33dddd0644c5 60 *
charlesgt 0:33dddd0644c5 61 *
charlesgt 0:33dddd0644c5 62 * int main() {
charlesgt 0:33dddd0644c5 63 * led1 = 0;
charlesgt 0:33dddd0644c5 64 * time_t seconds;
charlesgt 0:33dddd0644c5 65 *
charlesgt 0:33dddd0644c5 66 * // setup time structure for 29 Oct 2010 00:00:00
charlesgt 0:33dddd0644c5 67 * struct tm t;
charlesgt 0:33dddd0644c5 68 * t.tm_sec = 00; // 0-59
charlesgt 0:33dddd0644c5 69 * t.tm_min = 00; // 0-59
charlesgt 0:33dddd0644c5 70 * t.tm_hour = 00; // 0-23
charlesgt 0:33dddd0644c5 71 * t.tm_mday = 29; // 1-31
charlesgt 0:33dddd0644c5 72 * t.tm_mon = 9; // 0-11
charlesgt 0:33dddd0644c5 73 * t.tm_year = 110; // year since 1900
charlesgt 0:33dddd0644c5 74 * seconds = mktime(&t);
charlesgt 0:33dddd0644c5 75 * set_time(seconds);
charlesgt 0:33dddd0644c5 76 * AlarmTimeDate::Init();
charlesgt 0:33dddd0644c5 77 * AlarmTimeDate a1(AlarmFn,NULL,seconds+2);
charlesgt 0:33dddd0644c5 78 * do {
charlesgt 0:33dddd0644c5 79 * AlarmTimeDate::PrintAlarms();
charlesgt 0:33dddd0644c5 80 * AlarmTimeDate::Tick(__DoSleep,NULL);
charlesgt 0:33dddd0644c5 81 * seconds+=4;
charlesgt 0:33dddd0644c5 82 * a1.Set(seconds);
charlesgt 0:33dddd0644c5 83 * } while(1);
charlesgt 0:33dddd0644c5 84 * }
charlesgt 1:f4c7f13e5553 85 * \endcode
charlesgt 0:33dddd0644c5 86 **/
charlesgt 0:33dddd0644c5 87
charlesgt 0:33dddd0644c5 88 class AlarmTimeDate {
charlesgt 0:33dddd0644c5 89 public:
charlesgt 0:33dddd0644c5 90 /**
charlesgt 0:33dddd0644c5 91 * repeat types
charlesgt 0:33dddd0644c5 92 */
charlesgt 0:33dddd0644c5 93 enum TRepeat {
charlesgt 0:33dddd0644c5 94 ENone,
charlesgt 0:33dddd0644c5 95 EDaily,
charlesgt 0:33dddd0644c5 96 EDailyNoWeeked,
charlesgt 0:33dddd0644c5 97 EWeekly,
charlesgt 0:33dddd0644c5 98 EFortNightly,
charlesgt 0:33dddd0644c5 99 EMonthly,
charlesgt 0:33dddd0644c5 100 EYearly
charlesgt 0:33dddd0644c5 101 };
charlesgt 0:33dddd0644c5 102
charlesgt 0:33dddd0644c5 103 /**
charlesgt 0:33dddd0644c5 104 * @return time of this alarm's expiry as a time_t (secs since 00:00:00 1/1/1970)
charlesgt 0:33dddd0644c5 105 * 0 if alarm is not set
charlesgt 0:33dddd0644c5 106 */
charlesgt 0:33dddd0644c5 107 time_t AsTimeT() { return iTime; }
charlesgt 0:33dddd0644c5 108 /**
charlesgt 0:33dddd0644c5 109 * @return time of this alarm's expiry as a tm struct
charlesgt 0:33dddd0644c5 110 * NULL if alarm is not set
charlesgt 0:33dddd0644c5 111 */
charlesgt 0:33dddd0644c5 112 struct tm* AsTM() { return (iTime) ? localtime(&iTime) : NULL; }
charlesgt 0:33dddd0644c5 113
charlesgt 0:33dddd0644c5 114 /** Set alarm using time_t value (secs since 00:00:00 1/1/1970)
charlesgt 0:33dddd0644c5 115 * @param time_t aTime alarm expiry time
charlesgt 0:33dddd0644c5 116 */
charlesgt 0:33dddd0644c5 117 void Set(time_t aTime) { iTime = aTime; Tick(NULL,NULL); }
charlesgt 0:33dddd0644c5 118
charlesgt 0:33dddd0644c5 119 /** Set alarm using tm struct
charlesgt 0:33dddd0644c5 120 * @param struct tm* aTm alarm expiry time
charlesgt 0:33dddd0644c5 121 */
charlesgt 0:33dddd0644c5 122 void Set(struct tm* aTm) {iTime = mktime(aTm); Tick(NULL,NULL); }
charlesgt 0:33dddd0644c5 123
charlesgt 0:33dddd0644c5 124 /**
charlesgt 0:33dddd0644c5 125 * @return repeat type
charlesgt 0:33dddd0644c5 126 */
charlesgt 0:33dddd0644c5 127 TRepeat Repeat() {
charlesgt 0:33dddd0644c5 128 return iRepeat;
charlesgt 0:33dddd0644c5 129 }
charlesgt 0:33dddd0644c5 130
charlesgt 0:33dddd0644c5 131 /** Set repeat type
charlesgt 0:33dddd0644c5 132 * @param TRepeat aRepeat
charlesgt 0:33dddd0644c5 133 */
charlesgt 0:33dddd0644c5 134 void SetRepeat(TRepeat aRepeat) {
charlesgt 0:33dddd0644c5 135 iRepeat = aRepeat;
charlesgt 0:33dddd0644c5 136 Tick(NULL,NULL);
charlesgt 0:33dddd0644c5 137 }
charlesgt 0:33dddd0644c5 138
charlesgt 0:33dddd0644c5 139 /** Set pointer to pass to alarm callback function
charlesgt 0:33dddd0644c5 140 * @param void* aPtr
charlesgt 0:33dddd0644c5 141 */
charlesgt 0:33dddd0644c5 142 void SetPtr(void *aPtr) { iPtr = aPtr; }
charlesgt 0:33dddd0644c5 143
charlesgt 0:33dddd0644c5 144 /**
charlesgt 0:33dddd0644c5 145 * @return pointer used in alarm callback function
charlesgt 0:33dddd0644c5 146 */
charlesgt 0:33dddd0644c5 147 void* Ptr() { return iPtr; }
charlesgt 0:33dddd0644c5 148
charlesgt 0:33dddd0644c5 149 /** Set alarm callback function
charlesgt 0:33dddd0644c5 150 * @param AlarmCbFn aFn
charlesgt 0:33dddd0644c5 151 */
charlesgt 0:33dddd0644c5 152 void SetFn(AlarmCbFn aFn) { iFn = aFn; }
charlesgt 0:33dddd0644c5 153
charlesgt 0:33dddd0644c5 154 /**
charlesgt 0:33dddd0644c5 155 * @return pointer to alarm callback function
charlesgt 0:33dddd0644c5 156 */
charlesgt 0:33dddd0644c5 157 AlarmCbFn Fn() { return iFn; }
charlesgt 0:33dddd0644c5 158
charlesgt 0:33dddd0644c5 159 /** default constructor, alarm not set
charlesgt 0:33dddd0644c5 160 * @param AlarmCbFn aFn callback function
charlesgt 0:33dddd0644c5 161 * @param void* aPtr callback function parameter
charlesgt 0:33dddd0644c5 162 */
charlesgt 0:33dddd0644c5 163 AlarmTimeDate(AlarmCbFn aFn, void* aPtr);
charlesgt 0:33dddd0644c5 164
charlesgt 0:33dddd0644c5 165 /** fixed time/date
charlesgt 0:33dddd0644c5 166 * @param AlarmCbFn aFn callback function
charlesgt 0:33dddd0644c5 167 * @param void* aPtr callback function parameter
charlesgt 0:33dddd0644c5 168 * @param int aHours hour 0 to 23
charlesgt 0:33dddd0644c5 169 * @param int aMins mins 0 to 59
charlesgt 0:33dddd0644c5 170 * @param int aSecs seconds 0 to 59
charlesgt 0:33dddd0644c5 171 * @param int aDayM day of month 1 to 31
charlesgt 0:33dddd0644c5 172 * @param int aMon month 1 to 12
charlesgt 0:33dddd0644c5 173 * @param int aYear
charlesgt 0:33dddd0644c5 174 */
charlesgt 0:33dddd0644c5 175 AlarmTimeDate(AlarmCbFn aFn, void* aPtr, int aHours, int aMins, int aSecs, int aDayM, int aMon, int aYear);
charlesgt 0:33dddd0644c5 176 /** create daily alarm
charlesgt 0:33dddd0644c5 177 * @param AlarmCbFn aFn callback function
charlesgt 0:33dddd0644c5 178 * @param void* aPtr callback function parameter
charlesgt 0:33dddd0644c5 179 * @param int aHours
charlesgt 0:33dddd0644c5 180 * @param int aMins
charlesgt 0:33dddd0644c5 181 * @param int aSecs
charlesgt 0:33dddd0644c5 182 * @param bool aSkipWeekends default to false
charlesgt 0:33dddd0644c5 183 */
charlesgt 0:33dddd0644c5 184 AlarmTimeDate(AlarmCbFn aFn, void* aPtr, int aHours, int aMins, int aSecs, bool aSkipWeekends = false);
charlesgt 0:33dddd0644c5 185
charlesgt 0:33dddd0644c5 186 /** weekly or fornightly
charlesgt 0:33dddd0644c5 187 * @param AlarmCbFn aFn callback function
charlesgt 0:33dddd0644c5 188 * @param void* aPtr callback function parameter
charlesgt 0:33dddd0644c5 189 * @param int aHours
charlesgt 0:33dddd0644c5 190 * @param int aMins
charlesgt 0:33dddd0644c5 191 * @param int aSecs
charlesgt 0:33dddd0644c5 192 * @param int aDayOfWeek day of week 0..6 (0 is Sunday)create daily alarm
charlesgt 0:33dddd0644c5 193 * @param bool aFortNightly default to false
charlesgt 0:33dddd0644c5 194 */
charlesgt 0:33dddd0644c5 195 AlarmTimeDate(AlarmCbFn aFn, void* aPtr, int aHours, int aMins, int aSecs, int aDayW, bool aFortNightly = false);
charlesgt 0:33dddd0644c5 196
charlesgt 0:33dddd0644c5 197 /** Monthly
charlesgt 0:33dddd0644c5 198 * @param AlarmCbFn aFn callback function
charlesgt 0:33dddd0644c5 199 * @param void* aPtr callback function parameter
charlesgt 0:33dddd0644c5 200 * @param int aHours
charlesgt 0:33dddd0644c5 201 * @param int aMins
charlesgt 0:33dddd0644c5 202 * @param int aSecs
charlesgt 0:33dddd0644c5 203 * @param int aDayM day of month 1 to 31
charlesgt 0:33dddd0644c5 204 */
charlesgt 0:33dddd0644c5 205 AlarmTimeDate(AlarmCbFn aFn, void* aPtr, int aHours, int aMins, int aSecs, int aDayM);
charlesgt 0:33dddd0644c5 206
charlesgt 0:33dddd0644c5 207 /** Yearly
charlesgt 0:33dddd0644c5 208 * @param AlarmCbFn aFn callback function
charlesgt 0:33dddd0644c5 209 * @param void* aPtr callback function parameter
charlesgt 0:33dddd0644c5 210 * @param int aHours
charlesgt 0:33dddd0644c5 211 * @param int aMins
charlesgt 0:33dddd0644c5 212 * @param int aSecs
charlesgt 0:33dddd0644c5 213 * @param int aDayM day of month 1 to 31
charlesgt 0:33dddd0644c5 214 * @param int aMonth 1 to 12
charlesgt 0:33dddd0644c5 215 */
charlesgt 0:33dddd0644c5 216 AlarmTimeDate(AlarmCbFn aFn, void* aPtr, int aHours, int aMins, int aSecs, int aDayM, int aMon); // Yearly
charlesgt 0:33dddd0644c5 217
charlesgt 0:33dddd0644c5 218 /** construct with tm type
charlesgt 0:33dddd0644c5 219 * note that day of year and day of week are ignored, if repeating is required use SetRepeat
charlesgt 0:33dddd0644c5 220 * @param AlarmCbFn aFn callback function
charlesgt 0:33dddd0644c5 221 * @param void* aPtr callback function parameter
charlesgt 0:33dddd0644c5 222 * @param aTm
charlesgt 0:33dddd0644c5 223 * @see SetRepeat
charlesgt 0:33dddd0644c5 224 */
charlesgt 0:33dddd0644c5 225 AlarmTimeDate(AlarmCbFn aFn, void* aPtr, struct tm* aTm );
charlesgt 0:33dddd0644c5 226
charlesgt 0:33dddd0644c5 227 /** construct with seconds since 00:00:00 1st Jan 1970
charlesgt 0:33dddd0644c5 228 * @param AlarmCbFn aFn callback function
charlesgt 0:33dddd0644c5 229 * @param void* aPtr callback function parameter
charlesgt 0:33dddd0644c5 230 * @param aSec
charlesgt 0:33dddd0644c5 231 * @see SetRepeat
charlesgt 0:33dddd0644c5 232 */
charlesgt 0:33dddd0644c5 233 AlarmTimeDate(AlarmCbFn aFn, void* aPtr, time_t aSec );
charlesgt 0:33dddd0644c5 234
charlesgt 0:33dddd0644c5 235 /** desctructor
charlesgt 0:33dddd0644c5 236 */
charlesgt 0:33dddd0644c5 237 ~AlarmTimeDate();
charlesgt 0:33dddd0644c5 238
charlesgt 0:33dddd0644c5 239 /** print when Alarm will next expire
charlesgt 0:33dddd0644c5 240 */
charlesgt 0:33dddd0644c5 241 void PrintAlarm();
charlesgt 0:33dddd0644c5 242
charlesgt 0:33dddd0644c5 243 /** print all alarms expiry times
charlesgt 0:33dddd0644c5 244 */
charlesgt 0:33dddd0644c5 245 static void PrintAlarms();
charlesgt 0:33dddd0644c5 246
charlesgt 0:33dddd0644c5 247 /** Tick the Alarm system, will expire any pending alarms, set next one to expire
charlesgt 0:33dddd0644c5 248 * and then sleep. The sleep method is provided by the SleepFn function pointer and
charlesgt 0:33dddd0644c5 249 * should be based around a WFE or WFI.The alarm expiry causes an RTC which will
charlesgt 0:33dddd0644c5 250 * cause the sleep function to wake, after that Tick will exit and should be called
charlesgt 0:33dddd0644c5 251 * as part of the main loop of the applicaiton
charlesgt 0:33dddd0644c5 252 * @param SleepFn aFn sleep function
charlesgt 0:33dddd0644c5 253 * @param void* aParam optional paramter to pass into the sleep function
charlesgt 0:33dddd0644c5 254 */
charlesgt 0:33dddd0644c5 255 static void Tick(SleepFn aFn,void* aParam);
charlesgt 0:33dddd0644c5 256
charlesgt 0:33dddd0644c5 257 /** Init function to be called once before alarms are used
charlesgt 0:33dddd0644c5 258 */
charlesgt 0:33dddd0644c5 259 static void Init();
charlesgt 0:33dddd0644c5 260 private:
charlesgt 0:33dddd0644c5 261 void Queue();
charlesgt 0:33dddd0644c5 262 void DeQueue();
charlesgt 0:33dddd0644c5 263 void Expire();
charlesgt 0:33dddd0644c5 264 void Set();
charlesgt 0:33dddd0644c5 265 static void RTCISR();
charlesgt 0:33dddd0644c5 266
charlesgt 0:33dddd0644c5 267 private:
charlesgt 0:33dddd0644c5 268 time_t iTime;
charlesgt 0:33dddd0644c5 269 AlarmCbFn iFn;
charlesgt 0:33dddd0644c5 270 void* iPtr;
charlesgt 0:33dddd0644c5 271 AlarmTimeDate* iNext;
charlesgt 0:33dddd0644c5 272 TRepeat iRepeat;
charlesgt 0:33dddd0644c5 273 };
charlesgt 0:33dddd0644c5 274
charlesgt 0:33dddd0644c5 275 #endif //__ALARM_TIME_DATE_H__