/* Interrupt Example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#define North_Button GPIO_NUM_13
#define East_Button GPIO_NUM_35
#define South_Button GPIO_NUM_32
#define West_Button GPIO_NUM_33
#define DELAY_TIME 200
volatile bool Ncar = false;
volatile bool Ecar = false;
volatile bool Scar = false;
volatile bool Wcar = false;
// button Interrupt Service Routines (raising flags)
static void northISR(void* arg) {
Ncar = true;
}
static void eastISR(void* arg) {
Ecar = true;
}
static void southISR(void* arg) {
Scar = true;
}
static void westISR(void* arg) {
Wcar = true;
}
// button configurations for each direction
void Ncar_config() {
gpio_install_isr_service(0);
printf("configuring button\n");
gpio_reset_pin(North_Button);
gpio_set_direction(North_Button, GPIO_MODE_INPUT);
gpio_pullup_en(North_Button);
gpio_set_intr_type(North_Button, GPIO_INTR_POSEDGE);
gpio_isr_handler_add(North_Button, northISR, NULL);
printf("config complete\n");
}
void Ecar_config() {
gpio_install_isr_service(0);
printf("configuring button\n");
gpio_reset_pin(East_Button);
gpio_set_direction(East_Button, GPIO_MODE_INPUT);
gpio_pullup_en(East_Button);
gpio_set_intr_type(East_Button, GPIO_INTR_POSEDGE);
gpio_isr_handler_add(East_Button, eastISR, NULL);
printf("config complete\n");
}
void Scar_config() {
gpio_install_isr_service(0);
printf("configuring button\n");
gpio_reset_pin(South_Button);
gpio_set_direction(South_Button, GPIO_MODE_INPUT);
gpio_pullup_en(South_Button);
gpio_set_intr_type(South_Button, GPIO_INTR_POSEDGE);
gpio_isr_handler_add(South_Button, southISR, NULL);
printf("config complete\n");
}
void Wcar_config() {
gpio_install_isr_service(0);
printf("configuring button\n");
gpio_reset_pin(West_Button);
gpio_set_direction(West_Button, GPIO_MODE_INPUT);
gpio_pullup_en(West_Button);
gpio_set_intr_type(West_Button, GPIO_INTR_POSEDGE);
gpio_isr_handler_add(West_Button, westISR, NULL);
printf("config complete\n");
}
extern "C" void app_main() {
Ncar_config();
Ecar_config();
Scar_config();
Wcar_config();
while (1) {
if (Ncar) {
printf("NORTH\n");
Ncar = false;
}
if (Ecar) {
printf("EAST\n");
Ecar = false;
}
if (Scar) {
printf("SOUTH\n");
Scar = false;
}
if (Wcar) {
printf("WEST\n");
Wcar = false;
}
vTaskDelay(DELAY_TIME / portTICK_PERIOD_MS);
}
}