Skip to content

Commit

Permalink
drivers/ccs811: splitted test apps
Browse files Browse the repository at this point in the history
  • Loading branch information
gschorcht authored and aabadie committed Dec 20, 2018
1 parent 98af7d3 commit 4323d9c
Show file tree
Hide file tree
Showing 5 changed files with 148 additions and 85 deletions.
27 changes: 7 additions & 20 deletions tests/driver_ccs811/README.md
Original file line number Diff line number Diff line change
@@ -1,28 +1,15 @@
# About

This is a manual test application for the CCS811 driver. It shows how the
sensor can be used for periodic polling as well as with interrupts.

# Usage

The test application demonstrates the use of the CCS811. It uses the default
configuration parameters, that is, the measurement mode
```CCS811_MODE_1S``` with one measurement per second.

The application can use both approaches to wait for new data:

1. using the data-ready interrupt (```CCS811_INT_DATA_READY```):
```
#define USE_CSS811_DATA_READY_INT (1)
```
The test application demonstrates the use of the CCS811 using

2. using the data-ready status function (```ccs811_data_ready```)
```
#define USE_CSS811_DATA_READY_INT (0)
```
- data-ready status function ```ccs811_data_ready``` to wait for new data and
- default configuration parameters, that is, the measurement mode
```CCS811_MODE_1S``` with one measurement per second.

If data-ready interrupts are used, the default configuration parameter for the
interrupt pin can be overriden by ```CCS811_PARAM_INT_PIN``` before
```ccs811_params.h``` is included.
```
#define CCS811_PARAM_INT_PIN (GPIO_PIN(0, 12))
```
Please refer ```$(RIOTBASE)/tests/driver_ccs811_full``` to learn how
to use the CCS811 with interrupts.
75 changes: 10 additions & 65 deletions tests/driver_ccs811/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,27 +8,19 @@

/**
* @ingroup tests
* @brief Test application for the Sensirion SHT30/SHT31/SHT35 device driver
* @brief Test application for the AMS CCS811 device driver
* @author Gunar Schorcht <gunar@schorcht.net>
* @file
*
* The test application demonstrates the use of the CCS811. It uses the default
* configuration parameters, that is, the measurement mode #CCS811_MODE_1S with
* one measurement per second.
* The test application demonstrates the use of the CCS811 using
*
* The application can use both approaches to wait for new data
* - data-ready status function ```ccs811_data_ready``` to wait for
* new data and
* - default configuration parameters, that is, the measurement mode
* ```CCS811_MODE_1S``` with one measurement per second.
*
* - using the data-ready interrupt #CCS811_INT_DATA_READY or
* - using the data-ready status function #ccs811_data_ready
*
* To use the data-ready interrupt, use module ```ccs811_full``` and
* define ```USE_CCS811_DATA_READY_INT``` in CFLAGS variable of the
* make command, for example:
*
* ```
* USEMODULE=ccs811_full CFLAGS="-DUSE_CCS811_DATA_READY_INT" \
* make flash BOARD=... -C tests/driver_ccs811
* ```
* Please refer ```$(RIOTBASE)/tests/driver_ccs811_full``` to learn how
* to use the CCS811 with interrupts.
*/

#include <stdio.h>
Expand All @@ -40,24 +32,6 @@
#include "ccs811.h"
#include "ccs811_params.h"

#if USE_CCS811_DATA_READY_INT && !MODULE_CCS811_FULL
#error To use interrupt handling the *ccs811_full* module has to be enabled
#endif

#define CCS811_LOW 600
#define CCS811_HIGH 1000

kernel_pid_t p_main;

#ifdef USE_CCS811_DATA_READY_INT
static void ccs811_isr (void *arg)
{
/* send a message to trigger main thread to handle the interrupt */
msg_t msg;
msg_send(&msg, p_main);
}
#endif

