€•ªŒŒsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ1/translations/zh_CN/input/devices/iforce-protocol”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ1/translations/zh_TW/input/devices/iforce-protocol”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ1/translations/it_IT/input/devices/iforce-protocol”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ1/translations/ja_JP/input/devices/iforce-protocol”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ1/translations/ko_KR/input/devices/iforce-protocol”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ1/translations/pt_BR/input/devices/iforce-protocol”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ1/translations/sp_SP/input/devices/iforce-protocol”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒIforce Protocol”h]”hŒIforce Protocol”…””}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³ŒK/var/lib/git/docbuild/linux/Documentation/input/devices/iforce-protocol.rst”h´KubhŒ field_list”“”)”}”(hhh]”hŒfield”“”)”}”(hhh]”(hŒ field_name”“”)”}”(hŒAuthor”h]”hŒAuthor”…””}”(hh×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÕhhÒh³hÊh´KubhŒ field_body”“”)”}”(hŒ(Johann Deneux ”h]”hŒ paragraph”“”)”}”(hŒ'Johann Deneux ”h]”(hŒJohann Deneux <”…””}”(hhíh²hh³Nh´NubhŒ reference”“”)”}”(hŒjohann.deneux@gmail.com”h]”hŒjohann.deneux@gmail.com”…””}”(hh÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:johann.deneux@gmail.com”uh1hõhhíubhŒ>”…””}”(hhíh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khhçubah}”(h]”h ]”h"]”h$]”h&]”uh1håhhÒubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÐh³hÊh´KhhÍh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1hËhh·h²hh³hÊh´Kubhì)”}”(hŒJHome page at ``_”h]”(hŒ Home page at ”…””}”(hj#h²hh³Nh´Nubhö)”}”(hŒ=``_”h]”hŒ8http://web.archive.org/web/*/http://www.esil.univ-mrs.fr”…””}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ8http://web.archive.org/web/*/http://www.esil.univ-mrs.fr”Œrefuri”j:uh1hõhj#ubhŒtarget”“”)”}”(hŒ:”h]”h}”(h]”Œ2http-web-archive-org-web-http-www-esil-univ-mrs-fr”ah ]”h"]”Œ8http://web.archive.org/web/*/http://www.esil.univ-mrs.fr”ah$]”h&]”Œrefuri”j:uh1j<Œ referenced”Khj#ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khh·h²hubhÌ)”}”(hhh]”hÑ)”}”(hhh]”(hÖ)”}”(hŒ Additions”h]”hŒ Additions”…””}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÕhjUh³hÊh´Kubhæ)”}”(hŒby Vojtech Pavlik. ”h]”hì)”}”(hŒby Vojtech Pavlik.”h]”hŒby Vojtech Pavlik.”…””}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K hjfubah}”(h]”h ]”h"]”h$]”h&]”uh1håhjUubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÐh³hÊh´K hjRh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1hËhh·h²hh³hÊh´K ubh¶)”}”(hhh]”(h»)”}”(hŒ Introduction”h]”hŒ Introduction”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjŠh²hh³hÊh´K ubhì)”}”(hX¢This document describes what I managed to discover about the protocol used to specify force effects to I-Force 2.0 devices. None of this information comes from Immerse. That's why you should not trust what is written in this document. This document is intended to help understanding the protocol. This is not a reference. Comments and corrections are welcome. To contact me, send an email to: johann.deneux@gmail.com”h]”(hXThis document describes what I managed to discover about the protocol used to specify force effects to I-Force 2.0 devices. None of this information comes from Immerse. That’s why you should not trust what is written in this document. This document is intended to help understanding the protocol. This is not a reference. Comments and corrections are welcome. To contact me, send an email to: ”…””}”(hj›h²hh³Nh´Nubhö)”}”(hŒjohann.deneux@gmail.com”h]”hŒjohann.deneux@gmail.com”…””}”(hj£h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:johann.deneux@gmail.com”uh1hõhj›ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KhjŠh²hubhŒwarning”“”)”}”(hŒ•I shall not be held responsible for any damage or harm caused if you try to send data to your I-Force device based on what you read in this document.”h]”hì)”}”(hŒ•I shall not be held responsible for any damage or harm caused if you try to send data to your I-Force device based on what you read in this document.”h]”hŒ•I shall not be held responsible for any damage or harm caused if you try to send data to your I-Force device based on what you read in this document.”…””}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khj»ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¹hjŠh²hh³hÊh´Nubeh}”(h]”Œ introduction”ah ]”h"]”Œ introduction”ah$]”h&]”uh1hµhh·h²hh³hÊh´K ubh¶)”}”(hhh]”(h»)”}”(hŒPreliminary Notes”h]”hŒPreliminary Notes”…””}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjÛh²hh³hÊh´Kubhì)”}”(hŒëAll values are hexadecimal with big-endian encoding (msb on the left). Beware, values inside packets are encoded using little-endian. Bytes whose roles are unknown are marked ??? Information that needs deeper inspection is marked (?)”h]”hŒëAll values are hexadecimal with big-endian encoding (msb on the left). Beware, values inside packets are encoded using little-endian. Bytes whose roles are unknown are marked ??? Information that needs deeper inspection is marked (?)”…””}”(hjìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KhjÛh²hubh¶)”}”(hhh]”(h»)”}”(hŒGeneral form of a packet”h]”hŒGeneral form of a packet”…””}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjúh²hh³hÊh´K#ubhì)”}”(hŒGThis is how packets look when the device uses the rs232 to communicate.”h]”hŒGThis is how packets look when the device uses the rs232 to communicate.”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K%hjúh²hubhŒtable”“”)”}”(hhh]”hŒtgroup”“”)”}”(hhh]”(hŒcolspec”“”)”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j#hj ubj$)”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j#hj ubj$)”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j#hj ubj$)”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j#hj ubj$)”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j#hj ubhŒtbody”“”)”}”(hhh]”hŒrow”“”)”}”(hhh]”(hŒentry”“”)”}”(hhh]”hì)”}”(hŒ2B”h]”hŒ2B”…””}”(hjfh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K(hjcubah}”(h]”h ]”h"]”h$]”h&]”uh1jahj^ubjb)”}”(hhh]”hì)”}”(hŒOP”h]”hŒOP”…””}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K(hjzubah}”(h]”h ]”h"]”h$]”h&]”uh1jahj^ubjb)”}”(hhh]”hì)”}”(hŒLEN”h]”hŒLEN”…””}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K(hj‘ubah}”(h]”h ]”h"]”h$]”h&]”uh1jahj^ubjb)”}”(hhh]”hì)”}”(hŒDATA”h]”hŒDATA”…””}”(hj«h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K(hj¨ubah}”(h]”h ]”h"]”h$]”h&]”uh1jahj^ubjb)”}”(hhh]”hì)”}”(hŒCS”h]”hŒCS”…””}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K(hj¿ubah}”(h]”h ]”h"]”h$]”h&]”uh1jahj^ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j\hjYubah}”(h]”h ]”h"]”h$]”h&]”uh1jWhj ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1jhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjúh²hh³hÊh´Nubhì)”}”(hŒACS is the checksum. It is equal to the exclusive or of all bytes.”h]”hŒACS is the checksum. It is equal to the exclusive or of all bytes.”…””}”(hjïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K+hjúh²hubhì)”}”(hŒWhen using USB:”h]”hŒWhen using USB:”…””}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K-hjúh²hubj)”}”(hhh]”j)”}”(hhh]”(j$)”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j#hjubj$)”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j#hjubjX)”}”(hhh]”j])”}”(hhh]”(jb)”}”(hhh]”hì)”}”(hŒOP”h]”hŒOP”…””}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K0hj+ubah}”(h]”h ]”h"]”h$]”h&]”uh1jahj(ubjb)”}”(hhh]”hì)”}”(hŒDATA”h]”hŒDATA”…””}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K0hjBubah}”(h]”h ]”h"]”h$]”h&]”uh1jahj(ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j\hj%ubah}”(h]”h ]”h"]”h$]”h&]”uh1jWhjubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1jhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjúh²hh³hÊh´Nubhì)”}”(hŒ€The 2B, LEN and CS fields have disappeared, probably because USB handles frames and data corruption is handled or insignificant.”h]”hŒ€The 2B, LEN and CS fields have disappeared, probably because USB handles frames and data corruption is handled or insignificant.”…””}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K3hjúh²hubhì)”}”(hŒEFirst, I describe effects that are sent by the device to the computer”h]”hŒEFirst, I describe effects that are sent by the device to the computer”…””}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K6hjúh²hubeh}”(h]”Œgeneral-form-of-a-packet”ah ]”h"]”Œgeneral form of a packet”ah$]”h&]”uh1hµhjÛh²hh³hÊh´K#ubeh}”(h]”Œpreliminary-notes”ah ]”h"]”Œpreliminary notes”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kubh¶)”}”(hhh]”(h»)”}”(hŒDevice input state”h]”hŒDevice input state”…””}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjžh²hh³hÊh´K9ubhì)”}”(hŒUThis packet is used to indicate the state of each button and the value of each axis::”h]”hŒTThis packet is used to indicate the state of each button and the value of each axis:”…””}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K;hjžh²hubhŒ literal_block”“”)”}”(hXOP= 01 for a joystick, 03 for a wheel LEN= Varies from device to device 00 X-Axis lsb 01 X-Axis msb 02 Y-Axis lsb, or gas pedal for a wheel 03 Y-Axis msb, or brake pedal for a wheel 04 Throttle 05 Buttons 06 Lower 4 bits: Buttons Upper 4 bits: Hat 07 Rudder”h]”hXOP= 01 for a joystick, 03 for a wheel LEN= Varies from device to device 00 X-Axis lsb 01 X-Axis msb 02 Y-Axis lsb, or gas pedal for a wheel 03 Y-Axis msb, or brake pedal for a wheel 04 Throttle 05 Buttons 06 Lower 4 bits: Buttons Upper 4 bits: Hat 07 Rudder”…””}”hj¿sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1j½h³hÊh´K>hjžh²hubeh}”(h]”Œdevice-input-state”ah ]”h"]”Œdevice input state”ah$]”h&]”uh1hµhh·h²hh³hÊh´K9ubh¶)”}”(hhh]”(h»)”}”(hŒDevice effects states”h]”hŒDevice effects states”…””}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj×h²hh³hÊh´KKubj¾)”}”(hX\OP= 02 LEN= Varies 00 ? Bit 1 (Value 2) is the value of the deadman switch 01 Bit 8 is set if the effect is playing. Bits 0 to 7 are the effect id. 02 ?? 03 Address of parameter block changed (lsb) 04 Address of parameter block changed (msb) 05 Address of second parameter block changed (lsb) ... depending on the number of parameter blocks updated”h]”hX\OP= 02 LEN= Varies 00 ? Bit 1 (Value 2) is the value of the deadman switch 01 Bit 8 is set if the effect is playing. Bits 0 to 7 are the effect id. 02 ?? 03 Address of parameter block changed (lsb) 04 Address of parameter block changed (msb) 05 Address of second parameter block changed (lsb) ... depending on the number of parameter blocks updated”…””}”hjèsbah}”(h]”h ]”h"]”h$]”h&]”jÍjÎuh1j½h³hÊh´KOhj×h²hubh¶)”}”(hhh]”(h»)”}”(hŒ Force effect”h]”hŒ Force effect”…””}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjöh²hh³hÊh´KZubj¾)”}”(hXzOP= 01 LEN= 0e 00 Channel (when playing several effects at the same time, each must be assigned a channel) 01 Wave form Val 00 Constant Val 20 Square Val 21 Triangle Val 22 Sine Val 23 Sawtooth up Val 24 Sawtooth down Val 40 Spring (Force = f(pos)) Val 41 Friction (Force = f(velocity)) and Inertia (Force = f(acceleration)) 02 Axes affected and trigger Bits 4-7: Val 2 = effect along one axis. Byte 05 indicates direction Val 4 = X axis only. Byte 05 must contain 5a Val 8 = Y axis only. Byte 05 must contain b4 Val c = X and Y axes. Bytes 05 must contain 60 Bits 0-3: Val 0 = No trigger Val x+1 = Button x triggers the effect When the whole byte is 0, cancel the previously set trigger 03-04 Duration of effect (little endian encoding, in ms) 05 Direction of effect, if applicable. Else, see 02 for value to assign. 06-07 Minimum time between triggering. 08-09 Address of periodicity or magnitude parameters 0a-0b Address of attack and fade parameters, or ffff if none. *or* 08-09 Address of interactive parameters for X-axis, or ffff if not applicable 0a-0b Address of interactive parameters for Y-axis, or ffff if not applicable 0c-0d Delay before execution of effect (little endian encoding, in ms)”h]”hXzOP= 01 LEN= 0e 00 Channel (when playing several effects at the same time, each must be assigned a channel) 01 Wave form Val 00 Constant Val 20 Square Val 21 Triangle Val 22 Sine Val 23 Sawtooth up Val 24 Sawtooth down Val 40 Spring (Force = f(pos)) Val 41 Friction (Force = f(velocity)) and Inertia (Force = f(acceleration)) 02 Axes affected and trigger Bits 4-7: Val 2 = effect along one axis. Byte 05 indicates direction Val 4 = X axis only. Byte 05 must contain 5a Val 8 = Y axis only. Byte 05 must contain b4 Val c = X and Y axes. Bytes 05 must contain 60 Bits 0-3: Val 0 = No trigger Val x+1 = Button x triggers the effect When the whole byte is 0, cancel the previously set trigger 03-04 Duration of effect (little endian encoding, in ms) 05 Direction of effect, if applicable. Else, see 02 for value to assign. 06-07 Minimum time between triggering. 08-09 Address of periodicity or magnitude parameters 0a-0b Address of attack and fade parameters, or ffff if none. *or* 08-09 Address of interactive parameters for X-axis, or ffff if not applicable 0a-0b Address of interactive parameters for Y-axis, or ffff if not applicable 0c-0d Delay before execution of effect (little endian encoding, in ms)”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”jÍjÎuh1j½h³hÊh´K^hjöh²hubeh}”(h]”Œ force-effect”ah ]”h"]”Œ force effect”ah$]”h&]”uh1hµhj×h²hh³hÊh´KZubh¶)”}”(hhh]”(h»)”}”(hŒTime based parameters”h]”hŒTime based parameters”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´K‰ubh¶)”}”(hhh]”(h»)”}”(hŒAttack and fade”h]”hŒAttack and fade”…””}”(hj1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj.h²hh³hÊh´KŒubj¾)”}”(hŒÍOP= 02 LEN= 08 00-01 Address where to store the parameters 02-03 Duration of attack (little endian encoding, in ms) 04 Level at end of attack. Signed byte. 05-06 Duration of fade. 07 Level at end of fade.”h]”hŒÍOP= 02 LEN= 08 00-01 Address where to store the parameters 02-03 Duration of attack (little endian encoding, in ms) 04 Level at end of attack. Signed byte. 05-06 Duration of fade. 07 Level at end of fade.”…””}”hj?sbah}”(h]”h ]”h"]”h$]”h&]”jÍjÎuh1j½h³hÊh´Khj.h²hubeh}”(h]”Œattack-and-fade”ah ]”h"]”Œattack and fade”ah$]”h&]”uh1hµhjh²hh³hÊh´KŒubh¶)”}”(hhh]”(h»)”}”(hŒ Magnitude”h]”hŒ Magnitude”…””}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjUh²hh³hÊh´K™ubj¾)”}”(hŒ4OP= 03 LEN= 03 00-01 Address 02 Level. Signed byte.”h]”hŒ4OP= 03 LEN= 03 00-01 Address 02 Level. Signed byte.”…””}”hjfsbah}”(h]”h ]”h"]”h$]”h&]”jÍjÎuh1j½h³hÊh´KhjUh²hubeh}”(h]”Œ magnitude”ah ]”h"]”Œ magnitude”ah$]”h&]”uh1hµhjh²hh³hÊh´K™ubh¶)”}”(hhh]”(h»)”}”(hŒ Periodicity”h]”hŒ Periodicity”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj|h²hh³hÊh´K£ubj¾)”}”(hŒ©OP= 04 LEN= 07 00-01 Address 02 Magnitude. Signed byte. 03 Offset. Signed byte. 04 Phase. Val 00 = 0 deg, Val 40 = 90 degs. 05-06 Period (little endian encoding, in ms)”h]”hŒ©OP= 04 LEN= 07 00-01 Address 02 Magnitude. Signed byte. 03 Offset. Signed byte. 04 Phase. Val 00 = 0 deg, Val 40 = 90 degs. 05-06 Period (little endian encoding, in ms)”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”jÍjÎuh1j½h³hÊh´K§hj|h²hubeh}”(h]”Œ periodicity”ah ]”h"]”Œ periodicity”ah$]”h&]”uh1hµhjh²hh³hÊh´K£ubeh}”(h]”Œtime-based-parameters”ah ]”h"]”Œtime based parameters”ah$]”h&]”uh1hµhj×h²hh³hÊh´K‰ubh¶)”}”(hhh]”(h»)”}”(hŒInteractive parameters”h]”hŒInteractive parameters”…””}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj«h²hh³hÊh´K°ubj¾)”}”(hŒäOP= 05 LEN= 0a 00-01 Address 02 Positive Coeff 03 Negative Coeff 04+05 Offset (center) 06+07 Dead band (Val 01F4 = 5000 (decimal)) 08 Positive saturation (Val 0a = 1000 (decimal) Val 64 = 10000 (decimal)) 09 Negative saturation”h]”hŒäOP= 05 LEN= 0a 00-01 Address 02 Positive Coeff 03 Negative Coeff 04+05 Offset (center) 06+07 Dead band (Val 01F4 = 5000 (decimal)) 08 Positive saturation (Val 0a = 1000 (decimal) Val 64 = 10000 (decimal)) 09 Negative saturation”…””}”hj¼sbah}”(h]”h ]”h"]”h$]”h&]”jÍjÎuh1j½h³hÊh´K´hj«h²hubhì)”}”(hŒýThe encoding is a bit funny here: For coeffs, these are signed values. The maximum value is 64 (100 decimal), the min is 9c. For the offset, the minimum value is FE0C, the maximum value is 01F4. For the deadband, the minimum value is 0, the max is 03E8.”h]”hŒýThe encoding is a bit funny here: For coeffs, these are signed values. The maximum value is 64 (100 decimal), the min is 9c. For the offset, the minimum value is FE0C, the maximum value is 01F4. For the deadband, the minimum value is 0, the max is 03E8.”…””}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K¾hj«h²hubeh}”(h]”Œinteractive-parameters”ah ]”h"]”Œinteractive parameters”ah$]”h&]”uh1hµhj×h²hh³hÊh´K°ubh¶)”}”(hhh]”(h»)”}”(hŒControls”h]”hŒControls”…””}”(hjãh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjàh²hh³hÊh´KÄubj¾)”}”(hŒ¸OP= 41 LEN= 03 00 Channel 01 Start/Stop Val 00: Stop Val 01: Start and play once. Val 41: Start and play n times (See byte 02 below) 02 Number of iterations n.”h]”hŒ¸OP= 41 LEN= 03 00 Channel 01 Start/Stop Val 00: Stop Val 01: Start and play once. Val 41: Start and play n times (See byte 02 below) 02 Number of iterations n.”…””}”hjñsbah}”(h]”h ]”h"]”h$]”h&]”jÍjÎuh1j½h³hÊh´KÈhjàh²hubeh}”(h]”Œcontrols”ah ]”h"]”Œcontrols”ah$]”h&]”uh1hµhj×h²hh³hÊh´KÄubh¶)”}”(hhh]”(h»)”}”(hŒInit”h]”hŒInit”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´KÒubh¶)”}”(hhh]”(h»)”}”(hŒQuerying features”h]”hŒQuerying features”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´KÖubj¾)”}”(hŒïOP= ff Query command. Length varies according to the query type. The general format of this packet is: ff 01 QUERY [INDEX] CHECKSUM responses are of the same form: FF LEN QUERY VALUE_QUERIED CHECKSUM2 where LEN = 1 + length(VALUE_QUERIED)”h]”hŒïOP= ff Query command. Length varies according to the query type. The general format of this packet is: ff 01 QUERY [INDEX] CHECKSUM responses are of the same form: FF LEN QUERY VALUE_QUERIED CHECKSUM2 where LEN = 1 + length(VALUE_QUERIED)”…””}”hj)sbah}”(h]”h ]”h"]”h$]”h&]”jÍjÎuh1j½h³hÊh´KÙhjh²hubh¶)”}”(hhh]”(h»)”}”(hŒQuery ram size”h]”hŒQuery ram size”…””}”(hj:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj7h²hh³hÊh´Kâubj¾)”}”(hŒQUERY = 42 ('B'uffer size)”h]”hŒQUERY = 42 ('B'uffer size)”…””}”hjHsbah}”(h]”h ]”h"]”h$]”h&]”jÍjÎuh1j½h³hÊh´Kæhj7h²hubhì)”}”(hŒ·The device should reply with the same packet plus two additional bytes containing the size of the memory: ff 03 42 03 e8 CS would mean that the device has 1000 bytes of ram available.”h]”hŒ·The device should reply with the same packet plus two additional bytes containing the size of the memory: ff 03 42 03 e8 CS would mean that the device has 1000 bytes of ram available.”…””}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kèhj7h²hubeh}”(h]”Œquery-ram-size”ah ]”h"]”Œquery ram size”ah$]”h&]”uh1hµhjh²hh³hÊh´Kâubh¶)”}”(hhh]”(h»)”}”(hŒQuery number of effects”h]”hŒQuery number of effects”…””}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjlh²hh³hÊh´Kíubj¾)”}”(hŒ QUERY = 4e ('N'umber of effects)”h]”hŒ QUERY = 4e ('N'umber of effects)”…””}”hj}sbah}”(h]”h ]”h"]”h$]”h&]”jÍjÎuh1j½h³hÊh´Kñhjlh²hubhì)”}”(hŒ”The device should respond by sending the number of effects that can be played at the same time (one byte) ff 02 4e 14 CS would stand for 20 effects.”h]”hŒ”The device should respond by sending the number of effects that can be played at the same time (one byte) ff 02 4e 14 CS would stand for 20 effects.”…””}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kóhjlh²hubeh}”(h]”Œquery-number-of-effects”ah ]”h"]”Œquery number of effects”ah$]”h&]”uh1hµhjh²hh³hÊh´Kíubh¶)”}”(hhh]”(h»)”}”(hŒ Vendor's id”h]”hŒ Vendor’s id”…””}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj¡h²hh³hÊh´Køubj¾)”}”(hŒQUERY = 4d ('M'anufacturer)”h]”hŒQUERY = 4d ('M'anufacturer)”…””}”hj²sbah}”(h]”h ]”h"]”h$]”h&]”jÍjÎuh1j½h³hÊh´Kühj¡h²hubhì)”}”(hŒQuery the vendors'id (2 bytes)”h]”hŒ Query the vendors’id (2 bytes)”…””}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kþhj¡h²hubeh}”(h]”Œ vendor-s-id”ah ]”h"]”Œ vendor's id”ah$]”h&]”uh1hµhjh²hh³hÊh´Køubh¶)”}”(hhh]”(h»)”}”(hŒ Product id”h]”hŒ Product id”…””}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjÖh²hh³hÊh´Mubj¾)”}”(hŒQUERY = 50 ('P'roduct)”h]”hŒQUERY = 50 ('P'roduct)”…””}”hjçsbah}”(h]”h ]”h"]”h$]”h&]”jÍjÎuh1j½h³hÊh´MhjÖh²hubhì)”}”(hŒQuery the product id (2 bytes)”h]”hŒQuery the product id (2 bytes)”…””}”(hjõh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´MhjÖh²hubeh}”(h]”Œ product-id”ah ]”h"]”Œ product id”ah$]”h&]”uh1hµhjh²hh³hÊh´Mubh¶)”}”(hhh]”(h»)”}”(hŒ Open device”h]”hŒ Open device”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj h²hh³hÊh´M ubj¾)”}”(hŒQUERY = 4f ('O'pen)”h]”hŒQUERY = 4f ('O'pen)”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”jÍjÎuh1j½h³hÊh´Mhj h²hubhì)”}”(hŒNo data returned.”h]”hŒNo data returned.”…””}”(hj*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Mhj h²hubeh}”(h]”Œ open-device”ah ]”h"]”Œ open device”ah$]”h&]”uh1hµhjh²hh³hÊh´M ubh¶)”}”(hhh]”(h»)”}”(hŒ Close device”h]”hŒ Close device”…””}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj@h²hh³hÊh´Mubj¾)”}”(hŒQUERY = 43 ('C')lose”h]”hŒQUERY = 43 ('C')lose”…””}”hjQsbah}”(h]”h ]”h"]”h$]”h&]”jÍjÎuh1j½h³hÊh´Mhj@h²hubhì)”}”(hŒNo data returned.”h]”hŒNo data returned.”…””}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Mhj@h²hubeh}”(h]”Œ close-device”ah ]”h"]”Œ close device”ah$]”h&]”uh1hµhjh²hh³hÊh´Mubh¶)”}”(hhh]”(h»)”}”(hŒ Query effect”h]”hŒ Query effect”…””}”(hjxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjuh²hh³hÊh´Mubj¾)”}”(hŒQUERY = 45 ('E')”h]”hŒQUERY = 45 ('E')”…””}”hj†sbah}”(h]”h ]”h"]”h$]”h&]”jÍjÎuh1j½h³hÊh´M hjuh²hubhì)”}”(hŒ8Send effect type. Returns nonzero if supported (2 bytes)”h]”hŒ8Send effect type. Returns nonzero if supported (2 bytes)”…””}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´M"hjuh²hubeh}”(h]”Œ query-effect”ah ]”h"]”Œ query effect”ah$]”h&]”uh1hµhjh²hh³hÊh´Mubh¶)”}”(hhh]”(h»)”}”(hŒFirmware Version”h]”hŒFirmware Version”…””}”(hj­h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjªh²hh³hÊh´M&ubj¾)”}”(hŒQUERY = 56 ('V'ersion)”h]”hŒQUERY = 56 ('V'ersion)”…””}”hj»sbah}”(h]”h ]”h"]”h$]”h&]”jÍjÎuh1j½h³hÊh´M*hjªh²hubhì)”}”(hŒ+Sends back 3 bytes - major, minor, subminor”h]”hŒ+Sends back 3 bytes - major, minor, subminor”…””}”(hjÉh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´M,hjªh²hubeh}”(h]”Œfirmware-version”ah ]”h"]”Œfirmware version”ah$]”h&]”uh1hµhjh²hh³hÊh´M&ubeh}”(h]”Œquerying-features”ah ]”h"]”Œquerying features”ah$]”h&]”uh1hµhjh²hh³hÊh´KÖubh¶)”}”(hhh]”(h»)”}”(hŒInitialisation of the device”h]”hŒInitialisation of the device”…””}”(hjêh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjçh²hh³hÊh´M/ubh¶)”}”(hhh]”(h»)”}”(hŒ Set Control”h]”hŒ Set Control”…””}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjøh²hh³hÊh´M2ubhŒnote”“”)”}”(hŒ7Device dependent, can be different on different models!”h]”hì)”}”(hj h]”hŒ7Device dependent, can be different on different models!”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´M5hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjøh²hh³hÊh´Nubj¾)”}”(hX.OP= 40 [] LEN= 2 or 3 00 Idx Idx 00 Set dead zone (0..2048) Idx 01 Ignore Deadman sensor (0..1) Idx 02 Enable comm watchdog (0..1) Idx 03 Set the strength of the spring (0..100) Idx 04 Enable or disable the spring (0/1) Idx 05 Set axis saturation threshold (0..2048)”h]”hX.OP= 40 [] LEN= 2 or 3 00 Idx Idx 00 Set dead zone (0..2048) Idx 01 Ignore Deadman sensor (0..1) Idx 02 Enable comm watchdog (0..1) Idx 03 Set the strength of the spring (0..100) Idx 04 Enable or disable the spring (0/1) Idx 05 Set axis saturation threshold (0..2048)”…””}”hj"sbah}”(h]”h ]”h"]”h$]”h&]”jÍjÎuh1j½h³hÊh´M9hjøh²hubeh}”(h]”Œ set-control”ah ]”h"]”Œ set control”ah$]”h&]”uh1hµhjçh²hh³hÊh´M2ubh¶)”}”(hhh]”(h»)”}”(hŒSet Effect State”h]”hŒSet Effect State”…””}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj8h²hh³hÊh´MDubj¾)”}”(hŒtOP= 42 LEN= 1 00 State Bit 3 Pause force feedback Bit 2 Enable force feedback Bit 0 Stop all effects”h]”hŒtOP= 42 LEN= 1 00 State Bit 3 Pause force feedback Bit 2 Enable force feedback Bit 0 Stop all effects”…””}”hjIsbah}”(h]”h ]”h"]”h$]”h&]”jÍjÎuh1j½h³hÊh´MHhj8h²hubeh}”(h]”Œset-effect-state”ah ]”h"]”Œset effect state”ah$]”h&]”uh1hµhjçh²hh³hÊh´MDubh¶)”}”(hhh]”(h»)”}”(hŒ Set overall”h]”hŒ Set overall”…””}”(hjbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj_h²hh³hÊh´MPubj¾)”}”(hŒLOP= 43 LEN= 1 00 Gain Val 00 = 0% Val 40 = 50% Val 80 = 100%”h]”hŒLOP= 43 LEN= 1 00 Gain Val 00 = 0% Val 40 = 50% Val 80 = 100%”…””}”hjpsbah}”(h]”h ]”h"]”h$]”h&]”jÍjÎuh1j½h³hÊh´MThj_h²hubeh}”(h]”Œ set-overall”ah ]”h"]”Œ set overall”ah$]”h&]”uh1hµhjçh²hh³hÊh´MPubeh}”(h]”Œinitialisation-of-the-device”ah ]”h"]”Œinitialisation of the device”ah$]”h&]”uh1hµhjh²hh³hÊh´M/ubeh}”(h]”Œinit”ah ]”h"]”Œinit”ah$]”h&]”uh1hµhj×h²hh³hÊh´KÒubh¶)”}”(hhh]”(h»)”}”(hŒParameter memory”h]”hŒParameter memory”…””}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj–h²hh³hÊh´M\ubhì)”}”(hŒàEach device has a certain amount of memory to store parameters of effects. The amount of RAM may vary, I encountered values from 200 to 1000 bytes. Below is the amount of memory apparently needed for every set of parameters:”h]”hŒàEach device has a certain amount of memory to store parameters of effects. The amount of RAM may vary, I encountered values from 200 to 1000 bytes. Below is the amount of memory apparently needed for every set of parameters:”…””}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´M^hj–h²hubhŒ block_quote”“”)”}”(hŒI- period : 0c - magnitude : 02 - attack and fade : 0e - interactive : 08 ”h]”hŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒ period : 0c”h]”hì)”}”(hjÄh]”hŒ period : 0c”…””}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´MbhjÂubah}”(h]”h ]”h"]”h$]”h&]”uh1jÀhj½ubjÁ)”}”(hŒmagnitude : 02”h]”hì)”}”(hjÛh]”hŒmagnitude : 02”…””}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´MchjÙubah}”(h]”h ]”h"]”h$]”h&]”uh1jÀhj½ubjÁ)”}”(hŒattack and fade : 0e”h]”hì)”}”(hjòh]”hŒattack and fade : 0e”…””}”(hjôh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Mdhjðubah}”(h]”h ]”h"]”h$]”h&]”uh1jÀhj½ubjÁ)”}”(hŒinteractive : 08 ”h]”hì)”}”(hŒinteractive : 08”h]”hŒinteractive : 08”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Mehjubah}”(h]”h ]”h"]”h$]”h&]”uh1jÀhj½ubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1j»h³hÊh´Mbhj·ubah}”(h]”h ]”h"]”h$]”h&]”uh1jµh³hÊh´Mbhj–h²hubeh}”(h]”Œparameter-memory”ah ]”h"]”Œparameter memory”ah$]”h&]”uh1hµhj×h²hh³hÊh´M\ubeh}”(h]”Œdevice-effects-states”ah ]”h"]”Œdevice effects states”ah$]”h&]”uh1hµhh·h²hh³hÊh´KKubh¶)”}”(hhh]”(h»)”}”(hŒ$Appendix: How to study the protocol?”h]”hŒ$Appendix: How to study the protocol?”…””}”(hj@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj=h²hh³hÊh´Mhubhì)”}”(hX{1. Generate effects using the force editor provided with the DirectX SDK, or use Immersion Studio (freely available at their web site in the developer section: www.immersion.com) 2. Start a soft spying RS232 or USB (depending on where you connected your joystick/wheel). I used ComPortSpy from fCoder (alpha version!) 3. Play the effect, and watch what happens on the spy screen.”h]”hX{1. Generate effects using the force editor provided with the DirectX SDK, or use Immersion Studio (freely available at their web site in the developer section: www.immersion.com) 2. Start a soft spying RS232 or USB (depending on where you connected your joystick/wheel). I used ComPortSpy from fCoder (alpha version!) 3. Play the effect, and watch what happens on the spy screen.”…””}”(hjNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Mjhj=h²hubhì)”}”(hŒîA few words about ComPortSpy: At first glance, this software seems, hum, well... buggy. In fact, data appear with a few seconds latency. Personally, I restart it every time I play an effect. Remember it's free (as in free beer) and alpha!”h]”hŒðA few words about ComPortSpy: At first glance, this software seems, hum, well... buggy. In fact, data appear with a few seconds latency. Personally, I restart it every time I play an effect. Remember it’s free (as in free beer) and alpha!”…””}”(hj\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Mqhj=h²hubeh}”(h]”Œ"appendix-how-to-study-the-protocol”ah ]”h"]”Œ$appendix: how to study the protocol?”ah$]”h&]”uh1hµhh·h²hh³hÊh´Mhubh¶)”}”(hhh]”(h»)”}”(hŒURLS”h]”hŒURLS”…””}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjrh²hh³hÊh´Mwubhì)”}”(hŒ\Check http://www.immerse.com for Immersion Studio, and http://www.fcoder.com for ComPortSpy.”h]”(hŒCheck ”…””}”(hjƒh²hh³Nh´Nubhö)”}”(hŒhttp://www.immerse.com”h]”hŒhttp://www.immerse.com”…””}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”juh1hõhjƒubhŒ for Immersion Studio, and ”…””}”(hjƒh²hh³Nh´Nubhö)”}”(hŒhttp://www.fcoder.com”h]”hŒhttp://www.fcoder.com”…””}”(hjžh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j uh1hõhjƒubhŒ for ComPortSpy.”…””}”(hjƒh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Myhjrh²hubhì)”}”(hŒ'I-Force is trademark of Immersion Corp.”h]”hŒ'I-Force is trademark of Immersion Corp.”…””}”(hj·h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´M}hjrh²hubeh}”(h]”Œurls”ah ]”h"]”Œurls”ah$]”h&]”uh1hµhh·h²hh³hÊh´Mwubeh}”(h]”Œiforce-protocol”ah ]”h"]”Œiforce protocol”ah$]”h&]”uh1hµhhh²hh³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÊuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(hºNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”jaŒfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”j÷Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÊŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jÒjÏjGjDjØjÕj›j˜j“jjÔjÑj:j7jjj¨j¥jRjOjyjvj jjÝjÚjjj“jjäjájijfjžj›jÓjÐjjj=j:jrjoj§j¤jÜjÙj‹jˆj5j2j\jYjƒj€j2j/jojljÊjÇuŒ nametypes”}”(jÒ‰jGˆj؉j›‰j“‰jÔ‰j:‰j‰j¨‰jR‰jy‰j ‰j݉j‰j“‰jä‰ji‰jž‰jÓ‰j‰j=‰jr‰j§‰j܉j‹‰j5‰j\‰jƒ‰j2‰jo‰jʉuh}”(jÏh·jDj>jÕjŠj˜jÛjjújÑjžj7j×jjöj¥jjOj.jvjUjj|jÚj«jjàjjjájjfj7j›jljÐj¡jjÖj:j joj@j¤jujÙjªjˆjçj2jøjYj8j€j_j/j–jlj=jÇjruŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.