SourceForge.net Logo Valid XHTML 1.0 Strict

Uwatec Smart Dive Computer Data Format & Protocol

Simon Naunton - 5 July 2007
Copyright © 2007 Simon Naunton (snaunton at users.sourceforge.net)
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
Texts.  A copy of the license is included in the section entitled "GNU
Free Documentation License".

Table of Contents


1. Overview

The data downloaded from an Uwatec Smart dive computer is a ring buffer in least to most recent dive order.

Each dive begins with the byte string 0xa5 0xa5 0x5a 0x5a. To find the first dive in the downloaded data, read one byte at a time checking for the aforementioned string.

Dives have a header section and a profile section, both of which are discussed in their own section of this document.

SmartTrak also stores and uses the downloaded data directly. This is also discussed in it's own section.

The Smart computers deal with time values using half-seconds since 2000-01-01 00:00:00 UTC. In other words the number of half-seconds since midnight 2000-01-01 in London (and a few other places, and coincidentally as London was not under daylight savings on this day). Times ultimately need to be converted to the relevent timezone to make sense for the diver, so it is worth doing some reading to understand timezones properly. Wikipedia, particularily the article on UTC, is a good place to start

The data format deals with negative numbers in with variable bit lengths, so unless you are already well versed in using negative binary numbers, it is probably a good idea to read up on two's complement.

The most recent version of this document should be available at http://diversity.sourceforge.net/uwatec_smart_format.html.


2. Downloading

This does not explain how to make an IrDA connection as this varies from platform to platform. It assumes that an IrDA connection with a Smart dive computer has already been made.

Send = PC sends data to dive computer.

Recv = PC receives data from dive computer.

Send or RecvNum BytesByte Values
Get Reference Time
Send10x1b
Recv10x01
Send50x1c 0x10 0x27 0x00 0x00
Recv10x01
Send10x1a
Recv4Dive Computer Time
Read PC Time
Calculate Time Correction
Send10x14
Recv4Dive Computer Serial Number
Send10x10
Recv1Dive Computer Model
Send90xc6, From Time (4 bytes), 0x10, 0x27, 0x00, 0x00
Recv4Data Length
Send90xc4, From Time (4 bytes), 0x10, 0x27, 0x00, 0x00
RecvData Length

2.1. Reference Time

This is 2000-01-01 00:00:00 UTC in half-seconds since the epoc on the PC the dive computer is being downloaded to. On (most?) unix systems the epoc is 1970-01-01 00:00:00 UTC although it is probably best to calculate this value rather than hardcode it so you do not have to rely on the epoc being a specific value. The Reference Time, along with the Dive Computer Time and the PC Time is needed to calculate the Time Correction value. This value can be determined in C on a POSIX system like so:

char *tz_orig, *tz = "TZ";
time_t ref_time;
struct tm t;

/* Initialize the struct tm to 2000-01-01 00:00:00 */
memset (&t, 0, sizeof(t));
t.tm_mday = 1;
t.tm_year = 100;

/* save original timezone */
tz_orig = getenv (tz);
if (tz_orig) tz_orig = strdup (tz_orig);

/* set timezone to UTC */
setenv (tz, "UTC", 1);
tzset ();

/* get reference time */
ref_time = mktime(&t);

/* multiply by 2 to get the number of half-seconds */
ref_time = ref_time * 2;

/* restore original timezone */
if (tz_orig) {
    setenv (tz, tz_orig, 1);
    free (tz_orig);
}
else unsetenv (tz);
tzset ();

2.2. Dive Computer Time

32 bit big endian integer. To convert the value to an integer:

byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24)

The dive computer's internal clock which is assumed to be the number of half-seconds since 2000-01-01 00:00:00 UTC. See PC Time below.

For dive computers other than the Aladin PRIME and TEC, the timezone in which the dive was done is neede to provide a nice user friendly time. The Aladin PRIME and TEC have built-in timezone correction although this does rely on the diver setting it correctly. See UTC Offset.

2.3. PC Time

The Dive Computer Time appears not to be exactly the number of half-seconds since 2000-01-01 00:00:00 UTC as I originally thought. However, it is possible to compensate for this if we have time on the PC when the download occured therefore we need to read the number of half-seconds since the epoc on the PC. In C on a POSIX system, the easiest albeit-slightly-inaccurate-by-up-to-0.5-seconds way of doing this is:

unsigned int pc_time = time(NULL) * 2

2.4. Time Correction

Time Correction = PC Time - Reference Time - DC Time

Add this number to the Dive Start Time of each dive to get the correct time. NOTE: If you have been following the steps here the time correction will still be in half-seconds. This value can be negative so must be stored as a signed integer.

2.5. Dive Computer Model

0x10Smart PRO
0x12Aladin TEC/PRIME
0x14Smart COM
0x18Smart TEC
0x1cSmart Z

2.6. From Time

32 bit big endian integer.

Return the length of data for or download only dives started after this number of half-seconds since 2000-01-01 00:00:00 UTC. If 0 is entered all dives are downloaded.

To convert from little endian (i.e. PCs) to big endian:

byte3 + (byte2 << 8) + (byte1 << 16) + (byte0 << 24)

The From Time value needs to be corrected by subtracting the Time Correction value from it.

2.7. Data Length

32 bit big endian integer. To convert the value to an integer:

byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24)

The number of bytes of data that will be downloaded from the dive computer.


