mirror of
https://github.com/subsurface/subsurface.git
synced 2025-01-31 21:03:23 +00:00
Use proper types
This is step one of many to use gasmix instead of int o2/he. Right now some of these changes look ridiculous because after changing a few lines we immediately go back to o2 = get_o2(gas). The reason is that I wanted to convert a hand full of functions at a time. So in this commit I only change validate_gas(), get_gas_from_events() and get_gasidx() to use a struct gasmix instead of int o2, int he. This state builds and survived some mild testing. Let's continue on top of that. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
c539c8f861
commit
2bf46381a8
4 changed files with 47 additions and 47 deletions
66
planner.c
66
planner.c
|
@ -71,34 +71,24 @@ void set_last_stop(bool last_stop_6m)
|
||||||
decostoplevels[1] = 3000;
|
decostoplevels[1] = 3000;
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_gas_from_events(struct divecomputer *dc, int time, int *o2, int *he)
|
void get_gas_from_events(struct divecomputer *dc, int time, struct gasmix *gas)
|
||||||
{
|
{
|
||||||
// we don't modify the values passed in if nothing is found
|
// we don't modify the values passed in if nothing is found
|
||||||
// so don't call with uninitialized o2/he !
|
// so don't call with uninitialized gasmix !
|
||||||
struct event *event = dc->events;
|
struct event *event = dc->events;
|
||||||
while (event && event->time.seconds <= time) {
|
while (event && event->time.seconds <= time) {
|
||||||
if (!strcmp(event->name, "gaschange")) {
|
if (!strcmp(event->name, "gaschange"))
|
||||||
struct gasmix *g = get_gasmix_from_event(event);
|
*gas = *get_gasmix_from_event(event);
|
||||||
*o2 = get_o2(g);
|
|
||||||
*he = get_he(g);
|
|
||||||
}
|
|
||||||
event = event->next;
|
event = event->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_gasidx(struct dive *dive, int o2, int he)
|
int get_gasidx(struct dive *dive, struct gasmix *mix)
|
||||||
{
|
{
|
||||||
int gasidx = -1;
|
int gasidx = -1;
|
||||||
struct gasmix mix;
|
|
||||||
|
|
||||||
mix.o2.permille = o2;
|
|
||||||
mix.he.permille = he;
|
|
||||||
|
|
||||||
/* we treat air as 0/0 because it is special */
|
|
||||||
//if (is_air(o2, he))
|
|
||||||
// o2 = 0;
|
|
||||||
while (++gasidx < MAX_CYLINDERS)
|
while (++gasidx < MAX_CYLINDERS)
|
||||||
if (gasmix_distance(&dive->cylinder[gasidx].gasmix, &mix) < 200)
|
if (gasmix_distance(&dive->cylinder[gasidx].gasmix, mix) < 200)
|
||||||
return gasidx;
|
return gasidx;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -133,6 +123,7 @@ double tissue_at_end(struct dive *dive, char **cached_datap)
|
||||||
int i, t0, t1, gasidx, lastdepth;
|
int i, t0, t1, gasidx, lastdepth;
|
||||||
int o2, he;
|
int o2, he;
|
||||||
double tissue_tolerance;
|
double tissue_tolerance;
|
||||||
|
struct gasmix gas;
|
||||||
|
|
||||||
if (!dive)
|
if (!dive)
|
||||||
return 0.0;
|
return 0.0;
|
||||||
|
@ -148,13 +139,14 @@ double tissue_at_end(struct dive *dive, char **cached_datap)
|
||||||
psample = sample = dc->sample;
|
psample = sample = dc->sample;
|
||||||
lastdepth = t0 = 0;
|
lastdepth = t0 = 0;
|
||||||
/* we always start with gas 0 (unless an event tells us otherwise) */
|
/* we always start with gas 0 (unless an event tells us otherwise) */
|
||||||
o2 = get_o2(&dive->cylinder[0].gasmix);
|
gas = dive->cylinder[0].gasmix;
|
||||||
he = get_he(&dive->cylinder[0].gasmix);
|
|
||||||
for (i = 0; i < dc->samples; i++, sample++) {
|
for (i = 0; i < dc->samples; i++, sample++) {
|
||||||
t1 = sample->time.seconds;
|
t1 = sample->time.seconds;
|
||||||
get_gas_from_events(&dive->dc, t0, &o2, &he);
|
get_gas_from_events(&dive->dc, t0, &gas);
|
||||||
if ((gasidx = get_gasidx(dive, o2, he)) == -1) {
|
if ((gasidx = get_gasidx(dive, &gas)) == -1) {
|
||||||
report_error(translate("gettextFromC", "Can't find gas %d/%d"), (o2 + 5) / 10, (he + 5) / 10);
|
char gas_string[50];
|
||||||
|
get_gas_string(gas.o2.permille, gas.he.permille, gas_string, sizeof(gas_string));
|
||||||
|
report_error(translate("gettextFromC", "Can't find gas %s"), gas_string);
|
||||||
gasidx = 0;
|
gasidx = 0;
|
||||||
}
|
}
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
|
@ -425,12 +417,15 @@ struct gaschanges {
|
||||||
|
|
||||||
static struct gaschanges *analyze_gaslist(struct diveplan *diveplan, struct dive *dive, int *gaschangenr, int depth, int *asc_cylinder)
|
static struct gaschanges *analyze_gaslist(struct diveplan *diveplan, struct dive *dive, int *gaschangenr, int depth, int *asc_cylinder)
|
||||||
{
|
{
|
||||||
|
struct gasmix gas;
|
||||||
int nr = 0;
|
int nr = 0;
|
||||||
struct gaschanges *gaschanges = NULL;
|
struct gaschanges *gaschanges = NULL;
|
||||||
struct divedatapoint *dp = diveplan->dp;
|
struct divedatapoint *dp = diveplan->dp;
|
||||||
int best_depth = dive->cylinder[*asc_cylinder].depth.mm;
|
int best_depth = dive->cylinder[*asc_cylinder].depth.mm;
|
||||||
while (dp) {
|
while (dp) {
|
||||||
if (dp->time == 0) {
|
if (dp->time == 0) {
|
||||||
|
gas.o2.permille = dp->o2;
|
||||||
|
gas.he.permille = dp->he;
|
||||||
if (dp->depth <= depth) {
|
if (dp->depth <= depth) {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
nr++;
|
nr++;
|
||||||
|
@ -443,13 +438,13 @@ static struct gaschanges *analyze_gaslist(struct diveplan *diveplan, struct dive
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
gaschanges[i].depth = dp->depth;
|
gaschanges[i].depth = dp->depth;
|
||||||
gaschanges[i].gasidx = get_gasidx(dive, dp->o2, dp->he);
|
gaschanges[i].gasidx = get_gasidx(dive, &gas);
|
||||||
assert(gaschanges[i].gasidx != -1);
|
assert(gaschanges[i].gasidx != -1);
|
||||||
} else {
|
} else {
|
||||||
/* is there a better mix to start deco? */
|
/* is there a better mix to start deco? */
|
||||||
if (dp->depth < best_depth) {
|
if (dp->depth < best_depth) {
|
||||||
best_depth = dp->depth;
|
best_depth = dp->depth;
|
||||||
*asc_cylinder = get_gasidx(dive, dp->o2, dp->he);
|
*asc_cylinder = get_gasidx(dive, &gas);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -539,6 +534,7 @@ static void add_plan_to_notes(struct diveplan *diveplan, struct dive *dive, bool
|
||||||
translate("gettextFromC", "%s\nSubsurface dive plan\nbased on GFlow = %d and GFhigh = %d\n\n"),
|
translate("gettextFromC", "%s\nSubsurface dive plan\nbased on GFlow = %d and GFhigh = %d\n\n"),
|
||||||
disclaimer, diveplan->gflow, diveplan->gfhigh);
|
disclaimer, diveplan->gflow, diveplan->gfhigh);
|
||||||
do {
|
do {
|
||||||
|
struct gasmix gasmix;
|
||||||
const char *depth_unit;
|
const char *depth_unit;
|
||||||
char gas[64];
|
char gas[64];
|
||||||
double depthvalue;
|
double depthvalue;
|
||||||
|
@ -569,7 +565,9 @@ static void add_plan_to_notes(struct diveplan *diveplan, struct dive *dive, bool
|
||||||
if (!dp->entered && o2 == newo2 && he == newhe && nextdp && dp->depth != lastdepth && nextdp->depth != dp->depth)
|
if (!dp->entered && o2 == newo2 && he == newhe && nextdp && dp->depth != lastdepth && nextdp->depth != dp->depth)
|
||||||
continue;
|
continue;
|
||||||
get_gas_string(o2, he, gas, sizeof(gas));
|
get_gas_string(o2, he, gas, sizeof(gas));
|
||||||
gasidx = get_gasidx(dive, o2, he);
|
gasmix.he.permille = he;
|
||||||
|
gasmix.o2.permille = o2;
|
||||||
|
gasidx = get_gasidx(dive, &gasmix);
|
||||||
len = strlen(buffer);
|
len = strlen(buffer);
|
||||||
if (dp->depth != lastdepth)
|
if (dp->depth != lastdepth)
|
||||||
snprintf(buffer + len, sizeof(buffer) - len, translate("gettextFromC", "Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s\n"),
|
snprintf(buffer + len, sizeof(buffer) - len, translate("gettextFromC", "Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s\n"),
|
||||||
|
@ -655,6 +653,7 @@ void plan(struct diveplan *diveplan, char **cached_datap, struct dive **divep, s
|
||||||
int avg_depth, bottom_time;
|
int avg_depth, bottom_time;
|
||||||
int last_ascend_rate;
|
int last_ascend_rate;
|
||||||
int best_first_ascend_cylinder;
|
int best_first_ascend_cylinder;
|
||||||
|
struct gasmix gas;
|
||||||
|
|
||||||
set_gf(diveplan->gflow, diveplan->gfhigh, default_prefs.gf_low_at_maxdepth);
|
set_gf(diveplan->gflow, diveplan->gfhigh, default_prefs.gf_low_at_maxdepth);
|
||||||
if (!diveplan->surface_pressure)
|
if (!diveplan->surface_pressure)
|
||||||
|
@ -669,12 +668,15 @@ void plan(struct diveplan *diveplan, char **cached_datap, struct dive **divep, s
|
||||||
/* Let's start at the last 'sample', i.e. the last manually entered waypoint. */
|
/* Let's start at the last 'sample', i.e. the last manually entered waypoint. */
|
||||||
sample = &dive->dc.sample[dive->dc.samples - 1];
|
sample = &dive->dc.sample[dive->dc.samples - 1];
|
||||||
/* we start with gas 0, then check if that was changed */
|
/* we start with gas 0, then check if that was changed */
|
||||||
o2 = get_o2(&dive->cylinder[0].gasmix);
|
gas = dive->cylinder[0].gasmix;
|
||||||
he = get_he(&dive->cylinder[0].gasmix);
|
get_gas_from_events(&dive->dc, sample->time.seconds, &gas);
|
||||||
get_gas_from_events(&dive->dc, sample->time.seconds, &o2, &he);
|
o2 = get_o2(&gas);
|
||||||
|
he = get_he(&gas);
|
||||||
po2 = dive->dc.sample[dive->dc.samples - 1].po2;
|
po2 = dive->dc.sample[dive->dc.samples - 1].po2;
|
||||||
if ((current_cylinder = get_gasidx(dive, o2, he)) == -1) {
|
if ((current_cylinder = get_gasidx(dive, &gas)) == -1) {
|
||||||
report_error(translate("gettextFromC", "Can't find gas %d/%d"), (o2 + 5) / 10, (he + 5) / 10);
|
char gas_string[50];
|
||||||
|
get_gas_string(gas.o2.permille, gas.he.permille, gas_string, sizeof(gas_string));
|
||||||
|
report_error(translate("gettextFromC", "Can't find gas %s"), gas_string);
|
||||||
current_cylinder = 0;
|
current_cylinder = 0;
|
||||||
}
|
}
|
||||||
depth = dive->dc.sample[dive->dc.samples - 1].depth.mm;
|
depth = dive->dc.sample[dive->dc.samples - 1].depth.mm;
|
||||||
|
@ -866,7 +868,7 @@ static int get_permille(const char *begin, const char **end)
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
int validate_gas(const char *text, int *o2_p, int *he_p)
|
int validate_gas(const char *text, struct gasmix *gas)
|
||||||
{
|
{
|
||||||
int o2, he;
|
int o2, he;
|
||||||
|
|
||||||
|
@ -904,8 +906,8 @@ int validate_gas(const char *text, int *o2_p, int *he_p)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Let it rip */
|
/* Let it rip */
|
||||||
*o2_p = o2;
|
gas->o2.permille = o2;
|
||||||
*he_p = he;
|
gas->he.permille = he;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,13 +6,13 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern int validate_gas(const char *text, int *o2_p, int *he_p);
|
extern int validate_gas(const char *text, struct gasmix *gas);
|
||||||
extern int validate_po2(const char *text, int *mbar_po2);
|
extern int validate_po2(const char *text, int *mbar_po2);
|
||||||
extern timestamp_t current_time_notz(void);
|
extern timestamp_t current_time_notz(void);
|
||||||
extern void show_planned_dive(char **error_string_p);
|
extern void show_planned_dive(char **error_string_p);
|
||||||
extern void set_last_stop(bool last_stop_6m);
|
extern void set_last_stop(bool last_stop_6m);
|
||||||
extern void get_gas_from_events(struct divecomputer *dc, int time, int *o2, int *he);
|
extern void get_gas_from_events(struct divecomputer *dc, int time, struct gasmix *gas);
|
||||||
extern int get_gasidx(struct dive *dive, int o2, int he);
|
extern int get_gasidx(struct dive *dive, struct gasmix *mix);
|
||||||
extern bool diveplan_empty(struct diveplan *diveplan);
|
extern bool diveplan_empty(struct diveplan *diveplan);
|
||||||
|
|
||||||
extern struct dive *planned_dive;
|
extern struct dive *planned_dive;
|
||||||
|
|
|
@ -89,14 +89,13 @@ void DivePlannerPointsModel::loadFromDive(dive *d)
|
||||||
CylindersModel::instance()->setDive(stagingDive);
|
CylindersModel::instance()->setDive(stagingDive);
|
||||||
int lasttime = 0;
|
int lasttime = 0;
|
||||||
// we start with the first gas and see if it was changed
|
// we start with the first gas and see if it was changed
|
||||||
int o2 = get_o2(&backupDive.cylinder[0].gasmix);
|
struct gasmix gas = backupDive.cylinder[0].gasmix;
|
||||||
int he = get_he(&backupDive.cylinder[0].gasmix);
|
|
||||||
for (int i = 0; i < backupDive.dc.samples - 1; i++) {
|
for (int i = 0; i < backupDive.dc.samples - 1; i++) {
|
||||||
const sample &s = backupDive.dc.sample[i];
|
const sample &s = backupDive.dc.sample[i];
|
||||||
if (s.time.seconds == 0)
|
if (s.time.seconds == 0)
|
||||||
continue;
|
continue;
|
||||||
get_gas_from_events(&backupDive.dc, lasttime, &o2, &he);
|
get_gas_from_events(&backupDive.dc, lasttime, &gas);
|
||||||
plannerModel->addStop(s.depth.mm, s.time.seconds, o2, he, 0, true);
|
plannerModel->addStop(s.depth.mm, s.time.seconds, get_o2(&gas), get_he(&gas), 0, true);
|
||||||
lasttime = s.time.seconds;
|
lasttime = s.time.seconds;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -390,8 +389,7 @@ QVariant DivePlannerPointsModel::data(const QModelIndex &index, int role) const
|
||||||
|
|
||||||
bool DivePlannerPointsModel::setData(const QModelIndex &index, const QVariant &value, int role)
|
bool DivePlannerPointsModel::setData(const QModelIndex &index, const QVariant &value, int role)
|
||||||
{
|
{
|
||||||
int o2 = 0;
|
struct gasmix gas = { 0 };
|
||||||
int he = 0;
|
|
||||||
int i, shift;
|
int i, shift;
|
||||||
if (role == Qt::EditRole) {
|
if (role == Qt::EditRole) {
|
||||||
divedatapoint &p = divepoints[index.row()];
|
divedatapoint &p = divepoints[index.row()];
|
||||||
|
@ -419,9 +417,9 @@ bool DivePlannerPointsModel::setData(const QModelIndex &index, const QVariant &v
|
||||||
} break;
|
} break;
|
||||||
case GAS:
|
case GAS:
|
||||||
QByteArray gasv = value.toByteArray();
|
QByteArray gasv = value.toByteArray();
|
||||||
if (validate_gas(gasv.data(), &o2, &he)) {
|
if (validate_gas(gasv.data(), &gas)) {
|
||||||
p.o2 = o2;
|
p.o2 = get_o2(&gas);
|
||||||
p.he = he;
|
p.he = get_he(&gas);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -992,12 +992,12 @@ void ProfileWidget2::changeGas()
|
||||||
// backup the things on the dataModel, since we will clear that out.
|
// backup the things on the dataModel, since we will clear that out.
|
||||||
unsigned int diveComputer = dataModel->dcShown();
|
unsigned int diveComputer = dataModel->dcShown();
|
||||||
int diveId = dataModel->id();
|
int diveId = dataModel->id();
|
||||||
int o2, he;
|
struct gasmix gasmix;
|
||||||
int seconds = timeAxis->valueAt(scenePos);
|
int seconds = timeAxis->valueAt(scenePos);
|
||||||
struct dive *d = get_dive_by_uniq_id(diveId);
|
struct dive *d = get_dive_by_uniq_id(diveId);
|
||||||
|
|
||||||
validate_gas(gas.toUtf8().constData(), &o2, &he);
|
validate_gas(gas.toUtf8().constData(), &gasmix);
|
||||||
add_gas_switch_event(d, get_dive_dc(d, diveComputer), seconds, get_gasidx(d, o2, he));
|
add_gas_switch_event(d, get_dive_dc(d, diveComputer), seconds, get_gasidx(d, &gasmix));
|
||||||
// this means we potentially have a new tank that is being used and needs to be shown
|
// this means we potentially have a new tank that is being used and needs to be shown
|
||||||
fixup_dive(d);
|
fixup_dive(d);
|
||||||
MainWindow::instance()->information()->updateDiveInfo(selected_dive);
|
MainWindow::instance()->information()->updateDiveInfo(selected_dive);
|
||||||
|
|
Loading…
Add table
Reference in a new issue