This document describes the transfer protocol and memory layout of these Suunto diving computers:
- Suunto Sypder
The protocol uses 2400 8O1, which means 2400 baud with 8 bits, odd parity and 1 stop-bit. The check for the interfaces uses 2400 8N1, but it also works with 2400 8O1. This was the trivial part… But some lines have a special meaning with the interface!
The DTR line should always be set. It is used as a power supply for the interface.
RTS is a toggle for the direction of the half-duplex interface. To send a command to the interface, set RTS. When you await a command, clear RTS. Timing also seems to be critical! To make sure that all data is sent to the interface, before clearing RTS, I wait about 200ms. After clearing RTS, I also have to wait 400ms and use a 500ms timeout for receiving data.
The test for the existance of the interface is simple: the computer sends AT plus a CR ($41, $54, $0D) and awaits the same answer.
The protocol for the Suunto Spyder, Vyper and Cobra are identical, but the memory layout of the Spyder is different. All data is send in packages to and from the computer. Every package is followed by a CRC for checksum reasons.
unsigned char checksum = 0x00; for(int i=0; i<packageLen; ++i) checksum ^= package[i];
- Read memory
- to Spyder: 05 + addr_high + addr_low + count (1..32) + CRC
- from Spyder: 05 + addr_high + addr_low + count (1..32) + n Bytes + CRC
- Write memory
- to Spyder: 06 + addr_high + addr_low + count (1..31)+ n Bytes + CRC
- from Spyder: 06 + addr_high + addr_low + count (1..31) + CRC
- Used before every ‘Write memory’ call
- to Spyder: 07 + $a5 + CRC
- from Spyder: 07 + $a5 + CRC
- Get first dive profile
- to Spyder: 08 + $a5 + CRC
- from Spyder: 08 + count (1..32) + n Bytes + CRC (if more than 32 bytes needs to be transmitted, they are split in 32 byte packages)
- Get next dive profile
- to Spyder: 09 + $a5 + CRC
- from Spyder: 09 + count (1..32) + n Bytes + CRC (if more than 32 bytes needs to be transmitted, they are split in 32 byte packages)
The DiveManager Software from Suunto does the following when reading data from a Spyder: – Check for correct computer – Read Memory ($24, 1) – Read the internal memory: – Read Memory ($1E, 14) – Read Memory ($2C, 32) – Read Memory ($53, 30) – Get first dive profile – Get next dive profile – … – If “next dive profile” returns a null package, the end of the log memory is reached.
Default name of the LOG file: ‘‘PROFILE.ACW’’
offset | format | testvalue | content
|$00-$15||MSB binary||…||unused by the PC software, probably configuration values for the computer|
|$16-$17||MSB binary||$0102||Firmware version of the Spyder (old ACW $0101, new ACW $0102)|
|$18-$1B||MSB binary||…||Serialnumber (new ACW, e.g. $0002.0F7F = 203.967) or ID no. (old ACW, e.g. $2E.61.122E = 469704654) of the Spyder|
|$1C-$1D||MSB binary||…||Ptr to the last $82 byte in the profile ringbuffer|
|$1E-$1F||MSB binary||$3F46||max. depth in ft * 128.0|
|$20-$21||MSB binary||…||total dive time in minutes|
|$22-$23||MSB binary||…||total number of dives|
|$24||MSB binary||$14||interval (20s, 30s or 60s, Changing ist not allowed by DiveManager software! Why? Marketing?)|
|$25||MSB binary||…||altitude and personal settings (height (0..2) + 3 * personal (0..2))|
|$26-$2B||MSB binary||…||? ($0B,$03,$1F,$FF,$1F,$FF : identical on all Suunto computers?)|
|$2C-$49||ASCII||ACW Diver||personal information (“ACW Diver”, otherwise filled to the maximum length with spaces)|
|$4A-$4B||MSB binary||…||? ($01, $01 : identical on all ACW?!? Version of the profile memory?)|
|$4C-$1FFF||MSB binary||…||ring buffer for the profile memory|
The ring-buffer is a stream of data, which ends at the position, that is marked in the header. At this position the computer starts writing the information from the next dive. If the write pointer reaches the value $2000, it jumps back to $4C.
Format for one dive
|0||MSB binary||unknown — air preassure at the end of the dive?|
|1||MSB binary||temperature in degress celcius.|
|2…||binary||profile data from the end to the beginning of the dive,this means reverse order!|
|n||MSB binary||minutes at the beginning of the dive|
|n + 1||MSB binary||hours at the beginning of the dive|
|n + 2||MSB binary||day at the beginning of the dive|
|n + 3||MSB binary||month at the beginning of the dive|
|n + 4||MSB binary||year at the beginning of the dive (90..99 = 1990..1999, 00..89 = 2000..2089)|
|n + 5||MSB binary||altitude and personal settings (height (0..2) + 3 * personal (0..2))|
|n + 6||MSB binary||unknown — air preassure at the beginning of the dive?|
|n + 7||MSB binary||interval (20s, 30s or 60s)|
|n + 8||MSB binary||dive number in the Spyder (for repetitive dives)|
|n + 9||MSB binary||hours of the surface interval|
|n + 10||MSB binary||minutes of the surface interval|
The profile data is a stream of bytes. Every minute (or 30s or 20s – see the profile interval) a byte is recorded. This byte is the delta depth in ft to the last depth! E.g. you start your dive at a depth of 0 feet go down to 30ft in a minute, so the value is –30ft (because you go 30ft down) or $E2 in binary, if you then go up to 20ft, the next value will be +10ft (because you go 10ft up) or $0A in binary.
Some values have special meanings:
|$7d||Surfaced||you have reached the surface while (or after) the dive|
|$7e||ASC||dive now is a decompression dive|
|$80||End||end of the dive. The next byte is n + 1 in the format description of the dive.|
|$81||Slow||Slow warning while the dive. If the dive ends with $7d8180 (Surfaced, Slow, End) it means, you finished the dive with a blinking SLOW warning in the display.|
|$82||End of data||set after the last dive (written after the dive as a marker, so technically not profile information)|
meter = (int)(feet * 0.3048 * 10) / 10 psi = bar * 14.50377377 fahrenheit = celcius * 1.8 + 32
ATTN: the computers don’t round after the 2. digit, when calculating feet => meter! They cut it after the 2. digit. This results to the modified formula.