3. SmartTrak

The columns Log and Profile in the Dives table of the SmartTrak log book schema contain the header and profile data for the dive if it was downloaded from an Uwatec Smart dive computer. While this is annoying if you are trying to extract profile data, it is actually quite good from an application design perspective because SmartTrak can incorporate new features and apply them to dives downloaded years before the features were implemented.

The dive computer model must be obtained from the DiveComputerType column of the Dives table to be able to decode Log and Profile correctly.

It is also impossible to calculate the Dive Start Time from the Log column because a Time Correction value is not available. This means that the Immersion field has to be used as the time the dive started.

The Log and Profile columns are also used to store data if the dive was imported from a DataTrak log book. In this case, the Log field contains the following data (where ? is an unknown value):

0x?? 0x?? 0x6f 0x72 0x6d 0x61 0x74 0x39 0x32

Looked at as ASCII text this is:

??Format92

The Profile column is either empty if the dive was entered manually into DataTrak or contains the data downloaded from the Aladin dive computer as noted in the "(1) Depth Profile ring buffer" section of Protocol and Data Structure of Uwatec Aladin Dive Computers. Note that the data in the Profile field starts at byte 1 of the description in the above linked document. In other words byte 0 with the value 0xff is not present in the Profile field.


4. Header

Headers are a variable length depending on the dive computer's model:

ModelHeader length (bytes)
Smart PRO92
Aladin TEC/Prime108
Smart COM100
Smart TEC/Z132

Headers have slightly different formats depending on the dive computer's model.

4.1. Smart PRO Header

PositionNum bytesDescription
00-0340xa5 0xa5 0x5a 0x5a
04-074Dive Data Length
08-114Dive Start Time
12-154Unknown
161Alarms During Dive
171MB-level at start of dive
18-192Maximum Depth
20-212Duration
22-232Minimum Temperature
24-252O2%
26-272Surface Interval
28-292CNS% After Dive
30-312Altitude Level
32-332PO2 Limit
34-352Depth Limit
36-372Unknown
38-392Desat Before Dive
40-478Unknown
48-492Settings
50-512Unknown, always 0xff 0xff
52-598Unknown
60-634cpt data at start of dive. 8 cpts. Fast tissues to...
64-674
68-714
72-754
76-794
80-834
84-874
88-914...slow tissues

4.2. Aladin TEC/PRIME Header

PositionNum bytesDescription
00-0340xa5 0xa5 0x5a 0x5a
04-074Dive Data Length
08-114Dive Start Time
12-154Unknown
161UTC Offset
171Rep. No
181MB-level at start of dive
191Battery
201Unknown
211Alarms During Dive
22-232Maximum Depth
24-252Duration
26-272Minimum Temperature
28-292Maximum Temperature
30-312O2%
32-332Air Temperature
34-352Surface Interval
36-372CNS% After Dive
38-392Altitude Level
40-412Unknown
42-432PO2 Limit
44-452Depth Limit
48-492Desat Before Dive
50-512Unknown
52-532Desat Before Dive
54-7522Unknown
76-794cpt data at start of dive. 8 cpts. Fast tissues to...
80-834
84-874
88-914
92-954
96-994
100-1034
104-1074...slow tissues

4.3. Smart COM Header

PositionNum bytesDescription
00-0340xa5 0xa5 0x5a 0x5a
04-074Dive Data Length
08-114Dive Start Time
12-154Unknown
161Alarms During Dive
171MB-level at start of dive
18-192Maximum Depth
20-212Duration
22-232Minimum Temperature
24-252O2%
26-272Surface Interval
28-292CNS% After Dive
30-312Tank Pressure At Start Of Dive
32-332Tank Pressure At End Of Dive
34-352Depth Limit
36-372Tank Pressure Limit
38-414Unknown
42-432Altitude Level
44-452PO2 Limit
46-472Unknown
48-492Desat Before Dive
50-578Unknown
58-592Settings
60-678Unknown
68-714cpt data at start of dive. 8 cpts. Fast tissues to...
72-754
76-794
80-834
84-874
88-914
92-954
96-914...slow tissues

4.4. Smart TEC Header

PositionNum bytesDescription
00-0340xa5 0xa5 0x5a 0x5a
04-074Dive Data Length
08-114Dive Start Time
12-154Unknown
161Alarms During Dive
171MB-level at start of dive
18-192Maximum Depth
20-212Duration
22-232Minimum Temperature
24-252Surface Interval
26-272CNS% After Dive
28-292O2% Tank 1
30-312O2% Tank 2
32-332O2% Tank D
34-352Tank 1 Pressure At Start Of Dive
36-372Tank 1 Pressure At End Of Dive
38-392Tank 2 Pressure At Start Of Dive
40-412Tank 2 Pressure At End Of Dive
42-432Tank D Pressure At Start Of Dive
44-452Tank D Pressure At End Of Dive
46-472Unknown
48-492Depth Limit
50-512Tank Pressure Limit - all tanks have the same limit.
52-554Unknown
56-572Altitude Level
58-592PO2 Limit - Tank 1
60-612PO2 Limit - Tank 2
62-632PO2 Limit - Tank D
64-696Unknown - Seems to be a duplicate of bytes 58-63
70-7910Unknown
80-812Desat Before Dive
82-898Unknown
90-912Settings
92-998Unknown
100-1034cpt data at start of dive. 8 cpts. Fast tissues to...
104-1074
108-1114
112-1154
116-1194
120-1234
124-1274
128-1314...slow tissues

