1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/cpu/native/periph/rtc.c

182 lines
3.7 KiB
C
Raw Normal View History

2014-11-22 10:26:01 +01:00
/*
* Copyright (C) 2013, 2014 Ludwig Ortmann <ludwig.ortmann@fu-berlin.de>
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
2014-11-22 10:26:01 +01:00
*/
/**
* Native CPU periph/rtc.h implementation
*
* The implementation uses POSIX system calls to emulate a real-time
* clock based on the system clock.
*
* @author Ludwig Ortmann <ludwig.ortmann@fu-berlin.de>
*
2014-12-16 15:46:56 +01:00
* @ingroup _native_cpu
* @defgroup _native_rtc
* @file
*/
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <err.h>
#include "periph/rtc.h"
#include "cpu.h"
#include "native_internal.h"
#define ENABLE_DEBUG (0)
#include "debug.h"
2014-12-16 15:46:56 +01:00
static int _native_rtc_initialized = 0;
static int _native_rtc_powered = 0;
static struct tm _native_rtc_alarm;
static rtc_alarm_cb_t _native_rtc_alarm_callback;
static void *_native_rtc_alarm_argument;
void rtc_init(void)
{
DEBUG("rtc_init\n");
2014-12-16 15:46:56 +01:00
memset(&_native_rtc_alarm, 0, sizeof(_native_rtc_alarm));
_native_rtc_alarm_callback = NULL;
_native_rtc_alarm_argument = NULL;
2014-12-16 15:46:56 +01:00
_native_rtc_initialized = 1;
printf("Native RTC initialized.\n");
rtc_poweron();
}
void rtc_poweron(void)
{
DEBUG("rtc_poweron\n");
2014-12-16 15:46:56 +01:00
if (!_native_rtc_initialized) {
warnx("rtc_poweron: not initialized");
return;
}
2014-12-16 15:46:56 +01:00
_native_rtc_powered = 1;
}
void rtc_poweroff(void)
{
DEBUG("rtc_poweroff()\n");
2014-12-16 15:46:56 +01:00
if (!_native_rtc_initialized) {
warnx("rtc_poweroff: not initialized");
}
2014-12-16 15:46:56 +01:00
if (!_native_rtc_powered) {
warnx("rtc_poweroff: not powered on");
}
2014-12-16 15:46:56 +01:00
_native_rtc_powered = 0;
}
/* TODO: implement time setting using a delta */
int rtc_set_time(struct tm *ttime)
{
(void) ttime;
DEBUG("rtc_set_time()\n");
2014-12-16 15:46:56 +01:00
if (!_native_rtc_initialized) {
warnx("rtc_set_time: not initialized");
return -1;
}
2014-12-16 15:46:56 +01:00
if (!_native_rtc_powered) {
warnx("rtc_set_time: not powered on");
return -1;
}
2014-11-22 10:26:01 +01:00
warnx("rtc_set_time: not implemented");
return -1;
}
int rtc_get_time(struct tm *ttime)
{
time_t t;
2014-12-16 15:46:56 +01:00
if (!_native_rtc_initialized) {
warnx("rtc_get_time: not initialized");
return -1;
}
2014-12-16 15:46:56 +01:00
if (!_native_rtc_powered) {
warnx("rtc_get_time: not powered on");
return -1;
}
_native_syscall_enter();
t = time(NULL);
if (localtime_r(&t, ttime) == NULL) {
err(EXIT_FAILURE, "rtc_get_time: localtime_r");
}
_native_syscall_leave();
return 0;
}
/* TODO: implement alarm scheduling */
int rtc_set_alarm(struct tm *time, rtc_alarm_cb_t cb, void *arg)
{
(void) time;
(void) cb;
(void) arg;
2014-12-16 15:46:56 +01:00
if (!_native_rtc_initialized) {
warnx("rtc_set_alarm: not initialized");
return -1;
}
2014-12-16 15:46:56 +01:00
if (!_native_rtc_powered) {
warnx("rtc_set_alarm: not powered on");
return -1;
}
2014-12-16 15:46:56 +01:00
memcpy(&_native_rtc_alarm, time, sizeof(_native_rtc_alarm));
2014-11-22 10:26:01 +01:00
warnx("rtc_set_alarm: not implemented");
return -1;
}
int rtc_get_alarm(struct tm *time)
{
(void) time;
2014-12-16 15:46:56 +01:00
if (!_native_rtc_initialized) {
warnx("rtc_get_alarm: not initialized");
return -1;
}
2014-12-16 15:46:56 +01:00
if (!_native_rtc_powered) {
warnx("rtc_get_alarm: not powered on");
return -1;
}
2014-12-16 15:46:56 +01:00
memcpy(time, &_native_rtc_alarm, sizeof(_native_rtc_alarm));
return 0;
}
/* TODO: implement alarm unscheduling once rtc_set_alarm is
* implemented */
void rtc_clear_alarm(void)
{
DEBUG("rtc_clear_alarm()\n");
2014-12-16 15:46:56 +01:00
if (!_native_rtc_initialized) {
warnx("rtc_clear_alarm: not initialized");
}
2014-12-16 15:46:56 +01:00
if (!_native_rtc_powered) {
warnx("rtc_clear_alarm: not powered on");
}
2014-12-16 15:46:56 +01:00
memset(&_native_rtc_alarm, 0, sizeof(_native_rtc_alarm));
}