X-Git-Url: http://git.tdb.fi/?p=ext%2Fsubsurface.git;a=blobdiff_plain;f=profile.c;h=6a159cca85681fcc8436f159e6d0da9deb56e7c4;hp=5d5aff5187776971f53331d023937438444b5b67;hb=b693bb3fb962c54767f8430058575441df243b13;hpb=ce6c3ee56d372e2ef8386a065fbf4bce4cfa0ffc diff --git a/profile.c b/profile.c index 5d5aff5..6a159cc 100644 --- a/profile.c +++ b/profile.c @@ -1,5 +1,5 @@ /* profile.c */ -/* creates all the necessary data for drawing the dive profile +/* creates all the necessary data for drawing the dive profile * uses cairo to draw it */ #include @@ -168,9 +168,10 @@ static void dump_pi (struct plot_info *pi) pi->maxpressure, pi->mintemp, pi->maxtemp); for (i = 0; i < pi->nr; i++) printf(" entry[%d]:{same_cylinder:%d cylinderindex:%d sec:%d pressure:{%d,%d}\n" - " temperature:%d depth:%d smoothed:%d}\n", + " time:%d:%02d temperature:%d depth:%d smoothed:%d}\n", i, pi->entry[i].same_cylinder, pi->entry[i].cylinderindex, pi->entry[i].sec, pi->entry[i].pressure[0], pi->entry[i].pressure[1], + pi->entry[i].sec / 60, pi->entry[i].sec % 60, pi->entry[i].temperature, pi->entry[i].depth, pi->entry[i].smoothed); printf(" }\n"); } @@ -872,7 +873,7 @@ static velocity_t velocity(int speed) else if (speed < -25) /* -5ft/min */ v = SLOW; else if (speed < 25) /* very hard to find data, but it appears that the recommendations - for descent are usually about 2x ascent rate; still, we want + for descent are usually about 2x ascent rate; still, we want stable to mean stable */ v = STABLE; else if (speed < 152) /* between 5 and 30ft/min is considered slow */ @@ -928,7 +929,7 @@ static struct plot_info *analyze_plot_info(struct plot_info *pi) int past = -2; while (i+past > 0 && entry[0].sec - entry[past].sec < 15) past--; - entry->velocity = velocity((entry[0].depth - entry[past].depth) / + entry->velocity = velocity((entry[0].depth - entry[past].depth) / (entry[0].sec - entry[past].sec)); } } else @@ -940,7 +941,7 @@ static struct plot_info *analyze_plot_info(struct plot_info *pi) struct plot_data *entry = pi->entry +i; analyze_plot_info_minmax(entry, pi->entry, pi->entry+nr); } - + return pi; } @@ -1013,8 +1014,7 @@ static void dump_pr_track(pr_track_t **track_pr) } } -static void fill_missing_tank_pressures(struct dive *dive, struct plot_info *pi, - pr_track_t **track_pr) +static void fill_missing_tank_pressures(struct plot_info *pi, pr_track_t **track_pr) { pr_track_t *list = NULL; pr_track_t *nlist = NULL; @@ -1048,16 +1048,18 @@ static void fill_missing_tank_pressures(struct dive *dive, struct plot_info *pi, /* there may be multiple segments - so * let's assemble the length */ nlist = list; - pt = list->pressure_time; - while (!nlist->end) { - nlist = nlist->next; - if (!nlist) { - /* oops - we have no end pressure, - * so this means this is a tank without - * gas consumption information */ - break; + if (list) { + pt = list->pressure_time; + while (!nlist->end) { + nlist = nlist->next; + if (!nlist) { + /* oops - we have no end pressure, + * so this means this is a tank without + * gas consumption information */ + break; + } + pt += nlist->pressure_time; } - pt += nlist->pressure_time; } if (!nlist) { /* just continue without calculating @@ -1337,7 +1339,7 @@ static struct plot_info *create_plot_info(struct dive *dive, int nr_samples, str pi->meandepth = dive->meandepth.mm; if (missing_pr) { - fill_missing_tank_pressures(dive, pi, track_pr); + fill_missing_tank_pressures(pi, track_pr); } for (cyl = 0; cyl < MAX_CYLINDERS; cyl++) list_free(track_pr[cyl]); @@ -1354,12 +1356,15 @@ void plot(struct graphics_context *gc, cairo_rectangle_int_t *drawing_area, stru int nr = dive->samples; if (!nr) { + /* The dive has no samples, so create a few fake ones. This assumes an + ascent/descent rate of 9 m/min, which is just below the limit for FAST. */ int duration = dive->duration.seconds; int maxdepth = dive->maxdepth.mm; + int asc_desc_time = dive->maxdepth.mm*60/9000; sample = fake; - fake[1].time.seconds = duration * 0.05; + fake[1].time.seconds = asc_desc_time; fake[1].depth.mm = maxdepth; - fake[2].time.seconds = duration * 0.95; + fake[2].time.seconds = duration - asc_desc_time; fake[2].depth.mm = maxdepth; fake[3].time.seconds = duration * 1.00; nr = 4;