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".
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.
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 Recv | Num Bytes | Byte Values |
---|---|---|
Get Reference Time | ||
Send | 1 | 0x1b |
Recv | 1 | 0x01 |
Send | 5 | 0x1c 0x10 0x27 0x00 0x00 |
Recv | 1 | 0x01 |
Send | 1 | 0x1a |
Recv | 4 | Dive Computer Time |
Read PC Time | ||
Calculate Time Correction | ||
Send | 1 | 0x14 |
Recv | 4 | Dive Computer Serial Number |
Send | 1 | 0x10 |
Recv | 1 | Dive Computer Model |
Send | 9 | 0xc6, From Time (4 bytes), 0x10, 0x27, 0x00, 0x00 |
Recv | 4 | Data Length |
Send | 9 | 0xc4, From Time (4 bytes), 0x10, 0x27, 0x00, 0x00 |
Recv | Data Length |
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 ();
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.
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
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.
0x10 | Smart PRO |
0x12 | Aladin TEC/PRIME |
0x14 | Smart COM |
0x18 | Smart TEC |
0x1c | Smart Z |
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.
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.
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.
Headers are a variable length depending on the dive computer's model:
Model | Header length (bytes) |
---|---|
Smart PRO | 92 |
Aladin TEC/Prime | 108 |
Smart COM | 100 |
Smart TEC/Z | 132 |
Headers have slightly different formats depending on the dive computer's model.
Position | Num bytes | Description |
---|---|---|
00-03 | 4 | 0xa5 0xa5 0x5a 0x5a |
04-07 | 4 | Dive Data Length |
08-11 | 4 | Dive Start Time |
12-15 | 4 | Unknown |
16 | 1 | Alarms During Dive |
17 | 1 | MB-level at start of dive |
18-19 | 2 | Maximum Depth |
20-21 | 2 | Duration |
22-23 | 2 | Minimum Temperature |
24-25 | 2 | O2% |
26-27 | 2 | Surface Interval |
28-29 | 2 | CNS% After Dive |
30-31 | 2 | Altitude Level |
32-33 | 2 | PO2 Limit |
34-35 | 2 | Depth Limit |
36-37 | 2 | Unknown |
38-39 | 2 | Desat Before Dive |
40-47 | 8 | Unknown |
48-49 | 2 | Settings |
50-51 | 2 | Unknown, always 0xff 0xff |
52-59 | 8 | Unknown |
60-63 | 4 | cpt data at start of dive. 8 cpts. Fast tissues to... |
64-67 | 4 | |
68-71 | 4 | |
72-75 | 4 | |
76-79 | 4 | |
80-83 | 4 | |
84-87 | 4 | |
88-91 | 4 | ...slow tissues |
Position | Num bytes | Description |
---|---|---|
00-03 | 4 | 0xa5 0xa5 0x5a 0x5a |
04-07 | 4 | Dive Data Length |
08-11 | 4 | Dive Start Time |
12-15 | 4 | Unknown |
16 | 1 | UTC Offset |
17 | 1 | Rep. No |
18 | 1 | MB-level at start of dive |
19 | 1 | Battery |
20 | 1 | Unknown |
21 | 1 | Alarms During Dive |
22-23 | 2 | Maximum Depth |
24-25 | 2 | Duration |
26-27 | 2 | Minimum Temperature |
28-29 | 2 | Maximum Temperature |
30-31 | 2 | O2% |
32-33 | 2 | Air Temperature |
34-35 | 2 | Surface Interval |
36-37 | 2 | CNS% After Dive |
38-39 | 2 | Altitude Level |
40-41 | 2 | Unknown |
42-43 | 2 | PO2 Limit |
44-45 | 2 | Depth Limit |
48-49 | 2 | Desat Before Dive |
50-51 | 2 | Unknown |
52-53 | 2 | Desat Before Dive |
54-75 | 22 | Unknown |
76-79 | 4 | cpt data at start of dive. 8 cpts. Fast tissues to... |
80-83 | 4 | |
84-87 | 4 | |
88-91 | 4 | |
92-95 | 4 | |
96-99 | 4 | |
100-103 | 4 | |
104-107 | 4 | ...slow tissues |
Position | Num bytes | Description |
---|---|---|
00-03 | 4 | 0xa5 0xa5 0x5a 0x5a |
04-07 | 4 | Dive Data Length |
08-11 | 4 | Dive Start Time |
12-15 | 4 | Unknown |
16 | 1 | Alarms During Dive |
17 | 1 | MB-level at start of dive |
18-19 | 2 | Maximum Depth |
20-21 | 2 | Duration |
22-23 | 2 | Minimum Temperature |
24-25 | 2 | O2% |
26-27 | 2 | Surface Interval |
28-29 | 2 | CNS% After Dive |
30-31 | 2 | Tank Pressure At Start Of Dive |
32-33 | 2 | Tank Pressure At End Of Dive |
34-35 | 2 | Depth Limit |
36-37 | 2 | Tank Pressure Limit |
38-41 | 4 | Unknown |
42-43 | 2 | Altitude Level |
44-45 | 2 | PO2 Limit |
46-47 | 2 | Unknown |
48-49 | 2 | Desat Before Dive |
50-57 | 8 | Unknown |
58-59 | 2 | Settings |
60-67 | 8 | Unknown |
68-71 | 4 | cpt data at start of dive. 8 cpts. Fast tissues to... |
72-75 | 4 | |
76-79 | 4 | |
80-83 | 4 | |
84-87 | 4 | |
88-91 | 4 | |
92-95 | 4 | |
96-91 | 4 | ...slow tissues |
Position | Num bytes | Description |
---|---|---|
00-03 | 4 | 0xa5 0xa5 0x5a 0x5a |
04-07 | 4 | Dive Data Length |
08-11 | 4 | Dive Start Time |
12-15 | 4 | Unknown |
16 | 1 | Alarms During Dive |
17 | 1 | MB-level at start of dive |
18-19 | 2 | Maximum Depth |
20-21 | 2 | Duration |
22-23 | 2 | Minimum Temperature |
24-25 | 2 | Surface Interval |
26-27 | 2 | CNS% After Dive |
28-29 | 2 | O2% Tank 1 |
30-31 | 2 | O2% Tank 2 |
32-33 | 2 | O2% Tank D |
34-35 | 2 | Tank 1 Pressure At Start Of Dive |
36-37 | 2 | Tank 1 Pressure At End Of Dive |
38-39 | 2 | Tank 2 Pressure At Start Of Dive |
40-41 | 2 | Tank 2 Pressure At End Of Dive |
42-43 | 2 | Tank D Pressure At Start Of Dive |
44-45 | 2 | Tank D Pressure At End Of Dive |
46-47 | 2 | Unknown |
48-49 | 2 | Depth Limit |
50-51 | 2 | Tank Pressure Limit - all tanks have the same limit. |
52-55 | 4 | Unknown |
56-57 | 2 | Altitude Level |
58-59 | 2 | PO2 Limit - Tank 1 |
60-61 | 2 | PO2 Limit - Tank 2 |
62-63 | 2 | PO2 Limit - Tank D |
64-69 | 6 | Unknown - Seems to be a duplicate of bytes 58-63 |
70-79 | 10 | Unknown |
80-81 | 2 | Desat Before Dive |
82-89 | 8 | Unknown |
90-91 | 2 | Settings |
92-99 | 8 | Unknown |
100-103 | 4 | cpt data at start of dive. 8 cpts. Fast tissues to... |
104-107 | 4 | |
108-111 | 4 | |
112-115 | 4 | |
116-119 | 4 | |
120-123 | 4 | |
124-127 | 4 | |
128-131 | 4 | ...slow tissues |
Position | Num bytes | Description |
---|---|---|
00-03 | 4 | 0xa5 0xa5 0x5a 0x5a |
04-07 | 4 | Dive Data Length |
08-11 | 4 | Dive Start Time |
12-15 | 4 | Unknown |
16 | 1 | Alarms During Dive |
17 | 1 | MB-level at start of dive |
18-19 | 2 | Maximum Depth |
20-21 | 2 | Duration |
22-23 | 2 | Minimum Temperature |
24-25 | 2 | Surface Interval |
26-27 | 2 | CNS% After Dive |
28-29 | 2 | O2% |
30-33 | 4 | Unknown/Unused - Same position as TEC's Tank 2 & D O2% |
34-35 | 2 | Tank Pressure At Start Of Dive |
36-37 | 2 | Tank Pressure At End Of Dive |
38-45 | 8 | Unknown/Unused - Same position as TEC's Tank 2 & D Start & End Pressures |
46-47 | 2 | Unknown |
48-49 | 2 | Depth Limit |
50-51 | 2 | Tank Pressure Limit |
52-55 | 4 | Unknown |
56-57 | 2 | Altitude Level |
58-59 | 2 | PO2 Limit |
60-63 | 4 | Unknown/Unused - Same position as TEC's Tank 2 & D PO2 Limits |
64-69 | 6 | Unknown - Seems to be a duplicate of bytes 58-63 |
70-79 | 10 | Unknown |
80-81 | 2 | Desat Before Dive |
82-89 | 8 | Unknown |
90-91 | 2 | Settings |
92-99 | 8 | Unknown |
100-103 | 4 | cpt data at start of dive. 8 cpts. Fast tissues to... |
104-107 | 4 | |
108-111 | 4 | |
112-115 | 4 | |
116-119 | 4 | |
120-123 | 4 | |
124-127 | 4 | |
128-131 | 4 | ...slow tissues |
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.
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.
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.
8 bit integer. Aladin TEC/PRIME only.
I assume this number represents the dive number within a repetitative dive group.
8 bit integer.
The starting MB-level (Microbubble level) - Uwatec's diver settable fudge factor. Can be 0 to 5 representing L0 - L5.
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.
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).
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.
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!
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!
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.
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!
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.
16 bit big endian word. To convert the value to an integer:
byte0 + (byte1 << 8) + (byte2 << 16)
The CNS% after the dive.
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.
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.
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).
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.
User settable tank pressure limit alarm.
To convert to bar multiply by 0.0078125, add 0.5. and use the integer result.
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.
16 bit, bit fields.
Temperature Unit | x0000000 00000000 | 0 = Centigrade, 1 = fahrenheit |
Depth Unit | 0x000000 00000000 | 0 = Meters, 1 = Feet |
Gauge Mode | 000x0000 00000000 | 0 = Off, 1 = On |
Alarms | 000000xx xxxxxxxx | Not completely understood |
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 change | 0000x000 |
RBT | 00x00000 |
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.
Absolute Temperature | 11111110 dddddddd dddddddd |
Absolute Depth | 1111110d dddddddd dddddddd |
Delta Temperature | 111110dd dddddddd |
Delta Depth | 11110ddd dddddddd |
Alarms | 1110dddd |
Time | 110ddddd |
Delta Temperature | 10dddddd |
Delta Depth | 0ddddddd |
Alarms | 11111111 0ddddddd |
Absolute Temperature | 11111110 dddddddd dddddddd |
Absolute Depth | 1111110d dddddddd dddddddd |
Delta Temperature | 111110dd dddddddd |
Delta Depth | 11110ddd dddddddd |
Alarms | 1110dddd |
Time | 110ddddd |
Delta Temperature | 10dddddd |
Delta Depth | 0ddddddd |
Absolute RBT | 11111111 1110dddd dddddddd |
Absolute Temperature | 11111111 110ddddd dddddddd dddddddd |
Absolute Tank Pressure | 11111111 10dddddd dddddddd dddddddd |
Absolute Depth | 11111111 0ddddddd dddddddd dddddddd |
Time | 11111110 dddddddd |
Alarms | 1111110d dddddddd |
Delta Temperature | 111110dd dddddddd |
Delta Depth | 11110ddd dddddddd |
Delta Tank Pressure | 1110dddd dddddddd |
Delte Temperature | 110ddddd |
Delta RBT | 10dddddd |
Delta Tank Pressure/Depth | 0ddddddd dddddddd |
Absolute RBT | 11111111 111110dd dddddddd |
Absolute Tank D Pressure | 11111111 11110ddd dddddddd dddddddd |
Absolute Tank 2 Pressure | 11111111 1110dddd dddddddd dddddddd |
Absolute Tank 1 Pressure | 11111111 110ddddd dddddddd dddddddd |
Absolute Temperature | 11111111 10dddddd dddddddd dddddddd |
Absolute Depth | 11111111 0ddddddd dddddddd dddddddd |
Time | 11111110 dddddddd |
Alarms | 1111110d dddddddd |
Delta Temperature | 111110dd dddddddd |
Delta Depth | 11110ddd dddddddd |
Delta Tank Pressure | 1110dddd dddddddd |
Delta Temperature | 110ddddd |
Delta RBT | 10dddddd |
Delta Tank Pressure/Depth | 0ddddddd dddddddd |
Absolute RBT | 11111111 111110dd dddddddd |
Absolute Tank Pressure | 11111111 110ddddd dddddddd dddddddd |
Absolute Temperature | 11111111 10dddddd dddddddd dddddddd |
Absolute Depth | 11111111 0ddddddd dddddddd dddddddd |
Time | 11111110 dddddddd |
Alarms | 1111110d dddddddd |
Delta Temperature | 111110dd dddddddd |
Delta Depth | 11110ddd dddddddd |
Delta Tank Pressure | 1110dddd dddddddd |
Delta Temperature | 110ddddd |
Delta RBT | 10dddddd |
Delta Tank Pressure/Depth | 0ddddddd 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.
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.
To convert to centigrade divide by 2.5
See also the note on Delta Values.
This value indicates that the current profile time must be incremented by value * 4 seconds.
This is the number of minutes that the dive computer estimates you have left based on your air consumption. This value requires no conversion.
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.
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 */
Binary | Hex | Alarm | Description |
---|---|---|---|
00000001 | 0x01 | Alarm 1 | Yellow * is shown in Buzzer area of dive window in SmartTrak. I assume this means Alarm Status = Bad. |
00000010 | 0x02 | Alarm 2 | Red * is shown in Buzzer area of dive window in SmartTrak. I assume this means Alarm Status = Very Bad. |
00000100 | 0x04 | Workload | COM, TEC & Z only |
00001000 | 0x08 | UNKNOWN | UNKNOWN |
00010000 | 0x10 | UNKNOWN | UNKNOWN |
00100000 | 0x20 | RBT | COM, TEC & Z only |
01000000 | 0x40 | Bookmark/Safety Stop Timer Started | If 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): |
---|---|
<6 | 7 |
<12 | 8 |
<18 | 9 |
<23 | 10 |
<27 | 11 |
<31 | 13 |
<35 | 15 |
<39 | 17 |
<44 | 18 |
<50 | 19 |
>50 | 20 |
Depth (F): | Acent Rate Limit (F/min): |
---|---|
<20 | 23 |
<40 | 26 |
<60 | 29 |
<75 | 33 |
<88 | 36 |
<101 | 43 |
<115 | 49 |
<128 | 56 |
<144 | 59 |
<164 | 62 |
>164 | 66 |
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.
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.