Suunto DM5 Imports broken
Rainer Mohr
mail at divelogs.de
Thu Jun 7 01:58:57 PDT 2018
Gentlemen,
Just noticed, that the Suunto DM5 Import is very broken as it can't
parse the profile data from recent and semi-recent DM5 files properly.
Suunto has once again changed their data structures in the profile part
of DM5. Noticed after quite a few broken profiles popped up on divelogs.de
Now the 'SampleBlob' can contain not only blocks of 16, 23 and 26 Bytes,
but new: 30 Bytes (detectable by first Byte being '5')
Here is my PHP code for handling the profile parts from the SQLite Data,
hope someone can translate this into what you need, as I would be
useless at doing so:
<?php
// $databaserow contains the data from one dive, queried from the database
$data = $databaserow['SampleBlob'];
$samples = Array();
// Depending on first Byte: Samples are in blocks of 23 or 16 or 26 or
30 bytes
if (ord($data[0])==3) { // 23 Bytes per sample
$data = substr($data,1,strlen($data));
for($i = 0; $i < strlen($data)/23; ++$i) {
$s =
unpack("f",$data[$i*23+2].$data[$i*23+3].$data[$i*23+4].$data[$i*23+5]);
if ($s[1] < 200) $samples[] = round($s[1],1);
}
} elseif (ord($data[0])==4) { // 26 Bytes per sample
$data = substr($data,1,strlen($data));
for($i = 0; $i < strlen($data)/26; ++$i) {
$s =
unpack("f",$data[$i*26+2].$data[$i*26+3].$data[$i*26+4].$data[$i*26+5]);
if ($s[1] < 200) $samples[] = round($s[1],1);
}
} elseif (ord($data[0])==5) { // 30 Bytes per sample
$data = substr($data,1,strlen($data));
for($i = 0; $i < strlen($data)/30; ++$i) {
$s =
unpack("f",$data[$i*30+2].$data[$i*30+3].$data[$i*30+4].$data[$i*30+5]);
if ($s[1] < 200) $samples[] = round($s[1],1);
}
} else { // 16 Bytes per sample
for($i = 0; $i < strlen($data)/16; ++$i) {
$s =
unpack("f",$data[$i*16+3].$data[$i*16+4].$data[$i*16+5].$data[$i*16+6]);
if ($s[1] < 200) $samples[] = round($s[1],1);
}
}
// in case Dives from imported DM4 are available
if (count($samples)==0) {
$data = $databaserow['ProfileBlob'];
for($i = 0; $i < strlen($data)/4; ++$i) {
$s =
unpack("f",$data[$i*4].$data[$i*4+1].$data[$i*4+2].$data[$i*4+3]);
if ($s[1] < 200) $samples[] = round($s[1],1);
}
}
?>
Rainer
More information about the subsurface
mailing list