1// Copyright (C) 2011, Google Inc. All rights reserved.
2//
3// Redistribution and use in source and binary forms, with or without
4// modification, are permitted provided that the following conditions are met:
5//
6// 1. Redistributions of source code must retain the above copyright
7//    notice, this list of conditions and the following disclaimer.
8// 2. Redistributions in binary form must reproduce the above copyright
9//    notice, this list of conditions and the following disclaimer in the
10//    documentation and/or other materials provided with the distribution.
11//
12// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
13// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
15// ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
16// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
17// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
18// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
19// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
20// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
21// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
22// DAMAGE.
23
24#ifndef WebGamepad_h
25#define WebGamepad_h
26
27#include "WebCommon.h"
28
29#if BLINK_IMPLEMENTATION
30#include "wtf/Assertions.h"
31#endif
32
33namespace blink {
34
35#pragma pack(push, 1)
36
37class WebGamepadButton {
38public:
39    WebGamepadButton()
40        : pressed(false)
41        , value(0.)
42    {
43    }
44    WebGamepadButton(bool pressed, double value)
45        : pressed(pressed)
46        , value(value)
47    {
48    }
49    bool pressed;
50    double value;
51};
52
53// This structure is intentionally POD and fixed size so that it can be shared
54// memory between hardware polling threads and the rest of the browser. See
55// also WebGamepads.h.
56class WebGamepad {
57public:
58    static const size_t idLengthCap = 128;
59    static const size_t mappingLengthCap = 16;
60    static const size_t axesLengthCap = 16;
61    static const size_t buttonsLengthCap = 32;
62
63    WebGamepad()
64        : connected(false)
65        , timestamp(0)
66        , axesLength(0)
67        , buttonsLength(0)
68    {
69        id[0] = 0;
70        mapping[0] = 0;
71    }
72
73    // Is there a gamepad connected at this index?
74    bool connected;
75
76    // Device identifier (based on manufacturer, model, etc.).
77    WebUChar id[idLengthCap];
78
79    // Monotonically increasing value referring to when the data were last
80    // updated.
81    unsigned long long timestamp;
82
83    // Number of valid entries in the axes array.
84    unsigned axesLength;
85
86    // Normalized values representing axes, in the range [-1..1].
87    double axes[axesLengthCap];
88
89    // Number of valid entries in the buttons array.
90    unsigned buttonsLength;
91
92    // Button states
93    WebGamepadButton buttons[buttonsLengthCap];
94
95    // Mapping type (for example "standard")
96    WebUChar mapping[mappingLengthCap];
97};
98
99#if BLINK_IMPLEMENTATION
100COMPILE_ASSERT(sizeof(WebGamepad) == 721, WebGamepad_has_wrong_size);
101#endif
102
103#pragma pack(pop)
104
105}
106
107#endif // WebGamepad_h
108