X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=profile.c;h=7b2f31fe5eb1974d8909bd53a8121a47bc44d68c;hb=82f143d2299fbe918cc24a6ea661cb3d8c8df6c4;hp=1409f53ff8a505efb5ea502de3bc2e6e56887cda;hpb=adda1c6e86b911c268559a05affd2418767ed239;p=ext%2Fsubsurface.git diff --git a/profile.c b/profile.c index 1409f53..7b2f31f 100644 --- a/profile.c +++ b/profile.c @@ -14,7 +14,7 @@ int selected_dive = 0; struct plot_info { int nr; int maxtime; - int maxdepth; + int meandepth, maxdepth; int minpressure, maxpressure; int mintemp, maxtemp; struct plot_data { @@ -77,9 +77,9 @@ static int get_maxtime(struct plot_info *pi) return MAX(30*60, ROUND_UP(seconds, 60*10)); } -static int round_depth_up(depth_t depth) +static int get_maxdepth(struct plot_info *pi) { - unsigned mm = depth.mm; + unsigned mm = pi->maxdepth; /* Minimum 30m */ return MAX(30000, ROUND_UP(mm+3000, 10000)); } @@ -181,13 +181,13 @@ static void plot_text_samples(struct graphics_context *gc, struct plot_info *pi) } } -static void plot_depth_text(struct dive *dive, struct graphics_context *gc, struct plot_info *pi) +static void plot_depth_text(struct graphics_context *gc, struct plot_info *pi) { int maxtime, maxdepth; /* Get plot scaling limits */ maxtime = get_maxtime(pi); - maxdepth = round_depth_up(dive->maxdepth); + maxdepth = get_maxdepth(pi); gc->leftx = 0; gc->rightx = maxtime; gc->topy = 0; gc->bottomy = maxdepth; @@ -238,7 +238,7 @@ static void plot_minmax_profile(struct graphics_context *gc, struct plot_info *p plot_minmax_profile_minute(gc, pi, 0, 0.1); } -static void plot_depth_profile(struct dive *dive, struct graphics_context *gc, struct plot_info *pi) +static void plot_depth_profile(struct graphics_context *gc, struct plot_info *pi) { int i; cairo_t *cr = gc->cr; @@ -248,7 +248,7 @@ static void plot_depth_profile(struct dive *dive, struct graphics_context *gc, s /* Get plot scaling limits */ maxtime = get_maxtime(pi); - maxdepth = round_depth_up(dive->maxdepth); + maxdepth = get_maxdepth(pi); /* Time markers: every 5 min */ gc->leftx = 0; gc->rightx = maxtime; @@ -275,8 +275,8 @@ static void plot_depth_profile(struct dive *dive, struct graphics_context *gc, s /* Show mean depth */ set_source_rgba(gc, 1, 0.2, 0.2, 0.40); - move_to(gc, 0, dive->meandepth.mm); - line_to(gc, 1, dive->meandepth.mm); + move_to(gc, 0, pi->meandepth); + line_to(gc, 1, pi->meandepth); cairo_stroke(cr); gc->leftx = 0; gc->rightx = maxtime; @@ -400,52 +400,20 @@ static void plot_temperature_profile(struct dive *dive, struct graphics_context } /* gets both the actual start and end pressure as well as the scaling factors */ -static int get_cylinder_pressure_range(struct dive *dive, struct graphics_context *gc, - struct plot_info *pi, - pressure_t *startp, pressure_t *endp) +static int get_cylinder_pressure_range(struct graphics_context *gc, struct plot_info *pi) { - int i; - int min, max; - gc->leftx = 0; gc->rightx = get_maxtime(pi); - max = 0; - min = 5000000; - if (startp) - startp->mbar = endp->mbar = 0; - - for (i = 0; i < dive->samples; i++) { - int mbar; - struct sample *sample = dive->sample + i; - - /* FIXME! We only track cylinder 0 right now */ - if (sample->cylinderindex) - continue; - mbar = sample->cylinderpressure.mbar; - if (!mbar) - continue; - if (mbar < min) - min = mbar; - if (mbar > max) - max = mbar; - } - if (startp) - startp->mbar = max; - if (endp) - endp->mbar = min; - if (!max) - return 0; - gc->topy = 0; gc->bottomy = max * 1.5; - return 1; + gc->topy = 0; gc->bottomy = pi->maxpressure * 1.5; + return pi->maxpressure != 0; } -static void plot_cylinder_pressure(struct dive *dive, struct graphics_context *gc, - struct plot_info *pi) +static void plot_cylinder_pressure(struct dive *dive, struct graphics_context *gc, struct plot_info *pi) { int i, sec = -1; - if (!get_cylinder_pressure_range(dive, gc, pi, NULL, NULL)) + if (!get_cylinder_pressure_range(gc, pi)) return; cairo_set_source_rgba(gc->cr, 0.2, 1.0, 0.2, 0.80); @@ -533,36 +501,39 @@ static void plot_info(struct dive *dive, struct graphics_context *gc) } } -static void plot_cylinder_pressure_text(struct dive *dive, struct graphics_context *gc, - struct plot_info *pi) +static int mbar_to_PSI(int mbar) { - pressure_t startp, endp; + pressure_t p = {mbar}; + return to_PSI(p); +} - if (get_cylinder_pressure_range(dive, gc, pi, &startp, &endp)) { +static void plot_cylinder_pressure_text(struct graphics_context *gc, struct plot_info *pi) +{ + if (get_cylinder_pressure_range(gc, pi)) { int start, end; const char *unit = "bar"; switch (output_units.pressure) { case PASCAL: - start = startp.mbar * 100; - end = startp.mbar * 100; + start = pi->maxpressure * 100; + end = pi->minpressure * 100; unit = "pascal"; break; case BAR: - start = (startp.mbar + 500) / 1000; - end = (endp.mbar + 500) / 1000; + start = (pi->maxpressure + 500) / 1000; + end = (pi->minpressure + 500) / 1000; unit = "bar"; break; case PSI: - start = to_PSI(startp); - end = to_PSI(endp); + start = mbar_to_PSI(pi->maxpressure); + end = mbar_to_PSI(pi->minpressure); unit = "psi"; break; } text_render_options_t tro = {10, 0.2, 1.0, 0.2, LEFT, TOP}; - plot_text(gc, &tro, 0, startp.mbar, "%d %s", start, unit); - plot_text(gc, &tro, dive->duration.seconds, endp.mbar, + plot_text(gc, &tro, 0, pi->maxpressure, "%d %s", start, unit); + plot_text(gc, &tro, pi->maxtime, pi->minpressure, "%d %s", end, unit); } } @@ -614,6 +585,27 @@ static struct plot_info *analyze_plot_info(struct plot_info *pi) int i; int nr = pi->nr; + /* Do pressure min/max based on the non-surface data */ + for (i = 0; i < nr; i++) { + struct plot_data *entry = pi->entry+i; + int pressure = entry->pressure; + int temperature = entry->temperature; + + if (pressure) { + if (!pi->minpressure || pressure < pi->minpressure) + pi->minpressure = pressure; + if (pressure > pi->maxpressure) + pi->maxpressure = pressure; + } + + if (temperature) { + if (!pi->mintemp || temperature < pi->mintemp) + pi->mintemp = temperature; + if (temperature > pi->maxtemp) + pi->maxtemp = temperature; + } + } + /* Smoothing function: 5-point triangular smooth */ for (i = 2; i < nr-2; i++) { struct plot_data *entry = pi->entry+i; @@ -641,7 +633,7 @@ static struct plot_info *analyze_plot_info(struct plot_info *pi) */ static struct plot_info *create_plot_info(struct dive *dive) { - int lastdepth, maxtime; + int lastdepth, lastindex; int i, nr = dive->samples + 4, sec; size_t alloc_size = plot_info_size(nr); struct plot_info *pi; @@ -652,45 +644,39 @@ static struct plot_info *create_plot_info(struct dive *dive) memset(pi, 0, alloc_size); pi->nr = nr; sec = 0; - maxtime = 0; + lastindex = 0; lastdepth = -1; for (i = 0; i < dive->samples; i++) { - int depth, pressure, temperature; + int depth; struct sample *sample = dive->sample+i; struct plot_data *entry = pi->entry + i + 2; sec = entry->sec = sample->time.seconds; depth = entry->val = sample->depth.mm; - pressure = entry->pressure = sample->cylinderpressure.mbar; - temperature = entry->temperature = sample->temperature.mkelvin; + entry->pressure = sample->cylinderpressure.mbar; + entry->temperature = sample->temperature.mkelvin; if (depth || lastdepth) - maxtime = sec; + lastindex = i+2; + lastdepth = depth; if (depth > pi->maxdepth) pi->maxdepth = depth; - - if (pressure) { - if (!pi->minpressure || pressure < pi->minpressure) - pi->minpressure = pressure; - if (pressure > pi->maxpressure) - pi->maxpressure = pressure; - } - - if (temperature) { - if (!pi->mintemp || temperature < pi->mintemp) - pi->mintemp = temperature; - if (temperature > pi->maxtemp) - pi->maxtemp = temperature; - } } if (lastdepth) - maxtime = sec + 20; + lastindex = i + 2; /* Fill in the last two entries with empty values but valid times */ i = dive->samples + 2; pi->entry[i].sec = sec + 20; pi->entry[i+1].sec = sec + 40; - pi->maxtime = maxtime; + + pi->nr = lastindex+1; + pi->maxtime = pi->entry[lastindex].sec; + + pi->minpressure = dive->cylinder[0].end.mbar; + pi->maxpressure = dive->cylinder[0].start.mbar; + + pi->meandepth = dive->meandepth.mm; return analyze_plot_info(pi); } @@ -724,12 +710,12 @@ void plot(struct graphics_context *gc, int w, int h, struct dive *dive) plot_cylinder_pressure(dive, gc, pi); /* Depth profile */ - plot_depth_profile(dive, gc, pi); + plot_depth_profile(gc, pi); /* Text on top of all graphs.. */ plot_temperature_text(gc, pi); - plot_depth_text(dive, gc, pi); - plot_cylinder_pressure_text(dive, gc, pi); + plot_depth_text(gc, pi); + plot_cylinder_pressure_text(gc, pi); /* And info box in the lower right corner.. */ gc->leftx = 0; gc->rightx = 1.0;