]> git.tnoah.ca Git - lora-radio.git/commitdiff
Added basic input driver
authorMark Qvist <mark@unsigned.io>
Wed, 1 May 2024 23:13:26 +0000 (01:13 +0200)
committerMark Qvist <mark@unsigned.io>
Wed, 1 May 2024 23:13:26 +0000 (01:13 +0200)
Input.h [new file with mode: 0644]

diff --git a/Input.h b/Input.h
new file mode 100644 (file)
index 0000000..996a09c
--- /dev/null
+++ b/Input.h
@@ -0,0 +1,95 @@
+// Copyright (C) 2024, Mark Qvist
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program 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 General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+#ifndef INPUT_H
+  #define INPUT_H
+  
+  #define PIN_BUTTON pin_btn_usr1
+
+  #define PRESSED LOW
+  #define RELEASED HIGH
+
+  #define EVENT_ALL                 0x00
+  #define EVENT_CLICKS              0x01
+  #define EVENT_BUTTON_DOWN         0x11
+  #define EVENT_BUTTON_UP           0x12
+  #define EVENT_BUTTON_CLICK        0x13
+  #define EVENT_BUTTON_DOUBLE_CLICK 0x14
+  #define EVENT_BUTTON_TRIPLE_CLICK 0x15
+  
+  int button_events = EVENT_CLICKS;
+  int button_state = RELEASED;
+  int debounce_state = button_state;
+  unsigned long button_debounce_last = 0;
+  unsigned long button_debounce_delay = 25;
+  unsigned long button_down_last = 0;
+  unsigned long button_up_last = 0;
+
+  // Forward declaration
+  void button_event(uint8_t event, unsigned long duration);
+
+  void input_init() {
+    pinMode(PIN_BUTTON, INPUT_PULLUP);
+  }
+
+  void input_get_all_events() {
+    button_events = EVENT_ALL;
+  }
+
+  void input_get_click_events() {
+    button_events = EVENT_CLICKS;
+  }
+
+  void input_read() {
+    int button_reading = digitalRead(PIN_BUTTON);
+    if (button_reading != debounce_state) {
+      button_debounce_last = millis();
+      debounce_state = button_reading;
+    }
+
+    if ((millis() - button_debounce_last) > button_debounce_delay) {
+      if (button_reading != button_state) {
+        // State changed
+        int previous_state = button_state;
+        button_state = button_reading;
+
+        if (button_events == EVENT_ALL) {
+          if (button_state == PRESSED) {
+            button_event(EVENT_BUTTON_DOWN, 0);
+          } else if (button_state == RELEASED) {
+            button_event(EVENT_BUTTON_UP, 0);
+          }
+        } else if (button_events == EVENT_CLICKS) {
+          if (previous_state == PRESSED && button_state == RELEASED) {
+            button_up_last = millis();
+            button_event(EVENT_BUTTON_CLICK, button_up_last-button_down_last);
+          } else if (previous_state == RELEASED && button_state == PRESSED) {
+            button_down_last = millis();
+          }
+        }
+      }
+    }
+
+  }
+
+  bool button_pressed() {
+    if (button_state == PRESSED) {
+      return true;
+    } else {
+      return false;
+    }
+  }
+
+#endif
\ No newline at end of file