From f9a1caa8ebccaaa0d5f142c6c6270323e804f2ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 23 May 2017 10:44:30 +0200 Subject: [PATCH] [ion] Add a class State in Keyboard Change-Id: I42b2c892deaedc83a7629d8c8be66cd4e1fbcb5c --- apps/apps_container.cpp | 2 +- .../keyboard_test_controller.cpp | 3 +-- ion/Makefile | 1 + ion/include/ion/keyboard.h | 22 ++++++++++++++----- ion/src/device/bench/command/keyboard.cpp | 2 +- ion/src/device/keyboard.cpp | 4 ++-- ion/src/device/power.cpp | 4 ++-- ion/src/shared/events_keyboard.cpp | 6 ++--- ion/test/keyboard.cpp | 14 ++++++++++++ 9 files changed, 42 insertions(+), 16 deletions(-) create mode 100644 ion/test/keyboard.cpp diff --git a/apps/apps_container.cpp b/apps/apps_container.cpp index e01d26fc6..053915c01 100644 --- a/apps/apps_container.cpp +++ b/apps/apps_container.cpp @@ -39,7 +39,7 @@ AppsContainer::AppsContainer() : bool AppsContainer::poincareCircuitBreaker(const Poincare::Expression * e) { Ion::Keyboard::State state = Ion::Keyboard::scan(); - return Ion::Keyboard::keyDown(Ion::Keyboard::Key::A6, state); + return state.keyDown(Ion::Keyboard::Key::A6); } int AppsContainer::numberOfApps() { diff --git a/apps/hardware_test/keyboard_test_controller.cpp b/apps/hardware_test/keyboard_test_controller.cpp index ebb603b02..6ac28f9ee 100644 --- a/apps/hardware_test/keyboard_test_controller.cpp +++ b/apps/hardware_test/keyboard_test_controller.cpp @@ -30,8 +30,7 @@ bool KeyboardTestController::handleEvent(Ion::Events::Event event) { m_LEDColorIndex = 0; } updateBatteryState(Ion::Battery::voltage(), Ion::Battery::isCharging()); - int shift = (uint8_t)Ion::Keyboard::ValidKeys[m_view.keyboardView()->testedKeyIndex()]; - Ion::Keyboard::State onlyKeyDown = (uint64_t)1 << shift; + Ion::Keyboard::State onlyKeyDown = Ion::Keyboard::State(Ion::Keyboard::ValidKeys[m_view.keyboardView()->testedKeyIndex()]); if (state == onlyKeyDown) { m_view.keyboardView()->setTestedKeyIndex(m_view.keyboardView()->testedKeyIndex()+1); if (m_view.keyboardView()->testedKeyIndex() == Ion::Keyboard::NumberOfValidKeys) { diff --git a/ion/Makefile b/ion/Makefile index e0bc162ec..7790d6c7c 100644 --- a/ion/Makefile +++ b/ion/Makefile @@ -18,4 +18,5 @@ objs += $(addprefix ion/src/shared/, \ tests += $(addprefix ion/test/,\ crc32.cpp\ events.cpp\ + keyboard.cpp\ ) diff --git a/ion/include/ion/keyboard.h b/ion/include/ion/keyboard.h index 0dc7aebfc..47339cb06 100644 --- a/ion/include/ion/keyboard.h +++ b/ion/include/ion/keyboard.h @@ -31,15 +31,27 @@ constexpr Key ValidKeys[] = { constexpr int NumberOfKeys = 54; constexpr int NumberOfValidKeys = 46; -typedef uint64_t State; -static_assert(sizeof(State)*8>NumberOfKeys, "Ion::Keyboard::State cannot hold a keyboard snapshot"); +class State { +public: + constexpr State(uint64_t s = 0) : + m_bitField(s) + {} + explicit constexpr State(Key k) : + m_bitField((uint64_t)1 << (uint8_t)k) + {} + inline bool keyDown(Key k) const { + return (m_bitField>>(uint8_t)k) & 1; + } + operator uint64_t() const { return m_bitField; } +private: + uint64_t m_bitField; +}; State scan(); -inline bool keyDown(Key k, State s) { - return (s>>(uint8_t)k) & 1; -} +static_assert(sizeof(State)*8>NumberOfKeys, "Ion::Keyboard::State cannot hold a keyboard snapshot"); + } } diff --git a/ion/src/device/bench/command/keyboard.cpp b/ion/src/device/bench/command/keyboard.cpp index d375c97d5..4895d625f 100644 --- a/ion/src/device/bench/command/keyboard.cpp +++ b/ion/src/device/bench/command/keyboard.cpp @@ -14,7 +14,7 @@ void Keyboard(const char * input) { char result[9+Ion::Keyboard::NumberOfKeys+1] = { 'K', 'E', 'Y', 'B', 'O', 'A', 'R', 'D', '=' }; Ion::Keyboard::State state = Ion::Keyboard::scan(); for (uint8_t i=0; i delayBeforeRepeat); assert(*timeout > delayBetweenRepeat); int time = 0; - Keyboard::State keysSeenUp = 0; - Keyboard::State keysSeenTransitionningFromUpToDown = 0; + uint64_t keysSeenUp = 0; + uint64_t keysSeenTransitionningFromUpToDown = 0; while (true) { Keyboard::State state = Keyboard::scan(); keysSeenUp |= ~state; diff --git a/ion/test/keyboard.cpp b/ion/test/keyboard.cpp new file mode 100644 index 000000000..95657e280 --- /dev/null +++ b/ion/test/keyboard.cpp @@ -0,0 +1,14 @@ +#include +#include +#include + +using namespace Ion::Keyboard; + +QUIZ_CASE(ion_keyboard) { + for (Key k : ValidKeys) { + for (Key l : ValidKeys) { + assert(State(k).keyDown(l) == (k == l)); + } + } +} +