| // Copyright 2016 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef TOUCH_KEYBOARD_STATEMACHINE_STATEMACHINE_H_ |
| #define TOUCH_KEYBOARD_STATEMACHINE_STATEMACHINE_H_ |
| |
| #include <linux/input.h> |
| #include <stdio.h> |
| #include <unordered_map> |
| #include <vector> |
| |
| #include "touch_keyboard/statemachine/slot.h" |
| |
| namespace mtstatemachine { |
| |
| constexpr int kNumSlots = 10; |
| |
| // The information reported by a state machine for a single finger |
| struct MtFinger { |
| int x, y; |
| int p; |
| int touch_major; |
| }; |
| |
| class MtStateMachine { |
| /* Multi-touch State Machine |
| * |
| * This class implements a multitouch state machine and interprets the |
| * individual touch kernel events in a manageable way. To use a state machine |
| * instantiate a new MtStateMachine object at the beginning of your program |
| * and then continually call AddEvent() to pass the new touch kernel events |
| * for processing. AddEvent() will return 'true' at the end of an entire |
| * frame (SYN event) and then the snapshot map you passed will be populated |
| * and ready for use. The snapshot is a mapping from tracking IDs to finger |
| * data at the time of the SYN event. |
| */ |
| public: |
| MtStateMachine(): slot_(0) {} |
| |
| // Consume an input event and update the internal state. If this was a SYN |
| // (which means it's the end of a full update) populate out_snapshot with |
| // the current state and return true. Otherwise leave out_snapshot unchanged |
| // and return false to indicate there is still more events on the way. |
| bool AddEvent(struct input_event const &ev, |
| std::unordered_map<int, struct MtFinger> *out_snapshot); |
| |
| int slot_; |
| Slot slots_[kNumSlots]; |
| |
| private: |
| // Populate out_snapshot with the current state of the MtStateMachine. |
| void FillSnapshot(std::unordered_map<int, struct MtFinger> *out_snapshot); |
| }; |
| |
| } // namespace mtstatemachine |
| |
| #endif // TOUCH_KEYBOARD_STATEMACHINE_STATEMACHINE_H_ |