Hey, now you can sort your dives by how good your SAC is. Which sounds
more useful than it probably actually is. But maybe you can see
patterns in what makes your SAC suck..
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
return;
}
len = snprintf(buffer, sizeof(buffer),
return;
}
len = snprintf(buffer, sizeof(buffer),
if (frac >= 0)
len += snprintf(buffer+len, sizeof(buffer)-len,
".%d", frac);
if (frac >= 0)
len += snprintf(buffer+len, sizeof(buffer)-len,
".%d", frac);
+/*
+ * Return air usage (in liters).
+ */
+static double calculate_airuse(struct dive *dive)
+{
+ double airuse = 0;
+ int i;
+
+ for (i = 0; i < MAX_CYLINDERS; i++) {
+ cylinder_t *cyl = dive->cylinder + i;
+ int size = cyl->type.size.mliter;
+ double kilo_atm;
+
+ if (!size)
+ continue;
+
+ kilo_atm = (cyl->start.mbar - cyl->end.mbar) / 1013250.0;
+
+ /* Liters of air at 1 atm == milliliters at 1k atm*/
+ airuse += kilo_atm * size;
+ }
+ return airuse;
+}
+
static void get_sac(struct dive *dive, int *val, char **str)
{
static void get_sac(struct dive *dive, int *val, char **str)
{
+ const double liters_per_cuft = 28.317;
+ double airuse, pressure, sac;
+ const char *fmt, *unit;
+ char buffer[20];
+
+ airuse = calculate_airuse(dive);
+ if (!airuse)
+ return;
+ if (!dive->duration.seconds)
+ return;
+
+ /* Mean pressure in atm: 1 atm per 10m */
+ pressure = 1 + (dive->meandepth.mm / 10000.0);
+ sac = airuse / pressure * 60 / dive->duration.seconds;
+
+ /* milliliters per minute.. */
+ *val = sac * 1000;
+
+ switch (output_units.volume) {
+ case LITER:
+ unit = "l";
+ fmt = "%4.0f %s";
+ break;
+ case CUFT:
+ unit = "cuft";
+ fmt = "%4.2f %s";
+ airuse /= liters_per_cuft;
+ sac /= liters_per_cuft;
+ break;
+ }
+
+ snprintf(buffer, sizeof(buffer), fmt, sac, unit);
+ *str = strdup(buffer);
}
static gboolean set_one_dive(GtkTreeModel *model,
}
static gboolean set_one_dive(GtkTreeModel *model,
DIVE_NITROXSTR, nitroxstr,
DIVE_NITROX, nitrox,
DIVE_SACSTR, sacstr,
DIVE_NITROXSTR, nitroxstr,
DIVE_NITROX, nitrox,
DIVE_SACSTR, sacstr,
dive_list.model = gtk_list_store_new(DIVELIST_COLUMNS,
G_TYPE_INT, /* index */
G_TYPE_STRING, G_TYPE_INT, /* Date */
dive_list.model = gtk_list_store_new(DIVELIST_COLUMNS,
G_TYPE_INT, /* index */
G_TYPE_STRING, G_TYPE_INT, /* Date */
- G_TYPE_STRING, G_TYPE_INT, /* Depth */
- G_TYPE_STRING, G_TYPE_INT, /* Duration */
+ G_TYPE_STRING, G_TYPE_INT, /* Depth */
+ G_TYPE_STRING, G_TYPE_INT, /* Duration */
G_TYPE_STRING, /* Location */
G_TYPE_STRING, G_TYPE_INT, /* Temperature */
G_TYPE_STRING, G_TYPE_INT, /* Nitrox */
G_TYPE_STRING, /* Location */
G_TYPE_STRING, G_TYPE_INT, /* Temperature */
G_TYPE_STRING, G_TYPE_INT, /* Nitrox */
dive_list.container_widget = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(dive_list.container_widget),
dive_list.container_widget = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(dive_list.container_widget),
- GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
gtk_container_add(GTK_CONTAINER(dive_list.container_widget), dive_list.tree_view);
return dive_list;
gtk_container_add(GTK_CONTAINER(dive_list.container_widget), dive_list.tree_view);
return dive_list;