1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/drivers/include/dcf77.h
2021-08-13 19:50:38 +02:00

122 lines
3.4 KiB
C

/*
* Copyright 2019 HAW Hamburg
*
* 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.
*/
/**
* @defgroup drivers_dcf77 DCF77 long wave receiver with 77,5 kHz
* @ingroup drivers_sensors
* @brief Device driver long wave receiver with 77,5 kHz
*
* @{
*
* @file
* @brief Interface definition for the dcf77 sensor driver
*
* @author Michel Gerlach <michel.gerlach@haw-hamburg.de>
*/
#ifndef DCF77_H
#define DCF77_H
#include <stdint.h>
#include <stdlib.h>
#include <inttypes.h>
#include "xtimer.h"
#include "time.h"
#include "periph/gpio.h"
#include "dcf77_internal.h"
#ifdef __cplusplus
extern "C" {
#endif
/* forward-declaration for dcf77_tick_cb_t */
struct dcf77;
/**
* @brief Signature for tick callback
*
* @param[in] dev device that triggered the alarm
* @param[in] arg optional argument to put the callback in the right context
*/
typedef void(*dcf77_tick_cb_t)(struct dcf77 *dev, void *arg);
/**
* @brief Possible return codes
*/
enum {
DCF77_OK = 0, /**< all good */
DCF77_NOCSUM = -1, /**< checksum error */
DCF77_TIMEOUT = -2, /**< communication timed out */
DCF77_INIT_ERROR = -3 /**< Initialization error */
};
/**
* @brief Configuration parameters for DCF77 devices
*/
typedef struct {
gpio_t pin; /**< GPIO pin of the device's data pin */
gpio_mode_t in_mode; /**< input pin configuration from the device,
* without pull resistor */
} dcf77_params_t;
/**
* @brief Device descriptor for DCF77 sensor devices
*/
typedef struct dcf77 {
dcf77_params_t params; /**< Device parameters */
dcf77_bits_t bitseq; /**< contains all Bits from a current cycle */
dcf77_bits_t last_bitseq; /**< contains all Bits from a last cycle */
uint32_t startTime; /**< Timestamp to measure the term of the level */
uint8_t internal_state; /**< internal States */
uint8_t bitCounter; /**< Counter of the Bits in a Bitsequenz */
dcf77_tick_cb_t tick_cb; /**< Callback to be called if a new minute starts */
void *tick_cb_args; /**< Arguments for the tick callback */
} dcf77_t;
/**
* @brief Initialize a new DCF77 device
*
* @param[out] dev device descriptor of a DCF device
* @param[in] params configuration parameters
*
* @retval `DCF77_OK` Success
* @retval `DCF77_INIT_ERROR` Error in initialization
*/
int dcf77_init(dcf77_t *dev, const dcf77_params_t *params);
/**
* @brief get a new timestamp from the device.
*
* @note if reading fails or checksum is invalid, last_vaules will be unwritten
*
* @param[in] dev device descriptor of a DCF device
* @param[in] time datastruct for timeinformation
*
* @retval `DCF77_OK` Success
* @retval `DCF77_NOCSUM` Checksum error
*/
int dcf77_get_time(dcf77_t *dev, struct tm *time);
/**
* @brief Set a tick callback for DCF77.
*
* The registered callback function will be called for every new minute.
*
* @param[in] dev device descriptor of a DCF device
* @param[in] cb Callback executed when a new minute starts.
* @param[in] arg Argument passed to callback.
*/
void dcf77_set_tick_cb(dcf77_t *dev, dcf77_tick_cb_t cb, void *arg);
#ifdef __cplusplus
}
#endif
#endif /* DCF77_H */
/** @} */