4.5. Smart Z Header

PositionNum bytesDescription
00-0340xa5 0xa5 0x5a 0x5a
04-074Dive Data Length
08-114Dive Start Time
12-154Unknown
161Alarms During Dive
171MB-level at start of dive
18-192Maximum Depth
20-212Duration
22-232Minimum Temperature
24-252Surface Interval
26-272CNS% After Dive
28-292O2%
30-334Unknown/Unused - Same position as TEC's Tank 2 & D O2%
34-352Tank Pressure At Start Of Dive
36-372Tank Pressure At End Of Dive
38-458Unknown/Unused - Same position as TEC's Tank 2 & D Start & End Pressures
46-472Unknown
48-492Depth Limit
50-512Tank Pressure Limit
52-554Unknown
56-572Altitude Level
58-592PO2 Limit
60-634Unknown/Unused - Same position as TEC's Tank 2 & D PO2 Limits
64-696Unknown - Seems to be a duplicate of bytes 58-63
70-7910Unknown
80-812Desat Before Dive
82-898Unknown
90-912Settings
92-998Unknown
100-1034cpt data at start of dive. 8 cpts. Fast tissues to...
104-1074
108-1114
112-1154
116-1194
120-1234
124-1274
128-1314...slow tissues

4.6. Dive Data Length

32 bit big endian integer. To convert the value to an integer:

byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24)

The data length of the entire dive, profile + header including the 0xa5 0xa5 0x5a 0x5a at the begining of the header.

4.7. Dive Start Time

32 bit big endian integer. To convert the value to an integer:

byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24)

I originally thought that this was the number of half-seconds since 2000-01-01 00:00:00 UTC. However it is not and may be out by an hour or so (or even more?). To correct for this subtract the Time Correction obtained when downloading the dive computer from this value. Yes, this does mean that it is impossible to calculate the time exactly from a just a binary dump, including the Log and Profile fields in a SmartTrak log book.

NOTE: This is in the UTC timezone, not the timezone the diver was in when the dive was undergone. SmartTrak assumes that the dive was done in the same timezone as the PC that the dive computer is downloaded to - see the Adjust Time Zone section of the SmartTrak manual. The Aladin PRIME and TEC have a built in timezone modifier called UTC Offset. See "UTC Offset" in the Aladin PRIME/TEC manuals.

4.8. UTC Offset

8 bit integer. Aladin TEC/PRIME only.

Dive Start Time = UTC Offset * 1800 + Dive Start Time

1800 is the number of half-seconds in 15 minutes. See "UTC Offset" in the Aladin PRIME/TEC manuals.

4.9. Rep. No

8 bit integer. Aladin TEC/PRIME only.

I assume this number represents the dive number within a repetitative dive group.

4.10. MB-level

8 bit integer.

The starting MB-level (Microbubble level) - Uwatec's diver settable fudge factor. Can be 0 to 5 representing L0 - L5.

4.11. Battery

8 bit integer. Aladin TEC/PRIME only.

I have no idea what this value actually means, however it corresponds with the Battery field in SmartTrak.

4.12. Maximum Depth

16 bit big endian word. To convert the value to an integer:

byte0 + (byte1 << 8) + (byte2 << 16)

The maximum depth of the dive in centimeters.

To convert to meters, divide by 100 (duh!)

To convert to feet, multiply by 0.032808399 (according to Google anyway).

4.13. Duration

16 bit big endian word. To convert the value to an integer:

byte0 + (byte1 << 8) + (byte2 << 16)

Contains the duration of the dive in minutes.

4.14. Minimum Temperature

16 bit big endian word. To convert the value to an integer:

byte0 + (byte1 << 8) + (byte2 << 16)

The minimum temperature that occurred during a dive in tenths of a degree centigrade.

To convert to centigrade, divide by 10

To convert to fahrenheit... bah, work it out yourself!

4.15. Maximum Temperature

16 bit big endian word. Aladin TEC/PRIME only. To convert the value to an integer:

byte0 + (byte1 << 8) + (byte2 << 16)

The minimum temperature that occurred during a dive in tenths of a degree centigrade.

To convert to centigrade, divide by 10

To convert to fahrenheit... bah, work it out yourself!

4.16. O2%

16 bit big endian word. To convert the value to an integer:

byte0 + (byte1 << 8) + (byte2 << 16)

The percentage of O2 used for the dive. This value must be checked to be within the valid range (21 to 100), because this may contain weird values if the dive computer was in gauge mode during the dive.

4.17. Air Temperature

16 bit big endian word. Aladin TEC/PRIME only. To convert the value to an integer:

byte0 + (byte1 << 8) + (byte2 << 16)

The minimum temperature that occurred during a dive in tenths of a degree centigrade.

To convert to centigrade, divide by 10

To convert to fahrenheit... bah, work it out yourself!

4.18. Surface Interval

16 bit big endian word. To convert the value to an integer:

byte0 + (byte1 << 8) + (byte2 << 16)

The number of seconds since the previous dive ended. If this value is 0 then there is no previous dive or the previous dive occurred to long ago for the surface interval to be relevant.

4.19. CNS% After Dive

16 bit big endian word. To convert the value to an integer:

byte0 + (byte1 << 8) + (byte2 << 16)

The CNS% after the dive.

