Suunto Spyder, Vyper and Cobra Protocol

Suunto Transfer and Data Protocol

History:

0. Open Questions / Unknown things

1. Communication

The protocol uses 2400 8O1, which means 2300 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. The test is simple: the computer sends AT plus a CR ($0D) and awaits the same answer.

2. Transfer

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];

3. Memory layout of the Spyder

offset format testvalue content
$0000-$0015 MSB binary ... unused by the PC software, probably configuration values for the computer
$0016-$0017 MSB binary $0102 Firmware version of the Spyder (old ACW $0101, new ACW $0102)
$0018-$001B 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
$001C-$001D MSB binary ... Ptr to the last $82 byte in the profile ringbuffer
$001E-$001F 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)
$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 ACW?)
$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 ... profile memory

The ring-buffer is a stream of data, which ends at the position, that is marked in the header.

One dive has this format:

offset format testvalue content
0 MSB binary $00 unknown
? air preassure at the end of the dive?
1 MSB binary $18 temperature in degress celcius
2... binary profile data from the end to the beginning of the dive!
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 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.
special values:
  • $82 = End of data (only used in the internal memory)
  • $81 = Slow
  • $80 = End (end of dive)
  • $7f = ERR (decompression missed)
  • $7e = ASC (dive is now a decompression dive)
  • $7d = Surfaced
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 (99 = 1999, 00 = 2000)
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 repetetive dives)
n + 9 MSB binary ... hours of the surface interval
n + 10 MSB binary ... minutes of the surface interval

4. Memory layout of the Vyper and Cobra

offset format testvalue content
$0000-$0015 MSB binary ... unused by the PC software, probably configuration values for the computer
$0016-$0019 MSB binary ... Firmware version and/or computer type?!? Vyper: $0001A91C, Cobra: $0003631C
$001E-$001F MSB binary ... 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 (10s, 20s, 30s or 60s)
$26-$29 MSB binary ... serialnumber e.g. Vyper: $0001.04.41 (= 010465), Cobra: $0000.5A.38 (= 009056)
$2A-$2B MSB binary ... unknown
$2C-$49 ASCII Vyper Diver personal information ("Vyper Diver" or "Cobra Diver", otherwise filled to the maximum length with spaces)
$4A-$50 MSB binary ... unknown
$51-$52 MSB binary ... Ptr to the last $82 byte in the profile ringbuffer
$53 MSB binary ... Cobra? Interval (20s)
$54 MSB binary ... altitude and personal settings (height (0..2) + 3 * personal (0..2))
$55-$61 MSB binary ... unknown
$62 MSB binary ... 00 = imperial, 01 = metric
$63 MSB binary ... Model (0: Air, 1:Nitrox, 2:Gauge)
$64 MSB binary ... Light (Bit 7: on; Bit 0..6: time in s)
$65 MSB binary ... Bit 0: dive time alarm = on
Bit 1: dive depth alarm = on
$66 MSB binary ... unknown
$67 MSB binary ... dive time for the alarm in minutes
$68-$69 MSB binary ... depth for the alarm in ft * 128.0 ($419E = 40m, $40CC = 39.5m, Cobra: $4180 in feet, $41A0 in metric)
$6A-$70 MSB binary ... unknown
$71-$1FFF MSB binary ... profile memory

The ring-buffer is a stream of data, which ends at the position, that is marked in the header.

One dive has this format:

offset format testvalue content
0 MSB binary ... hours of the surface interval
1 MSB binary ... minutes of the surface interval
2 MSB binary ... dive number in the Vyper/Cobra (for repetetive dives)
3 MSB binary ... interval (10s, 20s, 30s or 60s)
4 altitude and personal settings (height (0..2) + 3 * personal (0..2))
5 preassure at the beginning of the dive in bar / 2
6 Oxygen in % (= Nitrox mode, air mode: 0); Bit 6 & 7 are ignored.
7 ? unused? (PO2??? 0=1.2, 1=1.3, 2=1.4, 3=1.5, 4=1.6???)
8 temperature of the air in degress celcius
9 year at the beginning of the dive (99 = 1999, 00 = 2000)
10 month at the beginning of the dive
11 day at the beginning of the dive
12 hours at the beginning of the dive
13 minutes at the beginning of the dive
14... binary profile data of the dive!
The profile data is a stream of bytes. Every minute (or 30s or 20s or 10s - see the profile interval) a byte is recorded. This byte is the delta depth 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.
special values:
  • $79 = unused
  • $7A = Slow (The diver ascended above dive depth limit. This symbol marks every interval in which the SLOW indicator appeared.)
  • $7B = (Dive Attention Mark as described in the dive computer user manual.)
  • $7C = (Bookmark. The diver pressed the PLAN button during this interval.)
  • $7D = Surfaced (The diver ascended above the minimum diving depth during this interval.)
  • $7E = ASC (A decompression ceiling first appeared during this interval. The dive computer's ASC indicator appeared.)
  • $7F = (The diver ascended above the decompression ceiling during this interval.)
  • $80 = End (end of dive)
  • $81 = (The diver ascended above a mandatory safety stop ceiling during this interval.)
  • $82 = End of data (only used in the internal memory)
  • $83 = unused
  • $84 = unused
  • $85 = unused
  • $86 = unused
  • $87 = unused
n MSB binary ... temperature at the max depth in degress celcius
n + 1 MSB binary ... temperature at the end of the dive in degress celcius
n + 2 MSB binary ... preassure at the end of the dive in bar / 2
n + 3 MSB binary ... 00 with Nitrox: OLF % * 2 ($32 * 2 = 100 CNS)

5. necessary Conversions

meter := int(feet * 0.3048 * 10) / 10
psi := bar * 14.50377377
fahrenheit := celcius * 1.8 + 32

[1.2] altitude :=
0: 700m, 2300ft
1: 1500m, 5000ft
2: 2400m, 8000ft