Alarm library for use with mbed.

Committer:
charlesgt
Date:
Mon Nov 15 23:22:07 2010 +0000
Revision:
2:23e65cacea5a
Parent:
1:f4c7f13e5553
can now set within within expiry function

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 #ifndef __ALARM_TIME_DATE_H__
charlesgt 0:33dddd0644c5 23 #define __ALARM_TIME_DATE_H__
charlesgt 0:33dddd0644c5 24
charlesgt 0:33dddd0644c5 25 /**
charlesgt 0:33dddd0644c5 26 * Alarm callback function pointer type
charlesgt 0:33dddd0644c5 27 */
charlesgt 0:33dddd0644c5 28 typedef void (*AlarmCbFn)(void*);
charlesgt 0:33dddd0644c5 29
charlesgt 0:33dddd0644c5 30 /**
charlesgt 0:33dddd0644c5 31 * Alarm callback function pointer type
charlesgt 0:33dddd0644c5 32 */
charlesgt 0:33dddd0644c5 33 typedef void (*SleepFn)(void*);
charlesgt 0:33dddd0644c5 34
charlesgt 0:33dddd0644c5 35 /**
charlesgt 0:33dddd0644c5 36 * AlarmTimeDate class
charlesgt 0:33dddd0644c5 37 * Alarm class, alarms can be set for a specific date and time and can be set to repeat
charlesgt 0:33dddd0644c5 38 * daily, weekly, fortnightly, monthly or yearly. It is also possible to repeat
charlesgt 0:33dddd0644c5 39 * daily skip whilst skipping weekends.
charlesgt 0:33dddd0644c5 40 * The main program loop needs to call the Tick function below. However the function
charlesgt 0:33dddd0644c5 41 * does take a SleepFn function pointer which can be used to to sleep the device
charlesgt 2:23e65cacea5a 42 * note sleep will be called with interrupts off,the wake interrupt of the RTC
charlesgt 2:23e65cacea5a 43 * will wake out of sleep
charlesgt 0:33dddd0644c5 44 * the class will generate an RTC interrupt when an alarm goes off
charlesgt 0:33dddd0644c5 45 * Example usage:
charlesgt 1:f4c7f13e5553 46 * \code
charlesgt 0:33dddd0644c5 47 * #include "mbed.h"
charlesgt 0:33dddd0644c5 48 * #include "AlarmTimeDate.h"
charlesgt 0:33dddd0644c5 49 *
charlesgt 0:33dddd0644c5 50 * DigitalOut led1(LED1);
charlesgt 0:33dddd0644c5 51 *
charlesgt 0:33dddd0644c5 52 * void __DoSleep(void *) {
charlesgt 0:33dddd0644c5 53 * __WFE();
charlesgt 0:33dddd0644c5 54 * }
charlesgt 0:33dddd0644c5 55 *
charlesgt 0:33dddd0644c5 56 * void AlarmFn(void *) {
charlesgt 0:33dddd0644c5 57 * led1 = !led1;
charlesgt 0:33dddd0644c5 58 * time_t now = time(NULL);
charlesgt 0:33dddd0644c5 59 * printf("Expiring %s! ",ctime(&now));
charlesgt 0:33dddd0644c5 60 * }
charlesgt 0:33dddd0644c5 61 *
charlesgt 0:33dddd0644c5 62 *
charlesgt 0:33dddd0644c5 63 * int main() {
charlesgt 0:33dddd0644c5 64 * led1 = 0;
charlesgt 0:33dddd0644c5 65 * time_t seconds;
charlesgt 0:33dddd0644c5 66 *
charlesgt 0:33dddd0644c5 67 * // setup time structure for 29 Oct 2010 00:00:00
charlesgt 0:33dddd0644c5 68 * struct tm t;
charlesgt 0:33dddd0644c5 69 * t.tm_sec = 00; // 0-59
charlesgt 0:33dddd0644c5 70 * t.tm_min = 00; // 0-59
charlesgt 0:33dddd0644c5 71 * t.tm_hour = 00; // 0-23
charlesgt 0:33dddd0644c5 72 * t.tm_mday = 29; // 1-31
charlesgt 0:33dddd0644c5 73 * t.tm_mon = 9; // 0-11
charlesgt 0:33dddd0644c5 74 * t.tm_year = 110; // year since 1900
charlesgt 0:33dddd0644c5 75 * seconds = mktime(&t);
charlesgt 0:33dddd0644c5 76 * set_time(seconds);
charlesgt 0:33dddd0644c5 77 * AlarmTimeDate::Init();
charlesgt 0:33dddd0644c5 78 * AlarmTimeDate a1(AlarmFn,NULL,seconds+2);
charlesgt 0:33dddd0644c5 79 * do {
charlesgt 0:33dddd0644c5 80 * AlarmTimeDate::PrintAlarms();
charlesgt 0:33dddd0644c5 81 * AlarmTimeDate::Tick(__DoSleep,NULL);
charlesgt 0:33dddd0644c5 82 * seconds+=4;
charlesgt 0:33dddd0644c5 83 * a1.Set(seconds);
charlesgt 0:33dddd0644c5 84 * } while(1);
charlesgt 0:33dddd0644c5 85 * }
charlesgt 1:f4c7f13e5553 86 * \endcode
charlesgt 0:33dddd0644c5 87 **/
charlesgt 0:33dddd0644c5 88
charlesgt 0:33dddd0644c5 89 class AlarmTimeDate {
charlesgt 0:33dddd0644c5 90 public:
charlesgt 0:33dddd0644c5 91 /**
charlesgt 0:33dddd0644c5 92 * repeat types
charlesgt 0:33dddd0644c5 93 */
charlesgt 0:33dddd0644c5 94 enum TRepeat {
charlesgt 0:33dddd0644c5 95 ENone,
charlesgt 0:33dddd0644c5 96 EDaily,
charlesgt 0:33dddd0644c5 97 EDailyNoWeeked,
charlesgt 0:33dddd0644c5 98 EWeekly,
charlesgt 0:33dddd0644c5 99 EFortNightly,
charlesgt 0:33dddd0644c5 100 EMonthly,
charlesgt 0:33dddd0644c5 101 EYearly
charlesgt 0:33dddd0644c5 102 };
charlesgt 0:33dddd0644c5 103
charlesgt 0:33dddd0644c5 104 /**
charlesgt 0:33dddd0644c5 105 * @return time of this alarm's expiry as a time_t (secs since 00:00:00 1/1/1970)
charlesgt 0:33dddd0644c5 106 * 0 if alarm is not set
charlesgt 0:33dddd0644c5 107 */
charlesgt 0:33dddd0644c5 108 time_t AsTimeT() { return iTime; }
charlesgt 0:33dddd0644c5 109 /**
charlesgt 0:33dddd0644c5 110 * @return time of this alarm's expiry as a tm struct
charlesgt 0:33dddd0644c5 111 * NULL if alarm is not set
charlesgt 0:33dddd0644c5 112 */
charlesgt 0:33dddd0644c5 113 struct tm* AsTM() { return (iTime) ? localtime(&iTime) : NULL; }
charlesgt 0:33dddd0644c5 114
charlesgt 0:33dddd0644c5 115 /** Set alarm using time_t value (secs since 00:00:00 1/1/1970)
charlesgt 0:33dddd0644c5 116 * @param time_t aTime alarm expiry time
charlesgt 0:33dddd0644c5 117 */
charlesgt 0:33dddd0644c5 118 void Set(time_t aTime) { iTime = aTime; Tick(NULL,NULL); }
charlesgt 0:33dddd0644c5 119
charlesgt 0:33dddd0644c5 120 /** Set alarm using tm struct
charlesgt 0:33dddd0644c5 121 * @param struct tm* aTm alarm expiry time
charlesgt 0:33dddd0644c5 122 */
charlesgt 0:33dddd0644c5 123 void Set(struct tm* aTm) {iTime = mktime(aTm); Tick(NULL,NULL); }
charlesgt 0:33dddd0644c5 124
charlesgt 0:33dddd0644c5 125 /**
charlesgt 0:33dddd0644c5 126 * @return repeat type
charlesgt 0:33dddd0644c5 127 */
charlesgt 0:33dddd0644c5 128 TRepeat Repeat() {
charlesgt 0:33dddd0644c5 129 return iRepeat;
charlesgt 0:33dddd0644c5 130 }
charlesgt 0:33dddd0644c5 131
charlesgt 0:33dddd0644c5 132 /** Set repeat type
charlesgt 0:33dddd0644c5 133 * @param TRepeat aRepeat
charlesgt 0:33dddd0644c5 134 */
charlesgt 0:33dddd0644c5 135 void SetRepeat(TRepeat aRepeat) {
charlesgt 0:33dddd0644c5 136 iRepeat = aRepeat;
charlesgt 2:23e65cacea5a 137 Tick(NULL,NULL);
charlesgt 0:33dddd0644c5 138 }
charlesgt 2:23e65cacea5a 139
charlesgt 0:33dddd0644c5 140
charlesgt 0:33dddd0644c5 141 /** Set pointer to pass to alarm callback function
charlesgt 0:33dddd0644c5 142 * @param void* aPtr
charlesgt 0:33dddd0644c5 143 */
charlesgt 0:33dddd0644c5 144 void SetPtr(void *aPtr) { iPtr = aPtr; }
charlesgt 0:33dddd0644c5 145
charlesgt 0:33dddd0644c5 146 /**
charlesgt 0:33dddd0644c5 147 * @return pointer used in alarm callback function
charlesgt 0:33dddd0644c5 148 */
charlesgt 0:33dddd0644c5 149 void* Ptr() { return iPtr; }
charlesgt 0:33dddd0644c5 150
charlesgt 0:33dddd0644c5 151 /** Set alarm callback function
charlesgt 0:33dddd0644c5 152 * @param AlarmCbFn aFn
charlesgt 0:33dddd0644c5 153 */
charlesgt 0:33dddd0644c5 154 void SetFn(AlarmCbFn aFn) { iFn = aFn; }
charlesgt 0:33dddd0644c5 155
charlesgt 0:33dddd0644c5 156 /**
charlesgt 0:33dddd0644c5 157 * @return pointer to alarm callback function
charlesgt 0:33dddd0644c5 158 */
charlesgt 0:33dddd0644c5 159 AlarmCbFn Fn() { return iFn; }
charlesgt 0:33dddd0644c5 160
charlesgt 0:33dddd0644c5 161 /** default constructor, alarm not set
charlesgt 0:33dddd0644c5 162 * @param AlarmCbFn aFn callback function
charlesgt 0:33dddd0644c5 163 * @param void* aPtr callback function parameter
charlesgt 0:33dddd0644c5 164 */
charlesgt 0:33dddd0644c5 165 AlarmTimeDate(AlarmCbFn aFn, void* aPtr);
charlesgt 0:33dddd0644c5 166
charlesgt 0:33dddd0644c5 167 /** fixed time/date
charlesgt 0:33dddd0644c5 168 * @param AlarmCbFn aFn callback function
charlesgt 0:33dddd0644c5 169 * @param void* aPtr callback function parameter
charlesgt 0:33dddd0644c5 170 * @param int aHours hour 0 to 23
charlesgt 0:33dddd0644c5 171 * @param int aMins mins 0 to 59
charlesgt 0:33dddd0644c5 172 * @param int aSecs seconds 0 to 59
charlesgt 0:33dddd0644c5 173 * @param int aDayM day of month 1 to 31
charlesgt 0:33dddd0644c5 174 * @param int aMon month 1 to 12
charlesgt 0:33dddd0644c5 175 * @param int aYear
charlesgt 0:33dddd0644c5 176 */
charlesgt 0:33dddd0644c5 177 AlarmTimeDate(AlarmCbFn aFn, void* aPtr, int aHours, int aMins, int aSecs, int aDayM, int aMon, int aYear);
charlesgt 0:33dddd0644c5 178 /** create daily alarm
charlesgt 0:33dddd0644c5 179 * @param AlarmCbFn aFn callback function
charlesgt 0:33dddd0644c5 180 * @param void* aPtr callback function parameter
charlesgt 0:33dddd0644c5 181 * @param int aHours
charlesgt 0:33dddd0644c5 182 * @param int aMins
charlesgt 0:33dddd0644c5 183 * @param int aSecs
charlesgt 0:33dddd0644c5 184 * @param bool aSkipWeekends default to false
charlesgt 0:33dddd0644c5 185 */
charlesgt 0:33dddd0644c5 186 AlarmTimeDate(AlarmCbFn aFn, void* aPtr, int aHours, int aMins, int aSecs, bool aSkipWeekends = false);
charlesgt 0:33dddd0644c5 187
charlesgt 0:33dddd0644c5 188 /** weekly or fornightly
charlesgt 0:33dddd0644c5 189 * @param AlarmCbFn aFn callback function
charlesgt 0:33dddd0644c5 190 * @param void* aPtr callback function parameter
charlesgt 0:33dddd0644c5 191 * @param int aHours
charlesgt 0:33dddd0644c5 192 * @param int aMins
charlesgt 0:33dddd0644c5 193 * @param int aSecs
charlesgt 0:33dddd0644c5 194 * @param int aDayOfWeek day of week 0..6 (0 is Sunday)create daily alarm
charlesgt 0:33dddd0644c5 195 * @param bool aFortNightly default to false
charlesgt 0:33dddd0644c5 196 */
charlesgt 0:33dddd0644c5 197 AlarmTimeDate(AlarmCbFn aFn, void* aPtr, int aHours, int aMins, int aSecs, int aDayW, bool aFortNightly = false);
charlesgt 0:33dddd0644c5 198
charlesgt 0:33dddd0644c5 199 /** Monthly
charlesgt 0:33dddd0644c5 200 * @param AlarmCbFn aFn callback function
charlesgt 0:33dddd0644c5 201 * @param void* aPtr callback function parameter
charlesgt 0:33dddd0644c5 202 * @param int aHours
charlesgt 0:33dddd0644c5 203 * @param int aMins
charlesgt 0:33dddd0644c5 204 * @param int aSecs
charlesgt 0:33dddd0644c5 205 * @param int aDayM day of month 1 to 31
charlesgt 0:33dddd0644c5 206 */
charlesgt 0:33dddd0644c5 207 AlarmTimeDate(AlarmCbFn aFn, void* aPtr, int aHours, int aMins, int aSecs, int aDayM);
charlesgt 0:33dddd0644c5 208
charlesgt 0:33dddd0644c5 209 /** Yearly
charlesgt 0:33dddd0644c5 210 * @param AlarmCbFn aFn callback function
charlesgt 0:33dddd0644c5 211 * @param void* aPtr callback function parameter
charlesgt 0:33dddd0644c5 212 * @param int aHours
charlesgt 0:33dddd0644c5 213 * @param int aMins
charlesgt 0:33dddd0644c5 214 * @param int aSecs
charlesgt 0:33dddd0644c5 215 * @param int aDayM day of month 1 to 31
charlesgt 0:33dddd0644c5 216 * @param int aMonth 1 to 12
charlesgt 0:33dddd0644c5 217 */
charlesgt 0:33dddd0644c5 218 AlarmTimeDate(AlarmCbFn aFn, void* aPtr, int aHours, int aMins, int aSecs, int aDayM, int aMon); // Yearly
charlesgt 0:33dddd0644c5 219
charlesgt 0:33dddd0644c5 220 /** construct with tm type
charlesgt 0:33dddd0644c5 221 * note that day of year and day of week are ignored, if repeating is required use SetRepeat
charlesgt 0:33dddd0644c5 222 * @param AlarmCbFn aFn callback function
charlesgt 0:33dddd0644c5 223 * @param void* aPtr callback function parameter
charlesgt 0:33dddd0644c5 224 * @param aTm
charlesgt 0:33dddd0644c5 225 * @see SetRepeat
charlesgt 0:33dddd0644c5 226 */
charlesgt 0:33dddd0644c5 227 AlarmTimeDate(AlarmCbFn aFn, void* aPtr, struct tm* aTm );
charlesgt 0:33dddd0644c5 228
charlesgt 0:33dddd0644c5 229 /** construct with seconds since 00:00:00 1st Jan 1970
charlesgt 0:33dddd0644c5 230 * @param AlarmCbFn aFn callback function
charlesgt 0:33dddd0644c5 231 * @param void* aPtr callback function parameter
charlesgt 0:33dddd0644c5 232 * @param aSec
charlesgt 0:33dddd0644c5 233 * @see SetRepeat
charlesgt 0:33dddd0644c5 234 */
charlesgt 0:33dddd0644c5 235 AlarmTimeDate(AlarmCbFn aFn, void* aPtr, time_t aSec );
charlesgt 0:33dddd0644c5 236
charlesgt 0:33dddd0644c5 237 /** desctructor
charlesgt 0:33dddd0644c5 238 */
charlesgt 0:33dddd0644c5 239 ~AlarmTimeDate();
charlesgt 0:33dddd0644c5 240
charlesgt 0:33dddd0644c5 241 /** print when Alarm will next expire
charlesgt 0:33dddd0644c5 242 */
charlesgt 0:33dddd0644c5 243 void PrintAlarm();
charlesgt 0:33dddd0644c5 244
charlesgt 0:33dddd0644c5 245 /** print all alarms expiry times
charlesgt 0:33dddd0644c5 246 */
charlesgt 0:33dddd0644c5 247 static void PrintAlarms();
charlesgt 0:33dddd0644c5 248
charlesgt 0:33dddd0644c5 249 /** Tick the Alarm system, will expire any pending alarms, set next one to expire
charlesgt 0:33dddd0644c5 250 * and then sleep. The sleep method is provided by the SleepFn function pointer and
charlesgt 0:33dddd0644c5 251 * should be based around a WFE or WFI.The alarm expiry causes an RTC which will
charlesgt 0:33dddd0644c5 252 * cause the sleep function to wake, after that Tick will exit and should be called
charlesgt 0:33dddd0644c5 253 * as part of the main loop of the applicaiton
charlesgt 0:33dddd0644c5 254 * @param SleepFn aFn sleep function
charlesgt 0:33dddd0644c5 255 * @param void* aParam optional paramter to pass into the sleep function
charlesgt 0:33dddd0644c5 256 */
charlesgt 0:33dddd0644c5 257 static void Tick(SleepFn aFn,void* aParam);
charlesgt 0:33dddd0644c5 258
charlesgt 0:33dddd0644c5 259 /** Init function to be called once before alarms are used
charlesgt 0:33dddd0644c5 260 */
charlesgt 0:33dddd0644c5 261 static void Init();
charlesgt 0:33dddd0644c5 262 private:
charlesgt 0:33dddd0644c5 263 void Queue();
charlesgt 0:33dddd0644c5 264 void DeQueue();
charlesgt 0:33dddd0644c5 265 void Expire();
charlesgt 0:33dddd0644c5 266 void Set();
charlesgt 0:33dddd0644c5 267 static void RTCISR();
charlesgt 0:33dddd0644c5 268
charlesgt 0:33dddd0644c5 269 private:
charlesgt 0:33dddd0644c5 270 time_t iTime;
charlesgt 0:33dddd0644c5 271 AlarmCbFn iFn;
charlesgt 0:33dddd0644c5 272 void* iPtr;
charlesgt 0:33dddd0644c5 273 AlarmTimeDate* iNext;
charlesgt 0:33dddd0644c5 274 TRepeat iRepeat;
charlesgt 2:23e65cacea5a 275 static volatile uint8_t iRTCIsSet;
charlesgt 2:23e65cacea5a 276 static volatile uint8_t iIsrCount;
charlesgt 2:23e65cacea5a 277 static volatile uint8_t iPad0;
charlesgt 2:23e65cacea5a 278 static volatile uint8_t iPad1;
charlesgt 0:33dddd0644c5 279 };
charlesgt 0:33dddd0644c5 280
charlesgt 0:33dddd0644c5 281 #endif //__ALARM_TIME_DATE_H__