|  |  | 
 |  |  |  *       Filename:  infrared.c | 
 |  |  |  *    Description:  This file  | 
 |  |  |  *                  | 
 |  |  |  *     pi@raspberrypi:~ $ gpio readall     #show BCM and wPi pinmap   | 
 |  |  |  * | 
 |  |  |  *             PIN          #PIN        BCM           wPi  | 
 |  |  |  *           VCC(left) ----  2   ----   5v     ----   5v | 
 |  |  |  *         I/O(indoor) ----  16  ----   23     ----   4 | 
 |  |  |  *        I/O(hallway) ----  18  ----   24     ----   5 | 
 |  |  |  *          GND(right) ----  34  ----   0v     ----   0v | 
 |  |  |  * | 
 |  |  |  *        Version:  1.0.0(30/01/19) | 
 |  |  |  *         Author:  Guo Wenxue <guowenxue@gmail.com> | 
 |  |  |  *      ChangeLog:  1, Release initial version on "30/01/19 03:37:16" | 
 |  |  | 
 |  |  |  | 
 |  |  | #include <stdio.h> | 
 |  |  | #include <unistd.h> | 
 |  |  | #include <errno.h> | 
 |  |  | #include <string.h> | 
 |  |  |  | 
 |  |  | //#define CONFIG_USE_WIRINGPI | 
 |  |  |  | 
 |  |  | #ifdef CONFIG_USE_WIRINGPI | 
 |  |  |  | 
 |  |  | #include <wiringPi.h> | 
 |  |  |  | 
 |  |  | /* I/O Pin connected to PIN#16, BCM code pin number is 23 and wPi pin number is 4 */ | 
 |  |  | #define INFRARED_PIN           4 | 
 |  |  | //#define INFRARED_PIN           5 | 
 |  |  |  | 
 |  |  | int main (int argc, char **argv) | 
 |  |  | { | 
 |  |  | 
 |  |  |         sleep(1); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     return 0; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | #else | 
 |  |  |  | 
 |  |  | #include <gpiod.h> | 
 |  |  |  | 
 |  |  | #define INFRARED_PIN           23 | 
 |  |  | //#define INFRARED_PIN           24 | 
 |  |  |  | 
 |  |  | int main (int argc, char **argv) | 
 |  |  | { | 
 |  |  |     struct gpiod_chip*       chip; | 
 |  |  |     struct gpiod_line*       line; | 
 |  |  |     int                      rv = 0; | 
 |  |  |     struct gpiod_line_event  event; | 
 |  |  |  | 
 |  |  |     chip = gpiod_chip_open_by_name("gpiochip0"); | 
 |  |  |     if( !chip ) | 
 |  |  |     { | 
 |  |  |         printf("gpiod open chip failure, maybe you need running as root\n"); | 
 |  |  |         return 1; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     line = gpiod_chip_get_line(chip, INFRARED_PIN); | 
 |  |  |     if( !line ) | 
 |  |  |     { | 
 |  |  |         printf("gpiod get line[%d] failure\n", INFRARED_PIN); | 
 |  |  |         rv = 2; | 
 |  |  |         goto cleanup; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     //if( gpiod_line_request_rising_edge_events(line, "infrared") < 0 ) | 
 |  |  |     if( gpiod_line_request_falling_edge_events(line, "infrared") < 0 ) | 
 |  |  |     { | 
 |  |  |         printf("gpiod request rising edge event failure: %s\n", strerror(errno)); | 
 |  |  |         rv = 3; | 
 |  |  |         goto cleanup; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     while(1) | 
 |  |  |     { | 
 |  |  |         /* This function will block, must call it to setup */ | 
 |  |  |         printf("Start gpiod_line_event_wait...\n"); | 
 |  |  |         if( gpiod_line_event_wait(line, NULL) < 0 ) | 
 |  |  |         { | 
 |  |  |             printf("gpiod line wait event failure!\n"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /* This function will block, must read to clear the event  */ | 
 |  |  |         printf("Start gpiod_line_event_read...\n"); | 
 |  |  |         if (gpiod_line_event_read(line, &event) < 0) | 
 |  |  |         { | 
 |  |  |             printf("gpiod line wait event failure!\n"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (event.event_type == GPIOD_LINE_EVENT_RISING_EDGE) | 
 |  |  |         { | 
 |  |  |             printf("Infrared monitor: Someone is closing!\n"); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | cleanup: | 
 |  |  |     gpiod_chip_close(chip); | 
 |  |  |     return rv; | 
 |  |  | } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | #endif |