summaryrefslogtreecommitdiffstats
path: root/parse-xml.c
diff options
context:
space:
mode:
authorGravatar Miika Turkia <miika.turkia@gmail.com>2014-02-15 08:36:51 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2014-02-14 22:47:10 -0800
commitbbda9dd10822583941761592d8ac8bc12a01d82d (patch)
treee68bb8266274a143c295d13c9a1388cfc061da8e /parse-xml.c
parent62e313df35df7319005b49b6011717ec0bc70088 (diff)
downloadsubsurface-bbda9dd10822583941761592d8ac8bc12a01d82d.tar.gz
Import gas info for Shearwater Desktop
Used gas mixes and gas changes are imported. Also po2, ndl, cns and ceiling are added to profile samples. As far as I can tell, the Searwater Desktop shows ceiling in 3 meter (or feet equivalent) steps, but stores in feet (or probably meters). I just use the value reported, no conversion to 3 meter steps. Fixes #432 Signed-off-by: Miika Turkia <miika.turkia@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'parse-xml.c')
-rw-r--r--parse-xml.c60
1 files changed, 54 insertions, 6 deletions
diff --git a/parse-xml.c b/parse-xml.c
index b93906f55..40bbf40ab 100644
--- a/parse-xml.c
+++ b/parse-xml.c
@@ -1883,6 +1883,32 @@ int parse_dm4_buffer(sqlite3 *handle, const char *url, const char *buffer, int s
return 0;
}
+extern int shearwater_cylinders(void *handle, int columns, char **data, char **column)
+{
+ cylinder_start();
+ if (data[0])
+ cur_dive->cylinder[cur_cylinder_index].gasmix.o2.permille = atof(data[0]) * 1000;
+ if (data[1])
+ cur_dive->cylinder[cur_cylinder_index].gasmix.he.permille = atof(data[1]) * 1000;
+ cylinder_end();
+
+ return 0;
+}
+
+extern int shearwater_changes(void *handle, int columns, char **data, char **column)
+{
+ event_start();
+ if (data[0])
+ cur_event.time.seconds = atoi(data[0]);
+ if (data[1]) {
+ cur_event.name = strdup("gaschange");
+ cur_event.value = atof(data[1]) * 100;
+ }
+ event_end();
+
+ return 0;
+}
+
extern int shearwater_profile_sample(void *handle, int columns, char **data, char **column)
{
sample_start();
@@ -1892,6 +1918,14 @@ extern int shearwater_profile_sample(void *handle, int columns, char **data, cha
cur_sample->depth.mm = metric ? atof(data[1]) * 1000 : feet_to_mm(atof(data[1]));
if (data[2])
cur_sample->temperature.mkelvin = metric ? C_to_mkelvin(atof(data[2])) : F_to_mkelvin(atof(data[2]));
+ if (data[3])
+ cur_sample->po2 = atof(data[3]) * 1000;
+ if (data[4])
+ cur_sample->ndl.seconds = atoi(data[4]) * 60;
+ if (data[5])
+ cur_sample->cns = atoi(data[5]);
+ if (data[6])
+ cur_sample->stopdepth.mm = metric ? atoi(data[6]) * 1000 : feet_to_mm(atoi(data[6]));
/* We don't actually have data[3], but it should appear in the
* SQL query at some point.
@@ -1910,10 +1944,10 @@ extern int shearwater_dive(void *param, int columns, char **data, char **column)
float *profileBlob;
unsigned char *tempBlob;
char *err = NULL;
- char *location, *site;
- char get_profile_template[] = "select currentTime,currentDepth,waterTemp from dive_log_records where diveLogId = %d";
- char get_tags_template[] = "select Text from DiveTag where DiveId = %d";
- char get_profile_sample[128];
+ char get_profile_template[] = "select currentTime,currentDepth,waterTemp,averagePPO2,currentNdl,CNSPercent,decoCeiling from dive_log_records where diveLogId = %d";
+ char get_cylinder_template[] = "select fractionO2,fractionHe from dive_log_records where diveLogId = %d group by fractionO2,fractionHe";
+ char get_changes_template[] = "select a.currentTime,a.fractionO2,a.fractionHe from dive_log_records as a,dive_log_records as b where a.diveLogId = %d and b.diveLogId = %d and (a.id - 1) = b.id and (a.fractionO2 != b.fractionO2 or a.fractionHe != b.fractionHe) union select min(currentTime),fractionO2,fractionHe from dive_log_records";
+ char get_buffer[1024];
dive_start();
cur_dive->number = atoi(data[0]);
@@ -1952,8 +1986,22 @@ extern int shearwater_dive(void *param, int columns, char **data, char **column)
dc_settings_end();
settings_end();
- snprintf(get_profile_sample, sizeof(get_profile_sample) - 1, get_profile_template, cur_dive->number);
- retval = sqlite3_exec(handle, get_profile_sample, &shearwater_profile_sample, 0, &err);
+ snprintf(get_buffer, sizeof(get_buffer) - 1, get_cylinder_template, cur_dive->number);
+ retval = sqlite3_exec(handle, get_buffer, &shearwater_cylinders, 0, &err);
+ if (retval != SQLITE_OK) {
+ fprintf(stderr, "%s", translate("gettextFromC","Database query get_cylinders failed.\n"));
+ return 1;
+ }
+
+ snprintf(get_buffer, sizeof(get_buffer) - 1, get_changes_template, cur_dive->number, cur_dive->number);
+ retval = sqlite3_exec(handle, get_buffer, &shearwater_changes, 0, &err);
+ if (retval != SQLITE_OK) {
+ fprintf(stderr, "%s", translate("gettextFromC","Database query get_changes failed.\n"));
+ return 1;
+ }
+
+ snprintf(get_buffer, sizeof(get_buffer) - 1, get_profile_template, cur_dive->number);
+ retval = sqlite3_exec(handle, get_buffer, &shearwater_profile_sample, 0, &err);
if (retval != SQLITE_OK) {
fprintf(stderr, "%s", translate("gettextFromC","Database query get_profile_sample failed.\n"));
return 1;