From 24315d6c8480b45a1b8a0d07d216b1f8811c82cd Mon Sep 17 00:00:00 2001 From: jvblanck Date: Sun, 18 Jul 2021 22:32:33 +0200 Subject: [PATCH] Debounce (some) buttons --- lib/Bounce2/.gitignore | 1 - lib/Bounce2/Bounce1.zip | Bin 7844 -> 0 bytes lib/Bounce2/Bounce2.cpp | 125 ------------------ lib/Bounce2/Bounce2.h | 110 --------------- lib/Bounce2/BouncySwitch_lockout.png | Bin 16093 -> 0 bytes lib/Bounce2/BouncySwitch_stable.png | Bin 9330 -> 0 bytes lib/Bounce2/INSTALL.txt | 1 - lib/Bounce2/LICENSE | 20 --- lib/Bounce2/README.md | 37 ------ lib/Bounce2/examples/bounce/bounce.ino | 48 ------- .../bounce2buttons/bounce2buttons.ino | 64 --------- .../bounce_multiple/bounce_multiple.ino | 56 -------- lib/Bounce2/examples/change/change.ino | 48 ------- ...rcuit-bounce-change-duration-retrigger.png | Bin 48556 -> 0 bytes lib/Bounce2/examples/duration/duration.ino | 53 -------- lib/Bounce2/examples/retrigger/retrigger.ino | 86 ------------ lib/Bounce2/keywords.txt | 29 ---- lib/Bounce2/library.json | 16 --- lib/Bounce2/library.properties | 9 -- lib/FT18_STW_INIT/FT18_STW_INIT.cpp | 113 ++++------------ platformio.ini | 4 +- src/18stw.cpp | 1 - 22 files changed, 26 insertions(+), 795 deletions(-) delete mode 100644 lib/Bounce2/.gitignore delete mode 100644 lib/Bounce2/Bounce1.zip delete mode 100644 lib/Bounce2/Bounce2.cpp delete mode 100644 lib/Bounce2/Bounce2.h delete mode 100644 lib/Bounce2/BouncySwitch_lockout.png delete mode 100644 lib/Bounce2/BouncySwitch_stable.png delete mode 100644 lib/Bounce2/INSTALL.txt delete mode 100644 lib/Bounce2/LICENSE delete mode 100644 lib/Bounce2/README.md delete mode 100644 lib/Bounce2/examples/bounce/bounce.ino delete mode 100644 lib/Bounce2/examples/bounce2buttons/bounce2buttons.ino delete mode 100644 lib/Bounce2/examples/bounce_multiple/bounce_multiple.ino delete mode 100644 lib/Bounce2/examples/change/change.ino delete mode 100644 lib/Bounce2/examples/circuit-bounce-change-duration-retrigger.png delete mode 100644 lib/Bounce2/examples/duration/duration.ino delete mode 100644 lib/Bounce2/examples/retrigger/retrigger.ino delete mode 100644 lib/Bounce2/keywords.txt delete mode 100644 lib/Bounce2/library.json delete mode 100644 lib/Bounce2/library.properties diff --git a/lib/Bounce2/.gitignore b/lib/Bounce2/.gitignore deleted file mode 100644 index 3997bea..0000000 --- a/lib/Bounce2/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.db \ No newline at end of file diff --git a/lib/Bounce2/Bounce1.zip b/lib/Bounce2/Bounce1.zip deleted file mode 100644 index 4b6c0cd46b4a6b74e95fcec8320126e39a444acd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7844 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 uy}o;1<*uEF-pin = pin; - state = 0; - if (readCurrentState()) { - setStateFlag(DEBOUNCED_STATE | UNSTABLE_STATE); - } -#ifdef BOUNCE_LOCK_OUT - previous_millis = 0; -#else - previous_millis = millis(); -#endif -} - -void Bounce::attach(int pin, int mode){ - setPinMode(pin, mode); - this->attach(pin); -} - -void Bounce::interval(uint16_t interval_millis) -{ - this->interval_millis = interval_millis; -} - -bool Bounce::update() -{ - - unsetStateFlag(CHANGED_STATE); -#ifdef BOUNCE_LOCK_OUT - - // Ignore everything if we are locked out - if (millis() - previous_millis >= interval_millis) { - bool currentState = readCurrentState(); - if ( currentState != getStateFlag(DEBOUNCED_STATE) ) { - previous_millis = millis(); - toggleStateFlag(DEBOUNCED_STATE); - setStateFlag(CHANGED_STATE); - } - } - - -#elif defined BOUNCE_WITH_PROMPT_DETECTION - // Read the state of the switch port into a temporary variable. - bool readState = readCurrentState(); - - - if ( readState != getStateFlag(DEBOUNCED_STATE) ) { - // We have seen a change from the current button state. - - if ( millis() - previous_millis >= interval_millis ) { - // We have passed the time threshold, so a new change of state is allowed. - // set the STATE_CHANGED flag and the new DEBOUNCED_STATE. - // This will be prompt as long as there has been greater than interval_misllis ms since last change of input. - // Otherwise debounced state will not change again until bouncing is stable for the timeout period. - toggleStateFlag(DEBOUNCED_STATE); - setStateFlag(CHANGED_STATE ); - } - } - - // If the readState is different from previous readState, reset the debounce timer - as input is still unstable - // and we want to prevent new button state changes until the previous one has remained stable for the timeout. - if ( readState != getStateFlag(UNSTABLE_STATE) ) { - // Update Unstable Bit to macth readState - toggleStateFlag(UNSTABLE_STATE); - previous_millis = millis(); - } - - -#else - // Read the state of the switch in a temporary variable. - bool currentState = readCurrentState(); - - - // If the reading is different from last reading, reset the debounce counter - if ( currentState != getStateFlag(UNSTABLE_STATE) ) { - previous_millis = millis(); - toggleStateFlag(UNSTABLE_STATE); - } else - if ( millis() - previous_millis >= interval_millis ) { - // We have passed the threshold time, so the input is now stable - // If it is different from last state, set the STATE_CHANGED flag - if (currentState != getStateFlag(DEBOUNCED_STATE) ) { - previous_millis = millis(); - toggleStateFlag(DEBOUNCED_STATE); - setStateFlag(CHANGED_STATE) ; - } - } - - -#endif - -return getStateFlag(CHANGED_STATE); - -} - -bool Bounce::read() -{ - return getStateFlag(DEBOUNCED_STATE); -} - -bool Bounce::rose() -{ - return getStateFlag(DEBOUNCED_STATE) && getStateFlag(CHANGED_STATE); -} - -bool Bounce::fell() -{ - return !getStateFlag(DEBOUNCED_STATE) && getStateFlag(CHANGED_STATE); -} diff --git a/lib/Bounce2/Bounce2.h b/lib/Bounce2/Bounce2.h deleted file mode 100644 index 8e6eebb..0000000 --- a/lib/Bounce2/Bounce2.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - The MIT License (MIT) - - Copyright (c) 2013 thomasfredericks - - Permission is hereby granted, free of charge, to any person obtaining a copy of - this software and associated documentation files (the "Software"), to deal in - the Software without restriction, including without limitation the rights to - use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - the Software, and to permit persons to whom the Software is furnished to do so, - subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * - Main code by Thomas O Fredericks (tof@t-o-f.info) - Previous contributions by Eric Lowry, Jim Schimpf and Tom Harkaway - * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef Bounce2_h -#define Bounce2_h - -#if defined(ARDUINO) && ARDUINO >= 100 -#include "Arduino.h" -#else -#include "WProgram.h" -#endif - -// Uncomment the following line for "LOCK-OUT" debounce method -//#define BOUNCE_LOCK_OUT - -// Uncomment the following line for "BOUNCE_WITH_PROMPT_DETECTION" debounce method -//#define BOUNCE_WITH_PROMPT_DETECTION - -#include - -/* -#ifndef _BV -#define _BV(n) (1<<(n)) -#endif -*/ - -class Bounce -{ - public: - // Create an instance of the bounce library - Bounce(); - - // Attach to a pin (and also sets initial state) - void attach(int pin); - - // Attach to a pin (and also sets initial state) and sets pin to mode (INPUT/INPUT_PULLUP/OUTPUT) - void attach(int pin, int mode); - - // Sets the debounce interval - void interval(uint16_t interval_millis); - - // Updates the pin - // Returns 1 if the state changed - // Returns 0 if the state did not change - bool update(); - - // Returns the updated pin state - bool read(); - - // Returns the falling pin state - bool fell(); - - // Returns the rising pin state - bool rose(); - - // Partial compatibility for programs written with Bounce version 1 - bool risingEdge() { return rose(); } - bool fallingEdge() { return fell(); } - Bounce(uint8_t pin, unsigned long interval_millis ) : Bounce() { - attach(pin); - interval(interval_millis); - } - - protected: - unsigned long previous_millis; - uint16_t interval_millis; - uint8_t state; - uint8_t pin; - virtual bool readCurrentState() { return digitalRead(pin); } - virtual void setPinMode(int pin, int mode) { -#if defined(ARDUINO_STM_NUCLEO_F103RB) || defined(ARDUINO_GENERIC_STM32F103C) - pinMode(pin, (WiringPinMode)mode); -#else - pinMode(pin, mode); -#endif - } - - private: - inline void setStateFlag(const uint8_t flag) {state |= flag;} - inline void unsetStateFlag(const uint8_t flag) {state &= ~flag;} - inline void toggleStateFlag(const uint8_t flag) {state ^= flag;} - inline bool getStateFlag(const uint8_t flag) {return((state & flag) != 0);} -}; - -#endif diff --git a/lib/Bounce2/BouncySwitch_lockout.png b/lib/Bounce2/BouncySwitch_lockout.png deleted file mode 100644 index d8313d4872954caf58605b975301b675d687b9e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16093 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 - -#define BUTTON_PIN 2 -#define LED_PIN 13 - -// Instantiate a Bounce object -Bounce debouncer = Bounce(); - -void setup() { - - // Setup the button with an internal pull-up : - pinMode(BUTTON_PIN,INPUT_PULLUP); - - // After setting up the button, setup the Bounce instance : - debouncer.attach(BUTTON_PIN); - debouncer.interval(5); // interval in ms - - //Setup the LED : - pinMode(LED_PIN,OUTPUT); - -} - -void loop() { - // Update the Bounce instance : - debouncer.update(); - - // Get the updated value : - int value = debouncer.read(); - - // Turn on or off the LED as determined by the state : - if ( value == LOW ) { - digitalWrite(LED_PIN, HIGH ); - } - else { - digitalWrite(LED_PIN, LOW ); - } - -} - - diff --git a/lib/Bounce2/examples/bounce2buttons/bounce2buttons.ino b/lib/Bounce2/examples/bounce2buttons/bounce2buttons.ino deleted file mode 100644 index 416d738..0000000 --- a/lib/Bounce2/examples/bounce2buttons/bounce2buttons.ino +++ /dev/null @@ -1,64 +0,0 @@ - -/* - DESCRIPTION - ==================== - Simple example of the Bounce library that switches the debug LED when - either of 2 buttons are pressed. - */ - -// Include the Bounce2 library found here : -// https://github.com/thomasfredericks/Bounce2 -#include - -#define BUTTON_PIN_1 2 -#define BUTTON_PIN_2 3 - - -#define LED_PIN 13 - -// Instantiate a Bounce object -Bounce debouncer1 = Bounce(); - -// Instantiate another Bounce object -Bounce debouncer2 = Bounce(); - -void setup() { - - // Setup the first button with an internal pull-up : - pinMode(BUTTON_PIN_1,INPUT_PULLUP); - // After setting up the button, setup the Bounce instance : - debouncer1.attach(BUTTON_PIN_1); - debouncer1.interval(5); // interval in ms - - // Setup the second button with an internal pull-up : - pinMode(BUTTON_PIN_2,INPUT_PULLUP); - // After setting up the button, setup the Bounce instance : - debouncer2.attach(BUTTON_PIN_2); - debouncer2.interval(5); // interval in ms - - - //Setup the LED : - pinMode(LED_PIN,OUTPUT); - -} - -void loop() { - // Update the Bounce instances : - debouncer1.update(); - debouncer2.update(); - - // Get the updated value : - int value1 = debouncer1.read(); - int value2 = debouncer2.read(); - - // Turn on the LED if either button is pressed : - if ( value1 == LOW || value2 == LOW ) { - digitalWrite(LED_PIN, HIGH ); - } - else { - digitalWrite(LED_PIN, LOW ); - } - -} - - diff --git a/lib/Bounce2/examples/bounce_multiple/bounce_multiple.ino b/lib/Bounce2/examples/bounce_multiple/bounce_multiple.ino deleted file mode 100644 index 25b92c7..0000000 --- a/lib/Bounce2/examples/bounce_multiple/bounce_multiple.ino +++ /dev/null @@ -1,56 +0,0 @@ -// Detect the falling edge of multiple buttons. -// Eight buttons with internal pullups. -// Toggles a LED when any button is pressed. -// Buttons on pins 2,3,4,5,6,7,8,9 - -// Include the Bounce2 library found here : -// https://github.com/thomasfredericks/Bounce2 -#include - -#define LED_PIN 13 - -#define NUM_BUTTONS 8 -const uint8_t BUTTON_PINS[NUM_BUTTONS] = {2, 3, 4, 5, 6, 7, 8, 9}; - -int ledState = LOW; - -Bounce * buttons = new Bounce[NUM_BUTTONS]; - -void setup() { - - for (int i = 0; i < NUM_BUTTONS; i++) { - buttons[i].attach( BUTTON_PINS[i] , INPUT_PULLUP ); //setup the bounce instance for the current button - buttons[i].interval(25); // interval in ms - } - - // Setup the LED : - pinMode(LED_PIN, OUTPUT); - digitalWrite(LED_PIN, ledState); - - -} - -void loop() { - - bool needToToggleLed = false; - - - for (int i = 0; i < NUM_BUTTONS; i++) { - // Update the Bounce instance : - buttons[i].update(); - // If it fell, flag the need to toggle the LED - if ( buttons[i].fell() ) { - needToToggleLed = true; - } - } - - // if a LED toggle has been flagged : - if ( needToToggleLed ) { - // Toggle LED state : - ledState = !ledState; - digitalWrite(LED_PIN, ledState); - } - - -} - diff --git a/lib/Bounce2/examples/change/change.ino b/lib/Bounce2/examples/change/change.ino deleted file mode 100644 index 0ece35b..0000000 --- a/lib/Bounce2/examples/change/change.ino +++ /dev/null @@ -1,48 +0,0 @@ - -// Detect the falling edge - -// Include the Bounce2 library found here : -// https://github.com/thomasfredericks/Bounce2 -#include - - -#define BUTTON_PIN 2 -#define LED_PIN 13 - -int ledState = LOW; - - -// Instantiate a Bounce object : -Bounce debouncer = Bounce(); - -void setup() { - - // Setup the button with an internal pull-up : - pinMode(BUTTON_PIN,INPUT_PULLUP); - - // After setting up the button, setup the Bounce instance : - debouncer.attach(BUTTON_PIN); - debouncer.interval(500); - - // Setup the LED : - pinMode(LED_PIN,OUTPUT); - digitalWrite(LED_PIN,ledState); - - -} - -void loop() { - - // Update the Bounce instance : - debouncer.update(); - - // Call code if Bounce fell (transition from HIGH to LOW) : - if ( debouncer.fell() ) { - - // Toggle LED state : - ledState = !ledState; - digitalWrite(LED_PIN,ledState); - - } -} - diff --git a/lib/Bounce2/examples/circuit-bounce-change-duration-retrigger.png b/lib/Bounce2/examples/circuit-bounce-change-duration-retrigger.png deleted file mode 100644 index 2e4114862b7a67742ba534487a215f09bf9855bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48556 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 - - -#define BUTTON_PIN 2 -#define LED_PIN 13 - -// Instantiate a Bounce object : -Bounce debouncer = Bounce(); - -unsigned long buttonPressTimeStamp; - -void setup() { - - Serial.begin(57600); - - // Setup the button with an internal pull-up : - pinMode(BUTTON_PIN,INPUT_PULLUP); - - // After setting up the button, setup the Bounce instance : - debouncer.attach(BUTTON_PIN); - debouncer.interval(5); - - // Setup the LED : - pinMode(LED_PIN,OUTPUT); - -} - -void loop() { - - // Update the Bounce instance : - debouncer.update(); - - // Call code if Bounce fell (transition from HIGH to LOW) : - if ( debouncer.fell() ) {; - - Serial.println( millis()-buttonPressTimeStamp ); - buttonPressTimeStamp = millis(); - - } - - -} - diff --git a/lib/Bounce2/examples/retrigger/retrigger.ino b/lib/Bounce2/examples/retrigger/retrigger.ino deleted file mode 100644 index dfc53fd..0000000 --- a/lib/Bounce2/examples/retrigger/retrigger.ino +++ /dev/null @@ -1,86 +0,0 @@ - -/* -DESCRIPTION -==================== -Example of the bounce library that shows how to retrigger an event when a button is held down. -In this case, the debug LED will blink every 500 ms as long as the button is held down. -Open the Serial Monitor (57600 baud) for debug messages. - -*/ - -// Include the Bounce2 library found here : -// https://github.com/thomasfredericks/Bounce2 -#include - - -#define BUTTON_PIN 2 -#define LED_PIN 13 - -// Instantiate a Bounce object -Bounce debouncer = Bounce(); - -int buttonState; -unsigned long buttonPressTimeStamp; - -int ledState; - -void setup() { - - Serial.begin(57600); - - // Setup the button - pinMode(BUTTON_PIN,INPUT); - // Activate internal pull-up - digitalWrite(BUTTON_PIN,HIGH); - - // After setting up the button, setup debouncer - debouncer.attach(BUTTON_PIN); - debouncer.interval(5); - - //Setup the LED - pinMode(LED_PIN,OUTPUT); - digitalWrite(LED_PIN,ledState); - -} - -void loop() { - // Update the debouncer and get the changed state - boolean changed = debouncer.update(); - - - - if ( changed ) { - // Get the update value - int value = debouncer.read(); - if ( value == HIGH) { - ledState = LOW; - digitalWrite(LED_PIN, ledState ); - - buttonState = 0; - Serial.println("Button released (state 0)"); - - } else { - ledState = HIGH; - digitalWrite(LED_PIN, ledState ); - - buttonState = 1; - Serial.println("Button pressed (state 1)"); - buttonPressTimeStamp = millis(); - - } - } - - if ( buttonState == 1 ) { - if ( millis() - buttonPressTimeStamp >= 500 ) { - buttonPressTimeStamp = millis(); - if ( ledState == HIGH ) ledState = LOW; - else if ( ledState == LOW ) ledState = HIGH; - digitalWrite(LED_PIN, ledState ); - Serial.println("Retriggering button"); - } - } - - -} - - diff --git a/lib/Bounce2/keywords.txt b/lib/Bounce2/keywords.txt deleted file mode 100644 index 22285fe..0000000 --- a/lib/Bounce2/keywords.txt +++ /dev/null @@ -1,29 +0,0 @@ -####################################### -# Syntax Coloring Map For Bounce2 -####################################### - -####################################### -# Datatypes (KEYWORD1) -####################################### - -Bounce KEYWORD1 - -####################################### -# Methods and Functions (KEYWORD2) -####################################### - -update KEYWORD2 -interval KEYWORD2 -read KEYWORD2 -attach KEYWORD2 -rose KEYWORD2 -fell KEYWORD2 - -####################################### -# Instances (KEYWORD2) -####################################### - -####################################### -# Constants (LITERAL1) -####################################### - diff --git a/lib/Bounce2/library.json b/lib/Bounce2/library.json deleted file mode 100644 index 327baa8..0000000 --- a/lib/Bounce2/library.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "Bounce2", - "keywords": "bounce, signal, input, ouput", - "description": "Debouncing library for Arduino or Wiring", - "repository": { - "type": "git", - "url": "https://github.com/thomasfredericks/Bounce2.git" - }, - "version": "2.41", - "exclude": [ - "*.png", - "*.zip" - ], - "frameworks": "arduino", - "platforms": "*" -} diff --git a/lib/Bounce2/library.properties b/lib/Bounce2/library.properties deleted file mode 100644 index ee9933d..0000000 --- a/lib/Bounce2/library.properties +++ /dev/null @@ -1,9 +0,0 @@ -name=Bounce2 -version=2.41 -author=Thomas O Fredericks with contributions fromEric Lowry, Jim Schimpf and Tom Harkaway -maintainer=Thomas O Fredericks -sentence=Debouncing library for Arduino and Wiring. -paragraph=Deboucing switches and toggles is important. -category=Signal Input/Output -url=https://github.com/thomasfredericks/Bounce2 -architectures=* diff --git a/lib/FT18_STW_INIT/FT18_STW_INIT.cpp b/lib/FT18_STW_INIT/FT18_STW_INIT.cpp index 6c19bc4..50dfc6c 100644 --- a/lib/FT18_STW_INIT/FT18_STW_INIT.cpp +++ b/lib/FT18_STW_INIT/FT18_STW_INIT.cpp @@ -1,7 +1,8 @@ -#include "Arduino.h" #include "FT18_STW_INIT.h" -#include "Bounce2.h" -#include "RotaryEncoder.h" + +#include +#include +#include volatile stw_data_type Stw_data = {0}; //alles mit 0 initialisieren volatile vehicle_data_type Vehicle_data = {0}; //alles mit 0 initialisieren @@ -9,7 +10,8 @@ bool enc1PinALast,enc1PinANow,enc2PinALast,enc2PinANow; int led[] = {led1,led2,led3,led4,led5,led6,led7,led8,led9,led10,led11,led12,led13,led14,led15,led16}; bool entprell; int buttons[] = {button1,button2,button3,button4,button5,button6,enc1PinS,enc2PinS}; -Bounce debouncer[8]; +constexpr size_t N_BUTTONS = sizeof(buttons)/sizeof(buttons[0]); +Bounce2::Button debouncer[N_BUTTONS]; double val = 0; double val2 = 0; RotaryEncoder encoder(enc1PinA,enc1PinB,1,1,50); @@ -23,110 +25,41 @@ void set_pins(){ for (int thisLed = 0; thisLed < sizeof(led)/sizeof(int); thisLed++) { pinMode(led[thisLed], OUTPUT); } - /*pinMode(button1, INPUT); - pinMode(button2, INPUT); - pinMode(button3, INPUT); - pinMode(button4, INPUT); - pinMode(button5, INPUT); - pinMode(button6, INPUT);*/ pinMode(enc1PinA, INPUT); pinMode(enc1PinB, INPUT); - //pinMode(enc1PinS, INPUT); pinMode(enc2PinA, INPUT); pinMode(enc2PinB, INPUT); - //pinMode(enc2PinS, INPUT); - //Stw_data.i=0; enc1PinALast=LOW; enc1PinANow=LOW; enc2PinALast=LOW; enc2PinANow=LOW; - for(int i = 0; i < 8; i++){ - pinMode(buttons[i], INPUT); - debouncer[i].attach(buttons[i]); + for(int i = 0; i < N_BUTTONS; i++){ + debouncer[i].attach(buttons[i], INPUT); debouncer[i].interval(10); } } void read_buttons(){ - /*entprell = digitalRead(button3); - delay(10); - if(digitalRead(button3)){ - Stw_data.Stw_auto_shift = entprell; + for (int i = 0; i < N_BUTTONS; i++) { + debouncer[i].update(); } - entprell = digitalRead(button2); - delay(10); - if(digitalRead(button2)){ - Stw_data.Stw_neutral = entprell; - } - entprell = digitalRead(button1); - delay(10); - if(digitalRead(button1)){ - Stw_data.buttonState1 = entprell; - } - entprell = digitalRead(button6); - delay(10); - if(digitalRead(button6)){ - Stw_data.Stw_shift_up = entprell; - } - entprell = digitalRead(button5); - delay(10); - if(digitalRead(button5)){ - Stw_data.Stw_shift_down = entprell; - } - entprell = digitalRead(button4); - delay(10); - if(digitalRead(button4)){ - Stw_data.buttonState4 = entprell; - } - entprell = digitalRead(enc1PinS); - delay(10); - if(digitalRead(enc1PinS)){ - Stw_data.buttonStateEnc1 = entprell; - } - entprell = digitalRead(enc2PinS); - delay(10); - if(digitalRead(enc2PinS)){ - Stw_data.buttonStateEnc2 = entprell; - }*/ - Stw_data.Stw_auto_shift = digitalRead(button3); - Stw_data.Stw_neutral = digitalRead(button2); + + // These are only used to send them out via CAN, so they only need to be + // high once. + Stw_data.Stw_neutral = debouncer[1].rose(); + Stw_data.Stw_auto_shift = debouncer[2].rose(); + Stw_data.Stw_shift_down = debouncer[4].rose(); + Stw_data.Stw_shift_up = debouncer[5].rose(); + + // These are also used for GUI, so if we set them only at rising edge, they + // might never be high when checked in the GUI. + // TODO: Rewrite so we can use debounced values here as well Stw_data.buttonState1 = digitalRead(button1); - Stw_data.Stw_shift_up = digitalRead(button6); - Stw_data.Stw_shift_down = digitalRead(button5); Stw_data.buttonState4 = digitalRead(button4); Stw_data.buttonStateEnc1 = digitalRead(enc1PinS); Stw_data.buttonStateEnc2 = digitalRead(enc2PinS); - - /*for(int i = 0;i < 8; i++){ - debouncer[i].update(); - } - debouncer[2].update(); - if(debouncer[2].fell()){ - Stw_data.Stw_auto_shift = HIGH; - } - if(debouncer[1].fell()){ - Stw_data.Stw_neutral = digitalRead(button2); - } - if(debouncer[0].fell()){ - Stw_data.buttonState1 = digitalRead(button1); - } - if(debouncer[5].fell()){ - Stw_data.Stw_shift_up = digitalRead(button6); - } - if(debouncer[4].fell()){ - Stw_data.Stw_shift_down = digitalRead(button5); - } - if(debouncer[3].fell()){ - Stw_data.buttonState4 = digitalRead(button4); - } - if(debouncer[6].fell()){ - Stw_data.buttonStateEnc1 = digitalRead(enc1PinS); - } - if(debouncer[7].fell()){ - Stw_data.buttonStateEnc2 = digitalRead(enc2PinS); - }*/ - } - +} + void read_rotary(){ int enc = encoder.readEncoder(); int enc2 = encoder2.readEncoder(); diff --git a/platformio.ini b/platformio.ini index 37a40e3..9df821e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,7 +12,9 @@ platform = atmelsam board = due framework = arduino -lib_deps = sebnil/DueFlashStorage@^1.0.0 +lib_deps = + sebnil/DueFlashStorage@^1.0.0 + thomasfredericks/Bounce2@^2.60 [env:combustion] src_filter = +<*> -<18estw.cpp> diff --git a/src/18stw.cpp b/src/18stw.cpp index 83fa4d4..2d7d799 100644 --- a/src/18stw.cpp +++ b/src/18stw.cpp @@ -1,5 +1,4 @@ #include -#include #include #include #include