peripheral/gpio_irq/main.c

/*
* EVALUATION AND USE OF THIS SOFTWARE IS SUBJECT TO THE TERMS AND
* CONDITIONS OF THE CONTROLLING LICENSE AGREEMENT FOUND AT LICENSE.md
* IN THIS SDK. IF YOU DO NOT AGREE TO THE LICENSE TERMS AND CONDITIONS,
* PLEASE RETURN ALL SOURCE FILES TO SILICON LABORATORIES.
* (c) Copyright 2018, Silicon Laboratories Inc. All rights reserved.
*/
/*
* Documentation for this app is available online.
* See https://docs.silabs.com/gecko-os/4/standard/latest/sdk/examples/basic/gpio
*/
#include "gos.h"
#define APPLICATION_START_LINE "\r\n\r\nGPIO IRQ Example app starting..."
/*************************************************************************************************/
void gos_app_init(void)
{
GOS_LOG(APPLICATION_START_LINE);
GOS_LOG("Press Button1 to toggle LED1");
GOS_LOG("Press Button2 to toggle LED2");
// NOTE: Also see the basic.button example app which uses the gos_button_XXX APIs
gos_gpio_init(PLATFORM_LED1, GOS_GPIO_OUTPUT_PUSH_PULL, !PLATFORM_LED_ACTIVE_STATE);
gos_gpio_init(PLATFORM_LED2, GOS_GPIO_OUTPUT_PUSH_PULL, !PLATFORM_LED_ACTIVE_STATE);
gos_gpio_irq_enable(PLATFORM_BUTTON1, GOS_GPIO_TRIGGER_BOTH_EDGES, gpio_irq_callback, (void*)PLATFORM_BUTTON1);
gos_gpio_irq_enable(PLATFORM_BUTTON2, GOS_GPIO_TRIGGER_BOTH_EDGES, gpio_irq_callback, (void*)PLATFORM_BUTTON2);
}
/*************************************************************************************************
* Executes inside the GPIO hardware IRQ
*/
static void gpio_irq_callback(void *arg)
{
const gos_gpio_t button_gpio = (gos_gpio_t)arg;
const gos_gpio_t led_gpio = (button_gpio == PLATFORM_BUTTON1) ? PLATFORM_LED1 : PLATFORM_LED2;
/*
* NOTE: MUST use the Native API due to execution in the GPIO IRQ, Command APIs are not allowed in IRQs
*/
const bool value = gos_gpio_get(button_gpio);
gos_gpio_set(led_gpio, (value == PLATFORM_BUTTON_ACTIVE_STATE) ? PLATFORM_LED_ACTIVE_STATE : !PLATFORM_LED_ACTIVE_STATE);
}