int main(void)
{
ccs811_t sensor;
Expand All @@ -66,54 +40,25 @@ int main(void)

printf("+------------Initializing------------+\n");

#ifdef USE_CCS811_DATA_READY_INT
gpio_init_int (ccs811_params[0].int_pin, GPIO_IN, GPIO_FALLING,
ccs811_isr, 0);
#endif /* USE_CCS811_DATA_READY_INT */

/* initialize the sensor with default configuration parameters */
if (ccs811_init (&sensor, &ccs811_params[0]) != CCS811_OK) {
puts("Initialization failed\n");
return 1;
}

#ifdef USE_CCS811_DATA_READY_INT
/* activate data ready interrupt */
if (ccs811_set_int_mode (&sensor, CCS811_INT_DATA_READY) != CCS811_OK) {
puts("Activating interrupt failed\n");
return 1;
}
#endif /* USE_CCS811_DATA_READY_INT */

/* save the pid of main thread */
p_main = sched_active_pid;

printf("\n+--------Starting Measurements--------+\n");

while (1) {

uint16_t tvoc;
uint16_t eco2;

#ifdef USE_CCS811_DATA_READY_INT

/* wait for data ready interrupt */
msg_t msg;
msg_receive(&msg);

#else /* USE_CCS811_DATA_READY_INT */

/* wait for new data by means of the data-ready status function */
/* wait and check for for new data every 10 ms */
while (ccs811_data_ready (&sensor) != CCS811_OK) {
/* sleep 10 ms */
xtimer_usleep(10000);
}

#endif /* USE_CCS811_DATA_READY_INT */

/* read the data */
/* read the data and print them on success */
if (ccs811_read_iaq(&sensor, &tvoc, &eco2, 0, 0) != CCS811_OK) {
/* print values */
printf("TVOC [ppb]: %d\neCO2 [ppm]: %d\n", tvoc, eco2);
puts("+-------------------------------------+");
}
Expand Down
5 changes: 5 additions & 0 deletions tests/driver_ccs811_full/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
include ../Makefile.tests_common

USEMODULE += ccs811_full

include $(RIOTBASE)/Makefile.include
24 changes: 24 additions & 0 deletions tests/driver_ccs811_full/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# About

This is a manual test application for the CCS811 driver. It shows how the
sensor can be used for periodic polling as well as with interrupts.

# Usage

The test application demonstrates the use of the CCS811 and pseudomodule
```ccs811_full``` using

- data-ready interrupt ```CCS811_INT_DATA_READY``` and
- default configuration parameters, that is, the measurement mode
```CCS811_MODE_1S``` with one measurement per second.

The default configuration parameter for the interrupt pin has to be
overridden according to the hardware configuration by defining
```CCS811_PARAM_INT_PIN``` before ```ccs811_params.h``` is included, e.g.,
```
#define CCS811_PARAM_INT_PIN (GPIO_PIN(0, 7))
```
or via the CFLAGS variable in the make command.
```
CFLAGS="-DCCS811_PARAM_INT_PIN=\(GPIO_PIN\(0,7\)\)" make -C tests/driver_ccs811 BOARD=...
```
102 changes: 102 additions & 0 deletions tests/driver_ccs811_full/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
/*
* Copyright (C) 2018 Gunar Schorcht
*
* 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
* @brief Test application for the AMS CCS811 device driver
* @author Gunar Schorcht <gunar@schorcht.net>
* @file
*
* The test application demonstrates the use of the CCS811 and pseudomodule
* ```ccs811_full``` using
*
* - data-ready interrupt ```CCS811_INT_DATA_READY``` and
* - default configuration parameters, that is, the measurement mode
* ```CCS811_MODE_1S``` with one measurement per second.
*
* The default configuration parameter for the interrupt pin has to be
* overridden according to the hardware configuration by defining
* ```CCS811_PARAM_INT_PIN``` before ```ccs811_params.h``` is included, e.g.,
* ```
* #define CCS811_PARAM_INT_PIN (GPIO_PIN(0, 7))
* ```
* or via the CFLAGS variable in the make command.
* ```
* CFLAGS="-DCCS811_PARAM_INT_PIN=\(GPIO_PIN\(0,7\)\)" make -C tests/driver_ccs811 BOARD=...
* ```
*/

#include <stdio.h>
#include <string.h>

#include "thread.h"
#include "xtimer.h"

#include "ccs811.h"
#include "ccs811_params.h"

kernel_pid_t p_main;

static void ccs811_isr (void *arg)
{
/* send a message to trigger main thread to handle the interrupt */
msg_t msg;
msg_send(&msg, p_main);
}

int main(void)
{
ccs811_t sensor;

puts("CCS811 test application\n");

printf("+------------Initializing------------+\n");

/* initialize the sensor with default configuration parameters */
if (ccs811_init (&sensor, &ccs811_params[0]) != CCS811_OK) {
puts("Initialization failed\n");
return 1;
}

/* initialize the interrupt pin */
gpio_init_int (ccs811_params[0].int_pin, GPIO_IN, GPIO_FALLING,
ccs811_isr, 0);

/* activate data ready interrupt */
if (ccs811_set_int_mode (&sensor, CCS811_INT_DATA_READY) != CCS811_OK) {
puts("Activating interrupt failed\n");
return 1;
}

/* save the pid of main thread */
p_main = sched_active_pid;

printf("\n+--------Starting Measurements--------+\n");

while (1) {

uint16_t tvoc;
uint16_t eco2;

/* wait for data ready interrupt */
msg_t msg;
msg_receive(&msg);

/* read the data */
if (ccs811_read_iaq(&sensor, &tvoc, &eco2, 0, 0) != CCS811_OK) {
/* print values */
printf("TVOC [ppb]: %d\neCO2 [ppm]: %d\n", tvoc, eco2);
puts("+-------------------------------------+");
}
else {
printf("Could not read data from sensor\n");
}
}

return 0;
}

0 comments on commit 4323d9c

Please sign in to comment.