joystick-api.rst 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. .. _joystick-api:
  2. =====================
  3. Programming Interface
  4. =====================
  5. :Author: Ragnar Hojland Espinosa <ragnar@macula.net> - 7 Aug 1998
  6. Introduction
  7. ============
  8. .. important::
  9. This document describes legacy ``js`` interface. Newer clients are
  10. encouraged to switch to the generic event (``evdev``) interface.
  11. The 1.0 driver uses a new, event based approach to the joystick driver.
  12. Instead of the user program polling for the joystick values, the joystick
  13. driver now reports only any changes of its state. See joystick-api.txt,
  14. joystick.h and jstest.c included in the joystick package for more
  15. information. The joystick device can be used in either blocking or
  16. nonblocking mode, and supports select() calls.
  17. For backward compatibility the old (v0.x) interface is still included.
  18. Any call to the joystick driver using the old interface will return values
  19. that are compatible to the old interface. This interface is still limited
  20. to 2 axes, and applications using it usually decode only 2 buttons, although
  21. the driver provides up to 32.
  22. Initialization
  23. ==============
  24. Open the joystick device following the usual semantics (that is, with open).
  25. Since the driver now reports events instead of polling for changes,
  26. immediately after the open it will issue a series of synthetic events
  27. (JS_EVENT_INIT) that you can read to obtain the initial state of the
  28. joystick.
  29. By default, the device is opened in blocking mode::
  30. int fd = open ("/dev/input/js0", O_RDONLY);
  31. Event Reading
  32. =============
  33. ::
  34. struct js_event e;
  35. read (fd, &e, sizeof(e));
  36. where js_event is defined as::
  37. struct js_event {
  38. __u32 time; /* event timestamp in milliseconds */
  39. __s16 value; /* value */
  40. __u8 type; /* event type */
  41. __u8 number; /* axis/button number */
  42. };
  43. If the read is successful, it will return sizeof(e), unless you wanted to read
  44. more than one event per read as described in section 3.1.
  45. js_event.type
  46. -------------
  47. The possible values of ``type`` are::
  48. #define JS_EVENT_BUTTON 0x01 /* button pressed/released */
  49. #define JS_EVENT_AXIS 0x02 /* joystick moved */
  50. #define JS_EVENT_INIT 0x80 /* initial state of device */
  51. As mentioned above, the driver will issue synthetic JS_EVENT_INIT ORed
  52. events on open. That is, if it's issuing a INIT BUTTON event, the
  53. current type value will be::
  54. int type = JS_EVENT_BUTTON | JS_EVENT_INIT; /* 0x81 */
  55. If you choose not to differentiate between synthetic or real events
  56. you can turn off the JS_EVENT_INIT bits::
  57. type &= ~JS_EVENT_INIT; /* 0x01 */
  58. js_event.number
  59. ---------------
  60. The values of ``number`` correspond to the axis or button that
  61. generated the event. Note that they carry separate numeration (that
  62. is, you have both an axis 0 and a button 0). Generally,
  63. =============== =======
  64. Axis number
  65. =============== =======
  66. 1st Axis X 0
  67. 1st Axis Y 1
  68. 2nd Axis X 2
  69. 2nd Axis Y 3
  70. ...and so on
  71. =============== =======
  72. Hats vary from one joystick type to another. Some can be moved in 8
  73. directions, some only in 4, The driver, however, always reports a hat as two
  74. independent axis, even if the hardware doesn't allow independent movement.
  75. js_event.value
  76. --------------
  77. For an axis, ``value`` is a signed integer between -32767 and +32767
  78. representing the position of the joystick along that axis. If you
  79. don't read a 0 when the joystick is ``dead``, or if it doesn't span the
  80. full range, you should recalibrate it (with, for example, jscal).
  81. For a button, ``value`` for a press button event is 1 and for a release
  82. button event is 0.
  83. Though this::
  84. if (js_event.type == JS_EVENT_BUTTON) {
  85. buttons_state ^= (1 << js_event.number);
  86. }
  87. may work well if you handle JS_EVENT_INIT events separately,
  88. ::
  89. if ((js_event.type & ~JS_EVENT_INIT) == JS_EVENT_BUTTON) {
  90. if (js_event.value)
  91. buttons_state |= (1 << js_event.number);
  92. else
  93. buttons_state &= ~(1 << js_event.number);
  94. }
  95. is much safer since it can't lose sync with the driver. As you would
  96. have to write a separate handler for JS_EVENT_INIT events in the first
  97. snippet, this ends up being shorter.
  98. js_event.time
  99. -------------
  100. The time an event was generated is stored in ``js_event.time``. It's a time
  101. in milliseconds since ... well, since sometime in the past. This eases the
  102. task of detecting double clicks, figuring out if movement of axis and button
  103. presses happened at the same time, and similar.
  104. Reading
  105. =======
  106. If you open the device in blocking mode, a read will block (that is,
  107. wait) forever until an event is generated and effectively read. There
  108. are two alternatives if you can't afford to wait forever (which is,
  109. admittedly, a long time;)
  110. a) use select to wait until there's data to be read on fd, or
  111. until it timeouts. There's a good example on the select(2)
  112. man page.
  113. b) open the device in non-blocking mode (O_NONBLOCK)
  114. O_NONBLOCK
  115. ----------
  116. If read returns -1 when reading in O_NONBLOCK mode, this isn't
  117. necessarily a "real" error (check errno(3)); it can just mean there
  118. are no events pending to be read on the driver queue. You should read
  119. all events on the queue (that is, until you get a -1).
  120. For example,
  121. ::
  122. while (1) {
  123. while (read (fd, &e, sizeof(e)) > 0) {
  124. process_event (e);
  125. }
  126. /* EAGAIN is returned when the queue is empty */
  127. if (errno != EAGAIN) {
  128. /* error */
  129. }
  130. /* do something interesting with processed events */
  131. }
  132. One reason for emptying the queue is that if it gets full you'll start
  133. missing events since the queue is finite, and older events will get
  134. overwritten.
  135. The other reason is that you want to know all what happened, and not
  136. delay the processing till later.
  137. Why can get the queue full? Because you don't empty the queue as
  138. mentioned, or because too much time elapses from one read to another
  139. and too many events to store in the queue get generated. Note that
  140. high system load may contribute to space those reads even more.
  141. If time between reads is enough to fill the queue and lose an event,
  142. the driver will switch to startup mode and next time you read it,
  143. synthetic events (JS_EVENT_INIT) will be generated to inform you of
  144. the actual state of the joystick.
  145. .. note::
  146. As of version 1.2.8, the queue is circular and able to hold 64
  147. events. You can increment this size bumping up JS_BUFF_SIZE in
  148. joystick.h and recompiling the driver.
  149. In the above code, you might as well want to read more than one event
  150. at a time using the typical read(2) functionality. For that, you would
  151. replace the read above with something like::
  152. struct js_event mybuffer[0xff];
  153. int i = read (fd, mybuffer, sizeof(mybuffer));
  154. In this case, read would return -1 if the queue was empty, or some
  155. other value in which the number of events read would be i /
  156. sizeof(js_event) Again, if the buffer was full, it's a good idea to
  157. process the events and keep reading it until you empty the driver queue.
  158. IOCTLs
  159. ======
  160. The joystick driver defines the following ioctl(2) operations::
  161. /* function 3rd arg */
  162. #define JSIOCGAXES /* get number of axes char */
  163. #define JSIOCGBUTTONS /* get number of buttons char */
  164. #define JSIOCGVERSION /* get driver version int */
  165. #define JSIOCGNAME(len) /* get identifier string char */
  166. #define JSIOCSCORR /* set correction values &js_corr */
  167. #define JSIOCGCORR /* get correction values &js_corr */
  168. For example, to read the number of axes::
  169. char number_of_axes;
  170. ioctl (fd, JSIOCGAXES, &number_of_axes);
  171. JSIOGCVERSION
  172. -------------
  173. JSIOGCVERSION is a good way to check in run-time whether the running
  174. driver is 1.0+ and supports the event interface. If it is not, the
  175. IOCTL will fail. For a compile-time decision, you can test the
  176. JS_VERSION symbol::
  177. #ifdef JS_VERSION
  178. #if JS_VERSION > 0xsomething
  179. JSIOCGNAME
  180. ----------
  181. JSIOCGNAME(len) allows you to get the name string of the joystick - the same
  182. as is being printed at boot time. The 'len' argument is the length of the
  183. buffer provided by the application asking for the name. It is used to avoid
  184. possible overrun should the name be too long::
  185. char name[128];
  186. if (ioctl(fd, JSIOCGNAME(sizeof(name)), name) < 0)
  187. strncpy(name, "Unknown", sizeof(name));
  188. printf("Name: %s\n", name);
  189. JSIOC[SG]CORR
  190. -------------
  191. For usage on JSIOC[SG]CORR I suggest you to look into jscal.c They are
  192. not needed in a normal program, only in joystick calibration software
  193. such as jscal or kcmjoy. These IOCTLs and data types aren't considered
  194. to be in the stable part of the API, and therefore may change without
  195. warning in following releases of the driver.
  196. Both JSIOCSCORR and JSIOCGCORR expect &js_corr to be able to hold
  197. information for all axis. That is, struct js_corr corr[MAX_AXIS];
  198. struct js_corr is defined as::
  199. struct js_corr {
  200. __s32 coef[8];
  201. __u16 prec;
  202. __u16 type;
  203. };
  204. and ``type``::
  205. #define JS_CORR_NONE 0x00 /* returns raw values */
  206. #define JS_CORR_BROKEN 0x01 /* broken line */
  207. Backward compatibility
  208. ======================
  209. The 0.x joystick driver API is quite limited and its usage is deprecated.
  210. The driver offers backward compatibility, though. Here's a quick summary::
  211. struct JS_DATA_TYPE js;
  212. while (1) {
  213. if (read (fd, &js, JS_RETURN) != JS_RETURN) {
  214. /* error */
  215. }
  216. usleep (1000);
  217. }
  218. As you can figure out from the example, the read returns immediately,
  219. with the actual state of the joystick::
  220. struct JS_DATA_TYPE {
  221. int buttons; /* immediate button state */
  222. int x; /* immediate x axis value */
  223. int y; /* immediate y axis value */
  224. };
  225. and JS_RETURN is defined as::
  226. #define JS_RETURN sizeof(struct JS_DATA_TYPE)
  227. To test the state of the buttons,
  228. ::
  229. first_button_state = js.buttons & 1;
  230. second_button_state = js.buttons & 2;
  231. The axis values do not have a defined range in the original 0.x driver,
  232. except for that the values are non-negative. The 1.2.8+ drivers use a
  233. fixed range for reporting the values, 1 being the minimum, 128 the
  234. center, and 255 maximum value.
  235. The v0.8.0.2 driver also had an interface for 'digital joysticks', (now
  236. called Multisystem joysticks in this driver), under /dev/djsX. This driver
  237. doesn't try to be compatible with that interface.
  238. Final Notes
  239. ===========
  240. ::
  241. ____/| Comments, additions, and specially corrections are welcome.
  242. \ o.O| Documentation valid for at least version 1.2.8 of the joystick
  243. =(_)= driver and as usual, the ultimate source for documentation is
  244. U to "Use The Source Luke" or, at your convenience, Vojtech ;)