DIY fertilizer mixer and plant watering machine https://www.xythobuz.de/giessomat.html
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

GPIOBank.cpp 1.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include <Arduino.h>
  2. #include "GPIOBank.h"
  3. #ifdef PLATFORM_ESP
  4. #include "WifiStuff.h"
  5. #endif // PLATFORM_ESP
  6. //#define GPIO_HIGH_AS_INPUT
  7. GPIOBank::GPIOBank(int _size) {
  8. size = _size;
  9. pins = new int[size];
  10. out_state = new bool[size];
  11. is_output = false;
  12. }
  13. GPIOBank::~GPIOBank(void) {
  14. delete pins;
  15. delete out_state;
  16. }
  17. void GPIOBank::setPinNumbers(int _pins[]) {
  18. for (int i = 0; i < size; i++) {
  19. pins[i] = _pins[i];
  20. }
  21. }
  22. void GPIOBank::setOutput(void) {
  23. for (int i = 0; i < size; i++) {
  24. #ifdef GPIO_HIGH_AS_INPUT
  25. pinMode(pins[i], INPUT);
  26. #else
  27. pinMode(pins[i], OUTPUT);
  28. digitalWrite(pins[i], HIGH);
  29. #endif
  30. out_state[i] = true;
  31. }
  32. is_output = true;
  33. }
  34. void GPIOBank::setInput(bool pullup) {
  35. for (int i = 0; i < size; i++) {
  36. if (pullup) {
  37. pinMode(pins[i], INPUT_PULLUP);
  38. } else {
  39. pinMode(pins[i], INPUT);
  40. }
  41. }
  42. is_output = false;
  43. }
  44. int GPIOBank::getSize(void) {
  45. return size;
  46. }
  47. void GPIOBank::setPin(int n, bool state) {
  48. if (!is_output) {
  49. return;
  50. }
  51. if ((n >= 0) && (n < size)) {
  52. #ifdef GPIO_HIGH_AS_INPUT
  53. if (state) {
  54. pinMode(pins[n], OUTPUT);
  55. digitalWrite(pins[n], LOW);
  56. } else {
  57. pinMode(pins[n], INPUT);
  58. }
  59. #else
  60. digitalWrite(pins[n], (!state) ? HIGH : LOW);
  61. #endif
  62. out_state[n] = !state;
  63. #ifdef PLATFORM_ESP
  64. wifi_schedule_websocket();
  65. #endif // PLATFORM_ESP
  66. }
  67. }
  68. void GPIOBank::setAll(bool state) {
  69. for (int i = 0; i < size; i++) {
  70. setPin(i, state);
  71. }
  72. }
  73. bool GPIOBank::getPin(int n) {
  74. if ((n >= 0) && (n < size)) {
  75. if (is_output) {
  76. return !out_state[n];
  77. } else {
  78. return (!digitalRead(pins[n]));
  79. }
  80. } else {
  81. return false;
  82. }
  83. }