1b08c118cSDmitry Torokhov=============== 2b08c118cSDmitry TorokhovIforce Protocol 3b08c118cSDmitry Torokhov=============== 4b08c118cSDmitry Torokhov 5b08c118cSDmitry Torokhov:Author: Johann Deneux <johann.deneux@gmail.com> 6b08c118cSDmitry Torokhov 7b08c118cSDmitry TorokhovHome page at `<http://web.archive.org/web/*/http://www.esil.univ-mrs.fr>`_ 8b08c118cSDmitry Torokhov 9b08c118cSDmitry Torokhov:Additions: by Vojtech Pavlik. 10b08c118cSDmitry Torokhov 11b08c118cSDmitry Torokhov 12b08c118cSDmitry TorokhovIntroduction 13b08c118cSDmitry Torokhov============ 14b08c118cSDmitry Torokhov 15b08c118cSDmitry TorokhovThis document describes what I managed to discover about the protocol used to 16b08c118cSDmitry Torokhovspecify force effects to I-Force 2.0 devices. None of this information comes 17b08c118cSDmitry Torokhovfrom Immerse. That's why you should not trust what is written in this 18b08c118cSDmitry Torokhovdocument. This document is intended to help understanding the protocol. 19b08c118cSDmitry TorokhovThis is not a reference. Comments and corrections are welcome. To contact me, 20b08c118cSDmitry Torokhovsend an email to: johann.deneux@gmail.com 21b08c118cSDmitry Torokhov 22b08c118cSDmitry Torokhov.. warning:: 23b08c118cSDmitry Torokhov 24b08c118cSDmitry Torokhov I shall not be held responsible for any damage or harm caused if you try to 25b08c118cSDmitry Torokhov send data to your I-Force device based on what you read in this document. 26b08c118cSDmitry Torokhov 27b08c118cSDmitry TorokhovPreliminary Notes 28b08c118cSDmitry Torokhov================= 29b08c118cSDmitry Torokhov 30b08c118cSDmitry TorokhovAll values are hexadecimal with big-endian encoding (msb on the left). Beware, 31b08c118cSDmitry Torokhovvalues inside packets are encoded using little-endian. Bytes whose roles are 32b08c118cSDmitry Torokhovunknown are marked ??? Information that needs deeper inspection is marked (?) 33b08c118cSDmitry Torokhov 34b08c118cSDmitry TorokhovGeneral form of a packet 35b08c118cSDmitry Torokhov------------------------ 36b08c118cSDmitry Torokhov 37b08c118cSDmitry TorokhovThis is how packets look when the device uses the rs232 to communicate. 38b08c118cSDmitry Torokhov 39b08c118cSDmitry Torokhov== == === ==== == 40b08c118cSDmitry Torokhov2B OP LEN DATA CS 41b08c118cSDmitry Torokhov== == === ==== == 42b08c118cSDmitry Torokhov 43b08c118cSDmitry TorokhovCS is the checksum. It is equal to the exclusive or of all bytes. 44b08c118cSDmitry Torokhov 45b08c118cSDmitry TorokhovWhen using USB: 46b08c118cSDmitry Torokhov 47b08c118cSDmitry Torokhov== ==== 48b08c118cSDmitry TorokhovOP DATA 49b08c118cSDmitry Torokhov== ==== 50b08c118cSDmitry Torokhov 51b08c118cSDmitry TorokhovThe 2B, LEN and CS fields have disappeared, probably because USB handles 52*d56b699dSBjorn Helgaasframes and data corruption is handled or insignificant. 53b08c118cSDmitry Torokhov 54b08c118cSDmitry TorokhovFirst, I describe effects that are sent by the device to the computer 55b08c118cSDmitry Torokhov 56b08c118cSDmitry TorokhovDevice input state 57b08c118cSDmitry Torokhov================== 58b08c118cSDmitry Torokhov 59b08c118cSDmitry TorokhovThis packet is used to indicate the state of each button and the value of each 60b08c118cSDmitry Torokhovaxis:: 61b08c118cSDmitry Torokhov 62b08c118cSDmitry Torokhov OP= 01 for a joystick, 03 for a wheel 63b08c118cSDmitry Torokhov LEN= Varies from device to device 64b08c118cSDmitry Torokhov 00 X-Axis lsb 65b08c118cSDmitry Torokhov 01 X-Axis msb 66b08c118cSDmitry Torokhov 02 Y-Axis lsb, or gas pedal for a wheel 67b08c118cSDmitry Torokhov 03 Y-Axis msb, or brake pedal for a wheel 68b08c118cSDmitry Torokhov 04 Throttle 69b08c118cSDmitry Torokhov 05 Buttons 70b08c118cSDmitry Torokhov 06 Lower 4 bits: Buttons 71b08c118cSDmitry Torokhov Upper 4 bits: Hat 72b08c118cSDmitry Torokhov 07 Rudder 73b08c118cSDmitry Torokhov 74b08c118cSDmitry TorokhovDevice effects states 75b08c118cSDmitry Torokhov===================== 76b08c118cSDmitry Torokhov 77b08c118cSDmitry Torokhov:: 78b08c118cSDmitry Torokhov 79b08c118cSDmitry Torokhov OP= 02 80b08c118cSDmitry Torokhov LEN= Varies 81b08c118cSDmitry Torokhov 00 ? Bit 1 (Value 2) is the value of the deadman switch 82b08c118cSDmitry Torokhov 01 Bit 8 is set if the effect is playing. Bits 0 to 7 are the effect id. 83b08c118cSDmitry Torokhov 02 ?? 84b08c118cSDmitry Torokhov 03 Address of parameter block changed (lsb) 85b08c118cSDmitry Torokhov 04 Address of parameter block changed (msb) 86b08c118cSDmitry Torokhov 05 Address of second parameter block changed (lsb) 87b08c118cSDmitry Torokhov ... depending on the number of parameter blocks updated 88b08c118cSDmitry Torokhov 89b08c118cSDmitry TorokhovForce effect 90b08c118cSDmitry Torokhov------------ 91b08c118cSDmitry Torokhov 92b08c118cSDmitry Torokhov:: 93b08c118cSDmitry Torokhov 94b08c118cSDmitry Torokhov OP= 01 95b08c118cSDmitry Torokhov LEN= 0e 96b08c118cSDmitry Torokhov 00 Channel (when playing several effects at the same time, each must 97b08c118cSDmitry Torokhov be assigned a channel) 98b08c118cSDmitry Torokhov 01 Wave form 99b08c118cSDmitry Torokhov Val 00 Constant 100b08c118cSDmitry Torokhov Val 20 Square 101b08c118cSDmitry Torokhov Val 21 Triangle 102b08c118cSDmitry Torokhov Val 22 Sine 103b08c118cSDmitry Torokhov Val 23 Sawtooth up 104b08c118cSDmitry Torokhov Val 24 Sawtooth down 105b08c118cSDmitry Torokhov Val 40 Spring (Force = f(pos)) 106b08c118cSDmitry Torokhov Val 41 Friction (Force = f(velocity)) and Inertia 107b08c118cSDmitry Torokhov (Force = f(acceleration)) 108b08c118cSDmitry Torokhov 109b08c118cSDmitry Torokhov 110b08c118cSDmitry Torokhov 02 Axes affected and trigger 111b08c118cSDmitry Torokhov Bits 4-7: Val 2 = effect along one axis. Byte 05 indicates direction 112b08c118cSDmitry Torokhov Val 4 = X axis only. Byte 05 must contain 5a 113b08c118cSDmitry Torokhov Val 8 = Y axis only. Byte 05 must contain b4 114b08c118cSDmitry Torokhov Val c = X and Y axes. Bytes 05 must contain 60 115b08c118cSDmitry Torokhov Bits 0-3: Val 0 = No trigger 116b08c118cSDmitry Torokhov Val x+1 = Button x triggers the effect 117b08c118cSDmitry Torokhov When the whole byte is 0, cancel the previously set trigger 118b08c118cSDmitry Torokhov 119b08c118cSDmitry Torokhov 03-04 Duration of effect (little endian encoding, in ms) 120b08c118cSDmitry Torokhov 121b08c118cSDmitry Torokhov 05 Direction of effect, if applicable. Else, see 02 for value to assign. 122b08c118cSDmitry Torokhov 123b08c118cSDmitry Torokhov 06-07 Minimum time between triggering. 124b08c118cSDmitry Torokhov 125b08c118cSDmitry Torokhov 08-09 Address of periodicity or magnitude parameters 126b08c118cSDmitry Torokhov 0a-0b Address of attack and fade parameters, or ffff if none. 127b08c118cSDmitry Torokhov *or* 128b08c118cSDmitry Torokhov 08-09 Address of interactive parameters for X-axis, 129b08c118cSDmitry Torokhov or ffff if not applicable 130b08c118cSDmitry Torokhov 0a-0b Address of interactive parameters for Y-axis, 131b08c118cSDmitry Torokhov or ffff if not applicable 132b08c118cSDmitry Torokhov 133b08c118cSDmitry Torokhov 0c-0d Delay before execution of effect (little endian encoding, in ms) 134b08c118cSDmitry Torokhov 135b08c118cSDmitry Torokhov 136b08c118cSDmitry TorokhovTime based parameters 137b08c118cSDmitry Torokhov--------------------- 138b08c118cSDmitry Torokhov 139b08c118cSDmitry TorokhovAttack and fade 140b08c118cSDmitry Torokhov^^^^^^^^^^^^^^^ 141b08c118cSDmitry Torokhov 142b08c118cSDmitry Torokhov:: 143b08c118cSDmitry Torokhov 144b08c118cSDmitry Torokhov OP= 02 145b08c118cSDmitry Torokhov LEN= 08 146b08c118cSDmitry Torokhov 00-01 Address where to store the parameters 147b08c118cSDmitry Torokhov 02-03 Duration of attack (little endian encoding, in ms) 148b08c118cSDmitry Torokhov 04 Level at end of attack. Signed byte. 149b08c118cSDmitry Torokhov 05-06 Duration of fade. 150b08c118cSDmitry Torokhov 07 Level at end of fade. 151b08c118cSDmitry Torokhov 152b08c118cSDmitry TorokhovMagnitude 153b08c118cSDmitry Torokhov^^^^^^^^^ 154b08c118cSDmitry Torokhov 155b08c118cSDmitry Torokhov:: 156b08c118cSDmitry Torokhov 157b08c118cSDmitry Torokhov OP= 03 158b08c118cSDmitry Torokhov LEN= 03 159b08c118cSDmitry Torokhov 00-01 Address 160b08c118cSDmitry Torokhov 02 Level. Signed byte. 161b08c118cSDmitry Torokhov 162b08c118cSDmitry TorokhovPeriodicity 163b08c118cSDmitry Torokhov^^^^^^^^^^^ 164b08c118cSDmitry Torokhov 165b08c118cSDmitry Torokhov:: 166b08c118cSDmitry Torokhov 167b08c118cSDmitry Torokhov OP= 04 168b08c118cSDmitry Torokhov LEN= 07 169b08c118cSDmitry Torokhov 00-01 Address 170b08c118cSDmitry Torokhov 02 Magnitude. Signed byte. 171b08c118cSDmitry Torokhov 03 Offset. Signed byte. 172b08c118cSDmitry Torokhov 04 Phase. Val 00 = 0 deg, Val 40 = 90 degs. 173b08c118cSDmitry Torokhov 05-06 Period (little endian encoding, in ms) 174b08c118cSDmitry Torokhov 175b08c118cSDmitry TorokhovInteractive parameters 176b08c118cSDmitry Torokhov---------------------- 177b08c118cSDmitry Torokhov 178b08c118cSDmitry Torokhov:: 179b08c118cSDmitry Torokhov 180b08c118cSDmitry Torokhov OP= 05 181b08c118cSDmitry Torokhov LEN= 0a 182b08c118cSDmitry Torokhov 00-01 Address 183b08c118cSDmitry Torokhov 02 Positive Coeff 184b08c118cSDmitry Torokhov 03 Negative Coeff 185b08c118cSDmitry Torokhov 04+05 Offset (center) 186b08c118cSDmitry Torokhov 06+07 Dead band (Val 01F4 = 5000 (decimal)) 187b08c118cSDmitry Torokhov 08 Positive saturation (Val 0a = 1000 (decimal) Val 64 = 10000 (decimal)) 188b08c118cSDmitry Torokhov 09 Negative saturation 189b08c118cSDmitry Torokhov 190b08c118cSDmitry TorokhovThe encoding is a bit funny here: For coeffs, these are signed values. The 191b08c118cSDmitry Torokhovmaximum value is 64 (100 decimal), the min is 9c. 192b08c118cSDmitry TorokhovFor the offset, the minimum value is FE0C, the maximum value is 01F4. 193b08c118cSDmitry TorokhovFor the deadband, the minimum value is 0, the max is 03E8. 194b08c118cSDmitry Torokhov 195b08c118cSDmitry TorokhovControls 196b08c118cSDmitry Torokhov-------- 197b08c118cSDmitry Torokhov 198b08c118cSDmitry Torokhov:: 199b08c118cSDmitry Torokhov 200b08c118cSDmitry Torokhov OP= 41 201b08c118cSDmitry Torokhov LEN= 03 202b08c118cSDmitry Torokhov 00 Channel 203b08c118cSDmitry Torokhov 01 Start/Stop 204b08c118cSDmitry Torokhov Val 00: Stop 205b08c118cSDmitry Torokhov Val 01: Start and play once. 206b08c118cSDmitry Torokhov Val 41: Start and play n times (See byte 02 below) 207b08c118cSDmitry Torokhov 02 Number of iterations n. 208b08c118cSDmitry Torokhov 209b08c118cSDmitry TorokhovInit 210b08c118cSDmitry Torokhov---- 211b08c118cSDmitry Torokhov 212b08c118cSDmitry Torokhov 213b08c118cSDmitry TorokhovQuerying features 214b08c118cSDmitry Torokhov^^^^^^^^^^^^^^^^^ 215b08c118cSDmitry Torokhov:: 216b08c118cSDmitry Torokhov 217b08c118cSDmitry Torokhov OP= ff 218b08c118cSDmitry Torokhov Query command. Length varies according to the query type. 219b08c118cSDmitry Torokhov The general format of this packet is: 220b08c118cSDmitry Torokhov ff 01 QUERY [INDEX] CHECKSUM 221b08c118cSDmitry Torokhov responses are of the same form: 222b08c118cSDmitry Torokhov FF LEN QUERY VALUE_QUERIED CHECKSUM2 223b08c118cSDmitry Torokhov where LEN = 1 + length(VALUE_QUERIED) 224b08c118cSDmitry Torokhov 225b08c118cSDmitry TorokhovQuery ram size 226b08c118cSDmitry Torokhov~~~~~~~~~~~~~~ 227b08c118cSDmitry Torokhov 228b08c118cSDmitry Torokhov:: 229b08c118cSDmitry Torokhov 230b08c118cSDmitry Torokhov QUERY = 42 ('B'uffer size) 231b08c118cSDmitry Torokhov 232b08c118cSDmitry TorokhovThe device should reply with the same packet plus two additional bytes 233b08c118cSDmitry Torokhovcontaining the size of the memory: 234b08c118cSDmitry Torokhovff 03 42 03 e8 CS would mean that the device has 1000 bytes of ram available. 235b08c118cSDmitry Torokhov 236b08c118cSDmitry TorokhovQuery number of effects 237b08c118cSDmitry Torokhov~~~~~~~~~~~~~~~~~~~~~~~ 238b08c118cSDmitry Torokhov 239b08c118cSDmitry Torokhov:: 240b08c118cSDmitry Torokhov 241b08c118cSDmitry Torokhov QUERY = 4e ('N'umber of effects) 242b08c118cSDmitry Torokhov 243b08c118cSDmitry TorokhovThe device should respond by sending the number of effects that can be played 244b08c118cSDmitry Torokhovat the same time (one byte) 245b08c118cSDmitry Torokhovff 02 4e 14 CS would stand for 20 effects. 246b08c118cSDmitry Torokhov 247b08c118cSDmitry TorokhovVendor's id 248b08c118cSDmitry Torokhov~~~~~~~~~~~ 249b08c118cSDmitry Torokhov 250b08c118cSDmitry Torokhov:: 251b08c118cSDmitry Torokhov 252b08c118cSDmitry Torokhov QUERY = 4d ('M'anufacturer) 253b08c118cSDmitry Torokhov 254b08c118cSDmitry TorokhovQuery the vendors'id (2 bytes) 255b08c118cSDmitry Torokhov 256b08c118cSDmitry TorokhovProduct id 257b08c118cSDmitry Torokhov~~~~~~~~~~ 258b08c118cSDmitry Torokhov 259b08c118cSDmitry Torokhov:: 260b08c118cSDmitry Torokhov 261b08c118cSDmitry Torokhov QUERY = 50 ('P'roduct) 262b08c118cSDmitry Torokhov 263b08c118cSDmitry TorokhovQuery the product id (2 bytes) 264b08c118cSDmitry Torokhov 265b08c118cSDmitry TorokhovOpen device 266b08c118cSDmitry Torokhov~~~~~~~~~~~ 267b08c118cSDmitry Torokhov 268b08c118cSDmitry Torokhov:: 269b08c118cSDmitry Torokhov 270b08c118cSDmitry Torokhov QUERY = 4f ('O'pen) 271b08c118cSDmitry Torokhov 272b08c118cSDmitry TorokhovNo data returned. 273b08c118cSDmitry Torokhov 274b08c118cSDmitry TorokhovClose device 275b08c118cSDmitry Torokhov~~~~~~~~~~~~ 276b08c118cSDmitry Torokhov 277b08c118cSDmitry Torokhov:: 278b08c118cSDmitry Torokhov 279b08c118cSDmitry Torokhov QUERY = 43 ('C')lose 280b08c118cSDmitry Torokhov 281b08c118cSDmitry TorokhovNo data returned. 282b08c118cSDmitry Torokhov 283b08c118cSDmitry TorokhovQuery effect 284b08c118cSDmitry Torokhov~~~~~~~~~~~~ 285b08c118cSDmitry Torokhov 286b08c118cSDmitry Torokhov:: 287b08c118cSDmitry Torokhov 288b08c118cSDmitry Torokhov QUERY = 45 ('E') 289b08c118cSDmitry Torokhov 290b08c118cSDmitry TorokhovSend effect type. 291b08c118cSDmitry TorokhovReturns nonzero if supported (2 bytes) 292b08c118cSDmitry Torokhov 293b08c118cSDmitry TorokhovFirmware Version 294b08c118cSDmitry Torokhov~~~~~~~~~~~~~~~~ 295b08c118cSDmitry Torokhov 296b08c118cSDmitry Torokhov:: 297b08c118cSDmitry Torokhov 298b08c118cSDmitry Torokhov QUERY = 56 ('V'ersion) 299b08c118cSDmitry Torokhov 300b08c118cSDmitry TorokhovSends back 3 bytes - major, minor, subminor 301b08c118cSDmitry Torokhov 302b08c118cSDmitry TorokhovInitialisation of the device 303b08c118cSDmitry Torokhov^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 304b08c118cSDmitry Torokhov 305b08c118cSDmitry TorokhovSet Control 306b08c118cSDmitry Torokhov~~~~~~~~~~~ 307b08c118cSDmitry Torokhov 308b08c118cSDmitry Torokhov.. note:: 309b08c118cSDmitry Torokhov Device dependent, can be different on different models! 310b08c118cSDmitry Torokhov 311b08c118cSDmitry Torokhov:: 312b08c118cSDmitry Torokhov 313b08c118cSDmitry Torokhov OP= 40 <idx> <val> [<val>] 314b08c118cSDmitry Torokhov LEN= 2 or 3 315b08c118cSDmitry Torokhov 00 Idx 316b08c118cSDmitry Torokhov Idx 00 Set dead zone (0..2048) 317b08c118cSDmitry Torokhov Idx 01 Ignore Deadman sensor (0..1) 318b08c118cSDmitry Torokhov Idx 02 Enable comm watchdog (0..1) 319b08c118cSDmitry Torokhov Idx 03 Set the strength of the spring (0..100) 320b08c118cSDmitry Torokhov Idx 04 Enable or disable the spring (0/1) 321b08c118cSDmitry Torokhov Idx 05 Set axis saturation threshold (0..2048) 322b08c118cSDmitry Torokhov 323b08c118cSDmitry TorokhovSet Effect State 324b08c118cSDmitry Torokhov~~~~~~~~~~~~~~~~ 325b08c118cSDmitry Torokhov 326b08c118cSDmitry Torokhov:: 327b08c118cSDmitry Torokhov 328b08c118cSDmitry Torokhov OP= 42 <val> 329b08c118cSDmitry Torokhov LEN= 1 330b08c118cSDmitry Torokhov 00 State 331b08c118cSDmitry Torokhov Bit 3 Pause force feedback 332b08c118cSDmitry Torokhov Bit 2 Enable force feedback 333b08c118cSDmitry Torokhov Bit 0 Stop all effects 334b08c118cSDmitry Torokhov 335b08c118cSDmitry TorokhovSet overall 336b08c118cSDmitry Torokhov~~~~~~~~~~~ 337b08c118cSDmitry Torokhov 338b08c118cSDmitry Torokhov:: 339b08c118cSDmitry Torokhov 340b08c118cSDmitry Torokhov OP= 43 <val> 341b08c118cSDmitry Torokhov LEN= 1 342b08c118cSDmitry Torokhov 00 Gain 343b08c118cSDmitry Torokhov Val 00 = 0% 344b08c118cSDmitry Torokhov Val 40 = 50% 345b08c118cSDmitry Torokhov Val 80 = 100% 346b08c118cSDmitry Torokhov 347b08c118cSDmitry TorokhovParameter memory 348b08c118cSDmitry Torokhov---------------- 349b08c118cSDmitry Torokhov 350b08c118cSDmitry TorokhovEach device has a certain amount of memory to store parameters of effects. 351b08c118cSDmitry TorokhovThe amount of RAM may vary, I encountered values from 200 to 1000 bytes. Below 352b08c118cSDmitry Torokhovis the amount of memory apparently needed for every set of parameters: 353b08c118cSDmitry Torokhov 354b08c118cSDmitry Torokhov - period : 0c 355b08c118cSDmitry Torokhov - magnitude : 02 356b08c118cSDmitry Torokhov - attack and fade : 0e 357b08c118cSDmitry Torokhov - interactive : 08 358b08c118cSDmitry Torokhov 359b08c118cSDmitry TorokhovAppendix: How to study the protocol? 360b08c118cSDmitry Torokhov==================================== 361b08c118cSDmitry Torokhov 362b08c118cSDmitry Torokhov1. Generate effects using the force editor provided with the DirectX SDK, or 363b08c118cSDmitry Torokhovuse Immersion Studio (freely available at their web site in the developer section: 364b08c118cSDmitry Torokhovwww.immersion.com) 365b08c118cSDmitry Torokhov2. Start a soft spying RS232 or USB (depending on where you connected your 366b08c118cSDmitry Torokhovjoystick/wheel). I used ComPortSpy from fCoder (alpha version!) 367b08c118cSDmitry Torokhov3. Play the effect, and watch what happens on the spy screen. 368b08c118cSDmitry Torokhov 369b08c118cSDmitry TorokhovA few words about ComPortSpy: 370b08c118cSDmitry TorokhovAt first glance, this software seems, hum, well... buggy. In fact, data appear with a 371b08c118cSDmitry Torokhovfew seconds latency. Personally, I restart it every time I play an effect. 372b08c118cSDmitry TorokhovRemember it's free (as in free beer) and alpha! 373b08c118cSDmitry Torokhov 374b08c118cSDmitry TorokhovURLS 375b08c118cSDmitry Torokhov==== 376b08c118cSDmitry Torokhov 377b08c118cSDmitry TorokhovCheck http://www.immerse.com for Immersion Studio, 378b08c118cSDmitry Torokhovand http://www.fcoder.com for ComPortSpy. 379b08c118cSDmitry Torokhov 380b08c118cSDmitry Torokhov 381b08c118cSDmitry TorokhovI-Force is trademark of Immersion Corp. 382