// Copyright 2019 The Fuchsia 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 SRC_UI_INPUT_DRIVERS_VIRTIO_INPUT_TOUCH_H_
#define SRC_UI_INPUT_DRIVERS_VIRTIO_INPUT_TOUCH_H_

#include "input_device.h"

namespace virtio {

static constexpr int kMaxTouchPoints = 5;
struct TouchReport {
  zx::time event_time = zx::time(ZX_TIME_INFINITE_PAST);
  struct Contact {
    bool exists = false;
    int64_t x = 0;
    int64_t y = 0;
  };
  std::array<Contact, kMaxTouchPoints> contacts = {};

  void ToFidlInputReport(
      fidl::WireTableBuilder<::fuchsia_input_report::wire::InputReport>& input_report,
      fidl::AnyArena& allocator);
};

// The HidTouch class translates virtio touchscreen events into HID touchscreen events. It does this
// by making the virtio touchscreen appear exactly like a Google Pixelbook (Eve) touchscreen. There
// is no good reason to use the Google Pixelbook (Eve) touchscreen, other than it is a valid, tested
// report descriptor and it was easier to reuse it than building a new report descriptor from
// scratch.
class HidTouch : public HidDevice<TouchReport> {
 public:
  HidTouch(virtio_input_absinfo_t x_info, virtio_input_absinfo_t y_info)
      : x_info_(x_info), y_info_(y_info) {}

  fuchsia_input_report::wire::DeviceDescriptor GetDescriptor(fidl::AnyArena& allocator) override;
  void ReceiveEvent(virtio_input_event_t* event) override;

  // These numbers are used by the touch descriptor of the Google Pixelbook (Eve) touchscreen. We
  // use these physical sizes to emulate a real touch device on the emulator.
  static constexpr int64_t kXPhysicalMaxMicrometer = 259200;
  static constexpr int64_t kYPhysicalMaxMicrometer = 172800;

 private:
  virtio_input_absinfo_t x_info_;
  virtio_input_absinfo_t y_info_;
  // The index of the current finger that the driver is processing.
  // Must be [0..kMaxTouchPoints - 1] for a valid finger or -1 when no finger is being processed.
  int active_finger_index_ = -1;
};

}  // namespace virtio

#endif  // SRC_UI_INPUT_DRIVERS_VIRTIO_INPUT_TOUCH_H_
