X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=divelist.c;h=4ab61997cfc4e71c374b0f6606708e760377e14d;hb=7b5874ead7c9115f8e20025ad29733d9e4293d70;hp=5b6c7e3e159268deca5fa7afdc660e3808ca651d;hpb=51176cb0897c04340d831a6a9f967933c5f7f059;p=ext%2Fsubsurface.git diff --git a/divelist.c b/divelist.c index 5b6c7e3..4ab6199 100644 --- a/divelist.c +++ b/divelist.c @@ -230,16 +230,23 @@ static void temperature_data_func(GtkTreeViewColumn *col, * - Nitrox trumps air (even if hypoxic) * These are the same rules as the inter-dive sorting rules. */ -static void get_dive_gas(struct dive *dive, int *o2, int *he) +static void get_dive_gas(struct dive *dive, int *o2, int *he, int *o2low) { int i; - int maxo2 = -1, maxhe = -1; + int maxo2 = -1, maxhe = -1, mino2 = 1000; for (i = 0; i < MAX_CYLINDERS; i++) { - struct gasmix *mix = &dive->cylinder[i].gasmix; + cylinder_t *cyl = dive->cylinder + i; + struct gasmix *mix = &cyl->gasmix; int o2 = mix->o2.permille; int he = mix->he.permille; + if (cylinder_none(cyl)) + continue; + if (!o2) + o2 = AIR_PERMILLE; + if (o2 < mino2) + mino2 = o2; if (he > maxhe) goto newmax; if (he < maxhe) @@ -250,8 +257,12 @@ newmax: maxhe = he; maxo2 = o2; } + /* All air? Show/sort as "air"/zero */ + if (!maxhe && maxo2 == AIR_PERMILLE && mino2 == maxo2) + maxo2 = mino2 = 0; *o2 = maxo2; *he = maxhe; + *o2low = mino2; } static gint nitrox_sort_func(GtkTreeModel *model, @@ -263,40 +274,50 @@ static gint nitrox_sort_func(GtkTreeModel *model, struct dive *a, *b; int a_o2, b_o2; int a_he, b_he; + int a_o2low, b_o2low; gtk_tree_model_get(model, iter_a, DIVE_INDEX, &index_a, -1); gtk_tree_model_get(model, iter_b, DIVE_INDEX, &index_b, -1); a = get_dive(index_a); b = get_dive(index_b); - get_dive_gas(a, &a_o2, &a_he); - get_dive_gas(b, &b_o2, &b_he); + get_dive_gas(a, &a_o2, &a_he, &a_o2low); + get_dive_gas(b, &b_o2, &b_he, &b_o2low); /* Sort by Helium first, O2 second */ - if (a_he == b_he) + if (a_he == b_he) { + if (a_o2 == b_o2) + return a_o2low - b_o2low; return a_o2 - b_o2; + } return a_he - b_he; } +#define UTF8_ELLIPSIS "\xE2\x80\xA6" + static void nitrox_data_func(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { - int index, o2, he; + int index, o2, he, o2low; char buffer[80]; struct dive *dive; gtk_tree_model_get(model, iter, DIVE_INDEX, &index, -1); dive = get_dive(index); - get_dive_gas(dive, &o2, &he); + get_dive_gas(dive, &o2, &he, &o2low); o2 = (o2 + 5) / 10; he = (he + 5) / 10; + o2low = (o2low + 5) / 10; if (he) snprintf(buffer, sizeof(buffer), "%d/%d", o2, he); else if (o2) - snprintf(buffer, sizeof(buffer), "%d", o2); + if (o2 == o2low) + snprintf(buffer, sizeof(buffer), "%d", o2); + else + snprintf(buffer, sizeof(buffer), "%d" UTF8_ELLIPSIS "%d", o2low, o2); else strcpy(buffer, "air"); @@ -371,8 +392,10 @@ static int calculate_otu(struct dive *dive) struct sample *sample = dive->sample + i; struct sample *psample = sample - 1; t = sample->time.seconds - psample->time.seconds; - po2 = dive->cylinder[sample->cylinderindex].gasmix.o2.permille / 1000.0 * - (sample->depth.mm + 10000) / 10000.0; + int o2 = dive->cylinder[sample->cylinderindex].gasmix.o2.permille; + if (!o2) + o2 = AIR_PERMILLE; + po2 = o2 / 1000.0 * (sample->depth.mm + 10000) / 10000.0; if (po2 >= 0.5) otu += pow(po2 - 0.5, 0.83) * t / 30.0; }