mirror of https://github.com/ARMmbed/mbed-os.git
Merge pull request #926 from Sissors/lookmartinImadeanewbranch
Add option to modify RTC source for time functions (using func pointers)pull/964/head
commit
0531ad4544
|
@ -69,6 +69,17 @@ extern "C" {
|
||||||
*/
|
*/
|
||||||
void set_time(time_t t);
|
void set_time(time_t t);
|
||||||
|
|
||||||
|
/** Attach an external RTC to be used for the C time functions
|
||||||
|
*
|
||||||
|
* Do not call this function from an interrupt while an RTC read/write operation may be occurring
|
||||||
|
*
|
||||||
|
* @param read_rtc pointer to function which returns current UNIX timestamp
|
||||||
|
* @param write_rtc pointer to function which sets current UNIX timestamp, can be NULL
|
||||||
|
* @param init_rtc pointer to funtion which initializes RTC, can be NULL
|
||||||
|
* @param isenabled_rtc pointer to function wich returns if the rtc is enabled, can be NULL
|
||||||
|
*/
|
||||||
|
void attach_rtc(time_t (*read_rtc)(void), void (*write_rtc)(time_t), void (*init_rtc)(void), int (*isenabled_rtc)(void));
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -19,6 +19,18 @@
|
||||||
#include "rtc_time.h"
|
#include "rtc_time.h"
|
||||||
#include "us_ticker_api.h"
|
#include "us_ticker_api.h"
|
||||||
|
|
||||||
|
#if DEVICE_RTC
|
||||||
|
static void (*_rtc_init)(void) = rtc_init;
|
||||||
|
static int (*_rtc_isenabled)(void) = rtc_isenabled;
|
||||||
|
static time_t (*_rtc_read)(void) = rtc_read;
|
||||||
|
static void (*_rtc_write)(time_t t) = rtc_write;
|
||||||
|
#else
|
||||||
|
static void (*_rtc_init)(void) = NULL;
|
||||||
|
static int (*_rtc_isenabled)(void) = NULL;
|
||||||
|
static time_t (*_rtc_read)(void) = NULL;
|
||||||
|
static void (*_rtc_write)(time_t t) = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
@ -29,15 +41,16 @@ time_t time(time_t *timer)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
{
|
{
|
||||||
#if DEVICE_RTC
|
if (_rtc_isenabled != NULL) {
|
||||||
if (!(rtc_isenabled())) {
|
if (!(_rtc_isenabled())) {
|
||||||
set_time(0);
|
set_time(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
time_t t = rtc_read();
|
|
||||||
|
|
||||||
#else
|
|
||||||
time_t t = 0;
|
time_t t = 0;
|
||||||
#endif
|
if (_rtc_read != NULL) {
|
||||||
|
t = _rtc_read();
|
||||||
|
}
|
||||||
|
|
||||||
if (timer != NULL) {
|
if (timer != NULL) {
|
||||||
*timer = t;
|
*timer = t;
|
||||||
|
@ -46,10 +59,12 @@ time_t time(time_t *timer)
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_time(time_t t) {
|
void set_time(time_t t) {
|
||||||
#if DEVICE_RTC
|
if (_rtc_init != NULL) {
|
||||||
rtc_init();
|
_rtc_init();
|
||||||
rtc_write(t);
|
}
|
||||||
#endif
|
if (_rtc_write != NULL) {
|
||||||
|
_rtc_write(t);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
clock_t clock() {
|
clock_t clock() {
|
||||||
|
@ -58,6 +73,17 @@ clock_t clock() {
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void attach_rtc(time_t (*read_rtc)(void), void (*write_rtc)(time_t), void (*init_rtc)(void), int (*isenabled_rtc)(void)) {
|
||||||
|
__disable_irq();
|
||||||
|
_rtc_read = read_rtc;
|
||||||
|
_rtc_write = write_rtc;
|
||||||
|
_rtc_init = init_rtc;
|
||||||
|
_rtc_isenabled = isenabled_rtc;
|
||||||
|
__enable_irq();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue