diff --git a/Defines.h b/Defines.h index f334d3a..abebc29 100644 --- a/Defines.h +++ b/Defines.h @@ -19,4 +19,6 @@ #define REGISTER_SIZE 2 +#define LONG_CLICK_TIME_MS 500 + #endif \ No newline at end of file diff --git a/DisplayHelper.h b/DisplayHelper.h index bfd25ea..dc3ad59 100644 --- a/DisplayHelper.h +++ b/DisplayHelper.h @@ -1,28 +1,39 @@ +#ifndef EYE_TRAINER_DISPLAYHELPER +#define EYE_TRAINER_DISPLAYHELPER 0 + #include #include "Defines.h" +#include "Settings.h" class DisplayHelper { // The amount of time (in milliseconds) between tests - #define TEST_DELAY 250 + #define TEST_DELAY 250 public: DisplayHelper() { } + + DisplayHelper(Settings* _Settings) + { + m_Settings = _Settings; + } void setup() { - pinMode(PIN_BTN_MAIN, INPUT); - pinMode(PIN_BTN_UP, INPUT); - pinMode(PIN_BTN_DOWN, INPUT); display.setBrightness(0x0f); } + loop() + { + + } + void buttonsTest() { bool btnMainState = digitalRead(PIN_BTN_MAIN); bool btnUpState = digitalRead(PIN_BTN_UP); bool btnDownState = digitalRead(PIN_BTN_DOWN); - int numChanged = currentNum; + int numChanged = currentTestNum; if(btnMainState == HIGH) { @@ -37,11 +48,11 @@ public: numChanged--; } - if(numChanged != currentNum) + if(numChanged != currentTestNum) { - currentNum = numChanged; + currentTestNum = numChanged; display.clear(); - display.showNumberDec(currentNum, false); + display.showNumberDec(currentTestNum, false); } } @@ -154,7 +165,8 @@ public: private: TM1637Display display = TM1637Display::TM1637Display(PIN_DISPLAY_CLK, PIN_DISPLAY_DIO); - int currentNum = 0; + Settings* m_Settings; + int currentTestNum = 0; // const uint8_t SEG_DONE[] = { uint8_t SEG_DONE[4] = { @@ -164,4 +176,8 @@ private: SEG_A | SEG_D | SEG_E | SEG_F | SEG_G // E }; -}; \ No newline at end of file + + +}; + +#endif \ No newline at end of file diff --git a/Enums.h b/Enums.h index aecd6f0..010aca1 100644 --- a/Enums.h +++ b/Enums.h @@ -7,21 +7,23 @@ enum DeviceMode SETTINGS_MODE, SETTINGS_BRIGHTNESS, SETTINGS_TIME, - RUN + RUN, }; enum RunMode { - Forward, - Backward, - Bothward, - Random, + FORWARD, + BACKWARD, + BOTH, + RANDOM, + TEST }; enum TimeMode { - Const, - Manual + CONST, + MANUAL, + INCREASING }; #endif \ No newline at end of file diff --git a/EyeTrainerMain.h b/EyeTrainerMain.h index a820827..4b18d25 100644 --- a/EyeTrainerMain.h +++ b/EyeTrainerMain.h @@ -2,7 +2,7 @@ #include "DisplayHelper.h" #include "Settings.h" #include "LEDRunner.h" - +#include "InputHelper.h" class EyeTrainerMain { @@ -13,9 +13,10 @@ public: DeviceMode m_deviceMode; - Settings m_Settings; - LEDRunner m_LEDRunner; - DisplayHelper m_DisplayHelper; + Settings m_Settings = Settings(); + LEDRunner m_LEDRunner = LEDRunner(&m_Settings); + DisplayHelper m_DisplayHelper = DisplayHelper(&m_Settings); + InputHelper m_InputHelper = InputHelper(); //============================================================== //end of state @@ -26,16 +27,15 @@ public: void setup() { pinMode(LED_BUILTIN, OUTPUT); - m_Settings = Settings(); - m_LEDRunner = LEDRunner(m_Settings); m_LEDRunner.setup(); - m_DisplayHelper = DisplayHelper(); m_DisplayHelper.setup(); + m_InputHelper.setup(); } void loop() { - + bool inputEvent = m_InputHelper.readInputs(millis()); + } void runTest() diff --git a/EyeTrainer_1.ino b/EyeTrainer_1.ino index cfc645e..939ebef 100644 --- a/EyeTrainer_1.ino +++ b/EyeTrainer_1.ino @@ -11,7 +11,5 @@ void setup() void loop() { - m_EyeTrainerMain.runTest(); -} - - + m_EyeTrainerMain.loop(); +} \ No newline at end of file diff --git a/InputHelper.h b/InputHelper.h new file mode 100644 index 0000000..8371258 --- /dev/null +++ b/InputHelper.h @@ -0,0 +1,53 @@ +#ifndef EYE_TRAINER_INPUTHELPER +#define EYE_TRAINER_INPUTHELPER 0 + +#include "Defines.h" +#include "SimpleButton.h" + +class InputHelper +{ +public: + InputHelper() { } + + void setup() + { + m_MainButton.setup(); + m_UpButton.setup(); + m_DownButton.setup(); + } + + bool readInputs(unsigned long _Time) + { + m_InputEvent = false; + + m_InputEvent |= m_MainButton.update(_Time); + m_InputEvent |= m_UpButton.update(_Time); + m_InputEvent |= m_DownButton.update(_Time); + + return m_InputEvent; + } + + SimpleButton getButtonMain() + { + return m_MainButton; + } + + SimpleButton getButtonUp() + { + return m_UpButton; + } + + SimpleButton getButtonDown() + { + return m_DownButton; + } + +private: + bool m_InputEvent; + + SimpleButton m_MainButton = SimpleButton(PIN_BTN_MAIN, LONG_CLICK_TIME_MS); + SimpleButton m_UpButton = SimpleButton(PIN_BTN_UP, LONG_CLICK_TIME_MS); + SimpleButton m_DownButton = SimpleButton(PIN_BTN_DOWN, LONG_CLICK_TIME_MS); +}; + +#endif \ No newline at end of file diff --git a/LEDRunner.h b/LEDRunner.h index fa089ad..7846738 100644 --- a/LEDRunner.h +++ b/LEDRunner.h @@ -6,18 +6,18 @@ */ #include "Defines.h" #include +#include "Settings.h" class LEDRunner { public: - LEDRunner() - { - } + // LEDRunner() + // { + // } - LEDRunner(Settings _Settings) + LEDRunner(Settings* _Settings) { - m_Settings = _Settings; - + this->m_Settings = _Settings; } void setup() @@ -28,6 +28,11 @@ public: pinMode(PIN_LED_LATCH, OUTPUT); } + void loop() + { + + } + void runTest() { // // setting all pins at the same time to either HIGH or LOW @@ -115,8 +120,27 @@ public: delay(500); } + void blink(const uint8_t _LedIndex, unsigned long _Time) + { + sr.setAllLow(); + sr.set(_LedIndex, HIGH); + delay(_Time); + sr.setAllLow(); + } + + void setAndClearOthers(const uint8_t _LedIndex, const uint8_t _Value) + { + sr.setAllLow(); + sr.set(_LedIndex, _Value); + } + + void set(const uint8_t _LedIndex, const uint8_t _Value) + { + sr.set(_LedIndex, _Value); + } + private: - Settings m_Settings; + Settings* m_Settings; ShiftRegister74HC595 sr = ShiftRegister74HC595::ShiftRegister74HC595(PIN_LED_DATA, PIN_LED_CLOCK, PIN_LED_LATCH); }; diff --git a/Settings.h b/Settings.h index 2d759ab..3df79cf 100644 --- a/Settings.h +++ b/Settings.h @@ -1,14 +1,20 @@ +#ifndef EYE_TRAINER_SETTINGS +#define EYE_TRAINER_SETTINGS 0 + #include "Defines.h" #include "Enums.h" class Settings { public: - enum RunMode m_RunMode = RunMode::Random; - enum TimeMode m_TimeMode = TimeMode::Const; - float SwitchTime = 3; + enum RunMode m_RunMode = RunMode::RANDOM; + enum TimeMode m_TimeMode = TimeMode::CONST; + float SwitchTime = 3; //In seconds + bool Changed = true; Settings() { } -}; \ No newline at end of file +}; + +#endif \ No newline at end of file diff --git a/SimpleButton.h b/SimpleButton.h new file mode 100644 index 0000000..83df4da --- /dev/null +++ b/SimpleButton.h @@ -0,0 +1,126 @@ +#ifndef EYE_TRAINER_SIMPLEBUTTON +#define EYE_TRAINER_SIMPLEBUTTON 0 + +class SimpleButton +{ +public: + + SimpleButton(int _ButtonPin, unsigned long _LongClickTime) + { + m_LongClickTime = _LongClickTime; + m_ButtonPin = _ButtonPin; + } + + void setup() + { + pinMode(m_ButtonPin, INPUT); + } + + int update(unsigned long _Time) + { + clearClicks(); + + int prevState = m_State; + + unsigned long deltaTime = _Time - m_PrevTimeMS; + m_PrevTimeMS = _Time; + bool pinState = digitalRead(m_ButtonPin); + + if(m_State == PRESSED && pinState) + { + m_PressedTime += deltaTime; + if(m_PressedTime >= m_LongClickTime) + { + m_IsNowHolded = true; + } + } + else if(m_State == PRESSED && !pinState) + { + m_State = RELEASED; + m_IsNowClicked = true; + + if(m_PressedTime >= m_LongClickTime) + { + m_IsNowLongClicked = true; + m_PressedTime = 0; + } + else + { + m_IsNowShortClicked = true; + } + } + else if(m_State == RELEASED && pinState) + { + m_State = PRESSED; + m_IsNowPressed = true; + } + + return m_IsNowHolded | (prevState != m_State); + } + + bool IsNowClicked() + { + return m_IsNowClicked; + } + + bool IsNowPressed() + { + return m_IsNowPressed; + } + + bool IsNowReleased() + { + return m_IsNowReleased; + } + + bool IsHolded() + { + return m_IsNowHolded; + } + + bool IsNowLongClicked() + { + return m_IsNowLongClicked; + } + + bool IsNowShortClicked() + { + return m_IsNowShortClicked; + } + + unsigned long GetPressedTime() + { + return m_PressedTime; + } + +private: + static const int CLICK_DELAY = 20; + static const int PRESSED = 1; + static const int RELEASED = 0; + int m_ButtonPin; + int m_State = RELEASED; + unsigned long m_PrevTimeMS = 0; + unsigned long m_PressedTime = 0; + unsigned long m_LongClickTime = 250; + unsigned long m_PressDelayTime = 0; + unsigned long m_ReleaseDelayTime = 0; + bool m_IsNowClicked = false; + bool m_IsNowPressed = false; + bool m_IsNowReleased = false; + bool m_IsNowHolded = false; + bool m_IsNowShortClicked = false; + bool m_IsNowLongClicked = false; + + void clearClicks() + { + m_IsNowClicked = false; + m_IsNowPressed = false; + m_IsNowReleased = false; + m_IsNowReleased = false; + m_IsNowHolded = false; + m_IsNowShortClicked = false; + m_IsNowLongClicked = false; + } +}; + +#endif \ No newline at end of file