diff --git a/samples/sensor/apds9960/prj.conf b/samples/sensor/apds9960/prj.conf index 64aacc22cc6..888ca523e63 100644 --- a/samples/sensor/apds9960/prj.conf +++ b/samples/sensor/apds9960/prj.conf @@ -2,5 +2,11 @@ CONFIG_PRINTK=y CONFIG_GPIO=y CONFIG_I2C=y CONFIG_PRINTK=y -CONFIG_APDS9960=y CONFIG_SENSOR=y + +CONFIG_SYS_LOG=y +CONFIG_SYS_LOG_SENSOR_LEVEL=1 +CONFIG_SYS_LOG_I2C_LEVEL=1 + +CONFIG_APDS9960=y +CONFIG_APDS9960_TRIGGER_GLOBAL_THREAD=n diff --git a/samples/sensor/apds9960/sample.yaml b/samples/sensor/apds9960/sample.yaml index 0e86b798c60..94103124549 100644 --- a/samples/sensor/apds9960/sample.yaml +++ b/samples/sensor/apds9960/sample.yaml @@ -6,3 +6,10 @@ tests: platform_whitelist: reel_board tags: samples sensor depends_on: i2c gpio + test-trigger: + harness: sensor + platform_whitelist: reel_board + tags: samples sensor + depends_on: i2c gpio + extra_configs: + - CONFIG_APDS9960_TRIGGER_GLOBAL_THREAD=y diff --git a/samples/sensor/apds9960/src/main.c b/samples/sensor/apds9960/src/main.c index 8b84edd1611..ff9393eadc9 100644 --- a/samples/sensor/apds9960/src/main.c +++ b/samples/sensor/apds9960/src/main.c @@ -1,6 +1,6 @@ /* - * * Copyright (c) 2017 Intel Corporation + * Copyright (c) 2018 Phytec Messtechnik GmbH * * SPDX-License-Identifier: Apache-2.0 */ @@ -11,43 +11,68 @@ #include #include -static void do_main(struct device *dev) +#ifdef CONFIG_APDS9960_TRIGGER +K_SEM_DEFINE(sem, 0, 1); + +static void trigger_handler(struct device *dev, struct sensor_trigger *trigger) { - struct sensor_value intensity, pdata; + ARG_UNUSED(dev); + ARG_UNUSED(trigger); - while (1) { - - if (sensor_sample_fetch(dev)) { - printk("sensor_sample fetch failed\n"); - } - - sensor_channel_get(dev, SENSOR_CHAN_LIGHT, &intensity); - - printk("ambient light intensity without" - " trigger is %d\n", intensity.val1); - - k_sleep(1000); - - sensor_channel_get(dev, SENSOR_CHAN_PROX, &pdata); - - printk("proxy without trigger is %d\n", pdata.val1); - - k_sleep(1000); - } + k_sem_give(&sem); } +#endif void main(void) { struct device *dev; + struct sensor_value intensity, pdata; printk("APDS9960 sample application\n"); - dev = device_get_binding("APDS9960"); - + dev = device_get_binding(CONFIG_APDS9960_DRV_NAME); if (!dev) { printk("sensor: device not found.\n"); return; } - do_main(dev); +#ifdef CONFIG_APDS9960_TRIGGER + struct sensor_value attr = { + .val1 = 127, + .val2 = 0, + }; + if (sensor_attr_set(dev, SENSOR_CHAN_PROX, + SENSOR_ATTR_UPPER_THRESH, &attr)) { + printk("Could not set threshold\n"); + return; + } + + struct sensor_trigger trig = { + .type = SENSOR_TRIG_THRESHOLD, + .chan = SENSOR_CHAN_PROX, + }; + + if (sensor_trigger_set(dev, &trig, trigger_handler)) { + printk("Could not set trigger\n"); + return; + } +#endif + + while (true) { +#ifdef CONFIG_APDS9960_TRIGGER + printk("Waiting for a threshold event\n"); + k_sem_take(&sem, K_FOREVER); +#else + k_sleep(5000); +#endif + if (sensor_sample_fetch(dev)) { + printk("sensor_sample fetch failed\n"); + } + + sensor_channel_get(dev, SENSOR_CHAN_LIGHT, &intensity); + sensor_channel_get(dev, SENSOR_CHAN_PROX, &pdata); + + printk("ambient light intensity %d, proximity %d\n", + intensity.val1, pdata.val1); + } }