|
- /*
- * wfi.c:
- * Wait for Interrupt test program
- *
- * This program demonstrates the use of the waitForInterrupt()
- * function in wiringPi. It listens to a button input on
- * BCM_GPIO pin 17 (wiringPi pin 0)
- *
- * The biggest issue with this method is that it really only works
- * well in Sys mode.
- *
- * Jan 2013: This way of doing things is sort of deprecated now, see
- * the wiringPiISR() function instead and the isr.c test program here.
- *
- * Copyright (c) 2012-2013 Gordon Henderson.
- ***********************************************************************
- * This file is part of wiringPi:
- * https://projects.drogon.net/raspberry-pi/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 <http://www.gnu.org/licenses/>.
- ***********************************************************************
- */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <wiringPi.h>
-
- // A 'key' which we can lock and unlock - values are 0 through 3
- // This is interpreted internally as a pthread_mutex by wiringPi
- // which is hiding some of that to make life simple.
-
- #define COUNT_KEY 0
-
- // What BCM_GPIO input are we using?
-
- #define BUTTON_PIN 17
-
- // Debounce time in mS
-
- #define DEBOUNCE_TIME 100
-
-
- // globalCounter:
- // Global variable to count interrupts
- // Should be declared volatile to make sure the compiler doesn't cache it.
-
- static volatile int globalCounter = 0 ;
-
-
- /*
- * waitForIt:
- * This is a thread created using the wiringPi simplified threading
- * mechanism. It will wait on an interrupt on the button and increment
- * a counter.
- *********************************************************************************
- */
-
- PI_THREAD (waitForIt)
- {
- int state = 0 ;
- int debounceTime = 0 ;
-
- (void)piHiPri (10) ; // Set this thread to be high priority
-
- for (;;)
- {
- if (waitForInterrupt (BUTTON_PIN, -1) > 0) // Got it
- {
- // Bouncing?
-
- if (millis () < debounceTime)
- {
- debounceTime = millis () + DEBOUNCE_TIME ;
- continue ;
- }
-
- // We have a valid one
-
- state ^= 1 ;
-
- piLock (COUNT_KEY) ;
- ++globalCounter ;
- piUnlock (COUNT_KEY) ;
-
- // Wait for key to be released
-
- while (digitalRead (BUTTON_PIN) == LOW)
- delay (1) ;
-
- debounceTime = millis () + DEBOUNCE_TIME ;
- }
- }
-
- return (void *) NULL ;
- }
-
-
- /*
- * setup:
- * Demo a crude but effective way to initialise the hardware
- *********************************************************************************
- */
-
- void setup (void)
- {
-
- // Use the gpio program to initialise the hardware
- // (This is the crude, but effective)
-
- system ("gpio edge 17 falling") ;
-
- // Setup wiringPi
-
- wiringPiSetupSys () ;
-
- // Fire off our interrupt handler
-
- piThreadCreate (waitForIt) ;
-
- }
-
-
- /*
- * main
- *********************************************************************************
- */
-
- int main (void)
- {
- int lastCounter = 0 ;
- int myCounter = 0 ;
-
- setup () ;
-
- for (;;)
- {
- printf ("Waiting ... ");
- fflush (stdout) ;
-
- while (myCounter == lastCounter)
- {
- piLock (COUNT_KEY) ;
- myCounter = globalCounter ;
- piUnlock (COUNT_KEY) ;
- delay (500) ;
- }
-
- printf (" Done. myCounter: %5d\n", myCounter) ;
- lastCounter = myCounter ;
- }
-
- return 0 ;
- }
|