4.20. Tank Pressure

16 bit big endian word. To convert the value to an integer:

byte0 + (byte1 << 8) + (byte2 << 16)

To convert to bar multiply by 0.0078125, add 0.5. and use the integer result.

4.21. Altitude Level

16 bit big endian word. To convert the value to an integer:

byte0 + (byte1 << 8) + (byte2 << 16)

The altitude level of the dive. See dive computer manual for a description.

4.22. PO2 Limit

16 bit big endian word. To convert the value to an integer:

byte0 + (byte1 << 8) + (byte2 << 16)

User settable PO2 Limit in bar * 10. Divide by 10 to convert to bar (duh! once more).

4.23. Depth Limit

16 bit big endian word. To convert the value to an integer:

byte0 + (byte1 << 8) + (byte2 << 16)

User settable depth limit alarm in centimeters. Divide by... no you can work that one out.

4.24. Tank Pressure Limit

User settable tank pressure limit alarm.

To convert to bar multiply by 0.0078125, add 0.5. and use the integer result.

4.25. Desat Before Dive

16 bit big endian word. To convert the value to an integer:

byte0 + (byte1 << 8) + (byte2 << 16)

The number of minutes to full desaturation when the dive starts.

4.26. Settings

16 bit, bit fields.

Temperature Unitx0000000 000000000 = Centigrade, 1 = fahrenheit
Depth Unit0x000000 000000000 = Meters, 1 = Feet
Gauge Mode000x0000 000000000 = Off, 1 = On
Alarms000000xx xxxxxxxxNot completely understood

4.27. Alarms During Dive

8 bit bit fields.

Have not determined exactly how this works, but I suspect that this indicates that some of the alarms occurred during the dive. In any case the following alarms did occur during dives where this field had the following values.

MB-level change0000x000
RBT00x00000

5. Profile

To understand how the profile format works, it is probably easier to visualize the profile data as a bit stream rather than byte stream (at least this is how I figured out what was going on :)). Starting at the beginning of the data section, read and count each bit until the first empty, i.e. 0, bit is reached. This value is what I call the Data Type Indicator (DTI) because it indicates the type of data that follows it. It also indicates the number of following bits the data is comprised of. The DTI can be up to 16 bits in length. The total number of bits in a DTI and data combination is either 8, 16, 24 or 32, i.e. a round number of bits.

The usage and meaning of DTIs varies between the different models of computer, consult the DTI table for each computer model. The DTI tables show the binary representation of the data where 1 and 0 bits indicate the DTI and d bits indicate the data bits.

Reading a bit at a time is inefficient. Perhaps the easiest way of reading a profile is to read a byte at a time like so:

profile time = 0 (seconds);
Loop through data 1 byte at a time
   read 1 byte
   if byte = 0xff
       read 1 byte
       look up byte in DTI table to determine data type
       read 0 -> 2 bytes of data depending on data type
       do something with data
   else
       look up byte in DTI table to determine data type
       read 0 -> 2 bytes of data depending on data type
       do something with data
   end if
   if data type is a depth type
       log profile segment
       profile time = time + 4 (seconds).
   end if
end loop

NOTE: You do not have to check if the byte == 0xff with a Smart PRO profile as no DTI exceeds 1 byte in length.

You will need to clear any data bits in the byte containing the DTI to look it up in the DTI table. To demonstrate clearing bits, I will use the Smart Pro. For example, the byte read has a value of 0xf1, which in binary is 11110001, we test it against all possible DTIs by clearing the data bits in turn:

11110001 & 11111111 = 11110001 == 11111110? No.
11110001 & 11111110 = 11110000 == 11111100? No.
11110001 & 11111100 = 11110000 == 11111000? No.
11110001 & 11111000 = 11110000 == 11110000? Yes. Found DTI, now process the data.

We now know that the DTI is 11110000. We look it up in the DTI table and see that it is a Delta Temperature, so we know that the data is in the least significant 3 bits of the same byte as the DTI and all the bits in the following byte. This also means that the byte following after that is the start of a new DTI.

Although we stopped testing to determine the DTI here because we had found it, if we had not determined the DTI checking would continue ANDing against the following values in turn until it was found:

11110000
11100000
11000000
10000000

So, for a Smart PRO, where X is a byte, clear the data bits and compare in turn stopping where there is a match:

X & 11111111 == 11111110 : Absolute Temperature
X & 11111110 == 11111100 : Absolute Depth
X & 11111100 == 11111000 : Delta Temperature
X & 11111000 == 11110000 : Delta Depth
X & 11110000 == 11100000 : Alarms
X & 11100000 == 11000000 : Time
X & 11000000 == 10000000 : Delta Temperature
X & 10000000 == 00000000 : Delta Depth

NOTE: ANDing against 11111111 is as silly as adding or subtracting 0, so you do not have to do it. X & 11111111 == 11111110 should simply be X == 11111110. However, doing so above makes the pattern easier to visualize.

When the depth is < 0.8M SmartTrak stops displaying the depth and time, displaying -- in place of the depth and the dive time from the last sample where the depth was >= 0.8M. I assume the Smart dive computers do this as well. If the diver does not descend to a depth >= 0.8M within 5 minutes then the dive will be considered to be over. During this 5 minute period the computer is still tracking depth and time and if the diver does descend to >= 0.8M within 5 minutes then the dive time will jump to the actual dive time rather than starting from the dive time displayed on the screen.

