| | |
| | |
| | |
| |
|
| | #include <algorithm> |
| | #include <atomic> |
| | #include <list> |
| | #include <mutex> |
| | #include <utility> |
| | #include "input_common/keyboard.h" |
| |
|
| | namespace InputCommon { |
| |
|
| | class KeyButton final : public Input::ButtonDevice { |
| | public: |
| | explicit KeyButton(std::atomic<bool>& status_) : status(status_) {} |
| |
|
| | ~KeyButton() override = default; |
| |
|
| | bool GetStatus() const override { |
| | return status.load(); |
| | } |
| |
|
| | friend class KeyButtonList; |
| |
|
| | private: |
| | std::atomic<bool>& status; |
| | }; |
| |
|
| | struct KeyButtonPair { |
| | explicit KeyButtonPair(int key_code_) : key_code(key_code_) {} |
| | int key_code; |
| | std::atomic<bool> status{false}; |
| | }; |
| |
|
| | class KeyButtonList { |
| | public: |
| | KeyButtonPair& AddKeyButton(int key_code) { |
| | std::lock_guard guard{mutex}; |
| | auto it = std::find_if(list.begin(), list.end(), [key_code](const KeyButtonPair& pair) { |
| | return pair.key_code == key_code; |
| | }); |
| | if (it == list.end()) { |
| | return list.emplace_back(key_code); |
| | } |
| | return *it; |
| | } |
| |
|
| | void ChangeKeyStatus(int key_code, bool pressed) { |
| | std::lock_guard guard{mutex}; |
| | for (KeyButtonPair& pair : list) { |
| | if (pair.key_code == key_code) |
| | pair.status.store(pressed); |
| | } |
| | } |
| |
|
| | void ChangeAllKeyStatus(bool pressed) { |
| | std::lock_guard guard{mutex}; |
| | for (KeyButtonPair& pair : list) { |
| | pair.status.store(pressed); |
| | } |
| | } |
| |
|
| | private: |
| | std::mutex mutex; |
| | std::list<KeyButtonPair> list; |
| | }; |
| |
|
| | Keyboard::Keyboard() : key_button_list{std::make_shared<KeyButtonList>()} {} |
| |
|
| | std::unique_ptr<Input::ButtonDevice> Keyboard::Create(const Common::ParamPackage& params) { |
| | int key_code = params.Get("code", 0); |
| | auto& pair = key_button_list->AddKeyButton(key_code); |
| | return std::make_unique<KeyButton>(pair.status); |
| | } |
| |
|
| | void Keyboard::PressKey(int key_code) { |
| | key_button_list->ChangeKeyStatus(key_code, true); |
| | } |
| |
|
| | void Keyboard::ReleaseKey(int key_code) { |
| | key_button_list->ChangeKeyStatus(key_code, false); |
| | } |
| |
|
| | void Keyboard::ReleaseAllKeys() { |
| | key_button_list->ChangeAllKeyStatus(false); |
| | } |
| |
|
| | } |
| |
|