summaryrefslogtreecommitdiff
path: root/nuttx/include/nuttx/input/djoystick.h
blob: c973936b73efbff17b39998cbd76c0676dd635cf (plain) (blame)
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
/****************************************************************************
 * include/nuttx/input/djoystick.h
 *
 *   Copyright (C) 2014 Gregory Nutt. All rights reserved.
 *   Author: Gregory Nutt <gnutt@nuttx.org>
 *
 * 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.
 * 3. Neither the name NuttX nor the names of its contributors may be
 *    used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE
 * COPYRIGHT OWNER OR 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.
 *
 ****************************************************************************/

/* This header file provides definition for a standard discrete joystick
 * interface.  A discrete joystick refers to a joystick that could be
 * implemented entirely with GPIO input pins.  So up, down, left, and right
 * are all discrete values like buttons (as opposed to integer values like
 * you might obtain from an analog joystick).
 *
 * The discrete joystick driver exports a standard character driver
 * interface. By convention, the discrete joystick is registered as an input
 * device at /dev/djoyN where N uniquely identifies the driver instance.
 *
 * This header file documents the generic interface that all NuttX discrete
 * joystick devices must conform.  It adds standards and conventions on top
 * of the standard character driver interface.
 */

#ifndef __INCLUDE_NUTTX_INPUT_DJOYSTICK_H
#define __INCLUDE_NUTTX_INPUT_DJOYSTICK_H

/****************************************************************************
 * Included Files
 ****************************************************************************/

#include <nuttx/config.h>
#include <nuttx/fs/ioctl.h>

/****************************************************************************
 * Pre-Processor Definitions
 ****************************************************************************/
/* Configuration ************************************************************/

#ifndef CONFIG_DJOYSTICK_NPOLLWAITERS
#  define CONFIG_DJOYSTICK_NPOLLWAITERS 2
#endif

/* Joystick Interface *******************************************************/
/* These definitions provide the meaning of all of the bits that may be
 * reported in the djoy_buttonset_t bitset.
 */

#define DJOY_UP             (1 << 0) /* Bit 0: True = Joystick UP */
#define DJOY_DOWN           (1 << 1) /* Bit 1: True = Joystick DOWN */
#define DJOY_LEFT           (1 << 2) /* Bit 2: True = Joystick LEFT */
#define DJOY_RIGHT          (1 << 3) /* Bit 3: True = Joystick RIGHT */
#define DJOY_BUTTON_1       (1 << 4) /* Bit 4: True = Button 1 pressed */
#define DJOY_BUTTON_2       (1 << 5) /* Bit 5: True = Button 2 pressed */
#define DJOY_BUTTON_3       (1 << 6) /* Bit 6: True = Button 3 pressed */
#define DJOY_BUTTON_3       (1 << 7) /* Bit 7: True = Button 4 pressed */
#define DJOY_BUTTONS_ALL    0xff     /* The set of all buttons */

/* IOCTL commands
 *
 * Discrete joystick drivers do not support the character driver write() or
 * seek() methods.  The remaining driver methods behave as follows:
 *
 * 1) The read() method will always return a single value of size
 *    djoy_buttonset_t represent the current state of the joystick buttons.
 * 2) The poll() method can be used to notify a client if there is a change
 *    in any of the joystick discrete inputs.  This feature, of course,
 *    depends upon interrupt GPIO support from the platform.
 * 3) The ioctl() method supports the commands documented below:
 */

/* Command:     DJOYIOC_POLLEVENTS
 * Description: Specify the set of button events that can cause a poll()
 *              to awaken.  The default is all button depressions and all
 *              button releases (all supported buttons);
 * Argument:    A read-only pointer to an instance of struct djoy_pollevents_s
 * Return:      Zero (OK) on success.  Minus one will be returned on failure
 *              with the errno value set appropriately.
 */

#define DJOYIOC_POLLEVENTS  _DJOYIOC(0x0001)