For example, at a dive time of 55 minutes a diver ascends above 0.8M where he stays for 4 minutes. Throughout this 4 minute period the dive computer displays 55 minutes and -- instead of the depth. The diver then descends below 0.8M, the dive computer resumes the dive and the dive time suddenly jumps to 59 minutes.

5.1. Smart PRO DTI Table

Absolute Temperature11111110 dddddddd dddddddd
Absolute Depth1111110d dddddddd dddddddd
Delta Temperature111110dd dddddddd
Delta Depth11110ddd dddddddd
Alarms1110dddd
Time110ddddd
Delta Temperature10dddddd
Delta Depth0ddddddd

5.2. Aladin TEC/PRIME DTI Table

Alarms11111111 0ddddddd
Absolute Temperature11111110 dddddddd dddddddd
Absolute Depth1111110d dddddddd dddddddd
Delta Temperature111110dd dddddddd
Delta Depth11110ddd dddddddd
Alarms1110dddd
Time110ddddd
Delta Temperature10dddddd
Delta Depth0ddddddd

5.3. Smart COM DTI Table

Absolute RBT11111111 1110dddd dddddddd
Absolute Temperature11111111 110ddddd dddddddd dddddddd
Absolute Tank Pressure11111111 10dddddd dddddddd dddddddd
Absolute Depth11111111 0ddddddd dddddddd dddddddd
Time11111110 dddddddd
Alarms1111110d dddddddd
Delta Temperature111110dd dddddddd
Delta Depth 11110ddd dddddddd
Delta Tank Pressure1110dddd dddddddd
Delte Temperature110ddddd
Delta RBT10dddddd
Delta Tank Pressure/Depth0ddddddd dddddddd

5.4. Smart TEC DTI Table

Absolute RBT11111111 111110dd dddddddd
Absolute Tank D Pressure11111111 11110ddd dddddddd dddddddd
Absolute Tank 2 Pressure11111111 1110dddd dddddddd dddddddd
Absolute Tank 1 Pressure11111111 110ddddd dddddddd dddddddd
Absolute Temperature11111111 10dddddd dddddddd dddddddd
Absolute Depth11111111 0ddddddd dddddddd dddddddd
Time11111110 dddddddd
Alarms1111110d dddddddd
Delta Temperature111110dd dddddddd
Delta Depth11110ddd dddddddd
Delta Tank Pressure1110dddd dddddddd
Delta Temperature110ddddd
Delta RBT10dddddd
Delta Tank Pressure/Depth0ddddddd dddddddd

5.5. Smart Z DTI Table

Absolute RBT11111111 111110dd dddddddd
Absolute Tank Pressure11111111 110ddddd dddddddd dddddddd
Absolute Temperature11111111 10dddddd dddddddd dddddddd
Absolute Depth11111111 0ddddddd dddddddd dddddddd
Time11111110 dddddddd
Alarms1111110d dddddddd
Delta Temperature111110dd dddddddd
Delta Depth11110ddd dddddddd
Delta Tank Pressure1110dddd dddddddd
Delta Temperature110ddddd
Delta RBT10dddddd
Delta Tank Pressure/Depth0ddddddd dddddddd

The Z seems to use the same DTI table as the TEC, but as it does not support multiple tanks there will not be any tank 2 and D DTIs in a Z profile.

5.6. Depth

The initial absolute depth of a profile is essentially a depth calibration. At this time in the dive the depth is 0M. You need to subtract this value from each subsequent depth to get the correct depth.

When a depth DTI is read, this is also when a profile segment is complete. All current values for temperature, alarms, tank pressure, RBT and, of course, depth are correct for the current profile time. The current time of a profile must be incremented by 4 seconds after the data has been acted upon.

To convert the depth to meters divide by 50.

See also the note on Delta Values.

5.7. Temperature

To convert to centigrade divide by 2.5

See also the note on Delta Values.

5.8. Time

This value indicates that the current profile time must be incremented by value * 4 seconds.

5.9. Remaining Bottom Time

This is the number of minutes that the dive computer estimates you have left based on your air consumption. This value requires no conversion.

5.10. Tank Pressure

Absolute Tank pressure, besides indicating what you would expect, also indicates a tank switch for the Smart TEC. For example, if an Absolute Tank 2 Pressure is read, then the diver has switched to Tank 2 and all subsequent Delta Tank Pressures are for Tank 2 - unless of course an Absolute Tank 1 or D Pressure is read.

To convert to bar divide by 4

Note that the current tank pressure can be < 0 which of course is invalid so needs to be checked for.

See also the note on Delta Values.

5.11. Delta Values

Delta values can be negative (well, duh!). As stated in the Overview section, it is probably worth reading up on two's complement. The most significant bit of a delta is the sign bit. However, as none of the delta data types have a nice number of bits, i.e. 8 or 16, the value need to be converted to an 8 or 16 bit integer. For example, convert an 11 bit integer to a 16 bit integer:

if ((byte0 & 0x04) == 0x04)    /* Test bit 2 of byte0, the sign bit     */
  value = byte0 | 0xfc;        /* Set  the most significant 6 bits to 1 */
else value = byte0 & 0xfc;     /* use only the least significant 2 bits */
value = (value << 8) + byte1;

Another example, convert an 6 bit integer to an 8 bit integer:

