mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Show a bit of surface degassing in the planner
to display the deco parameters at the surface, in particular tissue saturation and heat map. Suggeted-by: Matthias Heinrichs <info@heinrichsweikamp.com> Signed-off-by: Robert C. Helling <helling@atdotde.de>
This commit is contained in:
parent
7635ee3e77
commit
5e494ce761
5 changed files with 35 additions and 4 deletions
|
@ -1080,6 +1080,14 @@ bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, i
|
||||||
diveplan->eff_gflow = lrint(100.0 * (regressiona() * first_stop_depth + regressionb()));
|
diveplan->eff_gflow = lrint(100.0 * (regressiona() * first_stop_depth + regressionb()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < MAX_CYLINDERS; i++)
|
||||||
|
if (cylinder_nodata(&dive->cylinder[i])) {
|
||||||
|
// Switch to an empty air cylinder for breathing air at the surface
|
||||||
|
// If no empty cylinder is found, keep using last deco gas
|
||||||
|
current_cylinder = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
plan_add_segment(diveplan, 600, 0, current_cylinder, 0, false, OC);
|
||||||
create_dive_from_plan(diveplan, dive, is_planner);
|
create_dive_from_plan(diveplan, dive, is_planner);
|
||||||
add_plan_to_notes(diveplan, dive, show_disclaimer, error);
|
add_plan_to_notes(diveplan, dive, show_disclaimer, error);
|
||||||
fixup_dc_duration(&dive->dc);
|
fixup_dc_duration(&dive->dc);
|
||||||
|
|
|
@ -24,9 +24,12 @@ static int diveplan_duration(struct diveplan *diveplan)
|
||||||
{
|
{
|
||||||
struct divedatapoint *dp = diveplan->dp;
|
struct divedatapoint *dp = diveplan->dp;
|
||||||
int duration = 0;
|
int duration = 0;
|
||||||
|
int lastdepth = 0;
|
||||||
while(dp) {
|
while(dp) {
|
||||||
if (dp->time > duration)
|
if (dp->time > duration && (dp->depth.mm > SURFACE_THRESHOLD || lastdepth > SURFACE_THRESHOLD)) {
|
||||||
duration = dp->time;
|
duration = dp->time;
|
||||||
|
lastdepth = dp->depth.mm;
|
||||||
|
}
|
||||||
dp = dp->next;
|
dp = dp->next;
|
||||||
}
|
}
|
||||||
return (duration + 30) / 60;
|
return (duration + 30) / 60;
|
||||||
|
@ -193,6 +196,9 @@ void add_plan_to_notes(struct diveplan *diveplan, struct dive *dive, bool show_d
|
||||||
!rebreatherchange_before &&
|
!rebreatherchange_before &&
|
||||||
!rebreatherchange_after)
|
!rebreatherchange_after)
|
||||||
continue;
|
continue;
|
||||||
|
// Ignore final surface segment for notes
|
||||||
|
if (lastdepth == 0 && dp->depth.mm == 0 && !dp->next)
|
||||||
|
continue;
|
||||||
if ((dp->time - lasttime < 10 && lastdepth == dp->depth.mm) && !(gaschange_after && dp->next && dp->depth.mm != dp->next->depth.mm))
|
if ((dp->time - lasttime < 10 && lastdepth == dp->depth.mm) && !(gaschange_after && dp->next && dp->depth.mm != dp->next->depth.mm))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
|
@ -453,7 +453,7 @@ struct plot_info calculate_max_limits_new(struct dive *dive, struct divecomputer
|
||||||
|
|
||||||
if (depth > maxdepth)
|
if (depth > maxdepth)
|
||||||
maxdepth = s->depth.mm;
|
maxdepth = s->depth.mm;
|
||||||
if ((depth > SURFACE_THRESHOLD || lastdepth > SURFACE_THRESHOLD) &&
|
if ((depth > SURFACE_THRESHOLD || lastdepth > SURFACE_THRESHOLD || in_planner()) &&
|
||||||
s->time.seconds > maxtime)
|
s->time.seconds > maxtime)
|
||||||
maxtime = s->time.seconds;
|
maxtime = s->time.seconds;
|
||||||
lastdepth = depth;
|
lastdepth = depth;
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
#include "core/membuffer.h"
|
#include "core/membuffer.h"
|
||||||
#include "core/subsurface-string.h"
|
#include "core/subsurface-string.h"
|
||||||
|
|
||||||
|
#define DEPTH_NOT_FOUND (-2342)
|
||||||
|
|
||||||
extern struct ev_select *ev_namelist;
|
extern struct ev_select *ev_namelist;
|
||||||
extern int evn_used;
|
extern int evn_used;
|
||||||
|
|
||||||
|
@ -234,7 +236,8 @@ bool DiveEventItem::shouldBeHidden()
|
||||||
struct sample *first_sample = &dc->sample[0];
|
struct sample *first_sample = &dc->sample[0];
|
||||||
if (!strcmp(event->name, "gaschange") &&
|
if (!strcmp(event->name, "gaschange") &&
|
||||||
(event->time.seconds == 0 ||
|
(event->time.seconds == 0 ||
|
||||||
(first_sample && event->time.seconds == first_sample->time.seconds)))
|
(first_sample && event->time.seconds == first_sample->time.seconds) ||
|
||||||
|
depthAtTime(event->time.seconds) < SURFACE_THRESHOLD))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -254,6 +257,17 @@ bool DiveEventItem::shouldBeHidden()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int DiveEventItem::depthAtTime(int time)
|
||||||
|
{
|
||||||
|
QModelIndexList result = dataModel->match(dataModel->index(0, DivePlotDataModel::TIME), Qt::DisplayRole, time);
|
||||||
|
if (result.isEmpty()) {
|
||||||
|
Q_ASSERT("can't find a spot in the dataModel");
|
||||||
|
hide();
|
||||||
|
return DEPTH_NOT_FOUND;
|
||||||
|
}
|
||||||
|
return dataModel->data(dataModel->index(result.first().row(), DivePlotDataModel::DEPTH)).toInt();
|
||||||
|
}
|
||||||
|
|
||||||
void DiveEventItem::recalculatePos(bool instant)
|
void DiveEventItem::recalculatePos(bool instant)
|
||||||
{
|
{
|
||||||
if (!vAxis || !hAxis || !internalEvent || !dataModel)
|
if (!vAxis || !hAxis || !internalEvent || !dataModel)
|
||||||
|
@ -265,9 +279,11 @@ void DiveEventItem::recalculatePos(bool instant)
|
||||||
hide();
|
hide();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
int depth = depthAtTime(internalEvent->time.seconds);
|
||||||
|
if (depth == DEPTH_NOT_FOUND)
|
||||||
|
return;
|
||||||
if (!isVisible() && !shouldBeHidden())
|
if (!isVisible() && !shouldBeHidden())
|
||||||
show();
|
show();
|
||||||
int depth = dataModel->data(dataModel->index(result.first().row(), DivePlotDataModel::DEPTH)).toInt();
|
|
||||||
qreal x = hAxis->posAtValue(internalEvent->time.seconds);
|
qreal x = hAxis->posAtValue(internalEvent->time.seconds);
|
||||||
qreal y = vAxis->posAtValue(depth);
|
qreal y = vAxis->posAtValue(depth);
|
||||||
if (!instant)
|
if (!instant)
|
||||||
|
|
|
@ -27,6 +27,7 @@ slots:
|
||||||
private:
|
private:
|
||||||
void setupToolTipString(struct gasmix lastgasmix);
|
void setupToolTipString(struct gasmix lastgasmix);
|
||||||
void setupPixmap(struct gasmix lastgasmix);
|
void setupPixmap(struct gasmix lastgasmix);
|
||||||
|
int depthAtTime(int time);
|
||||||
DiveCartesianAxis *vAxis;
|
DiveCartesianAxis *vAxis;
|
||||||
DiveCartesianAxis *hAxis;
|
DiveCartesianAxis *hAxis;
|
||||||
DivePlotDataModel *dataModel;
|
DivePlotDataModel *dataModel;
|
||||||
|
|
Loading…
Add table
Reference in a new issue