Support KL25z requirements

Dependents:   kl25z_Usb_Logger

Fork of RTC by Erik -

Committer:
neilh20
Date:
Sun Oct 05 20:59:45 2014 +0000
Revision:
2:b61676bcc5c0
Parent:
1:be9d058ee5c7
Support a KL25z USB logger

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sissors 0:39767ffe05e6 1 #ifndef RTC_H
Sissors 0:39767ffe05e6 2 #define RTC_H
Sissors 0:39767ffe05e6 3
Sissors 0:39767ffe05e6 4 #include "mbed.h"
Sissors 0:39767ffe05e6 5
Sissors 1:be9d058ee5c7 6 /**
Sissors 1:be9d058ee5c7 7 * Library to get access to the interrupt functionality of the LPC1768's RTC.
Sissors 1:be9d058ee5c7 8 *
Sissors 1:be9d058ee5c7 9 * This class is completely static: which means you don't have to create an RTC object,
Sissors 1:be9d058ee5c7 10 * there is always one object automatically created when you include this class. Since
Sissors 1:be9d058ee5c7 11 * there is only one RTC, more than one would make no sense.
Sissors 1:be9d058ee5c7 12 *
Sissors 1:be9d058ee5c7 13 * @code
Sissors 1:be9d058ee5c7 14 * #include "mbed.h"
Sissors 1:be9d058ee5c7 15 * #include "RTC.h"
Sissors 1:be9d058ee5c7 16 *
Sissors 1:be9d058ee5c7 17 * DigitalOut led(LED1);
Sissors 1:be9d058ee5c7 18 *
Sissors 1:be9d058ee5c7 19 * void ledFunction( void )
Sissors 1:be9d058ee5c7 20 * {
Sissors 1:be9d058ee5c7 21 * led = 1;
Sissors 1:be9d058ee5c7 22 * RTC::detach(RTC::Second);
Sissors 1:be9d058ee5c7 23 * }
Sissors 1:be9d058ee5c7 24 *
Sissors 1:be9d058ee5c7 25 * void displayFunction( void )
Sissors 1:be9d058ee5c7 26 * {
Sissors 1:be9d058ee5c7 27 * time_t seconds = time(NULL);
Sissors 1:be9d058ee5c7 28 * printf("%s", ctime(&seconds));
Sissors 1:be9d058ee5c7 29 * }
Sissors 1:be9d058ee5c7 30 *
Sissors 1:be9d058ee5c7 31 * void alarmFunction( void )
Sissors 1:be9d058ee5c7 32 * {
Sissors 1:be9d058ee5c7 33 * error("Not most useful alarm function");
Sissors 1:be9d058ee5c7 34 * }
Sissors 1:be9d058ee5c7 35 *
Sissors 1:be9d058ee5c7 36 * int main()
Sissors 1:be9d058ee5c7 37 * {
Sissors 1:be9d058ee5c7 38 * set_time(1256729737); // Set time to Wed, 28 Oct 2009 11:35:37
Sissors 1:be9d058ee5c7 39 *
Sissors 1:be9d058ee5c7 40 * tm t = RTC::getDefaultTM();
Sissors 1:be9d058ee5c7 41 * t.tm_sec = 5;
Sissors 1:be9d058ee5c7 42 * t.tm_min = 36;
Sissors 1:be9d058ee5c7 43 *
Sissors 1:be9d058ee5c7 44 * RTC::alarm(&alarmFunction, t);
Sissors 1:be9d058ee5c7 45 * RTC::attach(&displayFunction, RTC::Second);
Sissors 1:be9d058ee5c7 46 * RTC::attach(&ledFunction, RTC::Minute);
Sissors 1:be9d058ee5c7 47 *
Sissors 1:be9d058ee5c7 48 * while(1);
Sissors 1:be9d058ee5c7 49 * }
Sissors 1:be9d058ee5c7 50 * @endcode
Sissors 1:be9d058ee5c7 51 **/
Sissors 0:39767ffe05e6 52 class RTC {
Sissors 0:39767ffe05e6 53 public:
Sissors 1:be9d058ee5c7 54 /**
Sissors 1:be9d058ee5c7 55 * Available time units for interrupts
Sissors 1:be9d058ee5c7 56 *
Sissors 1:be9d058ee5c7 57 * RTC::Second, RTC::Minute, RTC::Hour,
Sissors 1:be9d058ee5c7 58 * RTC::Day, RTC::Month, RTC::Year
Sissors 1:be9d058ee5c7 59 */
Sissors 0:39767ffe05e6 60 enum TimeUnit {Second, Minute, Hour,
Sissors 0:39767ffe05e6 61 Day, Month, Year};
Sissors 1:be9d058ee5c7 62
Sissors 1:be9d058ee5c7 63 /**
Sissors 1:be9d058ee5c7 64 * Call a function when the specified time unit increases
Sissors 1:be9d058ee5c7 65 *
Sissors 1:be9d058ee5c7 66 * You can attach one function for each TimeUnit. When several are
Sissors 1:be9d058ee5c7 67 * attached the smalles TimeUnit is called first.
Sissors 1:be9d058ee5c7 68 *
Sissors 1:be9d058ee5c7 69 * Member functions of a class can be attached the normal way (similar to for example Ticker).
Sissors 1:be9d058ee5c7 70 *
Sissors 1:be9d058ee5c7 71 * @param function - the function to call
Sissors 1:be9d058ee5c7 72 * @param interval - the TimeUnit which specifies the interval
Sissors 1:be9d058ee5c7 73 */
Sissors 0:39767ffe05e6 74 static void attach(void (*function)(void), TimeUnit interval);
Sissors 1:be9d058ee5c7 75 template<typename T>
Sissors 1:be9d058ee5c7 76 void attach(T *object, void (T::*member)(void), TimeUnit interval);
Sissors 1:be9d058ee5c7 77
Sissors 1:be9d058ee5c7 78 /**
Sissors 1:be9d058ee5c7 79 * Detach an interrupt function
Sissors 1:be9d058ee5c7 80 *
Sissors 1:be9d058ee5c7 81 * @param interval - the TimeUnit of the interrupt to detach
Sissors 1:be9d058ee5c7 82 */
Sissors 1:be9d058ee5c7 83 static void detach(TimeUnit interval);
Sissors 0:39767ffe05e6 84
Sissors 1:be9d058ee5c7 85 /**
Sissors 1:be9d058ee5c7 86 * Call a function when a specified time is reached
Sissors 1:be9d058ee5c7 87 *
Sissors 1:be9d058ee5c7 88 * Only one alarm is possible. Make fields of the tm structure -1 for don't care.
Sissors 1:be9d058ee5c7 89 *
Sissors 1:be9d058ee5c7 90 * Member functions of a class can be attached the normal way (similar to for example Ticker).
Sissors 1:be9d058ee5c7 91 *
Sissors 1:be9d058ee5c7 92 * @param function - the function to call
Sissors 1:be9d058ee5c7 93 * @param alarmTime - tm structure which specifies when to activate the alarm
Sissors 1:be9d058ee5c7 94 */
Sissors 1:be9d058ee5c7 95 static void alarm(void (*function)(void), tm alarmTime);
Sissors 1:be9d058ee5c7 96 template<typename T>
Sissors 1:be9d058ee5c7 97 void alarm(T *object, void (T::*member)(void), tm alarmTime);
Sissors 0:39767ffe05e6 98
Sissors 1:be9d058ee5c7 99 /**
Sissors 1:be9d058ee5c7 100 * Disable the alarm
Sissors 1:be9d058ee5c7 101 */
Sissors 0:39767ffe05e6 102 static void alarmOff( void );
Sissors 1:be9d058ee5c7 103
Sissors 1:be9d058ee5c7 104 /**
Sissors 1:be9d058ee5c7 105 * Returns a default tm structure where each field is initialized
Sissors 1:be9d058ee5c7 106 * to -1, so it is ignored by the alarm function.
Sissors 1:be9d058ee5c7 107 *
Sissors 1:be9d058ee5c7 108 * Available fields: http://www.cplusplus.com/reference/ctime/tm/
Sissors 1:be9d058ee5c7 109 * Except tm_isdst all of them can be used for the alarm
Sissors 1:be9d058ee5c7 110 *
Sissors 1:be9d058ee5c7 111 * @param return - tm structure initialized to -1
Sissors 1:be9d058ee5c7 112 */
Sissors 1:be9d058ee5c7 113 static tm getDefaultTM( void );
Sissors 1:be9d058ee5c7 114
Sissors 1:be9d058ee5c7 115
Sissors 0:39767ffe05e6 116
Sissors 0:39767ffe05e6 117 private:
Sissors 0:39767ffe05e6 118 static void IRQHandler( void );
Sissors 0:39767ffe05e6 119
Sissors 0:39767ffe05e6 120 static FunctionPointer attachCB[6];
Sissors 0:39767ffe05e6 121 static FunctionPointer alarmCB;
Sissors 0:39767ffe05e6 122
Sissors 0:39767ffe05e6 123 //If someone knows a nicer way to do this, please tell me
Sissors 0:39767ffe05e6 124 static bool initialRun;
Sissors 1:be9d058ee5c7 125 static void _attach(TimeUnit interval);
Sissors 1:be9d058ee5c7 126 static void _alarm(tm alarmTime);
Sissors 0:39767ffe05e6 127
Sissors 0:39767ffe05e6 128
Sissors 0:39767ffe05e6 129 };
Sissors 0:39767ffe05e6 130
Sissors 0:39767ffe05e6 131 #endif