if ((byte & 0x020) == 0x20)   /* Test bit 5 of byte, the sign bit      */
  value = byte | 0xe0;        /* Set  the most significant 6 bits to 1 */
else value = byte0 & 0x1f;    /* use only the least significant 5 bits */

5.12. Alarms

BinaryHexAlarmDescription
000000010x01Alarm 1Yellow * is shown in Buzzer area of dive window in SmartTrak. I assume this means Alarm Status = Bad.
000000100x02Alarm 2Red * is shown in Buzzer area of dive window in SmartTrak. I assume this means Alarm Status = Very Bad.
000001000x04WorkloadCOM, TEC & Z only
000010000x08UNKNOWNUNKNOWN
000100000x10UNKNOWNUNKNOWN
001000000x20RBTCOM, TEC & Z only
010000000x40Bookmark/Safety Stop Timer StartedIf current depth < 6.5 meters this is safety stop timer start, otherwise it is a bookmark. Aladin TEC/PRIME, TEC and Z only.

Other alarms, e.g. PO2 limit exceeded, depth limit exceeded, duration limit exceeded, ascent rate exceeded etc, need to be calculated based on the current and previous depths and times and the values for the limits in the header section. The Uwatec variable ascent rate tables are below. As all the data that comes from all current Uwatec computers is metric, I suspect that the alarms in SmartTrak are calculated using meters before the units are converted for display, therefore I suspect that the imperial table below have been rounded to an integer.

Depth (M):Acent Rate Limit (M/min):
<67
<128
<189
<2310
<2711
<3113
<3515
<3917
<4418
<5019
>5020
Depth (F):Acent Rate Limit (F/min):
<2023
<4026
<6029
<7533
<8836
<10143
<11549
<12856
<14459
<16462
>16466

6. Change Log


7. Thanks

Thanks to Rainer Mohr for... errm... "actively encouraging" me to get off my fat arse and write these specs :) and for pointing out a few mistakes in them. His website divelogs.de is probably the first implementation to use them.


8. GNU Free Documentation License

		GNU Free Documentation License
		  Version 1.2, November 2002


 Copyright (C) 2000,2001,2002  Free Software Foundation, Inc.
     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.


0. PREAMBLE

The purpose of this License is to make a manual, textbook, or other
functional and useful document "free" in the sense of freedom: to
assure everyone the effective freedom to copy and redistribute it,
with or without modifying it, either commercially or noncommercially.
Secondarily, this License preserves for the author and publisher a way
to get credit for their work, while not being considered responsible
for modifications made by others.

This License is a kind of "copyleft", which means that derivative
works of the document must themselves be free in the same sense.  It
complements the GNU General Public License, which is a copyleft
license designed for free software.

We have designed this License in order to use it for manuals for free
software, because free software needs free documentation: a free
program should come with manuals providing the same freedoms that the
software does.  But this License is not limited to software manuals;
it can be used for any textual work, regardless of subject matter or
whether it is published as a printed book.  We recommend this License
principally for works whose purpose is instruction or reference.


1. APPLICABILITY AND DEFINITIONS

This License applies to any manual or other work, in any medium, that
contains a notice placed by the copyright holder saying it can be
distributed under the terms of this License.  Such a notice grants a
world-wide, royalty-free license, unlimited in duration, to use that
work under the conditions stated herein.  The "Document", below,
refers to any such manual or work.  Any member of the public is a
licensee, and is addressed as "you".  You accept the license if you
copy, modify or distribute the work in a way requiring permission
under copyright law.

A "Modified Version" of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
modifications and/or translated into another language.

A "Secondary Section" is a named appendix or a front-matter section of
the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document's overall subject
(or to related matters) and contains nothing that could fall directly
within that overall subject.  (Thus, if the Document is in part a
textbook of mathematics, a Secondary Section may not explain any
mathematics.)  The relationship could be a matter of historical
connection with the subject or with related matters, or of legal,
commercial, philosophical, ethical or political position regarding
them.

The "Invariant Sections" are certain Secondary Sections whose titles
are designated, as being those of Invariant Sections, in the notice
that says that the Document is released under this License.  If a
section does not fit the above definition of Secondary then it is not
allowed to be designated as Invariant.  The Document may contain zero
Invariant Sections.  If the Document does not identify any Invariant
Sections then there are none.

The "Cover Texts" are certain short passages of text that are listed,
as Front-Cover Texts or Back-Cover Texts, in the notice that says that
the Document is released under this License.  A Front-Cover Text may
be at most 5 words, and a Back-Cover Text may be at most 25 words.

A "Transparent" copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
general public, that is suitable for revising the document
straightforwardly with generic text editors or (for images composed of
pixels) generic paint programs or (for drawings) some widely available
drawing editor, and that is suitable for input to text formatters or
for automatic translation to a variety of formats suitable for input
to text formatters.  A copy made in an otherwise Transparent file
format whose markup, or absence of markup, has been arranged to thwart
or discourage subsequent modification by readers is not Transparent.
An image format is not Transparent if used for any substantial amount
of text.  A copy that is not "Transparent" is called "Opaque".

Examples of suitable formats for Transparent copies include plain
ASCII without markup, Texinfo input format, LaTeX input format, SGML
or XML using a publicly available DTD, and standard-conforming simple
HTML, PostScript or PDF designed for human modification.  Examples of
transparent image formats include PNG, XCF and JPG.  Opaque formats
include proprietary formats that can be read and edited only by
proprietary word processors, SGML or XML for which the DTD and/or
processing tools are not generally available, and the
machine-generated HTML, PostScript or PDF produced by some word
processors for output purposes only.

