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.