Warn if Dive Mode / Cylinders are Changed to an Incorrect Configuration.

Signed-off-by: Michael Keller <github@ike.ch>
This commit is contained in:
Michael Keller 2025-01-22 14:00:28 +13:00 committed by Subsurface CI
parent 55a8b9089f
commit b5f823c85a
4 changed files with 35 additions and 7 deletions

View file

@ -1042,24 +1042,24 @@ static void fixup_dc_sample_sensors(struct dive &dive, struct divecomputer &dc)
}
}
static void fixup_dc_cylinder_use(struct dive &dive, struct divecomputer &dc)
int check_dc_cylinder_use(struct dive &dive, struct divecomputer &dc)
{
if (dc.divemode != OC && dc.divemode != CCR && dc.divemode != PSCR)
return;
return 1;
// Check that we have at least one cylinder that is suitable for the dive
// For OC we default to air if we don't have any cylinders
if (dc.divemode == OC && dive.cylinders.empty())
return;
return 1;
for (auto &cylinder: dive.cylinders)
if ((dc.divemode == CCR && cylinder.cylinder_use == DILUENT) || ((dc.divemode == PSCR || dc.divemode == OC) && cylinder.cylinder_use == OC_GAS))
return;
return 1;
report_error("Dive: %u, dive computer: %s: %s dive, but no %s cylinder found. Please add or select the correct cylinder use.", dive.number, dc.model.c_str(), dc.divemode == OC ? "open circuit" : dc.divemode == CCR ? "CCR" : "PSCR", dc.divemode == OC ? "open circuit" : dc.divemode == CCR ? "diluent" : "drive gas");
return report_error("Dive: %u, dive computer: %s: %s dive, but no %s cylinder found. Please add or select the correct cylinder use.", dive.number, dc.model.c_str(), dc.divemode == OC ? "open circuit" : dc.divemode == CCR ? "CCR" : "PSCR", dc.divemode == OC ? "open circuit" : dc.divemode == CCR ? "diluent" : "drive gas");
}
@ -1091,8 +1091,8 @@ static void fixup_dive_dc(struct dive &dive, struct divecomputer &dc)
/* Fixup CCR / PSCR dives with o2sensor values, but without no_o2sensors */
fixup_no_o2sensors(dc);
/* Fixup cylinder use */
fixup_dc_cylinder_use(dive, dc);
/* Check cylinder use */
check_dc_cylinder_use(dive, dc);
/* If there are no samples, generate a fake profile based on depth and time */
if (dc.samples.empty())

View file

@ -206,6 +206,8 @@ extern bool cylinder_with_sensor_sample(const struct dive *dive, int cylinder_id
extern void update_setpoint_events(const struct dive *dive, struct divecomputer *dc);
extern int check_dc_cylinder_use(struct dive &dive, struct divecomputer &dc);
/* Make pointers to dive and dive_trip "Qt metatypes" so that they can be passed through
* QVariants and through QML.
*/

View file

@ -43,6 +43,9 @@ DiveListView::DiveListView(QWidget *parent) : QTreeView(parent),
connect(m, &MultiFilterSortModel::divesSelected, this, &DiveListView::divesSelectedSlot);
connect(m, &MultiFilterSortModel::tripSelected, this, &DiveListView::tripSelected);
connect(&diveListNotifier, &DiveListNotifier::settingsChanged, this, &DiveListView::settingsChanged);
connect(&diveListNotifier, &DiveListNotifier::divesChanged, this, &DiveListView::divesChanged);
connect(&diveListNotifier, &DiveListNotifier::cylinderEdited, this, &DiveListView::cylinderEdited);
connect(&diveListNotifier, &DiveListNotifier::cylinderRemoved, this, &DiveListView::cylinderEdited);
setSortingEnabled(true);
setContextMenuPolicy(Qt::DefaultContextMenu);
@ -389,6 +392,27 @@ void DiveListView::settingsChanged()
}
}
static void check_cylinder_use(struct dive &dive)
{
for (auto &divecomputer: dive.dcs)
check_dc_cylinder_use(dive, divecomputer);
}
void DiveListView::divesChanged(const QVector<dive *> &dives, DiveField field)
{
if (!field.mode)
return;
for (auto &dive: dives)
check_cylinder_use(*dive);
}
void DiveListView::cylinderEdited(struct dive *dive, int)
{
check_cylinder_use(*dive);
}
void DiveListView::toggleColumnVisibilityByIndex()
{
QAction *action = qobject_cast<QAction *>(sender());

View file

@ -54,6 +54,8 @@ slots:
void shiftTimes();
void divesSelectedSlot(const QVector<QModelIndex> &indices, QModelIndex currentDive, int currentDC);
void tripSelected(QModelIndex trip, QModelIndex currentDive);
void divesChanged(const QVector<dive *> &dives, DiveField field);
void cylinderEdited(dive *dive, int);
private:
void rowsInserted(const QModelIndex &parent, int start, int end) override;
void reset() override;