c09167715e
- Fix dir-locals so emacs won't inject occasional tabs to case statements. - Fix stray tab indentation in example programs. (Thx @pfalcon for pointing this out)
84 lines
2.4 KiB
C
84 lines
2.4 KiB
C
/* Respond to a button press.
|
|
*
|
|
* This code combines two ways of checking for a button press -
|
|
* busy polling (the bad way) and button interrupt (the good way).
|
|
*
|
|
* This sample code is in the public domain.
|
|
*/
|
|
#include "espressif/esp_common.h"
|
|
#include "espressif/sdk_private.h"
|
|
#include "FreeRTOS.h"
|
|
#include "task.h"
|
|
#include "queue.h"
|
|
#include "esp8266.h"
|
|
|
|
/* pin config */
|
|
const int gpio = 0; /* gpio 0 usually has "PROGRAM" button attached */
|
|
const int active = 0; /* active == 0 for active low */
|
|
const gpio_interrupt_t int_type = INT_FALLING;
|
|
#define GPIO_HANDLER gpio00_interrupt_handler
|
|
|
|
|
|
/* This task polls for the button and prints the tick
|
|
count when it's seen.
|
|
|
|
Debounced to 200ms with a simple vTaskDelay.
|
|
|
|
This is not a good example of how to wait for button input!
|
|
*/
|
|
void buttonPollTask(void *pvParameters)
|
|
{
|
|
printf("Polling for button press on gpio %d...\r\n", gpio);
|
|
while(1) {
|
|
while(gpio_read(gpio) != active)
|
|
{
|
|
taskYIELD();
|
|
}
|
|
printf("Polled for button press at %dms\r\n", xTaskGetTickCount()*portTICK_RATE_MS);
|
|
vTaskDelay(200 / portTICK_RATE_MS);
|
|
}
|
|
}
|
|
|
|
/* This task configures the GPIO interrupt and uses it to tell
|
|
when the button is pressed.
|
|
|
|
The interrupt handler communicates the exact button press time to
|
|
the task via a queue.
|
|
|
|
This is a better example of how to wait for button input!
|
|
*/
|
|
void buttonIntTask(void *pvParameters)
|
|
{
|
|
printf("Waiting for button press interrupt on gpio %d...\r\n", gpio);
|
|
xQueueHandle *tsqueue = (xQueueHandle *)pvParameters;
|
|
gpio_set_interrupt(gpio, int_type);
|
|
|
|
uint32_t last = 0;
|
|
while(1) {
|
|
uint32_t button_ts;
|
|
xQueueReceive(*tsqueue, &button_ts, portMAX_DELAY);
|
|
button_ts *= portTICK_RATE_MS;
|
|
if(last < button_ts-200) {
|
|
printf("Button interrupt fired at %dms\r\n", button_ts);
|
|
last = button_ts;
|
|
}
|
|
}
|
|
}
|
|
|
|
static xQueueHandle tsqueue;
|
|
|
|
void GPIO_HANDLER(void)
|
|
{
|
|
uint32_t now = xTaskGetTickCountFromISR();
|
|
xQueueSendToBackFromISR(tsqueue, &now, NULL);
|
|
}
|
|
|
|
void user_init(void)
|
|
{
|
|
sdk_uart_div_modify(0, UART_CLK_FREQ / 115200);
|
|
gpio_enable(gpio, GPIO_INPUT);
|
|
|
|
tsqueue = xQueueCreate(2, sizeof(uint32_t));
|
|
xTaskCreate(buttonIntTask, (signed char *)"buttonIntTask", 256, &tsqueue, 2, NULL);
|
|
xTaskCreate(buttonPollTask, (signed char*)"buttonPollTask", 256, NULL, 1, NULL);
|
|
}
|