sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget-/translations/zh_CN/input/joydev/joystick-apimodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/zh_TW/input/joydev/joystick-apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/it_IT/input/joydev/joystick-apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/ja_JP/input/joydev/joystick-apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/ko_KR/input/joydev/joystick-apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/sp_SP/input/joydev/joystick-apimodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhtarget)}(h.. _joystick-api:h]h}(h]h ]h"]h$]h&]refid joystick-apiuh1hhKhhhhhG/var/lib/git/docbuild/linux/Documentation/input/joydev/joystick-api.rstubhsection)}(hhh](htitle)}(hProgramming Interfaceh]hProgramming Interface}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh field_list)}(hhh]hfield)}(hhh](h field_name)}(hAuthorh]hAuthor}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh field_body)}(h9Ragnar Hojland Espinosa - 7 Aug 1998 h]h paragraph)}(h8Ragnar Hojland Espinosa - 7 Aug 1998h](hRagnar Hojland Espinosa <}(hhhhhNhNubh reference)}(hragnar@macula.neth]hragnar@macula.net}(hhhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:ragnar@macula.netuh1hhhubh> - 7 Aug 1998}(hhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Introductionh]h Introduction}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK ubh important)}(hThis document describes legacy ``js`` interface. Newer clients are encouraged to switch to the generic event (``evdev``) interface.h]h)}(hThis document describes legacy ``js`` interface. Newer clients are encouraged to switch to the generic event (``evdev``) interface.h](hThis document describes legacy }(hj4hhhNhNubhliteral)}(h``js``h]hjs}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1j<hj4ubhI interface. Newer clients are encouraged to switch to the generic event (}(hj4hhhNhNubj=)}(h ``evdev``h]hevdev}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1j<hj4ubh ) interface.}(hj4hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hj0ubah}(h]h ]h"]h$]h&]uh1j.hjhhhhhNubh)}(hXThe 1.0 driver uses a new, event based approach to the joystick driver. Instead of the user program polling for the joystick values, the joystick driver now reports only any changes of its state. See joystick-api.txt, joystick.h and jstest.c included in the joystick package for more information. The joystick device can be used in either blocking or nonblocking mode, and supports select() calls.h]hXThe 1.0 driver uses a new, event based approach to the joystick driver. Instead of the user program polling for the joystick values, the joystick driver now reports only any changes of its state. See joystick-api.txt, joystick.h and jstest.c included in the joystick package for more information. The joystick device can be used in either blocking or nonblocking mode, and supports select() calls.}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hXFFor backward compatibility the old (v0.x) interface is still included. Any call to the joystick driver using the old interface will return values that are compatible to the old interface. This interface is still limited to 2 axes, and applications using it usually decode only 2 buttons, although the driver provides up to 32.h]hXFFor backward compatibility the old (v0.x) interface is still included. Any call to the joystick driver using the old interface will return values that are compatible to the old interface. This interface is still limited to 2 axes, and applications using it usually decode only 2 buttons, although the driver provides up to 32.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h] introductionah ]h"] introductionah$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(hInitializationh]hInitialization}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hX%Open the joystick device following the usual semantics (that is, with open). Since the driver now reports events instead of polling for changes, immediately after the open it will issue a series of synthetic events (JS_EVENT_INIT) that you can read to obtain the initial state of the joystick.h]hX%Open the joystick device following the usual semantics (that is, with open). Since the driver now reports events instead of polling for changes, immediately after the open it will issue a series of synthetic events (JS_EVENT_INIT) that you can read to obtain the initial state of the joystick.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hjhhubh)}(h3By default, the device is opened in blocking mode::h]h2By default, the device is opened in blocking mode:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK&hjhhubh literal_block)}(h+int fd = open ("/dev/input/js0", O_RDONLY);h]h+int fd = open ("/dev/input/js0", O_RDONLY);}hjsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1jhhhK(hjhhubeh}(h]initializationah ]h"]initializationah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Event Readingh]h Event Reading}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK,ubj)}(h,struct js_event e; read (fd, &e, sizeof(e));h]h,struct js_event e; read (fd, &e, sizeof(e));}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK0hjhhubh)}(hwhere js_event is defined as::h]hwhere js_event is defined as:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK3hjhhubj)}(hstruct js_event { __u32 time; /* event timestamp in milliseconds */ __s16 value; /* value */ __u8 type; /* event type */ __u8 number; /* axis/button number */ };h]hstruct js_event { __u32 time; /* event timestamp in milliseconds */ __s16 value; /* value */ __u8 type; /* event type */ __u8 number; /* axis/button number */ };}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK5hjhhubh)}(hIf the read is successful, it will return sizeof(e), unless you wanted to read more than one event per read as described in section 3.1.h]hIf the read is successful, it will return sizeof(e), unless you wanted to read more than one event per read as described in section 3.1.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhhhK\hjhhubh)}(hHats vary from one joystick type to another. Some can be moved in 8 directions, some only in 4. The driver, however, always reports a hat as two independent axes, even if the hardware doesn't allow independent movement.h]hHats vary from one joystick type to another. Some can be moved in 8 directions, some only in 4. The driver, however, always reports a hat as two independent axes, even if the hardware doesn’t allow independent movement.}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKfhjhhubeh}(h]js-event-numberah ]h"]js_event.numberah$]h&]uh1hhjhhhhhKVubh)}(hhh](h)}(hjs_event.valueh]hjs_event.value}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwhhhhhKlubh)}(hXFor an axis, ``value`` is a signed integer between -32767 and +32767 representing the position of the joystick along that axis. If you don't read a 0 when the joystick is ``dead``, or if it doesn't span the full range, you should recalibrate it (with, for example, jscal).h](h For an axis, }(hjhhhNhNubj=)}(h ``value``h]hvalue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j<hjubh is a signed integer between -32767 and +32767 representing the position of the joystick along that axis. If you don’t read a 0 when the joystick is }(hjhhhNhNubj=)}(h``dead``h]hdead}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j<hjubh_, or if it doesn’t span the full range, you should recalibrate it (with, for example, jscal).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKnhjwhhubh)}(hZFor a button, ``value`` for a press button event is 1 and for a release button event is 0.h](hFor a button, }(hjhhhNhNubj=)}(h ``value``h]hvalue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j<hjubhC for a press button event is 1 and for a release button event is 0.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKshjwhhubh)}(h Though this::h]h Though this:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKvhjwhhubj)}(hZif (js_event.type == JS_EVENT_BUTTON) { buttons_state ^= (1 << js_event.number); }h]hZif (js_event.type == JS_EVENT_BUTTON) { buttons_state ^= (1 << js_event.number); }}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKxhjwhhubh)}(h 0) { process_event (e); } /* EAGAIN is returned when the queue is empty */ if (errno != EAGAIN) { /* error */ } /* do something interesting with processed events */ }h]hX$while (1) { while (read (fd, &e, sizeof(e)) > 0) { process_event (e); } /* EAGAIN is returned when the queue is empty */ if (errno != EAGAIN) { /* error */ } /* do something interesting with processed events */ }}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(hOne reason for emptying the queue is that if it gets full you'll start missing events since the queue is finite, and older events will get overwritten.h]hOne reason for emptying the queue is that if it gets full you’ll start missing events since the queue is finite, and older events will get overwritten.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(heThe other reason is that you want to know all that happened, and not delay the processing till later.h]heThe other reason is that you want to know all that happened, and not delay the processing till later.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hXWhy can the queue get full? Because you don't empty the queue as mentioned, or because too much time elapses from one read to another and too many events to store in the queue get generated. Note that high system load may contribute to space those reads even more.h]hX Why can the queue get full? Because you don’t empty the queue as mentioned, or because too much time elapses from one read to another and too many events to store in the queue get generated. Note that high system load may contribute to space those reads even more.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hIf time between reads is enough to fill the queue and lose an event, the driver will switch to startup mode and next time you read it, synthetic events (JS_EVENT_INIT) will be generated to inform you of the actual state of the joystick.h]hIf time between reads is enough to fill the queue and lose an event, the driver will switch to startup mode and next time you read it, synthetic events (JS_EVENT_INIT) will be generated to inform you of the actual state of the joystick.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubhnote)}(hAs of version 1.2.8, the queue is circular and able to hold 64 events. You can increment this size bumping up JS_BUFF_SIZE in joystick.h and recompiling the driver.h]h)}(hAs of version 1.2.8, the queue is circular and able to hold 64 events. You can increment this size bumping up JS_BUFF_SIZE in joystick.h and recompiling the driver.h]hAs of version 1.2.8, the queue is circular and able to hold 64 events. You can increment this size bumping up JS_BUFF_SIZE in joystick.h and recompiling the driver.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjIubah}(h]h ]h"]h$]h&]uh1jGhjhhhhhNubh)}(hIn the above code, you might as well want to read more than one event at a time using the typical read(2) functionality. For that, you would replace the read above with something like::h]hIn the above code, you might as well want to read more than one event at a time using the typical read(2) functionality. For that, you would replace the read above with something like:}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hNstruct js_event mybuffer[0xff]; int i = read (fd, mybuffer, sizeof(mybuffer));h]hNstruct js_event mybuffer[0xff]; int i = read (fd, mybuffer, sizeof(mybuffer));}hjosbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(hX In this case, read would return -1 if the queue was empty, or some other value in which the number of events read would be i / sizeof(js_event) Again, if the buffer was full, it's a good idea to process the events and keep reading it until you empty the driver queue.h]hXIn this case, read would return -1 if the queue was empty, or some other value in which the number of events read would be i / sizeof(js_event) Again, if the buffer was full, it’s a good idea to process the events and keep reading it until you empty the driver queue.}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h] o-nonblockah ]h"] o_nonblockah$]h&]uh1hhjihhhhhKubeh}(h]readingah ]h"]readingah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hIOCTLsh]hIOCTLs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(h?The joystick driver defines the following ioctl(2) operations::h]h>The joystick driver defines the following ioctl(2) operations:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hX /* function 3rd arg */ #define JSIOCGAXES /* get number of axes char */ #define JSIOCGBUTTONS /* get number of buttons char */ #define JSIOCGVERSION /* get driver version int */ #define JSIOCGNAME(len) /* get identifier string char */ #define JSIOCSCORR /* set correction values &js_corr */ #define JSIOCGCORR /* get correction values &js_corr */h]hX /* function 3rd arg */ #define JSIOCGAXES /* get number of axes char */ #define JSIOCGBUTTONS /* get number of buttons char */ #define JSIOCGVERSION /* get driver version int */ #define JSIOCGNAME(len) /* get identifier string char */ #define JSIOCSCORR /* set correction values &js_corr */ #define JSIOCGCORR /* get correction values &js_corr */}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(h)For example, to read the number of axes::h]h(For example, to read the number of axes:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(h=char number_of_axes; ioctl (fd, JSIOCGAXES, &number_of_axes);h]h=char number_of_axes; ioctl (fd, JSIOCGAXES, &number_of_axes);}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(hhh](h)}(h JSIOGCVERSIONh]h JSIOGCVERSION}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hJSIOGCVERSION is a good way to check in run-time whether the running driver is 1.0+ and supports the event interface. If it is not, the IOCTL will fail. For a compile-time decision, you can test the JS_VERSION symbol::h]hJSIOGCVERSION is a good way to check in run-time whether the running driver is 1.0+ and supports the event interface. If it is not, the IOCTL will fail. For a compile-time decision, you can test the JS_VERSION symbol:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(h.#ifdef JS_VERSION #if JS_VERSION > 0xsomethingh]h.#ifdef JS_VERSION #if JS_VERSION > 0xsomething}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubeh}(h] jsiogcversionah ]h"] jsiogcversionah$]h&]uh1hhjhhhhhKubh)}(hhh](h)}(h JSIOCGNAMEh]h JSIOCGNAME}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hXJSIOCGNAME(len) allows you to get the name string of the joystick - the same as is being printed at boot time. The 'len' argument is the length of the buffer provided by the application asking for the name. It is used to avoid possible overrun should the name be too long::h]hXJSIOCGNAME(len) allows you to get the name string of the joystick - the same as is being printed at boot time. The ‘len’ argument is the length of the buffer provided by the application asking for the name. It is used to avoid possible overrun should the name be too long:}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubj)}(hchar name[128]; if (ioctl(fd, JSIOCGNAME(sizeof(name)), name) < 0) strscpy(name, "Unknown", sizeof(name)); printf("Name: %s\n", name);h]hchar name[128]; if (ioctl(fd, JSIOCGNAME(sizeof(name)), name) < 0) strscpy(name, "Unknown", sizeof(name)); printf("Name: %s\n", name);}hj8sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhjhhubeh}(h] jsiocgnameah ]h"] jsiocgnameah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(h JSIOC[SG]CORRh]h JSIOC[SG]CORR}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNhhhhhMubh)}(hXGFor usage on JSIOC[SG]CORR I suggest you to look into jscal.c They are not needed in a normal program, only in joystick calibration software such as jscal or kcmjoy. These IOCTLs and data types aren't considered to be in the stable part of the API, and therefore may change without warning in following releases of the driver.h]hXIFor usage on JSIOC[SG]CORR I suggest you to look into jscal.c They are not needed in a normal program, only in joystick calibration software such as jscal or kcmjoy. These IOCTLs and data types aren’t considered to be in the stable part of the API, and therefore may change without warning in following releases of the driver.}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjNhhubh)}(hBoth JSIOCSCORR and JSIOCGCORR expect &js_corr to be able to hold information for all axes. That is, struct js_corr corr[MAX_AXIS];h]hBoth JSIOCSCORR and JSIOCGCORR expect &js_corr to be able to hold information for all axes. That is, struct js_corr corr[MAX_AXIS];}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjNhhubh)}(hstruct js_corr is defined as::h]hstruct js_corr is defined as:}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjNhhubj)}(hRstruct js_corr { __s32 coef[8]; __u16 prec; __u16 type; };h]hRstruct js_corr { __s32 coef[8]; __u16 prec; __u16 type; };}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhjNhhubh)}(hand ``type``::h](hand }(hjhhhNhNubj=)}(h``type``h]htype}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j<hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM"hjNhhubj)}(hz#define JS_CORR_NONE 0x00 /* returns raw values */ #define JS_CORR_BROKEN 0x01 /* broken line */h]hz#define JS_CORR_NONE 0x00 /* returns raw values */ #define JS_CORR_BROKEN 0x01 /* broken line */}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhM$hjNhhubeh}(h] jsioc-sg-corrah ]h"] jsioc[sg]corrah$]h&]uh1hhjhhhhhMubeh}(h]ioctlsah ]h"]ioctlsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hBackward compatibilityh]hBackward compatibility}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhM)ubh)}(hThe 0.x joystick driver API is quite limited and its usage is deprecated. The driver offers backward compatibility, though. Here's a quick summary::h]hThe 0.x joystick driver API is quite limited and its usage is deprecated. The driver offers backward compatibility, though. Here’s a quick summary:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM+hjhhubj)}(hstruct JS_DATA_TYPE js; while (1) { if (read (fd, &js, JS_RETURN) != JS_RETURN) { /* error */ } usleep (1000); }h]hstruct JS_DATA_TYPE js; while (1) { if (read (fd, &js, JS_RETURN) != JS_RETURN) { /* error */ } usleep (1000); }}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhM.hjhhubh)}(hmAs you can figure out from the example, the read returns immediately, with the actual state of the joystick::h]hlAs you can figure out from the example, the read returns immediately, with the actual state of the joystick:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM6hjhhubj)}(hstruct JS_DATA_TYPE { int buttons; /* immediate button state */ int x; /* immediate x axis value */ int y; /* immediate y axis value */ };h]hstruct JS_DATA_TYPE { int buttons; /* immediate button state */ int x; /* immediate x axis value */ int y; /* immediate y axis value */ };}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhM9hjhhubh)}(hand JS_RETURN is defined as::h]hand JS_RETURN is defined as:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM?hjhhubj)}(h3#define JS_RETURN sizeof(struct JS_DATA_TYPE)h]h3#define JS_RETURN sizeof(struct JS_DATA_TYPE)}hj,sbah}(h]h ]h"]h$]h&]jjuh1jhhhMAhjhhubh)}(h!To test the state of the buttons,h]h!To test the state of the buttons,}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMChjhhubj)}(hKfirst_button_state = js.buttons & 1; second_button_state = js.buttons & 2;h]hKfirst_button_state = js.buttons & 1; second_button_state = js.buttons & 2;}hjHsbah}(h]h ]h"]h$]h&]jjuh1jhhhMGhjhhubh)}(hThe axis values do not have a defined range in the original 0.x driver, except that the values are non-negative. The 1.2.8+ drivers use a fixed range for reporting the values, 1 being the minimum, 128 the center, and 255 maximum value.h]hThe axis values do not have a defined range in the original 0.x driver, except that the values are non-negative. The 1.2.8+ drivers use a fixed range for reporting the values, 1 being the minimum, 128 the center, and 255 maximum value.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMJhjhhubh)}(hThe v0.8.0.2 driver also had an interface for 'digital joysticks', (now called Multisystem joysticks in this driver), under /dev/djsX. This driver doesn't try to be compatible with that interface.h]hThe v0.8.0.2 driver also had an interface for ‘digital joysticks’, (now called Multisystem joysticks in this driver), under /dev/djsX. This driver doesn’t try to be compatible with that interface.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMOhjhhubeh}(h]backward-compatibilityah ]h"]backward compatibilityah$]h&]uh1hhhhhhhhM)ubh)}(hhh](h)}(h Final Notesh]h Final Notes}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjzhhhhhMUubj)}(hX-____/| Comments, additions, and specially corrections are welcome. \ o.O| Documentation valid for at least version 1.2.8 of the joystick =(_)= driver and as usual, the ultimate source for documentation is U to "Use The Source Luke" or, at your convenience, Vojtech ;)h]hX-____/| Comments, additions, and specially corrections are welcome. \ o.O| Documentation valid for at least version 1.2.8 of the joystick =(_)= driver and as usual, the ultimate source for documentation is U to "Use The Source Luke" or, at your convenience, Vojtech ;)}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMYhjzhhubeh}(h] final-notesah ]h"] final notesah$]h&]uh1hhhhhhhhMUubeh}(h](programming-interfaceheh ]h"](programming interface joystick-apieh$]h&]uh1hhhhhhhhKexpect_referenced_by_name}jhsexpect_referenced_by_id}hhsubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksjfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}h]hasnameids}(jhjjjjjjjfjcjjjtjqj%j"j^j[jjjjjjjjjKjHjjjwjtjju nametypes}(jjjjjfjjtj%j^jjjjjKjjwjuh}(hhjhjjjjjcjjj"jqjj"jwj[j(jjijjjjjjjHjjjNjtjjjzu footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages]hsystem_message)}(hhh]h)}(hhh]h2Hyperlink target "joystick-api" is not referenced.}hj: sbah}(h]h ]h"]h$]h&]uh1hhj7 ubah}(h]h ]h"]h$]h&]levelKtypeINFOsourcehlineKuh1j5 uba transformerN include_log] decorationNhhub.