This document describes the transfer protocol and memory layout of these suunto diving computers:
- Suunto Eon
- Suunto Eon Lux
- Suunto Solution Alpha
- Suunto Solution Alpha Lux
- Suunto Solution Nitrox
- Suunto Vario (same as the Nitrox model)
The [[Suunto Solution]] is an older model with a different communication scheme.
Open Questions / Unknown things
- Does more than the 3 bytes for the transmission exist? I checked all letters, but there may be others?!?
- Any way to set the time of the EON? I don’t think so 🙁
- Does the EON really has a 3 byte counter for the number of dives? Or is it only 2 bytes and the first byte has a special meaning?
- What meanings have the other bytes in the header (32..255 with the exception of the serial number in 244..246)? I think 32..210 are unused, but the other contains constant (they never changed at my EON) data.
- How does the PC software find out, where the first dive in the log starts? At the moment I get the $82 position from the header and search for next $80 (end of dive), skip the temperature and pressure byte and – viola – the first (oldest) dive.
- information about the Nitrox model missing
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:
- ‘N’ ($4E) followed by 20 bytes, sets the owner name of the dive computer.
- ‘T’ ($54) followed by 1 byte ($14, $1E, $3C, which are 20s, 30s and 60s) sets the data rate for the diving profile. Other values may be possible, so the profile values may be recorded with a 1s to a 255s interval – but they should not be used (information from the developer of the EON)
- ‘P’ ($50) The computer sends $901 bytes (I call it the P-block) back to the computer.
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: c
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.