/* * * Copyright (c) 2024 Project CHIP Authors * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #include #include #include namespace chip { namespace app { /** * State machine to emit button sequences. Configure with `SetXxx()` methods * and then call `Execute()` with a functor to be called when done. * * The implementation has dependencies on SystemLayer (to start timers) and on * EventLogging. * */ class ButtonEventsSimulator { public: enum class Mode { kModeLongPress, kModeMultiPress, kModeMultiPressNonAs }; using DoneCallback = std::function; ButtonEventsSimulator() = default; // Returns true on success to start execution, false on something going awry. // `doneCallback` is called only if execution got started. bool Execute(DoneCallback && doneCallback); ButtonEventsSimulator & SetLongPressDelayMillis(System::Clock::Milliseconds32 longPressDelayMillis) { mLongPressDelayMillis = longPressDelayMillis; return *this; } ButtonEventsSimulator & SetLongPressDurationMillis(System::Clock::Milliseconds32 longPressDurationMillis) { mLongPressDurationMillis = longPressDurationMillis; return *this; } ButtonEventsSimulator & SetMultiPressPressedTimeMillis(System::Clock::Milliseconds32 multiPressPressedTimeMillis) { mMultiPressPressedTimeMillis = multiPressPressedTimeMillis; return *this; } ButtonEventsSimulator & SetMultiPressReleasedTimeMillis(System::Clock::Milliseconds32 multiPressReleasedTimeMillis) { mMultiPressReleasedTimeMillis = multiPressReleasedTimeMillis; return *this; } ButtonEventsSimulator & SetMultiPressNumPresses(uint8_t multiPressNumPresses) { mMultiPressNumPresses = multiPressNumPresses; return *this; } ButtonEventsSimulator & SetIdleButtonId(uint8_t idleButtonId) { mIdleButtonId = idleButtonId; return *this; } ButtonEventsSimulator & SetPressedButtonId(uint8_t pressedButtonId) { mPressedButtonId = pressedButtonId; return *this; } ButtonEventsSimulator & SetMode(Mode mode) { mMode = mode; return *this; } ButtonEventsSimulator & SetEndpointId(EndpointId endpointId) { mEndpointId = endpointId; return *this; } ButtonEventsSimulator & SetFeatureMap(uint32_t featureMap) { mFeatureMap = featureMap; return *this; } ButtonEventsSimulator & SetMultiPressMax(uint8_t multiPressMax) { mMultiPressMax = multiPressMax; return *this; } private: enum class State { kIdle = 0, kEmitStartOfLongPress = 1, kEmitLongPress = 2, kEmitLongRelease = 3, kEmitStartOfMultiPress = 4, kEmitEndOfMultiPress = 5, kMultiPressButtonRelease = 6, }; static void OnTimerDone(System::Layer * layer, void * appState); void SetState(State newState); void Next(); void StartTimer(System::Clock::Timeout duration); DoneCallback mDoneCallback; System::Clock::Milliseconds32 mLongPressDelayMillis{}; System::Clock::Milliseconds32 mLongPressDurationMillis{}; System::Clock::Milliseconds32 mMultiPressPressedTimeMillis{}; System::Clock::Milliseconds32 mMultiPressReleasedTimeMillis{}; uint8_t mMultiPressNumPresses{ 1 }; uint8_t mMultiPressPressesDone{ 0 }; uint8_t mIdleButtonId{ 0 }; uint8_t mPressedButtonId{ 1 }; EndpointId mEndpointId{ 1 }; uint32_t mFeatureMap{ 0 }; uint8_t mMultiPressMax{ 0 }; Mode mMode{ Mode::kModeLongPress }; State mState{ State::kIdle }; }; } // namespace app } // namespace chip