hattori&ide

Dependencies:   mbed

Committer:
hattori_atsushi
Date:
Sun Dec 18 08:16:01 2022 +0000
Revision:
0:f77369cabd75
hattori

Who changed what in which revision?

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