/* Command:     DJOYIOC_REGISTER
 * Description: Register to receive a signal whenever there is a change in
 *              any of the joystick discrete inputs.  This feature, of
 *              course, depends upon interrupt GPIO support from the
 *              platform.
 * Argument:    A read-only pointer to an instance of struct djoy_notify_s
 * Return:      Zero (OK) on success.  Minus one will be returned on failure
 *              with the errno value set appropriately.
 */

#define DJOYIOC_REGISTER   _DJOYIOC(0x0002)

/****************************************************************************
 * Public Types
 ****************************************************************************/
/* This type is a bit set that contains the state of all discrete joystick
 * buttons.
 */

typedef uint8_t djoy_buttonset_t;

/* A reference to this structure is provided with the DJOYIOC_POLLEVENTS IOCTL
 * command and describes the conditions under which the client would like
 * to receive notification.
 */

struct djoy_pollevents_s
{
  djoy_buttonset_t dp_press;   /* Set of button depressions to wake up the poll */
  djoy_buttonset_t dp_release; /* Set of button releases to wake up the poll */
};

/* A reference to this structure is provided with the DJOYIOC_REGISTER IOCTL
 * command and describes the conditions under which the client would like
 * to receive notification.
 */

struct djoy_notify_s
{
  djoy_buttonset_t dn_press;   /* Set of button depressions to be notified */
  djoy_buttonset_t dn_release; /* Set of button releases to be notified */
  uint8_t          dn_signo;   /* Signal number to use in the notification */
};

/* This is the type of the discrete joystick interrupt handler used with
 * the struct djoy_lowerhalf_s enable() method.
 */

typedef CODE void (*djoy_interrupt_t)
  (FAR const struct djoy_lowerhalf_s *lower, FAR void *arg);

/* The discrete joystick driver is a two-part driver:
 *
 * 1) A common upper half driver that provides the common user interface to
 *    the joystick,
 * 2) Platform-specific lower half drivers that provide the interface
 *    between the common upper half and the platform discrete inputs.
 *
 * This structure defines the interface between an instance of the lower
 * half driver and the common upper half driver.  Such an instance is
 * passed to the upper half driver when the driver is initialized, binding
 * the upper and lower halves into one driver.
 */

struct djoy_lowerhalf_s
{
  /* Return the set of buttons supported on the discrete joystick device */

  CODE djoy_buttonset_t (*dl_supported)(FAR const struct djoy_lowerhalf_s *lower);

  /* Return the current state of all discrete joystick buttons */

  CODE djoy_buttonset_t (*dl_sample)(FAR const struct djoy_lowerhalf_s *lower);

  /* Enable interrupts on the selecte set of joystick buttons.  And empty
   * set will disable all interrupts.
   */

  CODE void (*dl_enable)(FAR const struct djoy_lowerhalf_s *lower,
                         djoy_buttonset_t buttons,
                         djoy_interrupt_t handler, FAR void *arg);
};

/****************************************************************************
 * Public Data
 ****************************************************************************/

#ifdef __cplusplus
#define EXTERN extern "C"
extern "C"
{
#else
#define EXTERN extern
#endif

/****************************************************************************
 * Public Function Prototypes
 ****************************************************************************/

/****************************************************************************
 * Name: djoy_register
 *
 * Description:
 *   Bind the lower half discrete joystick driver to an instance of the
 *   upper half discrete joystick driver and register the composite character
 *   driver as the specific device.
 *
 * Input Parameters:
 *   devname - The name of the discrete joystick device to be registers.
 *     This should be a string of the form "/dev/djoyN" where N is the the
 *     minor device number.
 *   lower - An instance of the platform-specific discrete joystick lower
 *     half driver.
 *
 * Returned Values:
 *   Zero (OK) is returned on success.  Otherwise a negated errno value is
 *   returned to indicate the nature of the failure.
 *
 ****************************************************************************/

int djoy_register(FAR const char *devname,
                  FAR const struct djoy_lowerhalf_s *lower);

#undef EXTERN
#ifdef __cplusplus
}
#endif

#endif /* __INCLUDE_NUTTX_INPUT_DJOYSTICK_H */