~aleteoryx/muditaos

3a9d40922d914f64048747ad597c9176947117f8 — Tigran Soghbatyan 4 years ago 941b54b
[BH-1025] Fix deep and light click interaction

[BH-1025] Light click no longer occures after deep click
[BH-1113] Light click works shortly after deep click
1 files changed, 22 insertions(+), 13 deletions(-)

M module-bsp/board/rt1051/bellpx/bsp/switches/switches.cpp
M module-bsp/board/rt1051/bellpx/bsp/switches/switches.cpp => module-bsp/board/rt1051/bellpx/bsp/switches/switches.cpp +22 -13
@@ 67,22 67,22 @@ namespace bsp::bell_switches
      private:
        static constexpr std::chrono::milliseconds latchPressEventTimeout = 1000ms;
        cpp_freertos::MutexStandard latchFlagMutex;
        std::chrono::time_point<std::chrono::system_clock> timeOfLastLatchEvent = std::chrono::system_clock::now();
        bool pressed                                                            = false;
        bool pressed    = false;
        bool changeFlag = false;

      public:
        void setPressed()
        {
            cpp_freertos::LockGuard lock(latchFlagMutex);
            pressed              = true;
            timeOfLastLatchEvent = std::chrono::system_clock::now();
            pressed    = true;
            changeFlag = true;
        }

        void setReleased()
        {
            cpp_freertos::LockGuard lock(latchFlagMutex);
            pressed              = false;
            timeOfLastLatchEvent = std::chrono::system_clock::now();
            pressed    = false;
            changeFlag = true;
        }

        bool isPressed()


@@ 91,12 91,16 @@ namespace bsp::bell_switches
            return pressed;
        }

        bool wasJustPressed()
        bool wasMarkedChanged()
        {
            cpp_freertos::LockGuard lock(latchFlagMutex);
            auto ret = ((std::chrono::duration_cast<std::chrono::milliseconds>(
                            std::chrono::system_clock::now() - timeOfLastLatchEvent)) <= latchPressEventTimeout);
            return ret;
            return changeFlag;
        }

        void clearChangedMark()
        {
            cpp_freertos::LockGuard lock(latchFlagMutex);
            changeFlag = false;
        }

    } latchEventFlag;


@@ 163,9 167,14 @@ namespace bsp::bell_switches
        BaseType_t xHigherPriorityTaskWoken = pdFALSE;
        xTimerStop(timerState->timer, 0);

        if (!latchEventFlag.wasJustPressed() && qHandleIrq != nullptr) {
            auto val = static_cast<std::uint16_t>(timerState->notificationSource);
            xQueueSendFromISR(qHandleIrq, &val, &xHigherPriorityTaskWoken);
        if (qHandleIrq != nullptr) {
            if (latchEventFlag.wasMarkedChanged()) {
                latchEventFlag.clearChangedMark();
            }
            else {
                auto val = static_cast<std::uint16_t>(timerState->notificationSource);
                xQueueSendFromISR(qHandleIrq, &val, &xHigherPriorityTaskWoken);
            }
        }

        timerState->gpio->ClearPortInterrupts(1U << static_cast<uint32_t>(timerState->pin));