/*
* buttons3.c:
* Multiple button handling using wiringPiISRmulti.
*
***********************************************************************
* This file is part of wiringPi:
* https://github.com/nuncio-bitis/WiringPi
*
* wiringPi is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
*by the Free Software Foundation, either version 3 of the License, or (at your
*option) any later version.
*
* wiringPi is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with wiringPi. If not, see .
***********************************************************************
*/
#include
#include
#include
#include
#include
#include
//**********************************************************************************************************************
// GPIOs (BCM) that buttons are attached to:
static const int buttons[] = { 26, 16, 20, 21 };
static const int nButtons = (sizeof (buttons) / sizeof (int));
static int terminate_process = 0;
//**********************************************************************************************************************
/**
* Intercepts and handles signals from QNX
* This function is called when the SIGTERM signal is raised by QNX
*/
static void Signal_handler(int sig)
{
printf("Received signal %d\n", sig);
// Signal process to exit.
terminate_process = 1;
}
//**********************************************************************************************************************
static int getButtonIndex (int pin)
{
for (int i = 0; i < nButtons; ++i)
{
if (buttons[i] == pin)
{
return i;
}
}
return -1;
}
//**********************************************************************************************************************
static int nInts = 0;
static void Button_Wait (int pin)
{
nInts++;
printf ("%s: Interrupt on pin %d; Button #%d; nInts=%d\n", __FUNCTION__, pin, 1+getButtonIndex(pin), nInts);
}
//**********************************************************************************************************************
int main (int argc, char *argv[])
{
// Set the handler for SIGTERM (15)
signal(SIGTERM, Signal_handler);
signal(SIGHUP, Signal_handler);
signal(SIGINT, Signal_handler);
signal(SIGQUIT, Signal_handler);
signal(SIGTRAP, Signal_handler);
signal(SIGABRT, Signal_handler);
signal(SIGALRM, Signal_handler);
signal(SIGUSR1, Signal_handler);
signal(SIGUSR2, Signal_handler);
printf ("Raspberry Pi Button Test\n");
// ----------------------------------------------------
wiringPiSetupGpio ();
// Setup the inputs
for (int i = 0; i < nButtons; ++i)
{
pinMode (buttons[i], INPUT);
pullUpDnControl (buttons[i], PUD_UP);
}
// ----------------------------------------------------
// Set up a callback for when any of these buttons is pressed/released
// Note: there is no debounce proterction here.
// You may see multiple interrupts with one button.
if (wiringPiISRmulti ((int *)buttons, nButtons, INT_EDGE_RISING, &Button_Wait) < 0)
{
fprintf (stderr, "%s: Unable to setup ISR: %s\n", argv[0], strerror(errno));
return EXIT_FAILURE;
}
nInts = 0;
while (!terminate_process)
{
delayMs(100);
}
return EXIT_SUCCESS;
}
//**********************************************************************************************************************