Can you show the heartrate in Subsurface?

Linus Torvalds torvalds at linux-foundation.org
Fri Jan 17 13:50:55 UTC 2014


On Fri, Jan 17, 2014 at 1:29 PM, Oscar Isoz <jan.oscar.isoz at gmail.com> wrote:
>
> Here comes a xml file with one dive that was recorded using your patch,

Ok. So here's a slightly updated patch that replaces the previous
patch, fixing an extraneous space in the XML output, and also adding
the heartbeat and bearing information to the profile "info" box, so
now you can actually see it in subsurface too.

It does *not* plot the heartbeat as a graph, even if that might be
interesting. I'm not quite motivated enough to do that, especially
since I don't have the hardware myself, and as Tomaz is re-doing the
profile plotting.

But it seems to be working with your XML file, so I think this is
worth applying. Dirk? I don't have any good commit message for this,
just "Add support for heartbeat and bearing information". And my
sign-off.

Right now it adds the heartbeat/bearing to the information box
unconditionally if they exist. I suspect that people who have a dive
computer that supports this would actually want to see it. But if
somebody wants to add the preferences option to enable/disable it, go
wild..

                    Linus
-------------- next part --------------
 dive.h            |  2 ++
 libdivecomputer.c |  4 ++--
 parse-xml.c       |  4 ++++
 profile.c         | 10 ++++++++++
 profile.h         |  2 ++
 save-xml.c        |  2 ++
 6 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/dive.h b/dive.h
index e4c4e354c6b7..6dc228ee54bb 100644
--- a/dive.h
+++ b/dive.h
@@ -266,6 +266,8 @@ struct sample {
 	bool in_deco;
 	int cns;
 	int po2;
+	int heartbeat;
+	int bearing;
 };
 
 struct divetag {
diff --git a/libdivecomputer.c b/libdivecomputer.c
index 69fa38c5cc78..b764ae5f6178 100644
--- a/libdivecomputer.c
+++ b/libdivecomputer.c
@@ -220,10 +220,10 @@ sample_cb(dc_sample_type_t type, dc_sample_value_t value, void *userdata)
 		printf("   <rbt>%u</rbt>\n", value.rbt);
 		break;
 	case DC_SAMPLE_HEARTBEAT:
-		printf("   <heartbeat>%u</heartbeat>\n", value.heartbeat);
+		sample->heartbeat = value.heartbeat;
 		break;
 	case DC_SAMPLE_BEARING:
-		printf("   <bearing>%u</bearing>\n", value.bearing);
+		sample->bearing = value.bearing;
 		break;
 	case DC_SAMPLE_VENDOR:
 		printf("   <vendor time='%u:%02u' type=\"%u\" size=\"%u\">", FRACTION(sample->time.seconds, 60),
diff --git a/parse-xml.c b/parse-xml.c
index 3e320c9f3b23..b4a816f40948 100644
--- a/parse-xml.c
+++ b/parse-xml.c
@@ -854,6 +854,10 @@ static void try_to_fill_sample(struct sample *sample, const char *name, char *bu
 		return;
 	if (MATCH("po2.sample", double_to_permil, &sample->po2))
 		return;
+	if (MATCH("heartbeat", get_index, &sample->heartbeat))
+		return;
+	if (MATCH("bearing", get_index, &sample->bearing))
+		return;
 
 	switch (import_source) {
 	case DIVINGLOG:
diff --git a/profile.c b/profile.c
index 23903d99fb1c..59ff2dade715 100644
--- a/profile.c
+++ b/profile.c
@@ -918,6 +918,8 @@ struct plot_data *populate_plot_entries(struct dive *dive, struct divecomputer *
 			entry->temperature = lasttemp = sample->temperature.mkelvin;
 		else
 			entry->temperature = lasttemp;
+		entry->heartbeat = sample->heartbeat;
+		entry->bearing = sample->bearing;
 
 		lasttime = time;
 		lastdepth = depth;
@@ -1451,6 +1453,14 @@ static void plot_string(struct plot_data *entry, char *buf, int bufsize,
 			}
 		}
 	}
+	if (entry->heartbeat) {
+		memcpy(buf2, buf, bufsize);
+		snprintf(buf, bufsize, translate("gettextFromC","%s\nheartbeat:%d"), buf2, entry->heartbeat);
+	}
+	if (entry->bearing) {
+		memcpy(buf2, buf, bufsize);
+		snprintf(buf, bufsize, translate("gettextFromC","%s\nbearing:%d"), buf2, entry->bearing);
+	}
 	free(buf2);
 }
 
diff --git a/profile.h b/profile.h
index daf402d529d5..73f908f65610 100644
--- a/profile.h
+++ b/profile.h
@@ -42,6 +42,8 @@ struct plot_data {
 	int stoptime_calc;
 	int stopdepth_calc;
 	int pressure_time;
+	int heartbeat;
+	int bearing;
 };
 //TODO: remove the calculatE_max_limits as soon as the new profile is done.
 void calculate_max_limits(struct dive *dive, struct divecomputer *dc, struct graphics_context *gc);
diff --git a/save-xml.c b/save-xml.c
index 374632624df7..7eba7165cabc 100644
--- a/save-xml.c
+++ b/save-xml.c
@@ -330,6 +330,8 @@ static void save_sample(struct membuffer *b, struct sample *sample, struct sampl
 		put_milli(b, " po2='", sample->po2, " bar'");
 		old->po2 = sample->po2;
 	}
+	show_index(b, sample->heartbeat, "heartbeat='", "'");
+	show_index(b, sample->bearing, "bearing='", "'");
 	put_format(b, " />\n");
 }
 


More information about the subsurface mailing list