blob: 02439cc1ebdb704dbd38dce41696d07f8afed3b5 [file] [log] [blame]
// 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_FAKETOUCHPAD_H_
#define TOUCH_KEYBOARD_FAKETOUCHPAD_H_
#include <string>
#include <vector>
#include "touch_keyboard/evdevsource.h"
#include "touch_keyboard/statemachine/statemachine.h"
#include "touch_keyboard/uinputdevice.h"
namespace touch_keyboard {
constexpr int kInvertY = 0x01;
constexpr int kInvertX = 0x02;
class FakeTouchpad : public UinputDevice, public EvdevSource {
/* Generate a "fake" touchpad device that pulls it's touch events from a sub-
* region of a larger touch sensor.
*
* This class collects evdev events from one touch sensor and creates a
* similar device with udev, then pipes events from a certain area through.
* It also handles various bookkeeping with respect to which fingers are
* within the "touchpad" region. In essence, you initialize one of these
* objects with a source device and the area you want to treat as a touchpad.
* Then, when you run Start() it sets up the devices and will block forever
* passing though the appropriate events and modifying them to maintain the
* illusion of a normal touchpad.
*/
public:
FakeTouchpad(int xmin, int xmax, int ymin, int ymax,
unsigned char axis_inversion_flags);
void Start(std::string const &source_device_path,
std::string const &touchpad_device_name);
private:
// Loop forever consuming events from the source and emitting them from the
// fake touchpad -- the main workhorse function that Start() calls.
void Consume();
// Send button events indicating how many fingers are currently on the fake
// touchpad.
void SendTouchpadBtnEvents(int touch_count) const;
// Test to see if the finger who's data is stored in the slot is currently
// within the region defined as the touchpad.
bool Contains(mtstatemachine::Slot const &slot) const;
// Check the state of the input touch and sync the fake touchpad by passing
// through any new updates.
int SyncTouchEvents();
// Used by SyncTouchEvents, this function blindly duplicates the state stored
// in the slot for the fake touchpad by replicating events for each value.
bool PassEventsThrough(mtstatemachine::Slot const &slot) const;
// These member variables store the ranges of x/y coordinates that make up
// the "touchpad" area on the source input device.
int xmin_, xmax_, ymin_, ymax_;
// These flags indicate which, if any, axes should be inverted.
bool invertx_, inverty_;
// Every FakeTouchpad needs a state machine to interpret incoming events, it
// is defined and created here as a member of each object.
mtstatemachine::MtStateMachine sm_;
// Here we store a mapping that determines which slots are in the touchpad
// region or not currently.
std::vector<bool> slot_memberships_;
DISALLOW_COPY_AND_ASSIGN(FakeTouchpad);
};
} // namespace touch_keyboard
#endif // TOUCH_KEYBOARD_FAKETOUCHPAD_H_