Here is a couple of patches that fix the problems on Sunnto DM5 import that
I have identified so far. Mainly highlighted by Mika's DB that we received
recently. Some of the patches I have sent before, but they are not yet
pushed out so here should be everything pending + new ones.

Partly the problems were caused by Suunto storing faulty information in the
DB when they have no data (e.g. 2^16/2) or defaulting some values. And of
course there were some bugs or incomplete features introduced by me as well
:D

miika
From 7ba6333a8fbd2fda34c0c7ce3d22fa242e2c7758 Mon Sep 17 00:00:00 2001
From: Miika Turkia <miika.tur...@gmail.com>
Date: Sun, 22 Feb 2015 08:20:20 +0200
Subject: [PATCH 5/5] Discard deleted dives on DM5 import

I had some double profiles with slight differences in them, until I
realized that this was caused by including deleted dives in the import.

Signed-off-by: Miika Turkia <miika.tur...@gmail.com>
---
 parse-xml.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/parse-xml.c b/parse-xml.c
index 3d50bcd..1d9ce97 100644
--- a/parse-xml.c
+++ b/parse-xml.c
@@ -2407,7 +2407,7 @@ int parse_dm5_buffer(sqlite3 *handle, const char *url, const char *buffer, int s
 
 	/* StartTime is converted from Suunto's nano seconds to standard
 	 * time. We also need epoch, not seconds since year 1. */
-	char get_dives[] = "select DiveId,StartTime/10000000-62135596800,Note,Duration,coalesce(SourceSerialNumber,SerialNumber),Source,MaxDepth,SampleInterval,StartTemperature,BottomTemperature,StartPressure,EndPressure,'','',SurfacePressure,DiveTime,SampleInterval,ProfileBlob,TemperatureBlob,PressureBlob,'','','','',SampleBlob FROM Dive";
+	char get_dives[] = "select DiveId,StartTime/10000000-62135596800,Note,Duration,coalesce(SourceSerialNumber,SerialNumber),Source,MaxDepth,SampleInterval,StartTemperature,BottomTemperature,StartPressure,EndPressure,'','',SurfacePressure,DiveTime,SampleInterval,ProfileBlob,TemperatureBlob,PressureBlob,'','','','',SampleBlob FROM Dive where Deleted is null";
 
 	retval = sqlite3_exec(handle, get_dives, &dm5_dive, handle, &err);
 
-- 
2.1.0

From 66c035c695f978c406618b821095d90f2eff4eb2 Mon Sep 17 00:00:00 2001
From: Miika Turkia <miika.tur...@gmail.com>
Date: Sun, 22 Feb 2015 07:07:40 +0200
Subject: [PATCH 4/5] Clean DM5 sql query

We don't use the data coming from DiveMixture so removing the join. The
join did also generate extra rows of the same dive (with differing gas
info).

Signed-off-by: Miika Turkia <miika.tur...@gmail.com>
---
 parse-xml.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/parse-xml.c b/parse-xml.c
index 530a41d..3d50bcd 100644
--- a/parse-xml.c
+++ b/parse-xml.c
@@ -2407,7 +2407,7 @@ int parse_dm5_buffer(sqlite3 *handle, const char *url, const char *buffer, int s
 
 	/* StartTime is converted from Suunto's nano seconds to standard
 	 * time. We also need epoch, not seconds since year 1. */
-	char get_dives[] = "select D.DiveId,StartTime/10000000-62135596800,Note,Duration,coalesce(SourceSerialNumber,SerialNumber),Source,MaxDepth,SampleInterval,StartTemperature,BottomTemperature,D.StartPressure,D.EndPressure,Size,CylinderWorkPressure,SurfacePressure,DiveTime,SampleInterval,ProfileBlob,TemperatureBlob,PressureBlob,Oxygen,Helium,MIX.StartPressure,MIX.EndPressure,SampleBlob FROM Dive AS D JOIN DiveMixture AS MIX ON D.DiveId=MIX.DiveId";
+	char get_dives[] = "select DiveId,StartTime/10000000-62135596800,Note,Duration,coalesce(SourceSerialNumber,SerialNumber),Source,MaxDepth,SampleInterval,StartTemperature,BottomTemperature,StartPressure,EndPressure,'','',SurfacePressure,DiveTime,SampleInterval,ProfileBlob,TemperatureBlob,PressureBlob,'','','','',SampleBlob FROM Dive";
 
 	retval = sqlite3_exec(handle, get_dives, &dm5_dive, handle, &err);
 
-- 
2.1.0

From e73f04bda4fb5bcafd11a8390ee38f3542984e82 Mon Sep 17 00:00:00 2001
From: Miika Turkia <miika.tur...@gmail.com>
Date: Sat, 21 Feb 2015 20:55:06 +0200
Subject: [PATCH 3/5] Import DC info properly from DM5 log

Using serial number as device ID here for simplicity. We also need the
DC info for the divecomputer tag per dive. And it seems that serial
number is in SerialNumber, SourceSerialNumber or both.

Signed-off-by: Miika Turkia <miika.tur...@gmail.com>
---
 parse-xml.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/parse-xml.c b/parse-xml.c
index d656ed3..530a41d 100644
--- a/parse-xml.c
+++ b/parse-xml.c
@@ -2267,12 +2267,13 @@ extern int dm5_dive(void *param, int columns, char **data, char **column)
 	 */
 	settings_start();
 	dc_settings_start();
-	if (data[4])
+	if (data[4]) {
 		utf8_string(data[4], &cur_settings.dc.serial_nr);
+		cur_settings.dc.deviceid = atoi(data[4]);
+	}
 	if (data[5])
 		utf8_string(data[5], &cur_settings.dc.model);
 
-	cur_settings.dc.deviceid = 0xffffffff;
 	dc_settings_end();
 	settings_end();
 
@@ -2283,9 +2284,11 @@ extern int dm5_dive(void *param, int columns, char **data, char **column)
 	if (data[9])
 		cur_dive->dc.watertemp.mkelvin = C_to_mkelvin(atoi(data[9]));
 
-	/*
-	 * TODO: handle multiple cylinders
-	 */
+	if (data[4]) {
+		cur_dive->dc.deviceid = atoi(data[4]);
+	}
+	if (data[5])
+		utf8_string(data[5], &cur_dive->dc.model);
 
 	snprintf(get_events, sizeof(get_events) - 1, get_cylinders_template, cur_dive->number);
 	retval = sqlite3_exec(handle, get_events, &dm5_cylinders, 0, &err);
@@ -2404,7 +2407,7 @@ int parse_dm5_buffer(sqlite3 *handle, const char *url, const char *buffer, int s
 
 	/* StartTime is converted from Suunto's nano seconds to standard
 	 * time. We also need epoch, not seconds since year 1. */
-	char get_dives[] = "select D.DiveId,StartTime/10000000-62135596800,Note,Duration,SourceSerialNumber,Source,MaxDepth,SampleInterval,StartTemperature,BottomTemperature,D.StartPressure,D.EndPressure,Size,CylinderWorkPressure,SurfacePressure,DiveTime,SampleInterval,ProfileBlob,TemperatureBlob,PressureBlob,Oxygen,Helium,MIX.StartPressure,MIX.EndPressure,SampleBlob FROM Dive AS D JOIN DiveMixture AS MIX ON D.DiveId=MIX.DiveId";
+	char get_dives[] = "select D.DiveId,StartTime/10000000-62135596800,Note,Duration,coalesce(SourceSerialNumber,SerialNumber),Source,MaxDepth,SampleInterval,StartTemperature,BottomTemperature,D.StartPressure,D.EndPressure,Size,CylinderWorkPressure,SurfacePressure,DiveTime,SampleInterval,ProfileBlob,TemperatureBlob,PressureBlob,Oxygen,Helium,MIX.StartPressure,MIX.EndPressure,SampleBlob FROM Dive AS D JOIN DiveMixture AS MIX ON D.DiveId=MIX.DiveId";
 
 	retval = sqlite3_exec(handle, get_dives, &dm5_dive, handle, &err);
 
-- 
2.1.0

From 47e34480c6860f5c2ede8b34b8a6b7191e9c63cf Mon Sep 17 00:00:00 2001
From: Miika Turkia <miika.tur...@gmail.com>
Date: Sat, 21 Feb 2015 13:15:03 +0200
Subject: [PATCH 2/5] Support for gas changes in DM5 import

Signed-off-by: Miika Turkia <miika.tur...@gmail.com>
---
 parse-xml.c | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/parse-xml.c b/parse-xml.c
index 285c681..d656ed3 100644
--- a/parse-xml.c
+++ b/parse-xml.c
@@ -2090,6 +2090,19 @@ extern int dm5_cylinders(void *handle, int columns, char **data, char **column)
 	return 0;
 }
 
+extern int dm5_gaschange(void *handle, int columns, char **data, char **column)
+{
+	event_start();
+	if (data[0])
+		cur_event.time.seconds = atoi(data[0]);
+	if (data[1]) {
+		strcpy(cur_event.name, "gaschange");
+		cur_event.value = atof(data[1]);
+	}
+	event_end();
+
+	return 0;
+}
 
 extern int dm4_tags(void *handle, int columns, char **data, char **column)
 {
@@ -2234,7 +2247,8 @@ extern int dm5_dive(void *param, int columns, char **data, char **column)
 	char get_events_template[] = "select * from Mark where DiveId = %d";
 	char get_tags_template[] = "select Text from DiveTag where DiveId = %d";
 	char get_cylinders_template[] = "select * from DiveMixture where DiveId = %d";
-	char get_events[64];
+	char get_gaschange_template[] = "select GasChangeTime,Oxygen,Helium from DiveGasChange join DiveMixture on DiveGasChange.DiveMixtureId=DiveMixture.DiveMixtureId where DiveId = %d";
+	char get_events[512];
 
 	dive_start();
 	cur_dive->number = atoi(data[0]);
@@ -2333,6 +2347,13 @@ extern int dm5_dive(void *param, int columns, char **data, char **column)
 		}
 	}
 
+	snprintf(get_events, sizeof(get_events) - 1, get_gaschange_template, cur_dive->number);
+	retval = sqlite3_exec(handle, get_events, &dm5_gaschange, 0, &err);
+	if (retval != SQLITE_OK) {
+		fprintf(stderr, "%s", translate("gettextFromC", "Database query dm5_gaschange failed.\n"));
+		return 1;
+	}
+
 	snprintf(get_events, sizeof(get_events) - 1, get_events_template, cur_dive->number);
 	retval = sqlite3_exec(handle, get_events, &dm4_events, 0, &err);
 	if (retval != SQLITE_OK) {
-- 
2.1.0

From 49da7eae0320a0e7b8ab43e1eb30019080971e4e Mon Sep 17 00:00:00 2001
From: Miika Turkia <miika.tur...@gmail.com>
Date: Fri, 20 Feb 2015 20:30:38 +0200
Subject: [PATCH 1/5] Fix surface pressure on DM5 import

Seems that DM5 uses pascal as pressure unit for surface pressure.

Signed-off-by: Miika Turkia <miika.tur...@gmail.com>
---
 parse-xml.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/parse-xml.c b/parse-xml.c
index 8826f2f..285c681 100644
--- a/parse-xml.c
+++ b/parse-xml.c
@@ -2281,7 +2281,7 @@ extern int dm5_dive(void *param, int columns, char **data, char **column)
 	}
 
 	if (data[14])
-		cur_dive->dc.surface_pressure.mbar = (atoi(data[14]) * 1000);
+		cur_dive->dc.surface_pressure.mbar = (atoi(data[14]) / 100);
 
 	interval = data[16] ? atoi(data[16]) : 0;
 	sampleBlob = (unsigned const char *)data[24];
-- 
2.1.0

_______________________________________________
subsurface mailing list
subsurface@subsurface-divelog.org
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface

Reply via email to