main.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /*
  2. main.c
  3. raspberry pi zero GPIO read test
  4. For speedup run this example as root, either wis
  5. sudo ./main
  6. or by setting the superuser bit:
  7. sudo chown root:root ./main
  8. sudo chmod u+s ./main
  9. */
  10. #include <stdlib.h>
  11. #include <stdio.h>
  12. #include <signal.h>
  13. #include "bcm2835.h"
  14. #include "raspi_gpio_hal.h"
  15. void sigtermhandler(int x)
  16. {
  17. puts("SIGTERM");
  18. bcm2835_close();
  19. exit(0);
  20. }
  21. void siginthandler(int x)
  22. {
  23. puts("SIGINT");
  24. bcm2835_close();
  25. exit(0);
  26. }
  27. #define BUTTON_STATE_NOT_PRESSED 0
  28. #define BUTTON_STATE_HIGH_DETECT 1
  29. #define BUTTON_STATE_HIGH_WAIT 2
  30. #define BUTTON_STATE_LOW_DELAY 3
  31. struct button_struct
  32. {
  33. int state;
  34. int delay;
  35. uint8_t pin;
  36. };
  37. typedef struct button_struct button_t;
  38. #define BUTTON_DELAY_HIGH 2
  39. #define BUTTON_DELAY_LOW 2
  40. #define BUTTON_CNT 2
  41. button_t button_list[BUTTON_CNT];
  42. int button_init(void)
  43. {
  44. int i;
  45. for( i = 0; i < BUTTON_CNT; i++ )
  46. {
  47. bcm2835_gpio_fsel(button_list[i].pin, BCM2835_GPIO_FSEL_INPT);
  48. }
  49. }
  50. int button_get_event(void)
  51. {
  52. int button_value = -1;
  53. int i;
  54. for( i = 0; i < BUTTON_CNT; i++ )
  55. {
  56. switch(button_list[i].state)
  57. {
  58. case BUTTON_STATE_NOT_PRESSED:
  59. button_list[i].delay = 0;
  60. if ( bcm2835_gpio_lev(button_list[i].pin) != 0 )
  61. button_list[i].state = BUTTON_STATE_HIGH_DETECT;
  62. break;
  63. case BUTTON_STATE_HIGH_DETECT:
  64. if ( bcm2835_gpio_lev(button_list[i].pin) == 0 )
  65. {
  66. button_list[i].delay = 0;
  67. button_list[i].state = BUTTON_STATE_LOW_DELAY;
  68. }
  69. button_list[i].delay++;
  70. if ( button_list[i].delay >= BUTTON_DELAY_HIGH )
  71. {
  72. button_value = i;
  73. button_list[i].state = BUTTON_STATE_HIGH_WAIT;
  74. }
  75. break;
  76. case BUTTON_STATE_HIGH_WAIT:
  77. if ( bcm2835_gpio_lev(button_list[i].pin) == 0 )
  78. {
  79. button_list[i].delay = 0;
  80. button_list[i].state = BUTTON_STATE_LOW_DELAY;
  81. }
  82. break;
  83. case BUTTON_STATE_LOW_DELAY:
  84. button_list[i].delay++;
  85. if ( button_list[i].delay >= BUTTON_DELAY_LOW )
  86. button_list[i].state = BUTTON_STATE_NOT_PRESSED;
  87. break;
  88. }
  89. }
  90. return button_value;
  91. }
  92. int main(void)
  93. {
  94. int i = 0;
  95. int b = -1;
  96. int pins[4] = { 12, 13, 16, 17 };
  97. if (!bcm2835_init())
  98. exit(1);
  99. signal(SIGTERM, sigtermhandler);
  100. signal(SIGINT, siginthandler);
  101. atexit((void (*) (void))bcm2835_close);
  102. button_list[0].pin = 12;
  103. button_list[1].pin = 16;
  104. button_init();
  105. for( ;; )
  106. {
  107. b = button_get_event();
  108. if ( b >= 0 )
  109. printf("Button %d\n", b);
  110. }
  111. //delaynanoseconds(500000000UL);
  112. }