PC Protocol of Suunto EON/Solution/Vario

This document describes the transfer protocol and memory layout of these suunto diving computers:

The [[Suunto Solution]] is an older model with a different communication scheme.

Open Questions / Unknown things

Communication

The protocol uses 1200 8N2, which means 1200 baud with 8 bits, no parity and 2 stop-bits.

Transfer

You can send the following data to the EON:

Format of the P-block

The P-block has a $100 byte header and a $800 byte ring-buffer for the profile data plus a one byte checksum. The ring-buffer on a new interface only consists of $FF bytes.

The last byte after the P-block is a checksum:

unsigned char chk = 0x00;
for(int i=0; i<0x900; ++i)
 chk += buf[i];

The default name of the LOG files are: * “PROFILE.EON” for the Suunto Eon * “PROFILE.SOA” for the Suunto Solution Alpha * “PROFILE.SNV” for the Suunto Solution Nitrox/Vario

Header of the P-block

offset |     format     |  testvalue  | content

———- | ————– | ———– | ———– | 0-2 | MSB binary | $00015E | number of dives made with the computer (here: 180; from the history). I am not sure, if the upper byte is used (I haven’t made 65536 dives yet :-) | | 3-4 | MSB binary | $0258 | divetime under water in minutes (here: 600; from the history) | | 5-6 | MSB binary | $3F46 | max. depth (here: $3F46 / 128.0 = 126.5 feet; from the history) | | 7-8 | MSB binary | $0100 | $900 - this value = offset after the last dive (here: $800) | | 9 | MSB binary | $3C | current profile interval (here: 60s) | | 10 | MSB binary | $18 | altitude settings (value / 32 = Altitude, here: $18 / 32 = 0, so A0) [bit 0: unknown (always = 0?), bit 1: nitrox, bit 2: unknown (always = 0?), bit 3: metric, bit 4: air (= EON)] | | 11 | MSB binary | $60 | current year - 1900 (here: 96 => 1996, 00 would be 2000) | | 12..31 | ASCII | “EON - Markus Fritze ” | 20 bytes string, that is filled with spaces. Not zero terminated! If the owner name is never set, it contains $FF..$FF | | 32..210 | binary | $FF | unused? | | 211..243 | binary | $?? | unknown | | 244..246 | BCD | $502159 | serial number of the computer (here: 502159) | | 247..255 | binary | $?? | unknown |

Ring-Buffer of the P-block

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 $900, it jumps back to $100.

Format for one dive

offset format testvalue content
0 MSB binary $05 surface interval (minutes)
1 MSB binary $01 surface interval (hours) (here: 1:05)
2 MSB binary $01 repetitive dive counter (here: the first dive). The counter resets to 1, when the computer turns off after a longer pause. Every dive before that is a repetitive dive and increments the counter.
3 MSB binary $3C profile interval for this dive (here: 60s), this is necessary, because the interval may be changed after every dive and the ring-buffer still contains information about dives with other profile intervals.
4 MSB binary $38 altitude settings (value / 32 = Altitude, here: $18 / 32 = 0, so A0) – bit 0: unknown (always = 0?), bit 3: metric, bit 4: air (= EON)
5 MSB binary $64 A solution alpha always transmits a 0. on nitrox: nitrogen level
6 BCD $97 year (here: 1997). Year 2000 is $00
7 BCD $01 month (here: 1 = January)
8 BCD $31 day (here: 31)
9 BCD $13 hour (here: 13 or 1pm)
10 BCD $35 minute (here: 35)
11 … binary profile data
n MSB binary $80 end of the dive marker
n + 1 MSB binary $3C temperature at the dive in degree celcius - 40 (here: 60 - 40 = 20 degree celcius)
n + 2 MSB binary $19 tank preassure at the end of the dive in bar (here: 25 * 2 = 50bar) - A solution alpha always transmits a 0.

Profile information

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:

Byte Type Description
$7d Surfaced you have reached the surface while (or after) the dive
$7e ASC dive now is a decompression dive
$7f ERR decompression missed
$80 End end 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)

Necessary conversions

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

Altitude:

value meters feet
0 700m 2300ft
1 1500m 5000ft
2 2400m 8000ft

ATTN: the computers (checked on the solution alpha) don’t round after the 2. digit, when calculating feet => meter! They cut it after the 2. digit. This results to the modified formula.

Previous post:
Next post: