Suunto EON and Solution Alpha Computers

Suunto EON/Solution alpha Transfer and Data Protocol

History:

0. Open Questions / Unknown things

1. Communication

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

2. Transfer

You can send the following data to the EON:

3. Format of the P-block

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

[1.2] The last byte is a checksum:

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

The header has this format:

offset format testvalue content
0-2 MSB binary $00015E number of dives made with the EON (here: 180; from the EON history). I am not sure, if the upper byte is used (I havn't made 65536 dives yet :-)
3-4 MSB binary $0258 divetime under water in minutes (here: 600; from the EON history)
5-6 MSB binary $3F46 [1.2] max. depth (here: $3F46 / 128.0 = 126.5 feet; from the EON 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)
[1.2]:
bit 0: unknown (always = 0?)
bit 1: nitrox
bit 2: unknown (always = 0?)
bit 3: metric
bit 4: air (= EON)
11 MSB binary $60 [1.2] current year - 1900 (here: 96 => 1996)
12..31 ASCII "EON - Markus Fritze " 20 bytes string, that is filled with spaces. Not zero terminated! [1.1] 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 EON (here: 502159)
247..255 binary $?? unknown

The ring-buffer is a stream of data, which ends at the position, that is marked in the header. At this position the EON starts writing the information from the next dive. If the write pointer reaches the value $900, it jump back to $100.

One dive has this format:

offset format testvalue content
0 MSB binary $?? unknown
[1.2] the first byte in the data block seems the be the nitrogen level before the dive (at repetitive dives)
1 MSB binary $01 repetitive dive counter (here: the first dive). The counter resets to 1, when the EON turns off after a longer pause. Every dive before that is a repetitive dive and increments the counter.
2 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.
3 MSB binary $38 altitude settings (value / 32 = Altitude, here: $18 / 32 = 0, so A0)
[1.2]:
bit 0: unknown (always = 0?)
bit 1: nitrox
bit 2: unknown (always = 0?)
bit 3: metric
bit 4: air (= EON)
4 MSB binary $64 [1.1] A solution alpha always transmits a 0.
[1.2] on nitrox: nitrogen level
5 BCD $97 year (here: 1997). Don't know, what happens at year 2000.
6 BCD $01 month (here: 1 = January)
7 BCD $31 day (here: 31)
8 BCD $13 hour (here: 13 or 1pm)
9 BCD $35 minute (here: 35)
10 ... binary profile data
n MSB binary $80 end of the dive
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)
[1.1] A solution alpha always transmits a 0.
n + 3 MSB binary $?? unknown
[1.2] the last byte in the data block seems to be the nitrogen level after 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.

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
$7f ERR - decompression missed? I'm not sure with this value, because I never missed it :-)
$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. Bad boy!
$82 End of data - set after the last dive [1.2]

4. 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

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