diff --git a/src/io.c b/src/io.c new file mode 100644 index 0000000..aed6679 --- /dev/null +++ b/src/io.c @@ -0,0 +1,169 @@ +/* io.c - Application main entry point */ + +/* + * Copyright (c) 2020 Olaf Landsiedel + * + * SPDX-License-Identifier: Apache-2.0 + */ + + +#include +#include +#include + +#include "covid.h" +#include "io.h" + +/* + * Devicetree helper macro which gets the 'flags' cell from a 'gpios' + * property, or returns 0 if the property has no 'flags' cell. + */ + +#define FLAGS_OR_ZERO(node) \ + COND_CODE_1(DT_PHA_HAS_CELL(node, gpios, flags), \ + (DT_GPIO_FLAGS(node, gpios)), \ + (0)) + +/* + * Get button configuration from the devicetree sw0 alias. + * + * At least a GPIO device and pin number must be provided. The 'flags' + * cell is optional. + */ + +//on my NRF board this is button 1 +#define SW0_NODE DT_ALIAS(sw0) + +#if DT_NODE_HAS_STATUS(SW0_NODE, okay) +#define SW0_GPIO_LABEL DT_GPIO_LABEL(SW0_NODE, gpios) +#define SW0_GPIO_PIN DT_GPIO_PIN(SW0_NODE, gpios) +#define SW0_GPIO_FLAGS (GPIO_INPUT | FLAGS_OR_ZERO(SW0_NODE)) +#else +#error "Unsupported board: sw0 devicetree alias is not defined" +#define SW0_GPIO_LABEL "" +#define SW0_GPIO_PIN 0 +#define SW0_GPIO_FLAGS 0 +#endif + +//on my NRF board this is button 2 +#define SW1_NODE DT_ALIAS(sw1) + +#if DT_NODE_HAS_STATUS(SW1_NODE, okay) +#define SW1_GPIO_LABEL DT_GPIO_LABEL(SW1_NODE, gpios) +#define SW1_GPIO_PIN DT_GPIO_PIN(SW1_NODE, gpios) +#define SW1_GPIO_FLAGS (GPIO_INPUT | FLAGS_OR_ZERO(SW1_NODE)) +#else +#error "Unsupported board: sw1 devicetree alias is not defined" +#define SW1_GPIO_LABEL "" +#define SW1_GPIO_PIN 0 +#define SW1_GPIO_FLAGS 0 +#endif + +/* The devicetree node identifier for the "led0" alias. */ +#define LED0_NODE DT_ALIAS(led0) + +#if DT_NODE_HAS_STATUS(LED0_NODE, okay) +#define LED0 DT_GPIO_LABEL(LED0_NODE, gpios) +#define PIN DT_GPIO_PIN(LED0_NODE, gpios) +#if DT_PHA_HAS_CELL(LED0_NODE, gpios, flags) +#define FLAGS DT_GPIO_FLAGS(LED0_NODE, gpios) +#endif +#else +/* A build error here means your board isn't set up to blink an LED. */ +#error "Unsupported board: led0 devicetree alias is not defined" +#define LED0 "" +#define PIN 0 +#endif + +#ifndef FLAGS +#define FLAGS 0 +#endif + + +static struct gpio_callback button_0_cb_data; +static struct gpio_callback button_1_cb_data; + +void button_0_pressed(struct device *dev, struct gpio_callback *cb, uint32_t pins){ + set_infection(true); + gpio_pin_set(dev, PIN, (int)1); + printk("Button 0 (=infected) pressed at %" PRIu32 "\n", k_cycle_get_32()); +} + +void button_1_pressed(struct device *dev, struct gpio_callback *cb, uint32_t pins){ + set_infection(false); + gpio_pin_set(dev, PIN, (int)0); + printk("Button 1 (=healthy) pressed at %" PRIu32 "\n", k_cycle_get_32()); +} + +int init_io(){ + struct device *button0, *button1; + int err = 0; + //struct device *led; + + button0 = device_get_binding(SW0_GPIO_LABEL); + if (button0 == NULL) { + printk("Error: didn't find %s device\n", SW0_GPIO_LABEL); + return -1; + } + button1 = device_get_binding(SW1_GPIO_LABEL); + if (button1 == NULL) { + printk("Error: didn't find %s device\n", SW1_GPIO_LABEL); + return -1; + } + + err = gpio_pin_configure(button0, SW0_GPIO_PIN, SW0_GPIO_FLAGS); + if (err != 0) { + printk("Error %d: failed to configure %s pin %d\n", + err, SW0_GPIO_LABEL, SW0_GPIO_PIN); + return err; + } + + err = gpio_pin_configure(button1, SW1_GPIO_PIN, SW1_GPIO_FLAGS); + if (err != 0) { + printk("Error %d: failed to configure %s pin %d\n", + err, SW1_GPIO_LABEL, SW1_GPIO_PIN); + return err; + } + + + err = gpio_pin_interrupt_configure(button0, + SW0_GPIO_PIN, + GPIO_INT_EDGE_TO_ACTIVE); + if (err != 0) { + printk("Error %d: failed to configure interrupt on %s pin %d\n", + err, SW0_GPIO_LABEL, SW0_GPIO_PIN); + return err; + } + + err = gpio_pin_interrupt_configure(button1, + SW1_GPIO_PIN, + GPIO_INT_EDGE_TO_ACTIVE); + if (err != 0) { + printk("Error %d: failed to configure interrupt on %s pin %d\n", + err, SW1_GPIO_LABEL, SW1_GPIO_PIN); + return err; + } + + gpio_init_callback(&button_0_cb_data, button_0_pressed, BIT(SW0_GPIO_PIN)); + gpio_add_callback(button0, &button_0_cb_data); + printk("Set up button at %s pin %d\n", SW0_GPIO_LABEL, SW0_GPIO_PIN); + + gpio_init_callback(&button_1_cb_data, button_1_pressed, BIT(SW1_GPIO_PIN)); + gpio_add_callback(button1, &button_1_cb_data); + printk("Set up button at %s pin %d\n", SW1_GPIO_LABEL, SW1_GPIO_PIN); + + struct device *dev; + dev = device_get_binding(LED0); + if (dev == NULL) { + return -1; + } + + err = gpio_pin_configure(dev, PIN, GPIO_OUTPUT_ACTIVE | FLAGS); + if (err < 0) { + printk("Error %d: failed to configure leds\n", err); + return err; + } + //Turn LED 0 off + gpio_pin_set(dev, PIN, (int)0); + return 0; +} \ No newline at end of file diff --git a/src/io.h b/src/io.h new file mode 100644 index 0000000..b4a7c3b --- /dev/null +++ b/src/io.h @@ -0,0 +1,10 @@ +/* io.h - Application main entry point */ + +/* + * Copyright (c) 2020 Olaf Landsiedel + * + * SPDX-License-Identifier: Apache-2.0 + */ + + +int init_io(); \ No newline at end of file diff --git a/src/main.c b/src/main.c index d60a746..6633bd0 100644 --- a/src/main.c +++ b/src/main.c @@ -7,14 +7,8 @@ */ -#include -#include -#include -#include #include -#include #include -#include #include #include "exposure-notification.h" @@ -22,160 +16,7 @@ #include "contacts.h" #include "gatt_service.h" #include "covid.h" - -/* - * Devicetree helper macro which gets the 'flags' cell from a 'gpios' - * property, or returns 0 if the property has no 'flags' cell. - */ - -#define FLAGS_OR_ZERO(node) \ - COND_CODE_1(DT_PHA_HAS_CELL(node, gpios, flags), \ - (DT_GPIO_FLAGS(node, gpios)), \ - (0)) - -/* - * Get button configuration from the devicetree sw0 alias. - * - * At least a GPIO device and pin number must be provided. The 'flags' - * cell is optional. - */ - -//on my NRF board this is button 1 -#define SW0_NODE DT_ALIAS(sw0) - -#if DT_NODE_HAS_STATUS(SW0_NODE, okay) -#define SW0_GPIO_LABEL DT_GPIO_LABEL(SW0_NODE, gpios) -#define SW0_GPIO_PIN DT_GPIO_PIN(SW0_NODE, gpios) -#define SW0_GPIO_FLAGS (GPIO_INPUT | FLAGS_OR_ZERO(SW0_NODE)) -#else -#error "Unsupported board: sw0 devicetree alias is not defined" -#define SW0_GPIO_LABEL "" -#define SW0_GPIO_PIN 0 -#define SW0_GPIO_FLAGS 0 -#endif - -//on my NRF board this is button 2 -#define SW1_NODE DT_ALIAS(sw1) - -#if DT_NODE_HAS_STATUS(SW1_NODE, okay) -#define SW1_GPIO_LABEL DT_GPIO_LABEL(SW1_NODE, gpios) -#define SW1_GPIO_PIN DT_GPIO_PIN(SW1_NODE, gpios) -#define SW1_GPIO_FLAGS (GPIO_INPUT | FLAGS_OR_ZERO(SW1_NODE)) -#else -#error "Unsupported board: sw1 devicetree alias is not defined" -#define SW1_GPIO_LABEL "" -#define SW1_GPIO_PIN 0 -#define SW1_GPIO_FLAGS 0 -#endif - -/* The devicetree node identifier for the "led0" alias. */ -#define LED0_NODE DT_ALIAS(led0) - -#if DT_NODE_HAS_STATUS(LED0_NODE, okay) -#define LED0 DT_GPIO_LABEL(LED0_NODE, gpios) -#define PIN DT_GPIO_PIN(LED0_NODE, gpios) -#if DT_PHA_HAS_CELL(LED0_NODE, gpios, flags) -#define FLAGS DT_GPIO_FLAGS(LED0_NODE, gpios) -#endif -#else -/* A build error here means your board isn't set up to blink an LED. */ -#error "Unsupported board: led0 devicetree alias is not defined" -#define LED0 "" -#define PIN 0 -#endif - -#ifndef FLAGS -#define FLAGS 0 -#endif - - -static struct gpio_callback button_0_cb_data; -static struct gpio_callback button_1_cb_data; - -void button_0_pressed(struct device *dev, struct gpio_callback *cb, uint32_t pins){ - set_infection(true); - gpio_pin_set(dev, PIN, (int)1); - printk("Button 0 (=infected) pressed at %" PRIu32 "\n", k_cycle_get_32()); -} - -void button_1_pressed(struct device *dev, struct gpio_callback *cb, uint32_t pins){ - set_infection(false); - gpio_pin_set(dev, PIN, (int)0); - printk("Button 1 (=healthy) pressed at %" PRIu32 "\n", k_cycle_get_32()); -} - -int init_io(){ - struct device *button0, *button1; - int err = 0; - //struct device *led; - - button0 = device_get_binding(SW0_GPIO_LABEL); - if (button0 == NULL) { - printk("Error: didn't find %s device\n", SW0_GPIO_LABEL); - return -1; - } - button1 = device_get_binding(SW1_GPIO_LABEL); - if (button1 == NULL) { - printk("Error: didn't find %s device\n", SW1_GPIO_LABEL); - return -1; - } - - err = gpio_pin_configure(button0, SW0_GPIO_PIN, SW0_GPIO_FLAGS); - if (err != 0) { - printk("Error %d: failed to configure %s pin %d\n", - err, SW0_GPIO_LABEL, SW0_GPIO_PIN); - return err; - } - - err = gpio_pin_configure(button1, SW1_GPIO_PIN, SW1_GPIO_FLAGS); - if (err != 0) { - printk("Error %d: failed to configure %s pin %d\n", - err, SW1_GPIO_LABEL, SW1_GPIO_PIN); - return err; - } - - - err = gpio_pin_interrupt_configure(button0, - SW0_GPIO_PIN, - GPIO_INT_EDGE_TO_ACTIVE); - if (err != 0) { - printk("Error %d: failed to configure interrupt on %s pin %d\n", - err, SW0_GPIO_LABEL, SW0_GPIO_PIN); - return err; - } - - err = gpio_pin_interrupt_configure(button1, - SW1_GPIO_PIN, - GPIO_INT_EDGE_TO_ACTIVE); - if (err != 0) { - printk("Error %d: failed to configure interrupt on %s pin %d\n", - err, SW1_GPIO_LABEL, SW1_GPIO_PIN); - return err; - } - - gpio_init_callback(&button_0_cb_data, button_0_pressed, BIT(SW0_GPIO_PIN)); - gpio_add_callback(button0, &button_0_cb_data); - printk("Set up button at %s pin %d\n", SW0_GPIO_LABEL, SW0_GPIO_PIN); - - gpio_init_callback(&button_1_cb_data, button_1_pressed, BIT(SW1_GPIO_PIN)); - gpio_add_callback(button1, &button_1_cb_data); - printk("Set up button at %s pin %d\n", SW1_GPIO_LABEL, SW1_GPIO_PIN); - - struct device *dev; - dev = device_get_binding(LED0); - if (dev == NULL) { - return -1; - } - - err = gpio_pin_configure(dev, PIN, GPIO_OUTPUT_ACTIVE | FLAGS); - if (err < 0) { - printk("Error %d: failed to configure leds\n", err); - return err; - } - //Turn LED 0 off - gpio_pin_set(dev, PIN, (int)0); - return 0; -} +#include "io.h" void main(void) {