diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2013-02-09 07:41:15 -0800 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2013-02-09 07:41:15 -0800 |
commit | ebcbe5aedd6188d2dce0cc9dee37daaaab4e8b05 (patch) | |
tree | a163cfaa732ed09ee4ebe3c7e88e32fc81beb9af | |
parent | b9865d6bbc30ff4f82ffa17d4a2e3e74bc1054ed (diff) | |
download | subsurface-ebcbe5aedd6188d2dce0cc9dee37daaaab4e8b05.tar.gz |
Finish removing accesses to first divecomputer instead of dive
This adds watertemp and airtemp to the dive, populates them in fixup and
uses them elsewhere in the code.
WARNING: as a sideeffect we now edit the airtemp in the dive, but we never
display this in the DIve Info notebook (as that always displays the data
from the specific selected divecomputer). This is likely to cause
confusion. It's consistent behavior, but... odd. This brings back the
desire to have a view of "best data available" for a dive, in addition to
the "per divecomputer" view. This would also allow us to consolidate the
different pressure graphs we may be getting from different divecomputers
(consider the case where you dive with multiple air integrated computers
that are connected to different tanks - now we could have one profile with
all the correct tank pressure plots overlayed - and the best available (or
edited) data in the corresponding Dive Info notebook.
This commit also fixes a few remaining accesses to the first divecomputer
that fell through the cracks earlier and does a couple of other related
cleanups.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r-- | dive.c | 33 | ||||
-rw-r--r-- | dive.h | 2 | ||||
-rw-r--r-- | divelist.c | 16 | ||||
-rw-r--r-- | file.c | 8 | ||||
-rw-r--r-- | info.c | 8 | ||||
-rw-r--r-- | main.c | 4 |
6 files changed, 52 insertions, 19 deletions
@@ -469,6 +469,36 @@ static void fixup_duration(struct dive *dive) dive->duration.seconds = duration; } +static void fixup_watertemp(struct dive *dive) +{ + struct divecomputer *dc; + int sum = 0, nr = 0; + + for_each_dc(dive, dc) { + if (dc->watertemp.mkelvin) { + sum += dc->watertemp.mkelvin; + nr++; + } + } + if (nr) + dive->watertemp.mkelvin = (sum + nr / 2) / nr; +} + +static void fixup_airtemp(struct dive *dive) +{ + struct divecomputer *dc; + int sum = 0, nr = 0; + + for_each_dc(dive, dc) { + if (dc->airtemp.mkelvin) { + sum += dc->airtemp.mkelvin; + nr++; + } + } + if (nr) + dive->airtemp.mkelvin = (sum + nr / 2) / nr; +} + /* * events are stored as a linked list, so the concept of * "consecutive, identical events" is somewhat hard to @@ -662,6 +692,8 @@ struct dive *fixup_dive(struct dive *dive) fixup_surface_pressure(dive); fixup_meandepth(dive); fixup_duration(dive); + fixup_watertemp(dive); + fixup_airtemp(dive); for_each_dc(dive, dc) fixup_dive_dc(dive, dc); @@ -1580,7 +1612,6 @@ struct dive *merge_dives(struct dive *a, struct dive *b, int offset, gboolean pr MERGE_MAX(res, a, b, rating); MERGE_TXT(res, a, b, suit); MERGE_MAX(res, a, b, number); - res->dc.meandepth.mm = 0; MERGE_NONZERO(res, a, b, cns); MERGE_NONZERO(res, a, b, visibility); merge_equipment(res, a, b); @@ -320,7 +320,7 @@ struct dive { int sac, otu, cns, maxcns; /* Calculated based on dive computer data */ - temperature_t mintemp, maxtemp; + temperature_t mintemp, maxtemp, watertemp, airtemp; depth_t maxdepth, meandepth; pressure_t surface_pressure; duration_t duration; diff --git a/divelist.c b/divelist.c index 70a99f9c6..03e0287d3 100644 --- a/divelist.c +++ b/divelist.c @@ -720,7 +720,7 @@ static int calculate_sac(struct dive *dive) } } /* Mean pressure in bar (SAC calculations are in bar*l/min) */ - pressure = depth_to_mbar(dive->dc.meandepth.mm, dive) / 1000.0; + pressure = depth_to_mbar(dc->meandepth.mm, dive) / 1000.0; sac = airuse / pressure * 60 / duration; /* milliliters per minute.. */ @@ -735,7 +735,7 @@ static void add_dive_to_deco(struct dive *dive) if (!dc) return; - for (i = 1; i < dive->dc.samples; i++) { + for (i = 1; i < dc->samples; i++) { struct sample *psample = dc->sample + i - 1; struct sample *sample = dc->sample + i; int t0 = psample->time.seconds; @@ -1322,7 +1322,7 @@ static void fill_dive_list(void) DIVE_LOCATION, dive->location, DIVE_LOC_ICON, icon, DIVE_RATING, dive->rating, - DIVE_TEMPERATURE, dive->dc.watertemp.mkelvin, + DIVE_TEMPERATURE, dive->watertemp.mkelvin, DIVE_SAC, 0, -1); gtk_tree_store_append(liststore, &iter, NULL); @@ -1335,7 +1335,7 @@ static void fill_dive_list(void) DIVE_LOCATION, dive->location, DIVE_LOC_ICON, icon, DIVE_RATING, dive->rating, - DIVE_TEMPERATURE, dive->dc.watertemp.mkelvin, + DIVE_TEMPERATURE, dive->watertemp.mkelvin, DIVE_TOTALWEIGHT, 0, DIVE_SUIT, dive->suit, DIVE_SAC, 0, @@ -1674,8 +1674,8 @@ static int copy_tree_node(GtkTreeIter *a, GtkTreeIter *b) DIVE_DATE, &store_dive.when, DIVE_RATING, &store_dive.rating, DIVE_DEPTH, &store_dive.maxdepth, - DIVE_DURATION, &store_dive.dc.duration, - DIVE_TEMPERATURE, &store_dive.dc.watertemp.mkelvin, + DIVE_DURATION, &store_dive.duration, + DIVE_TEMPERATURE, &store_dive.watertemp.mkelvin, DIVE_TOTALWEIGHT, &totalweight, DIVE_SUIT, &store_dive.suit, DIVE_CYLINDER, &cylinder_text, @@ -1691,8 +1691,8 @@ static int copy_tree_node(GtkTreeIter *a, GtkTreeIter *b) DIVE_DATE, store_dive.when, DIVE_RATING, store_dive.rating, DIVE_DEPTH, store_dive.maxdepth, - DIVE_DURATION, store_dive.dc.duration, - DIVE_TEMPERATURE, store_dive.dc.watertemp.mkelvin, + DIVE_DURATION, store_dive.duration, + DIVE_TEMPERATURE, store_dive.watertemp.mkelvin, DIVE_TOTALWEIGHT, totalweight, DIVE_SUIT, store_dive.suit, DIVE_CYLINDER, cylinder_text, @@ -174,6 +174,7 @@ static int try_to_open_csv(const char *filename, struct memblock *mem, enum csv_ int i, time; timestamp_t date; struct dive *dive; + struct divecomputer *dc; for (i = 0; i < 8; i++) { header[i] = p; @@ -190,6 +191,7 @@ static int try_to_open_csv(const char *filename, struct memblock *mem, enum csv_ dive = alloc_dive(); dive->when = date; dive->number = atoi(header[1]); + dc = &dive->dc; time = 0; for (;;) { @@ -204,13 +206,13 @@ static int try_to_open_csv(const char *filename, struct memblock *mem, enum csv_ if (errno) break; - sample = prepare_sample(&dive->dc); + sample = prepare_sample(dc); sample->time.seconds = time; add_sample_data(sample, type, val); - finish_sample(&dive->dc); + finish_sample(dc); time++; - dive->dc.duration.seconds = time; + dc->duration.seconds = time; if (*end != ',') break; p = end+1; @@ -593,8 +593,8 @@ static void save_dive_info_changes(struct dive *dive, struct dive *master, struc default: mkelvin = 0; } - if (mkelvin != dive->dc.airtemp.mkelvin && dive->dc.airtemp.mkelvin == master->dc.airtemp.mkelvin) { - dive->dc.airtemp.mkelvin = mkelvin; + if (mkelvin != dive->airtemp.mkelvin && dive->airtemp.mkelvin == master->airtemp.mkelvin) { + dive->airtemp.mkelvin = mkelvin; changed = 1; } } @@ -808,9 +808,9 @@ static void dive_info_widget(GtkWidget *box, struct dive *dive, struct dive_info info->viz = text_entry(hbox, _("Visibility"), star_list, star_strings[dive->visibility]); - value = get_temp_units(dive->dc.airtemp.mkelvin, &unit); + value = get_temp_units(dive->airtemp.mkelvin, &unit); snprintf(buffer, sizeof(buffer), _("Air Temp in %s"), unit); - if (dive->dc.airtemp.mkelvin) + if (dive->airtemp.mkelvin) snprintf(airtemp, sizeof(airtemp), "%.1f", value); else airtemp[0] = '\0'; @@ -172,8 +172,8 @@ void report_dives(gboolean is_imported, gboolean prefer_imported) /* only try to merge overlapping dives - or if one of the dives has * zero duration (that might be a gps marker from the webservice) */ - if (prev->dc.duration.seconds && dive->dc.duration.seconds && - prev->when + prev->dc.duration.seconds < dive->when) + if (prev->duration.seconds && dive->duration.seconds && + prev->when + prev->duration.seconds < dive->when) continue; merged = try_to_merge(prev, dive, prefer_imported); |