.. I'll want to move pressure limit calculations into the 'plot_info',
so that we can do several passes of analysis and change dive limits etc
without having to actually modify the dive data itself (or add new
fields to 'struct dive' just for plotting).
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
* 30 minutes or 90 ft, just so that small dives show
* up as such.
*/
* 30 minutes or 90 ft, just so that small dives show
* up as such.
*/
-static int round_seconds_up(int seconds)
+static int get_maxtime(struct plot_info *pi)
+ int seconds = pi->maxtime;
return MAX(30*60, ROUND_UP(seconds, 60*10));
}
return MAX(30*60, ROUND_UP(seconds, 60*10));
}
int maxtime, maxdepth;
/* Get plot scaling limits */
int maxtime, maxdepth;
/* Get plot scaling limits */
- maxtime = round_seconds_up(dive->duration.seconds);
+ maxtime = get_maxtime(pi);
maxdepth = round_depth_up(dive->maxdepth);
gc->leftx = 0; gc->rightx = maxtime;
maxdepth = round_depth_up(dive->maxdepth);
gc->leftx = 0; gc->rightx = maxtime;
int maxtime, maxdepth, marker;
/* Get plot scaling limits */
int maxtime, maxdepth, marker;
/* Get plot scaling limits */
- maxtime = round_seconds_up(dive->duration.seconds);
+ maxtime = get_maxtime(pi);
maxdepth = round_depth_up(dive->maxdepth);
/* Time markers: every 5 min */
maxdepth = round_depth_up(dive->maxdepth);
/* Time markers: every 5 min */
-static int setup_temperature_limits(struct dive *dive, struct graphics_context *gc)
+static int setup_temperature_limits(struct dive *dive, struct graphics_context *gc, struct plot_info *pi)
{
int i;
int maxtime, mintemp, maxtemp;
/* Get plot scaling limits */
{
int i;
int maxtime, mintemp, maxtemp;
/* Get plot scaling limits */
- maxtime = round_seconds_up(dive->duration.seconds);
+ maxtime = get_maxtime(pi);
mintemp = INT_MAX;
maxtemp = 0;
for (i = 0; i < dive->samples; i++) {
mintemp = INT_MAX;
maxtemp = 0;
for (i = 0; i < dive->samples; i++) {
plot_text(gc, &tro, sec, temperature.mkelvin, "%d %s", deg, unit);
}
plot_text(gc, &tro, sec, temperature.mkelvin, "%d %s", deg, unit);
}
-static void plot_temperature_text(struct dive *dive, struct graphics_context *gc)
+static void plot_temperature_text(struct dive *dive, struct graphics_context *gc,
+ struct plot_info *pi)
{
int i;
int last = 0;
temperature_t last_temperature, last_printed_temp;
{
int i;
int last = 0;
temperature_t last_temperature, last_printed_temp;
- if (!setup_temperature_limits(dive, gc))
+ if (!setup_temperature_limits(dive, gc, pi))
return;
for (i = 0; i < dive->samples; i++) {
return;
for (i = 0; i < dive->samples; i++) {
-static void plot_temperature_profile(struct dive *dive, struct graphics_context *gc)
+static void plot_temperature_profile(struct dive *dive, struct graphics_context *gc,
+ struct plot_info *pi)
{
int i;
cairo_t *cr = gc->cr;
int last = 0;
{
int i;
cairo_t *cr = gc->cr;
int last = 0;
- if (!setup_temperature_limits(dive, gc))
+ if (!setup_temperature_limits(dive, gc, pi))
return;
set_source_rgba(gc, 0.2, 0.2, 1.0, 0.8);
return;
set_source_rgba(gc, 0.2, 0.2, 1.0, 0.8);
/* 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,
/* 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,
pressure_t *startp, pressure_t *endp)
{
int i;
int min, max;
pressure_t *startp, pressure_t *endp)
{
int i;
int min, max;
- gc->leftx = 0; gc->rightx = round_seconds_up(dive->duration.seconds);
+ gc->leftx = 0;
+ gc->rightx = get_maxtime(pi);
-static void plot_cylinder_pressure(struct dive *dive, struct graphics_context *gc)
+static void plot_cylinder_pressure(struct dive *dive, struct graphics_context *gc,
+ struct plot_info *pi)
- if (!get_cylinder_pressure_range(dive, gc, NULL, NULL))
+ if (!get_cylinder_pressure_range(dive, gc, pi, NULL, NULL))
return;
cairo_set_source_rgba(gc->cr, 0.2, 1.0, 0.2, 0.80);
return;
cairo_set_source_rgba(gc->cr, 0.2, 1.0, 0.2, 0.80);
-static void plot_cylinder_pressure_text(struct dive *dive, struct graphics_context *gc)
+static void plot_cylinder_pressure_text(struct dive *dive, struct graphics_context *gc,
+ struct plot_info *pi)
{
pressure_t startp, endp;
{
pressure_t startp, endp;
- if (get_cylinder_pressure_range(dive, gc, &startp, &endp)) {
+ if (get_cylinder_pressure_range(dive, gc, pi, &startp, &endp)) {
int start, end;
const char *unit = "bar";
int start, end;
const char *unit = "bar";
*/
static struct plot_info *depth_plot_info(struct dive *dive)
{
*/
static struct plot_info *depth_plot_info(struct dive *dive)
{
+ int lastdepth, maxtime;
int i, nr = dive->samples + 4, sec;
size_t alloc_size = plot_info_size(nr);
struct plot_info *pi;
int i, nr = dive->samples + 4, sec;
size_t alloc_size = plot_info_size(nr);
struct plot_info *pi;
memset(pi, 0, alloc_size);
pi->nr = nr;
sec = 0;
memset(pi, 0, alloc_size);
pi->nr = nr;
sec = 0;
+ maxtime = 0;
+ lastdepth = -1;
for (i = 0; i < dive->samples; i++) {
for (i = 0; i < dive->samples; i++) {
struct sample *sample = dive->sample+i;
struct plot_data *entry = pi->entry + i + 2;
sec = entry->sec = sample->time.seconds;
struct sample *sample = dive->sample+i;
struct plot_data *entry = pi->entry + i + 2;
sec = entry->sec = sample->time.seconds;
- entry->val = sample->depth.mm;
+ depth = entry->val = sample->depth.mm;
+ if (depth || lastdepth)
+ maxtime = sec;
+ lastdepth = depth;
+ if (lastdepth)
+ maxtime = sec + 20;
/* 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;
/* 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;
return analyze_plot_info(pi);
}
return analyze_plot_info(pi);
}
gc->maxy = (h - 2*topy);
/* Temperature profile */
gc->maxy = (h - 2*topy);
/* Temperature profile */
- plot_temperature_profile(dive, gc);
+ plot_temperature_profile(dive, gc, pi);
/* Cylinder pressure plot */
/* Cylinder pressure plot */
- plot_cylinder_pressure(dive, gc);
+ plot_cylinder_pressure(dive, gc, pi);
/* Depth profile */
plot_depth_profile(dive, gc, pi);
/* Text on top of all graphs.. */
/* Depth profile */
plot_depth_profile(dive, gc, pi);
/* Text on top of all graphs.. */
- plot_temperature_text(dive, gc);
+ plot_temperature_text(dive, gc, pi);
plot_depth_text(dive, gc, pi);
plot_depth_text(dive, gc, pi);
- plot_cylinder_pressure_text(dive, gc);
+ plot_cylinder_pressure_text(dive, gc, pi);
/* And info box in the lower right corner.. */
gc->leftx = 0; gc->rightx = 1.0;
/* And info box in the lower right corner.. */
gc->leftx = 0; gc->rightx = 1.0;