The "Title Page" means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the material
this License requires to appear in the title page.  For works in
formats which do not have any title page as such, "Title Page" means
the text near the most prominent appearance of the work's title,
preceding the beginning of the body of the text.

A section "Entitled XYZ" means a named subunit of the Document whose
title either is precisely XYZ or contains XYZ in parentheses following
text that translates XYZ in another language.  (Here XYZ stands for a
specific section name mentioned below, such as "Acknowledgements",
"Dedications", "Endorsements", or "History".)  To "Preserve the Title"
of such a section when you modify the Document means that it remains a
section "Entitled XYZ" according to this definition.

The Document may include Warranty Disclaimers next to the notice which
states that this License applies to the Document.  These Warranty
Disclaimers are considered to be included by reference in this
License, but only as regards disclaiming warranties: any other
implication that these Warranty Disclaimers may have is void and has
no effect on the meaning of this License.


2. VERBATIM COPYING

You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License applies
to the Document are reproduced in all copies, and that you add no other
conditions whatsoever to those of this License.  You may not use
technical measures to obstruct or control the reading or further
copying of the copies you make or distribute.  However, you may accept
compensation in exchange for copies.  If you distribute a large enough
number of copies you must also follow the conditions in section 3.

You may also lend copies, under the same conditions stated above, and
you may publicly display copies.


3. COPYING IN QUANTITY

If you publish printed copies (or copies in media that commonly have
printed covers) of the Document, numbering more than 100, and the
Document's license notice requires Cover Texts, you must enclose the
copies in covers that carry, clearly and legibly, all these Cover
Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
the back cover.  Both covers must also clearly and legibly identify
you as the publisher of these copies.  The front cover must present
the full title with all words of the title equally prominent and
visible.  You may add other material on the covers in addition.
Copying with changes limited to the covers, as long as they preserve
the title of the Document and satisfy these conditions, can be treated
as verbatim copying in other respects.

If the required texts for either cover are too voluminous to fit
legibly, you should put the first ones listed (as many as fit
reasonably) on the actual cover, and continue the rest onto adjacent
pages.

If you publish or distribute Opaque copies of the Document numbering
more than 100, you must either include a machine-readable Transparent
copy along with each Opaque copy, or state in or with each Opaque copy
a computer-network location from which the general network-using
public has access to download using public-standard network protocols
a complete Transparent copy of the Document, free of added material.
If you use the latter option, you must take reasonably prudent steps,
when you begin distribution of Opaque copies in quantity, to ensure
that this Transparent copy will remain thus accessible at the stated
location until at least one year after the last time you distribute an
Opaque copy (directly or through your agents or retailers) of that
edition to the public.

It is requested, but not required, that you contact the authors of the
Document well before redistributing any large number of copies, to give
them a chance to provide you with an updated version of the Document.


4. MODIFICATIONS

You may copy and distribute a Modified Version of the Document under
the conditions of sections 2 and 3 above, provided that you release
the Modified Version under precisely this License, with the Modified
Version filling the role of the Document, thus licensing distribution
and modification of the Modified Version to whoever possesses a copy
of it.  In addition, you must do these things in the Modified Version:

A. Use in the Title Page (and on the covers, if any) a title distinct
   from that of the Document, and from those of previous versions
   (which should, if there were any, be listed in the History section
   of the Document).  You may use the same title as a previous version
   if the original publisher of that version gives permission.
B. List on the Title Page, as authors, one or more persons or entities
   responsible for authorship of the modifications in the Modified
   Version, together with at least five of the principal authors of the
   Document (all of its principal authors, if it has fewer than five),
   unless they release you from this requirement.
C. State on the Title page the name of the publisher of the
   Modified Version, as the publisher.
D. Preserve all the copyright notices of the Document.
E. Add an appropriate copyright notice for your modifications
   adjacent to the other copyright notices.
F. Include, immediately after the copyright notices, a license notice
   giving the public permission to use the Modified Version under the
   terms of this License, in the form shown in the Addendum below.
G. Preserve in that license notice the full lists of Invariant Sections
   and required Cover Texts given in the Document's license notice.
H. Include an unaltered copy of this License.
I. Preserve the section Entitled "History", Preserve its Title, and add
   to it an item stating at least the title, year, new authors, and
   publisher of the Modified Version as given on the Title Page.  If
   there is no section Entitled "History" in the Document, create one
   stating the title, year, authors, and publisher of the Document as
   given on its Title Page, then add an item describing the Modified
   Version as stated in the previous sentence.
J. Preserve the network location, if any, given in the Document for
   public access to a Transparent copy of the Document, and likewise
   the network locations given in the Document for previous versions
   it was based on.  These may be placed in the "History" section.
   You may omit a network location for a work that was published at
   least four years before the Document itself, or if the original
   publisher of the version it refers to gives permission.
K. For any section Entitled "Acknowledgements" or "Dedications",
   Preserve the Title of the section, and preserve in the section all
   the substance and tone of each of the contributor acknowledgements
   and/or dedications given therein.
L. Preserve all the Invariant Sections of the Document,
   unaltered in their text and in their titles.  Section numbers
   or the equivalent are not considered part of the section titles.
M. Delete any section Entitled "Endorsements".  Such a section
   may not be included in the Modified Version.
