Separate out single dive statistics and total statistics

Right now this just changes the infrastructure - nothing outside of
statistics.c is modified. This is simply in preparation to split out the
single dive info and the total dive statistics in the future (as we are
creating more info and more stats and they will overflow the screen area
available - so this will turn into two notebook tabs).

This commit does not change any functionality.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Dirk Hohndel 2012-01-15 13:19:39 -08:00
parent c544226334
commit 68a1ff9cf5

View file

@ -29,17 +29,22 @@ typedef struct {
*sac, *sac,
*otu, *otu,
*o2he, *o2he,
*gas_used, *gas_used;
*total_time, } single_stat_widget_t;
static single_stat_widget_t single_w;
typedef struct {
GtkWidget *total_time,
*avg_time, *avg_time,
*max_overall_depth, *max_overall_depth,
*avg_overall_depth, *avg_overall_depth,
*min_sac, *min_sac,
*avg_sac, *avg_sac,
*max_sac; *max_sac;
} info_stat_widget_t; } total_stats_widget_t;
static info_stat_widget_t info_stat_w; static total_stats_widget_t stats_w;
typedef struct { typedef struct {
duration_t total_time; duration_t total_time;
@ -49,9 +54,9 @@ typedef struct {
volume_t max_sac; volume_t max_sac;
volume_t min_sac; volume_t min_sac;
volume_t avg_sac; volume_t avg_sac;
} info_stat_t; } stats_t;
static info_stat_t info_stat; static stats_t stats;
static void process_all_dives(struct dive *dive, struct dive **prev_dive) static void process_all_dives(struct dive *dive, struct dive **prev_dive)
{ {
@ -60,7 +65,7 @@ static void process_all_dives(struct dive *dive, struct dive **prev_dive)
int old_tt, sac_time = 0; int old_tt, sac_time = 0;
*prev_dive = NULL; *prev_dive = NULL;
memset(&info_stat, 0, sizeof(info_stat)); memset(&stats, 0, sizeof(stats));
/* this relies on the fact that the dives in the dive_table /* this relies on the fact that the dives in the dive_table
* are in chronological order */ * are in chronological order */
for (idx = 0; idx < dive_table.nr; idx++) { for (idx = 0; idx < dive_table.nr; idx++) {
@ -70,21 +75,21 @@ static void process_all_dives(struct dive *dive, struct dive **prev_dive)
if (idx > 0) if (idx > 0)
*prev_dive = dive_table.dives[idx-1]; *prev_dive = dive_table.dives[idx-1];
} }
old_tt = info_stat.total_time.seconds; old_tt = stats.total_time.seconds;
info_stat.total_time.seconds += dp->duration.seconds; stats.total_time.seconds += dp->duration.seconds;
if (dp->maxdepth.mm > info_stat.max_depth.mm) if (dp->maxdepth.mm > stats.max_depth.mm)
info_stat.max_depth.mm = dp->maxdepth.mm; stats.max_depth.mm = dp->maxdepth.mm;
info_stat.avg_depth.mm = (1.0 * old_tt * info_stat.avg_depth.mm + stats.avg_depth.mm = (1.0 * old_tt * stats.avg_depth.mm +
dp->duration.seconds * dp->meandepth.mm) / info_stat.total_time.seconds; dp->duration.seconds * dp->meandepth.mm) / stats.total_time.seconds;
if (dp->sac > 2800) { /* less than .1 cuft/min (2800ml/min) is bogus */ if (dp->sac > 2800) { /* less than .1 cuft/min (2800ml/min) is bogus */
int old_sac_time = sac_time; int old_sac_time = sac_time;
sac_time += dp->duration.seconds; sac_time += dp->duration.seconds;
info_stat.avg_sac.mliter = (1.0 * old_sac_time * info_stat.avg_sac.mliter + stats.avg_sac.mliter = (1.0 * old_sac_time * stats.avg_sac.mliter +
dp->duration.seconds * dp->sac) / sac_time ; dp->duration.seconds * dp->sac) / sac_time ;
if (dp->sac > info_stat.max_sac.mliter) if (dp->sac > stats.max_sac.mliter)
info_stat.max_sac.mliter = dp->sac; stats.max_sac.mliter = dp->sac;
if (info_stat.min_sac.mliter == 0 || dp->sac < info_stat.min_sac.mliter) if (stats.min_sac.mliter == 0 || dp->sac < stats.min_sac.mliter)
info_stat.min_sac.mliter = dp->sac; stats.min_sac.mliter = dp->sac;
} }
} }
} }
@ -117,7 +122,7 @@ static char * get_time_string(int seconds, int maxdays)
return buf; return buf;
} }
void show_dive_stats(struct dive *dive) static void show_single_dive_stats(struct dive *dive)
{ {
char buf[80]; char buf[80];
double value; double value;
@ -137,28 +142,28 @@ void show_dive_stats(struct dive *dive)
tm->tm_mday, tm->tm_year + 1900, tm->tm_mday, tm->tm_year + 1900,
tm->tm_hour, tm->tm_min); tm->tm_hour, tm->tm_min);
set_label(info_stat_w.date, buf); set_label(single_w.date, buf);
set_label(info_stat_w.dive_time, "%d min", (dive->duration.seconds + 30) / 60); set_label(single_w.dive_time, "%d min", (dive->duration.seconds + 30) / 60);
if (prev_dive) if (prev_dive)
set_label(info_stat_w.surf_intv, set_label(single_w.surf_intv,
get_time_string(dive->when - (prev_dive->when + prev_dive->duration.seconds), 4)); get_time_string(dive->when - (prev_dive->when + prev_dive->duration.seconds), 4));
else else
set_label(info_stat_w.surf_intv, "unknown"); set_label(single_w.surf_intv, "unknown");
value = get_depth_units(dive->maxdepth.mm, &decimals, &unit); value = get_depth_units(dive->maxdepth.mm, &decimals, &unit);
set_label(info_stat_w.max_depth, "%.*f %s", decimals, value, unit); set_label(single_w.max_depth, "%.*f %s", decimals, value, unit);
value = get_depth_units(dive->meandepth.mm, &decimals, &unit); value = get_depth_units(dive->meandepth.mm, &decimals, &unit);
set_label(info_stat_w.avg_depth, "%.*f %s", decimals, value, unit); set_label(single_w.avg_depth, "%.*f %s", decimals, value, unit);
if (dive->watertemp.mkelvin) { if (dive->watertemp.mkelvin) {
value = get_temp_units(dive->watertemp.mkelvin, &unit); value = get_temp_units(dive->watertemp.mkelvin, &unit);
set_label(info_stat_w.water_temp, "%.1f %s", value, unit); set_label(single_w.water_temp, "%.1f %s", value, unit);
} else } else
set_label(info_stat_w.water_temp, ""); set_label(single_w.water_temp, "");
value = get_volume_units(dive->sac, &decimals, &unit); value = get_volume_units(dive->sac, &decimals, &unit);
if (value > 0) { if (value > 0) {
set_label(info_stat_w.sac, "%.*f %s/min", decimals, value, unit); set_label(single_w.sac, "%.*f %s/min", decimals, value, unit);
} else } else
set_label(info_stat_w.sac, ""); set_label(single_w.sac, "");
set_label(info_stat_w.otu, "%d", dive->otu); set_label(single_w.otu, "%d", dive->otu);
offset = 0; offset = 0;
gas_used = 0; gas_used = 0;
buf[0] = '\0'; buf[0] = '\0';
@ -185,25 +190,38 @@ void show_dive_stats(struct dive *dive)
if (cyl->type.size.mliter && start && end) if (cyl->type.size.mliter && start && end)
gas_used += cyl->type.size.mliter / 1000.0 * (start - end); gas_used += cyl->type.size.mliter / 1000.0 * (start - end);
} }
set_label(info_stat_w.o2he, buf); set_label(single_w.o2he, buf);
if (gas_used) { if (gas_used) {
value = get_volume_units(gas_used, &decimals, &unit); value = get_volume_units(gas_used, &decimals, &unit);
set_label(info_stat_w.gas_used, "%.*f %s", decimals, value, unit); set_label(single_w.gas_used, "%.*f %s", decimals, value, unit);
} else } else
set_label(info_stat_w.gas_used, ""); set_label(single_w.gas_used, "");
/* and now do the statistics */ }
set_label(info_stat_w.total_time, get_time_string(info_stat.total_time.seconds, 0));
set_label(info_stat_w.avg_time, get_time_string(info_stat.total_time.seconds / dive_table.nr, 0)); static void show_total_dive_stats(struct dive *dive)
value = get_depth_units(info_stat.max_depth.mm, &decimals, &unit); {
set_label(info_stat_w.max_overall_depth, "%.*f %s", decimals, value, unit); double value;
value = get_depth_units(info_stat.avg_depth.mm, &decimals, &unit); int decimals;
set_label(info_stat_w.avg_overall_depth, "%.*f %s", decimals, value, unit); const char *unit;
value = get_volume_units(info_stat.max_sac.mliter, &decimals, &unit);
set_label(info_stat_w.max_sac, "%.*f %s/min", decimals, value, unit); set_label(stats_w.total_time, get_time_string(stats.total_time.seconds, 0));
value = get_volume_units(info_stat.min_sac.mliter, &decimals, &unit); set_label(stats_w.avg_time, get_time_string(stats.total_time.seconds / dive_table.nr, 0));
set_label(info_stat_w.min_sac, "%.*f %s/min", decimals, value, unit); value = get_depth_units(stats.max_depth.mm, &decimals, &unit);
value = get_volume_units(info_stat.avg_sac.mliter, &decimals, &unit); set_label(stats_w.max_overall_depth, "%.*f %s", decimals, value, unit);
set_label(info_stat_w.avg_sac, "%.*f %s/min", decimals, value, unit); value = get_depth_units(stats.avg_depth.mm, &decimals, &unit);
set_label(stats_w.avg_overall_depth, "%.*f %s", decimals, value, unit);
value = get_volume_units(stats.max_sac.mliter, &decimals, &unit);
set_label(stats_w.max_sac, "%.*f %s/min", decimals, value, unit);
value = get_volume_units(stats.min_sac.mliter, &decimals, &unit);
set_label(stats_w.min_sac, "%.*f %s/min", decimals, value, unit);
value = get_volume_units(stats.avg_sac.mliter, &decimals, &unit);
set_label(stats_w.avg_sac, "%.*f %s/min", decimals, value, unit);
}
void show_dive_stats(struct dive *dive)
{
show_single_dive_stats(dive);
show_total_dive_stats(dive);
} }
void flush_dive_stats_changes(struct dive *dive) void flush_dive_stats_changes(struct dive *dive)
@ -224,10 +242,40 @@ static GtkWidget *new_info_label_in_frame(GtkWidget *box, const char *label)
return label_widget; return label_widget;
} }
GtkWidget *stats_widget(void) static GtkWidget *total_stats_widget(GtkWidget *vbox)
{ {
GtkWidget *vbox, *hbox, *infoframe, *statsframe, *framebox; GtkWidget *hbox, *statsframe, *framebox;
statsframe = gtk_frame_new("Statistics");
gtk_box_pack_start(GTK_BOX(vbox), statsframe, TRUE, FALSE, 3);
framebox = gtk_vbox_new(FALSE, 3);
gtk_container_add(GTK_CONTAINER(statsframe), framebox);
/* first row */
hbox = gtk_hbox_new(FALSE, 3);
gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3);
stats_w.total_time = new_info_label_in_frame(hbox, "Total Time");
stats_w.avg_time = new_info_label_in_frame(hbox, "Avg Time");
stats_w.max_overall_depth = new_info_label_in_frame(hbox, "Max Depth");
stats_w.avg_overall_depth = new_info_label_in_frame(hbox, "Avg Depth");
/* second row */
hbox = gtk_hbox_new(FALSE, 3);
gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3);
stats_w.max_sac = new_info_label_in_frame(hbox, "Max SAC");
stats_w.min_sac = new_info_label_in_frame(hbox, "Min SAC");
stats_w.avg_sac = new_info_label_in_frame(hbox, "Avg SAC");
return vbox;
}
static GtkWidget *single_stats_widget(void)
{
GtkWidget *vbox, *hbox, *infoframe, *framebox;
vbox = gtk_vbox_new(FALSE, 3); vbox = gtk_vbox_new(FALSE, 3);
@ -240,48 +288,32 @@ GtkWidget *stats_widget(void)
hbox = gtk_hbox_new(FALSE, 3); hbox = gtk_hbox_new(FALSE, 3);
gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3); gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3);
info_stat_w.date = new_info_label_in_frame(hbox, "Date"); single_w.date = new_info_label_in_frame(hbox, "Date");
info_stat_w.dive_time = new_info_label_in_frame(hbox, "Dive Time"); single_w.dive_time = new_info_label_in_frame(hbox, "Dive Time");
info_stat_w.surf_intv = new_info_label_in_frame(hbox, "Surf Intv"); single_w.surf_intv = new_info_label_in_frame(hbox, "Surf Intv");
/* second row */ /* second row */
hbox = gtk_hbox_new(FALSE, 3); hbox = gtk_hbox_new(FALSE, 3);
gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3); gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3);
info_stat_w.max_depth = new_info_label_in_frame(hbox, "Max Depth"); single_w.max_depth = new_info_label_in_frame(hbox, "Max Depth");
info_stat_w.avg_depth = new_info_label_in_frame(hbox, "Avg Depth"); single_w.avg_depth = new_info_label_in_frame(hbox, "Avg Depth");
info_stat_w.water_temp = new_info_label_in_frame(hbox, "Water Temp"); single_w.water_temp = new_info_label_in_frame(hbox, "Water Temp");
/* third row */ /* third row */
hbox = gtk_hbox_new(FALSE, 3); hbox = gtk_hbox_new(FALSE, 3);
gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3); gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3);
info_stat_w.sac = new_info_label_in_frame(hbox, "SAC"); single_w.sac = new_info_label_in_frame(hbox, "SAC");
info_stat_w.otu = new_info_label_in_frame(hbox, "OTU"); single_w.otu = new_info_label_in_frame(hbox, "OTU");
info_stat_w.o2he = new_info_label_in_frame(hbox, "O" UTF8_SUBSCRIPT_2 " / He"); single_w.o2he = new_info_label_in_frame(hbox, "O" UTF8_SUBSCRIPT_2 " / He");
info_stat_w.gas_used = new_info_label_in_frame(hbox, "Gas Used"); single_w.gas_used = new_info_label_in_frame(hbox, "Gas Used");
statsframe = gtk_frame_new("Statistics");
gtk_box_pack_start(GTK_BOX(vbox), statsframe, TRUE, FALSE, 3);
framebox = gtk_vbox_new(FALSE, 3);
gtk_container_add(GTK_CONTAINER(statsframe), framebox);
/* first row */
hbox = gtk_hbox_new(FALSE, 3);
gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3);
info_stat_w.total_time = new_info_label_in_frame(hbox, "Total Time");
info_stat_w.avg_time = new_info_label_in_frame(hbox, "Avg Time");
info_stat_w.max_overall_depth = new_info_label_in_frame(hbox, "Max Depth");
info_stat_w.avg_overall_depth = new_info_label_in_frame(hbox, "Avg Depth");
/* second row */
hbox = gtk_hbox_new(FALSE, 3);
gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3);
info_stat_w.max_sac = new_info_label_in_frame(hbox, "Max SAC");
info_stat_w.min_sac = new_info_label_in_frame(hbox, "Min SAC");
info_stat_w.avg_sac = new_info_label_in_frame(hbox, "Avg SAC");
return vbox; return vbox;
} }
GtkWidget* stats_widget(void)
{
GtkWidget *vbox = single_stats_widget();
return total_stats_widget(vbox);
}