Derived from http://translate.google.com/translate?js=n&prev=_t&hl=cs&ie=UTF-8&layout=2&eotf=1&sl=de&tl=en&u=http%3A%2F%2Fslotbaer.de%2Findex.php%2Fscx-digital%2F63-scx-digital-daten-protokoll&act=url Original source http://slotbaer.de/index.php/scx-digital/63-scx-digital-daten-protokoll Outline ======= The control unit broadcasts data packets across the track. The packets are 9 bytes long, and the structure is the following: 0x55 packet_type data_byte1..6 crc The Ole Seeberg's interface adds 0x05 (05 = O.S. :-) after each packet. This byte can be safely ignored. There can be noise on the track, so sometimes the packets are received by a reader with an incorrect checksum. Those should be discarded. The bus reader apparently does not report packets which are sent by the cars. Packet types ============ 0xAA - bus free time -------------------- Format: 0x55 0xAA N1 N2 0xF0 0xF0 0xF0 0xF0 CRC Sent twice after the car crosses the finish line. This is a message to the car instructing it to send its ID after the given delay. The delay is the ratio of the N1 and N2 numbers. No need to handle this, it is for cars, not race management. N1, N2 - fraction specifiying the bus free time. My Pit box with 020 firmware sends the first packet with 0x0C 0x06, and the second one with 0x18 0x06 Example: 55 AA 0C 06 F0 F0 F0 F0 7B 55 AA 18 06 F0 F0 F0 F0 93 0xCC - car programming ---------------------- Format: 0x55 0xCC CTRL 0xFE 0xFF 0xFF 0xFF 0xFF CRC Sent twice when matching the car to the particular controller. CTRL: Bit 7 - always 1 Bits 6-3 - always 0 Bits 2-0 - number of the controller (starting from 0) Example: TBD 0xD0 - reset ------------ Format: 0x55 0xD0 0xFF N1 N2 0xAA 0xAA 0xAA CRC N1, N2 forms the ratio, probably used as a challenge for car control units Example: 55 D0 FF 0A 05 AA AA AA AD 0xD3 - standings ---------------- Format: 0x55 0xD3 P0-P5 CRC Sent after passing the start/finish line for the first time in a race and then every 300 ms. P0-P5: one byte for each position, starts with the leader. 0xFF means there is no car on this position (for example, when not all cars have passed the start line) Bit 7 - 1 if the car is more than 15 laps behind the leader Bits 6-3 - number of laps behind the leader (0-15, set to 0 when bit 7 is set to 1) Bits 2-0 - vehicle number (0-5) Example: 55 D3 81 FF FF FF FF FF 2C 0xD4 - lap time --------------- Format: 0x55 0xD4 ID R1 R2 MS T1 T2 CRC Sent after passing the finish line and then every 300 ms. Lap count and last lap time of the specified vehicle. ID: car number (0-5) R1: Round number - higher byte R2: Round number - lower byte (bit 0 is always zero) MS: miscellaneous Bits 7-4 - always 0 Bit 3 - least significant bit of T1 Bit 2 - unknown Bit 1 - unknown Bit 0 - least significant bit of R2 T1: Lap time - higher byte (bit 0 is always zero) T2: Lap time - lower byte So the lap number is 256*R1 + R2 + MS & 0x01, and the time is 256*T1 + (MS & 0x08 ? 1 : 0) Example: 55 D4 01 00 00 01 00 00 59 (round 1 - after crossing the start line) 55 D4 01 00 02 08 00 E8 32 (round 2) 55 D4 01 00 02 0D 00 B6 3C (round 3) 55 D4 01 00 04 0C 04 98 69 (round 4) Box entry example 32.203 55 d4 02 00 06 0d 00 fe 4f 05 # Car 2 round 7 time ff .. 32.315 55 d4 02 00 06 01 00 00 a9 05 # Car 2 round 7 time 00 34.005 55 d4 02 00 06 09 fe fe 13 05 # Here the back button has been presed 0xD5 - race setup ----------------- Format: 0x055 0xD5 DI R2-R0 0xFF 0xFF CRC Sent when the Start button is pressed for two seconds, i.e. before the start of the race. DI - lap counting direction. 0x00 means counting from 0 upwards, 0xFF means counting from preset number of laps downwards. R2-R0 - number of laps. Only lower 4 bits are used, so the count can be obtained as 256*R2 + 16*R1 + R0 Example: 55 D5 00 FF FF FF FF FF 83 55 D5 FF 00 00 04 FF FF CF 0xD6 - fuel level ----------------- Format: 0x55 0xD6 F0-F2 N1 N2 B CRC Sent about every 500 ms, current fuel level F0-F2 - encodes the fuel level for each car in 4 bits (values 0-8); car 0 is in higher-order bits of F0 (F0 >> 4), car 5 is in lower-order bits of F2 (F2 & 0x0F). N1,N2 - fuel consumption ratio (e.g. 0x14 0x50 means 0.25, 0x00 0x50 means the race w/o fuel consumption). B - 0xAA, but the source reports that 0xFF has been rarely seen here as well. Example: 55 D6 88 88 88 00 50 AA 3D 55 D6 88 18 88 14 50 AA 7F A packet with 0xA fuel level has been seen: 55 D6 AA 88 88 14 50 AA 25 - this is with cars 0 and 1 active. The meaning of this still has to be determined. 0xD7 - brake setting -------------------- Format: 0x55 0xD7 CT BR 0x83 0x93 0xDB 0xFF CRC CT - the controller which had the back button pressed (0-5) BR - brake level (0x00 - 0 %, 0x02 - 50 %, 0x04 - 100 %) Example: TBD 0xDB - qualification -------------------- Format: 0x55 0xDB R2-R0 NR 0xFF 0xFF CRC Sent after the start of the qualification. R2-R0 - number of laps. Only lower 4 bits are used, so the count can be obtained as 256*R2 + 16*R1 + R0 NR - number of cars participating in the qualification 0xDC - end of the race ---------------------- Format: 0x55 0xDC 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF CRC Sent twice when the last vehicle crosses the finish line or the race is stopped. Example: 55 DC FF FF FF FF FF FF DF 0xDD - race start ----------------- Format: 0x55 0xDD 0x00 0xAA 0xAA 0xAA 0xAA 0xAA CRC Sent twice after the reset packet (0xD0) has been sent twice. Example: 55 DD 00 AA AA AA AA AA 42 0xDE - display change --------------------- Format: 0x55 0xDE WE 0xFF 0xFF 0xFF 0xFF 0xFF CRC WE - 0 or 1 Sent in the RES mode: after the SELECT button is pressed for the first time, no packet is sent. The second time the packet with WE = 0 is sent, the third time two packets are sent (one weith WE = 0 and one with WE = 1), and the fourth time two packets are sent (one with WE = 1 and one with WE = 0). Example: TBD 0xEE - finish line ------------------ Format: 0x05 0xEE R0-R5 CRC Sent after the car crosses the finish line and sends back its ID. R0-R5 - one byte for each car. 0xE7 means that this car has crossed the finish line, every other value means it did not cross it: 0xAA is sent for unconnected controllers. Example: 55 EE F0 E7 F0 AA AA AA 3C 55 EE FE FE E7 AA AA AA 1E # Car 2 crosses normal finish line 55 EE 02 00 E7 01 00 00 CF # Car 2 drives through pit lane 55 EE 82 FF E7 FF FF Ff 90 # Car 2 enters pit lane too fast 55 EE F0 F0 E7 AA AA AA B1 # Car 2 enters pit lane 55 EE 83 78 E7 14 50 AA 04 # Car 2 enters pit lane too fast? 0xFF - controller status ------------------------ Format: 0x55 0xFF R0-R5 CRC Sent approximately every 102 ms, or when the change is detected. R0-R5: For each controller there is one byte. 0xAA - set when the controller is not connected otherwise, the bits have the following meaning: Bit 7 - always 1 Bit 6 - always 1 Bit 5 - lights (0 = on, 1 = off) (note the lights setting is reported for each controller, even though the control unit can set it only for all cars at once) Bit 4 - back button (0 = pressed, 1 = not pressed) Bits 3-0 - throttle (values 0-12 in normal mode, 0-8 in junior mode, and 0-6 in the pit lane) Example: 55 FF F0 F0 F0 AA AA AA 7D - controllers 1-3 present and idle, 4-6 not connected