1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/drivers/dfplayer/include/dfplayer_implementation.h
Marian Buschsieweke 5683281b5d
drivers/dfplayer: fix bug in utility function
Apparently, those functions have never been used. Otherwise this
obvious bug wouldn't have sailed unnoticed for so long.
2023-05-19 21:51:44 +02:00

262 lines
6.1 KiB
C

/*
* Copyright 2019 Marian Buschsieweke
*
* 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.
*/
/**
* @ingroup drivers_dfplayer
* @{
*
* @file
* @brief Header-only functions of the DFPlayer Mini Device driver
* @author Marian Buschsieweke <marian.buschsieweke@ovgu.de>
*/
#ifndef DFPLAYER_IMPLEMENTATION_H
#define DFPLAYER_IMPLEMENTATION_H
#include <errno.h>
#include "dfplayer.h"
#include "dfplayer_constants.h"
#include "dfplayer_internal.h"
#include "dfplayer_types.h"
#ifdef __cplusplus
extern "C" {
#endif
/* This file contains the implementations of the functions whose signature and
* Doxygen documentation is given in `drivers/include/dfplayer.h`. Doxygen
* sadly doesn't detect this and creates two entries for every function; with
* one entry being undocumented. We just hide the implementations here from
* Doxygen to prevent the duplicate entries
*/
#ifndef DOXYGEN
static inline int dfplayer_next(dfplayer_t *dev)
{
return dfplayer_step(dev, 1);
}
static inline int dfplayer_prev(dfplayer_t *dev)
{
return dfplayer_step(dev, -1);
}
static inline int dfplayer_set_volume(dfplayer_t *dev, uint8_t volume)
{
if (volume > DFPLAYER_MAX_VOLUME) {
volume = DFPLAYER_MAX_VOLUME;
}
return dfplayer_cmd_1param(dev, DFPLAYER_CMD_SET_VOLUME, volume);
}
static inline int dfplayer_set_equalizer(dfplayer_t *dev,
dfplayer_eq_t equalizer)
{
if ((unsigned)equalizer >= (unsigned)DFPLAYER_EQ_NUMOF) {
return -EINVAL;
}
return dfplayer_cmd_1param(dev, DFPLAYER_CMD_SET_EQUALIZER,
(uint8_t)equalizer);
}
static inline int dfplayer_set_source(dfplayer_t *dev, dfplayer_source_t src)
{
if ((unsigned)src >= (unsigned)DFPLAYER_SOURCE_NUMOF) {
return -EINVAL;
}
return dfplayer_cmd_1param(dev, DFPLAYER_CMD_SET_SOURCE, (uint8_t)src);
}
static inline int dfplayer_enter_standby(dfplayer_t *dev)
{
return dfplayer_cmd(dev, DFPLAYER_CMD_STANDBY_ENTER);
}
static inline int dfplayer_exit_standby(dfplayer_t *dev)
{
return dfplayer_cmd(dev, DFPLAYER_CMD_STANDBY_EXIT);
}
static inline int dfplayer_play(dfplayer_t *dev)
{
return dfplayer_cmd(dev, DFPLAYER_CMD_PLAY);
}
static inline int dfplayer_pause(dfplayer_t *dev)
{
return dfplayer_cmd(dev, DFPLAYER_CMD_PAUSE);
}
static inline int dfplayer_stop_advert(dfplayer_t *dev)
{
return dfplayer_cmd(dev, DFPLAYER_CMD_ABORT_ADVERT);
}
static inline int dfplayer_repeat_folder(dfplayer_t *dev, uint8_t folder)
{
return dfplayer_file_cmd(dev, DFPLAYER_CMD_REPEAT_FOLDER, 0, folder);
}
static inline int dfplayer_shuffle_all(dfplayer_t *dev)
{
return dfplayer_cmd(dev, DFPLAYER_CMD_RANDOM);
}
static inline int dfplayer_repeat(dfplayer_t *dev, bool repeat)
{
return dfplayer_cmd_1param(dev, DFPLAYER_CMD_REPEAT, (uint8_t)repeat);
}
static inline int dfplayer_get_volume(dfplayer_t *dev, uint8_t *volume)
{
if (!volume) {
return -EINVAL;
}
uint16_t tmp;
int retval = dfplayer_query(dev, &tmp, DFPLAYER_CMD_GET_VOLUME);
if (retval) {
return retval;
}
*volume = (uint8_t)tmp;
return 0;
}
static inline int dfplayer_get_equalizer(dfplayer_t *dev,
dfplayer_eq_t *equalizer)
{
if (!equalizer) {
return -EINVAL;
}
uint16_t tmp;
int retval = dfplayer_query(dev, &tmp, DFPLAYER_CMD_GET_EQUALIZER);
if (retval) {
return retval;
}
*equalizer = (dfplayer_eq_t)tmp;
return 0;
}
static inline int dfplayer_get_mode(dfplayer_t *dev,
dfplayer_mode_t *mode)
{
if (!mode) {
return -EINVAL;
}
uint16_t tmp;
int retval = dfplayer_query(dev, &tmp, DFPLAYER_CMD_GET_MODE);
if (retval) {
return retval;
}
*mode = (dfplayer_mode_t)tmp;
return 0;
}
static inline int dfplayer_get_version(dfplayer_t *dev, uint16_t *version)
{
if (!version) {
return -EINVAL;
}
return dfplayer_query(dev, version, DFPLAYER_CMD_GET_VERSION);
}
static inline int dfplayer_files_usb(dfplayer_t *dev, uint16_t *files)
{
if (!files) {
return -EINVAL;
}
return dfplayer_query(dev, files, DFPLAYER_CMD_FILES_USB);
}
static inline int dfplayer_files_sdcard(dfplayer_t *dev, uint16_t *files)
{
if (!files) {
return -EINVAL;
}
return dfplayer_query(dev, files, DFPLAYER_CMD_FILES_SDCARD);
}
static inline int dfplayer_files_flash(dfplayer_t *dev, uint16_t *files)
{
if (!files) {
return -EINVAL;
}
return dfplayer_query(dev, files, DFPLAYER_CMD_FILES_FLASH);
}
static inline int dfplayer_get_fileno_usb(dfplayer_t *dev, uint16_t *fileno)
{
if (!fileno) {
return -EINVAL;
}
return dfplayer_query(dev, fileno, DFPLAYER_CMD_FILENO_USB);
}
static inline int dfplayer_get_fileno_sdcard(dfplayer_t *dev, uint16_t *fileno)
{
if (!fileno) {
return -EINVAL;
}
return dfplayer_query(dev, fileno, DFPLAYER_CMD_FILENO_SDCARD);
}
static inline int dfplayer_get_fileno_flash(dfplayer_t *dev, uint16_t *fileno)
{
if (!fileno) {
return -EINVAL;
}
return dfplayer_query(dev, fileno, DFPLAYER_CMD_FILENO_FLASH);
}
static inline dfplayer_file_t dfplayer_get_played_file(dfplayer_t *dev)
{
mutex_lock(&dev->mutex);
dfplayer_file_t res = dev->file;
mutex_unlock(&dev->mutex);
return res;
}
static inline int dfplayer_source_set_contains(dfplayer_source_set_t set,
dfplayer_source_t src)
{
return (set & (0x01 << src)) ? 1 : 0;
}
static inline void dfplayer_source_set_add(dfplayer_source_set_t *set,
dfplayer_source_t src)
{
*set |= 0x01 << src;
}
static inline void dfplayer_source_set_rm(dfplayer_source_set_t *set,
dfplayer_source_t src)
{
*set &= ~((dfplayer_source_set_t)(0x01 << src));
}
#endif /* !DOXYGEN */
#ifdef __cplusplus
}
#endif
#endif /* DFPLAYER_IMPLEMENTATION_H */
/** @} */