From d5396d7580383b0c433ed141fff1299515e453d3 Mon Sep 17 00:00:00 2001 From: Mathieu Maret Date: Sun, 6 Nov 2016 11:03:06 +0100 Subject: [PATCH] First Draft with only one GPIO usable --- HIB.cpp | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HIB.h | 17 ++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 HIB.cpp create mode 100644 HIB.h diff --git a/HIB.cpp b/HIB.cpp new file mode 100644 index 0000000..d29decd --- /dev/null +++ b/HIB.cpp @@ -0,0 +1,80 @@ +#include "HIB.h" + +static uint8_t pin; +static uint8_t initialState; +static int state; +static volatile bool debouncing; +static ETSTimer timer; +static unsigned long previousMillis; +static unsigned int longPressMsec; +void timerCallback(void *); +void IRQ_handler(); +void onButtonPressed(); +void onButtonReleased(); +void onLongButtonPressed(); +void setConfig(uint8_t p, uint8_t initState, int longPress ); + + +HIB::HIB(uint8_t pin, uint8_t initialState, int longPressMsec) +{ + setConfig(pin, initialState, longPressMsec); +} + +HIB::HIB(){ +} + +void HIB::configure(uint8_t pin, uint8_t initState, int longPressMsec){ + setConfig(pin, initState, longPressMsec); +} + +void setConfig(uint8_t p, uint8_t initState, int longPress ){ + pin = p; + initialState = initState; + state = initialState; + debouncing = false; + previousMillis = 0; + longPressMsec = longPress; + + pinMode(pin, INPUT); + attachInterrupt(digitalPinToInterrupt(pin), IRQ_handler, CHANGE); + os_timer_setfn(&timer, timerCallback, NULL); +} + +void IRQ_handler(){ + if(!debouncing){ + debouncing = true; + os_timer_arm(&timer, 50, 0); + } +} + +void timerCallback(void *){ + debouncing = false; + state = !state; + if (state != digitalRead(pin)){ + Serial.println("Debounce failed"); + state = !state; + return; + } + if(state != initialState) + onButtonPressed(); + else + onButtonReleased(); +} + +void onButtonPressed(){ + Serial.println("Button Pressed"); + previousMillis = millis(); +} + +void onLongButtonPressed(){ + Serial.println("Long Button Pressed"); +} + +void onButtonReleased(){ + Serial.println("Button Released"); + if(millis() - previousMillis >= longPressMsec){ + onLongButtonPressed(); + } +} + +HIB Hib; diff --git a/HIB.h b/HIB.h new file mode 100644 index 0000000..7f8a86b --- /dev/null +++ b/HIB.h @@ -0,0 +1,17 @@ +#pragma once +#include "Arduino.h" +extern "C" { +#include "osapi.h" +} +// Human Interface Button +class HIB { +private: + +public: + HIB(uint8_t pin, uint8_t initialState, int longPressMsec = 5000); + HIB(); + void configure(uint8_t pin, uint8_t initialState, int longPressMsec = 5000); +}; + + +extern HIB Hib;