N. Do not retitle any existing section to be Entitled "Endorsements"
   or to conflict in title with any Invariant Section.
O. Preserve any Warranty Disclaimers.

If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no material
copied from the Document, you may at your option designate some or all
of these sections as invariant.  To do this, add their titles to the
list of Invariant Sections in the Modified Version's license notice.
These titles must be distinct from any other section titles.

You may add a section Entitled "Endorsements", provided it contains
nothing but endorsements of your Modified Version by various
parties--for example, statements of peer review or that the text has
been approved by an organization as the authoritative definition of a
standard.

You may add a passage of up to five words as a Front-Cover Text, and a
passage of up to 25 words as a Back-Cover Text, to the end of the list
of Cover Texts in the Modified Version.  Only one passage of
Front-Cover Text and one of Back-Cover Text may be added by (or
through arrangements made by) any one entity.  If the Document already
includes a cover text for the same cover, previously added by you or
by arrangement made by the same entity you are acting on behalf of,
you may not add another; but you may replace the old one, on explicit
permission from the previous publisher that added the old one.

The author(s) and publisher(s) of the Document do not by this License
give permission to use their names for publicity for or to assert or
imply endorsement of any Modified Version.


5. COMBINING DOCUMENTS

You may combine the Document with other documents released under this
License, under the terms defined in section 4 above for modified
versions, provided that you include in the combination all of the
Invariant Sections of all of the original documents, unmodified, and
list them all as Invariant Sections of your combined work in its
license notice, and that you preserve all their Warranty Disclaimers.

The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
copy.  If there are multiple Invariant Sections with the same name but
different contents, make the title of each such section unique by
adding at the end of it, in parentheses, the name of the original
author or publisher of that section if known, or else a unique number.
Make the same adjustment to the section titles in the list of
Invariant Sections in the license notice of the combined work.

In the combination, you must combine any sections Entitled "History"
in the various original documents, forming one section Entitled
"History"; likewise combine any sections Entitled "Acknowledgements",
and any sections Entitled "Dedications".  You must delete all sections
Entitled "Endorsements".


6. COLLECTIONS OF DOCUMENTS

You may make a collection consisting of the Document and other documents
released under this License, and replace the individual copies of this
License in the various documents with a single copy that is included in
the collection, provided that you follow the rules of this License for
verbatim copying of each of the documents in all other respects.

You may extract a single document from such a collection, and distribute
it individually under this License, provided you insert a copy of this
License into the extracted document, and follow this License in all
other respects regarding verbatim copying of that document.


7. AGGREGATION WITH INDEPENDENT WORKS

A compilation of the Document or its derivatives with other separate
and independent documents or works, in or on a volume of a storage or
distribution medium, is called an "aggregate" if the copyright
resulting from the compilation is not used to limit the legal rights
of the compilation's users beyond what the individual works permit.
When the Document is included in an aggregate, this License does not
apply to the other works in the aggregate which are not themselves
derivative works of the Document.

If the Cover Text requirement of section 3 is applicable to these
copies of the Document, then if the Document is less than one half of
the entire aggregate, the Document's Cover Texts may be placed on
covers that bracket the Document within the aggregate, or the
electronic equivalent of covers if the Document is in electronic form.
Otherwise they must appear on printed covers that bracket the whole
aggregate.


8. TRANSLATION

Translation is considered a kind of modification, so you may
distribute translations of the Document under the terms of section 4.
Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections.  You may include a
translation of this License, and all the license notices in the
Document, and any Warranty Disclaimers, provided that you also include
the original English version of this License and the original versions
of those notices and disclaimers.  In case of a disagreement between
the translation and the original version of this License or a notice
or disclaimer, the original version will prevail.

If a section in the Document is Entitled "Acknowledgements",
"Dedications", or "History", the requirement (section 4) to Preserve
its Title (section 1) will typically require changing the actual
title.


9. TERMINATION

You may not copy, modify, sublicense, or distribute the Document except
as expressly provided for under this License.  Any other attempt to
copy, modify, sublicense or distribute the Document is void, and will
automatically terminate your rights under this License.  However,
parties who have received copies, or rights, from you under this
License will not have their licenses terminated so long as such
parties remain in full compliance.


10. FUTURE REVISIONS OF THIS LICENSE

The Free Software Foundation may publish new, revised versions
of the GNU Free Documentation License from time to time.  Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.  See
http://www.gnu.org/copyleft/.

Each version of the License is given a distinguishing version number.
If the Document specifies that a particular numbered version of this
License "or any later version" applies to it, you have the option of
following the terms and conditions either of that specified version or
of any later version that has been published (not as a draft) by the
Free Software Foundation.  If the Document does not specify a version
number of this License, you may choose any version ever published (not
as a draft) by the Free Software Foundation.


ADDENDUM: How to use this License for your documents

To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and
license notices just after the title page:

    Copyright (c)  YEAR  YOUR NAME.
    Permission is granted to copy, distribute and/or modify this document
    under the terms of the GNU Free Documentation License, Version 1.2
    or any later version published by the Free Software Foundation;
    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
    A copy of the license is included in the section entitled "GNU
    Free Documentation License".

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
replace the "with...Texts." line with this:

    with the Invariant Sections being LIST THEIR TITLES, with the
    Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.

If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.

If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
free software license, such as the GNU General Public License,
to permit their use in free software.