X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=profile.c;fp=profile.c;h=5dad475bcbc850de7464064afd3acc50e0e38efa;hb=a72408400c67a142b9abaec89df954df7dac7a71;hp=6c1e8ce426d63cc3f68262f9e61a75458492c1ad;hpb=11b62a149b0d65e37a2cedbc93c8e8d84b23e041;p=ext%2Fsubsurface.git diff --git a/profile.c b/profile.c index 6c1e8ce..5dad475 100644 --- a/profile.c +++ b/profile.c @@ -880,6 +880,68 @@ static void fill_missing_tank_pressures(struct dive *dive, struct plot_info *pi, } } +static int get_cylinder_index(struct dive *dive, struct event *ev) +{ + int i; + + /* + * Try to find a cylinder that matches the O2 percentage + * in the gas change event 'value' field. + * + * Crazy suunto gas change events. We really should do + * this in libdivecomputer or something. + */ + for (i = 0; i < MAX_CYLINDERS; i++) { + cylinder_t *cyl = dive->cylinder+i; + int o2 = (cyl->gasmix.o2.permille + 5) / 10; + if (o2 == ev->value) + return i; + } + + return 0; +} + +static struct event *get_next_gaschange(struct event *event) +{ + while (event) { + if (!strcmp(event->name, "gaschange")) + return event; + event = event->next; + } + return event; +} + +static int set_cylinder_index(struct plot_info *pi, int i, int cylinderindex, unsigned int end) +{ + while (i < pi->nr) { + struct plot_data *entry = pi->entry+i; + if (entry->sec > end) + break; + if (entry->cylinderindex != cylinderindex) { + entry->cylinderindex = cylinderindex; + entry->pressure[0] = 0; + } + i++; + } + return i; +} + +static void check_gas_change_events(struct dive *dive, struct plot_info *pi) +{ + int i = 0, cylinderindex = 0; + struct event *ev = get_next_gaschange(dive->events); + + if (!ev) + return; + + do { + i = set_cylinder_index(pi, i, cylinderindex, ev->time.seconds); + cylinderindex = get_cylinder_index(dive, ev); + ev = get_next_gaschange(ev->next); + } while (ev); + set_cylinder_index(pi, i, cylinderindex, ~0u); +} + /* * Create a plot-info with smoothing and ranged min/max * @@ -907,9 +969,6 @@ static struct plot_info *create_plot_info(struct dive *dive) sec = 0; lastindex = 0; lastdepth = -1; - for (cyl = 0; cyl < MAX_CYLINDERS; cyl++) /* initialize the start pressures */ - track_pr[cyl] = pr_track_alloc(dive->cylinder[cyl].start.mbar, -1); - current = track_pr[dive->sample[0].cylinderindex]; for (i = 0; i < dive->samples; i++) { int depth; struct sample *sample = dive->sample+i; @@ -917,9 +976,29 @@ static struct plot_info *create_plot_info(struct dive *dive) entry = pi->entry + i + 2; sec = entry->sec = sample->time.seconds; depth = entry->depth = sample->depth.mm; - entry->same_cylinder = sample->cylinderindex == cylinderindex; - entry->cylinderindex = cylinderindex = sample->cylinderindex; + entry->cylinderindex = sample->cylinderindex; SENSOR_PRESSURE(entry) = sample->cylinderpressure.mbar; + entry->temperature = sample->temperature.mkelvin; + + if (depth || lastdepth) + lastindex = i+2; + + lastdepth = depth; + if (depth > pi->maxdepth) + pi->maxdepth = depth; + } + + check_gas_change_events(dive, pi); + + for (cyl = 0; cyl < MAX_CYLINDERS; cyl++) /* initialize the start pressures */ + track_pr[cyl] = pr_track_alloc(dive->cylinder[cyl].start.mbar, -1); + current = track_pr[dive->sample[0].cylinderindex]; + for (i = 0; i < dive->samples; i++) { + entry = pi->entry + i + 2; + + entry->same_cylinder = entry->cylinderindex == cylinderindex; + cylinderindex = entry->cylinderindex; + /* track the segments per cylinder and their pressure/time integral */ if (!entry->same_cylinder) { current->end = SENSOR_PRESSURE(entry-1); @@ -941,15 +1020,8 @@ static struct plot_info *create_plot_info(struct dive *dive) current->pressure_time += (entry->sec - (entry-1)->sec) * (1 + entry->depth / 10000.0); missing_pr |= !SENSOR_PRESSURE(entry); - entry->temperature = sample->temperature.mkelvin; - - if (depth || lastdepth) - lastindex = i+2; - - lastdepth = depth; - if (depth > pi->maxdepth) - pi->maxdepth = depth; } + current->t_end = entry->sec; for (cyl = 0; cyl < MAX_CYLINDERS; cyl++) { /* initialize the end pressures */ int pr = dive->cylinder[cyl].end.mbar;