summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/modules/gamepad/gamepad.h
blob: 9bd4a0bd64a5ecd2abdc08c336eb36e0c171c23c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
 * Copyright (C) 2011, Google Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 */

#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_GAMEPAD_GAMEPAD_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_GAMEPAD_GAMEPAD_H_

#include "device/gamepad/public/cpp/gamepad.h"
#include "third_party/blink/renderer/core/dom/dom_high_res_time_stamp.h"
#include "third_party/blink/renderer/modules/gamepad/gamepad_button.h"
#include "third_party/blink/renderer/modules/gamepad/gamepad_haptic_actuator.h"
#include "third_party/blink/renderer/modules/modules_export.h"
#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
#include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
#include "third_party/blink/renderer/platform/wtf/vector.h"

namespace blink {

class MODULES_EXPORT Gamepad final : public ScriptWrappable {
  DEFINE_WRAPPERTYPEINFO();

 public:
  // Objects implementing this interface are garbage-collected.
  class Client : public GarbageCollectedMixin {
   public:
    virtual GamepadHapticActuator* GetVibrationActuatorForGamepad(
        const Gamepad&) = 0;
    virtual ~Client() = default;
  };

  Gamepad(Client* client,
          int index,
          base::TimeTicks time_origin,
          base::TimeTicks time_floor);
  ~Gamepad() override;

  void UpdateFromDeviceState(const device::Gamepad&);

  typedef Vector<double> DoubleVector;

  const String& id() const { return id_; }
  void SetId(const String& id) { id_ = id; }

  int index() const { return index_; }

  bool connected() const { return connected_; }
  void SetConnected(bool val) { connected_ = val; }

  DOMHighResTimeStamp timestamp() const { return timestamp_; }

  const String& mapping() const { return mapping_; }
  void SetMapping(device::GamepadMapping mapping);

  const DoubleVector& axes();
  void SetAxes(unsigned count, const double* data);
  bool isAxisDataDirty() const { return is_axis_data_dirty_; }

  const GamepadButtonVector& buttons();
  void SetButtons(unsigned count, const device::GamepadButton* data);
  bool isButtonDataDirty() const { return is_button_data_dirty_; }

  GamepadHapticActuator* vibrationActuator() const;
  void SetVibrationActuatorInfo(const device::GamepadHapticActuator&);
  bool HasVibrationActuator() const { return has_vibration_actuator_; }
  device::GamepadHapticActuatorType GetVibrationActuatorType() const {
    return vibration_actuator_type_;
  }

  void Trace(Visitor*) override;

 private:
  void SetTimestamp(const device::Gamepad& device_gamepad);

  Member<Client> client_;

  // A string identifying the gamepad model.
  String id_;

  // The index of this gamepad within the GamepadList.
  const int index_;

  // True if this gamepad was still connected when gamepad state was captured.
  bool connected_;

  // The current time when the gamepad state was captured.
  DOMHighResTimeStamp timestamp_;

  // A string indicating whether the standard mapping is in use.
  String mapping_;

  // Snapshot of the axis state.
  DoubleVector axes_;

  // Snapshot of the button state.
  GamepadButtonVector buttons_;

  // True if the gamepad can produce haptic vibration effects.
  bool has_vibration_actuator_;

  // The type of haptic actuator used for vibration effects.
  device::GamepadHapticActuatorType vibration_actuator_type_;

  // True if the data in |axes_| has changed since the last time it was
  // accessed.
  bool is_axis_data_dirty_;

  // True if the data in |buttons_| has changed since the last time it was
  // accessed.
  bool is_button_data_dirty_;

  // Base time on which all relative timestamps are based.
  const base::TimeTicks time_origin_;

  // Minimum value to use for timestamps from the device.
  const base::TimeTicks time_floor_;
};

}  // namespace blink

#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_GAMEPAD_GAMEPAD_H_