1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/tests/drivers/qmc5883l/main.c

151 lines
4.0 KiB
C

/*
* Copyright (C) 2019 Freie Universität Berlin
*
* 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 tests
* @{
* @file
* @brief Test application for the QMC5883L magnetic sensor
* @author Hauke Petersen <hauke.petersen@fu-berlin.de>
*
* @}
*/
#include <stdio.h>
#include "xtimer.h"
#include "thread.h"
#include "thread_flags.h"
#include "qmc5883l.h"
#include "qmc5883l_params.h"
#define PWR_OFF_DELAY (1u)
#define FLAG_DRDY (0x0400)
/* allocate the device descriptor */
static qmc5883l_t _dev;
#ifdef MODULE_QMC5883L_INT
static thread_t *_tmain;
static void _on_drdy(void *arg)
{
(void)arg;
thread_flags_set(_tmain, FLAG_DRDY);
}
#endif
static void _read_and_dump(void)
{
int16_t data[3];
int res = qmc5883l_read(&_dev, data);
if ((res == QMC5883L_OK) || (res == QMC5883L_OVERFLOW)) {
printf("Reading - X:%6i Y:%6i Z:%6i [mGauss]",
(int)data[0], (int)data[1], (int)data[2]);
if (res == QMC5883L_OVERFLOW) {
printf(" - OVERFLOWED");
}
puts("");
}
else if (res == QMC5883L_OVERFLOW) {
puts("Reading - overflow");
}
else if (res == QMC5883L_NODATA) {
puts("Reading - no new data available");
}
}
int main(void)
{
uint32_t delay = US_PER_MS;
puts("QMC5883L test application");
puts("Please refer to the README.md for more information\n");
/* initialize the sensor with default configuration parameters */
if (qmc5883l_init(&_dev, &qmc5883l_params[0]) != QMC5883L_OK) {
puts("Error: unable to initialize device");
return 1;
}
printf("QMC5883L successfully initialized.\nData rate: ");
switch (qmc5883l_params[0].odr) {
case QMC5883L_ODR_10HZ: puts("10Hz"); delay *= 100; break;
case QMC5883L_ODR_50HZ: puts("50Hz"); delay *= 20; break;
case QMC5883L_ODR_100HZ: puts("100Hz"); delay *= 10; break;
case QMC5883L_ODR_200HZ: puts("200Hz"); delay *= 5; break;
}
printf("Data range: ");
switch (qmc5883l_params[0].rng) {
case QMC5883L_RNG_2G: puts("2G"); break;
case QMC5883L_RNG_8G: puts("8G"); break;
}
printf("Over sample rate: ");
switch (qmc5883l_params[0].osr) {
case QMC5883L_OSR_512: puts("512"); break;
case QMC5883L_OSR_256: puts("256"); break;
case QMC5883L_OSR_128: puts("128"); break;
case QMC5883L_OSR_64: puts("64"); break;
}
#ifdef MODULE_QMC5883L_INT
printf("Mode: ");
if (gpio_is_valid(qmc5883l_params[0].pin_drdy)) {
puts("interrupt driven");
}
else {
puts("polling");
}
#endif
puts("");
/* test the driver's power cycling */
puts("Power cycle test: powering device off now");
if (qmc5883l_poweroff(&_dev) != QMC5883L_OK) {
puts("Error: unable to power off device");
return 1;
}
xtimer_sleep(PWR_OFF_DELAY);
if (qmc5883l_poweron(&_dev) != QMC5883L_OK) {
puts("Error: unable to power on the device again");
return 1;
}
puts("Power cycle test: device is powered back on now");
#ifdef MODULE_QMC5883L_INT
/* safe a reference to the main thread TCB so we can wait for flags */
if (gpio_is_valid(qmc5883l_params[0].pin_drdy)) {
_tmain = thread_get_active();
if (qmc5883l_init_int(&_dev, _on_drdy, NULL) != QMC5883L_OK) {
puts("Error: unable to configure interrupt callback");
return 1;
}
while (1) {
thread_flags_wait_any(FLAG_DRDY);
_read_and_dump();
}
}
#endif
while (1) {
int ready;
do {
xtimer_usleep(delay);
ready = qmc5883l_data_ready(&_dev);
} while (ready != QMC5883L_OK);
_read_and_dump();
}
/* should never be reached */
return 0;
}