Home | History | Annotate | Download | only in evdev
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef UI_EVENTS_OZONE_EVDEV_TOUCH_EVENT_CONVERTER_EVDEV_H_
      6 #define UI_EVENTS_OZONE_EVDEV_TOUCH_EVENT_CONVERTER_EVDEV_H_
      7 
      8 #include <bitset>
      9 
     10 #include "base/compiler_specific.h"
     11 #include "base/files/file_path.h"
     12 #include "base/message_loop/message_pump_libevent.h"
     13 #include "ui/events/event_constants.h"
     14 #include "ui/events/ozone/evdev/event_converter_evdev.h"
     15 #include "ui/events/ozone/evdev/event_device_info.h"
     16 #include "ui/events/ozone/evdev/events_ozone_evdev_export.h"
     17 
     18 namespace ui {
     19 
     20 class TouchEvent;
     21 
     22 class EVENTS_OZONE_EVDEV_EXPORT TouchEventConverterEvdev
     23     : public EventConverterEvdev,
     24       public base::MessagePumpLibevent::Watcher {
     25  public:
     26   enum {
     27     MAX_FINGERS = 11
     28   };
     29   TouchEventConverterEvdev(int fd,
     30                            base::FilePath path,
     31                            const EventDeviceInfo& info,
     32                            const EventDispatchCallback& dispatch);
     33   virtual ~TouchEventConverterEvdev();
     34 
     35   // Start & stop watching for events.
     36   virtual void Start() OVERRIDE;
     37   virtual void Stop() OVERRIDE;
     38 
     39  private:
     40   friend class MockTouchEventConverterEvdev;
     41 
     42   // Unsafe part of initialization.
     43   void Init(const EventDeviceInfo& info);
     44 
     45   // Overidden from base::MessagePumpLibevent::Watcher.
     46   virtual void OnFileCanReadWithoutBlocking(int fd) OVERRIDE;
     47   virtual void OnFileCanWriteWithoutBlocking(int fd) OVERRIDE;
     48 
     49   virtual bool Reinitialize();
     50 
     51   void ProcessInputEvent(const input_event& input);
     52   void ProcessAbs(const input_event& input);
     53   void ProcessSyn(const input_event& input);
     54 
     55   void ReportEvents(base::TimeDelta delta);
     56 
     57   // Set if we have seen a SYN_DROPPED and not yet re-synced with the device.
     58   bool syn_dropped_;
     59 
     60   // Set if this is a type A device (uses SYN_MT_REPORT).
     61   bool is_type_a_;
     62 
     63   // Pressure values.
     64   int pressure_min_;
     65   int pressure_max_;  // Used to normalize pressure values.
     66 
     67   // Input range for x-axis.
     68   float x_min_tuxels_;
     69   float x_num_tuxels_;
     70 
     71   // Input range for y-axis.
     72   float y_min_tuxels_;
     73   float y_num_tuxels_;
     74 
     75   // Output range for x-axis.
     76   float x_min_pixels_;
     77   float x_num_pixels_;
     78 
     79   // Output range for y-axis.
     80   float y_min_pixels_;
     81   float y_num_pixels_;
     82 
     83   // Touch point currently being updated from the /dev/input/event* stream.
     84   int current_slot_;
     85 
     86   // File descriptor for the /dev/input/event* instance.
     87   int fd_;
     88 
     89   // Path to input device.
     90   base::FilePath path_;
     91 
     92   // Bit field tracking which in-progress touch points have been modified
     93   // without a syn event.
     94   std::bitset<MAX_FINGERS> altered_slots_;
     95 
     96   struct InProgressEvents {
     97     float x_;
     98     float y_;
     99     int id_;  // Device reported "unique" touch point id; -1 means not active
    100     int finger_;  // "Finger" id starting from 0; -1 means not active
    101 
    102     EventType type_;
    103     int major_;
    104     float pressure_;
    105   };
    106 
    107   // In-progress touch points.
    108   InProgressEvents events_[MAX_FINGERS];
    109 
    110   // Controller for watching the input fd.
    111   base::MessagePumpLibevent::FileDescriptorWatcher controller_;
    112 
    113   DISALLOW_COPY_AND_ASSIGN(TouchEventConverterEvdev);
    114 };
    115 
    116 }  // namespace ui
    117 
    118 #endif  // UI_EVENTS_OZONE_EVDEV_TOUCH_EVENT_CONVERTER_EVDEV_H_
    119