More consistency improvements

Treat SAC and OTU consistently:
- SAC is now a member of struct dive
- it's calculated / populated at the same time with a helper function with
  consistent API

Create get_volume_units function that returns volumes (e.g. used in SAC
rates) based on preferred units - make sure we have these conversions just
once in the code.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Dirk Hohndel 2011-11-01 19:56:14 -07:00
parent 18b8247cb3
commit a487f6c931
3 changed files with 38 additions and 9 deletions

25
dive.c
View file

@ -46,6 +46,31 @@ double get_temp_units(unsigned int mk, const char **units)
return deg; return deg;
} }
double get_volume_units(unsigned int ml, int *frac, const char **units)
{
int decimals;
double vol;
const char *unit;
switch (output_units.volume) {
case LITER:
vol = ml / 1000.0;
unit = "l";
decimals = 1;
break;
case CUFT:
vol = ml_to_cuft(ml);
unit = "cuft";
decimals = 2;
break;
}
if (frac)
*frac = decimals;
if (units)
*units = unit;
return vol;
}
double get_depth_units(unsigned int mm, int *frac, const char **units) double get_depth_units(unsigned int mm, int *frac, const char **units)
{ {
int decimals; int decimals;

8
dive.h
View file

@ -87,8 +87,14 @@ typedef struct {
} cylinder_t; } cylinder_t;
extern double get_depth_units(unsigned int mm, int *frac, const char **units); extern double get_depth_units(unsigned int mm, int *frac, const char **units);
extern double get_volume_units(unsigned int mm, int *frac, const char **units);
extern double get_temp_units(unsigned int mm, const char **units); extern double get_temp_units(unsigned int mm, const char **units);
static inline double ml_to_cuft(int ml)
{
return ml / 28317.0;
}
static inline double mm_to_feet(int mm) static inline double mm_to_feet(int mm)
{ {
return mm * 0.00328084; return mm * 0.00328084;
@ -177,7 +183,7 @@ struct dive {
depth_t visibility; depth_t visibility;
temperature_t airtemp, watertemp; temperature_t airtemp, watertemp;
cylinder_t cylinder[MAX_CYLINDERS]; cylinder_t cylinder[MAX_CYLINDERS];
int otu; int sac, otu;
struct event *events; struct event *events;
int samples, alloc_samples; int samples, alloc_samples;
struct sample sample[]; struct sample sample[];

View file

@ -315,23 +315,22 @@ static double calculate_airuse(struct dive *dive)
return airuse; return airuse;
} }
static void get_sac(struct dive *dive, int *val) static int calculate_sac(struct dive *dive)
{ {
double airuse, pressure, sac; double airuse, pressure, sac;
*val = 0;
airuse = calculate_airuse(dive); airuse = calculate_airuse(dive);
if (!airuse) if (!airuse)
return; return 0;
if (!dive->duration.seconds) if (!dive->duration.seconds)
return; return 0;
/* Mean pressure in atm: 1 atm per 10m */ /* Mean pressure in atm: 1 atm per 10m */
pressure = 1 + (dive->meandepth.mm / 10000.0); pressure = 1 + (dive->meandepth.mm / 10000.0);
sac = airuse / pressure * 60 / dive->duration.seconds; sac = airuse / pressure * 60 / dive->duration.seconds;
/* milliliters per minute.. */ /* milliliters per minute.. */
*val = sac * 1000; return sac * 1000;
} }
static void get_string(char **str, const char *s) static void get_string(char **str, const char *s)
@ -364,12 +363,10 @@ static void fill_one_dive(struct dive *dive,
GtkTreeModel *model, GtkTreeModel *model,
GtkTreeIter *iter) GtkTreeIter *iter)
{ {
int sac;
char *location, *cylinder; char *location, *cylinder;
get_cylinder(dive, &cylinder); get_cylinder(dive, &cylinder);
get_location(dive, &location); get_location(dive, &location);
get_sac(dive, &sac);
/* /*
* We only set the fields that changed: the strings. * We only set the fields that changed: the strings.
@ -379,7 +376,7 @@ static void fill_one_dive(struct dive *dive,
DIVE_NR, dive->number, DIVE_NR, dive->number,
DIVE_LOCATION, location, DIVE_LOCATION, location,
DIVE_CYLINDER, cylinder, DIVE_CYLINDER, cylinder,
DIVE_SAC, sac, DIVE_SAC, dive->sac,
DIVE_OTU, dive->otu, DIVE_OTU, dive->otu,
-1); -1);
} }
@ -471,6 +468,7 @@ static void fill_dive_list(void)
struct dive *dive = dive_table.dives[i]; struct dive *dive = dive_table.dives[i];
dive->otu = calculate_otu(dive); dive->otu = calculate_otu(dive);
dive->sac = calculate_sac(dive);
gtk_list_store_append(store, &iter); gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, gtk_list_store_set(store, &iter,
DIVE_INDEX, i, DIVE_INDEX, i,