2017-04-27 18:25:32 +00:00
|
|
|
// SPDX-License-Identifier: GPL-2.0
|
2016-04-05 05:02:03 +00:00
|
|
|
#include "qt-models/diveplotdatamodel.h"
|
2017-11-24 13:17:01 +00:00
|
|
|
#include "qt-models/diveplannermodel.h"
|
2016-04-05 05:02:03 +00:00
|
|
|
#include "core/profile.h"
|
|
|
|
#include "core/divelist.h"
|
|
|
|
#include "core/color.h"
|
2014-01-14 18:43:58 +00:00
|
|
|
|
2015-06-22 13:42:02 +00:00
|
|
|
DivePlotDataModel::DivePlotDataModel(QObject *parent) :
|
|
|
|
QAbstractTableModel(parent),
|
|
|
|
diveId(0),
|
|
|
|
dcNr(0)
|
2014-01-14 18:43:58 +00:00
|
|
|
{
|
2019-08-25 10:56:41 +00:00
|
|
|
init_plot_info(&pInfo);
|
2017-12-28 12:24:34 +00:00
|
|
|
memset(&plot_deco_state, 0, sizeof(struct deco_state));
|
2014-01-14 18:43:58 +00:00
|
|
|
}
|
|
|
|
|
2018-05-21 15:53:42 +00:00
|
|
|
int DivePlotDataModel::columnCount(const QModelIndex&) const
|
2014-01-14 18:43:58 +00:00
|
|
|
{
|
|
|
|
return COLUMNS;
|
|
|
|
}
|
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
QVariant DivePlotDataModel::data(const QModelIndex &index, int role) const
|
2014-01-14 18:43:58 +00:00
|
|
|
{
|
2016-01-19 18:27:38 +00:00
|
|
|
if ((!index.isValid()) || (index.row() >= pInfo.nr) || pInfo.entry == 0)
|
2014-01-14 18:43:58 +00:00
|
|
|
return QVariant();
|
|
|
|
|
2014-02-04 19:34:16 +00:00
|
|
|
plot_data item = pInfo.entry[index.row()];
|
2014-01-16 04:50:56 +00:00
|
|
|
if (role == Qt::DisplayRole) {
|
|
|
|
switch (index.column()) {
|
2014-02-28 04:09:57 +00:00
|
|
|
case DEPTH:
|
|
|
|
return item.depth;
|
|
|
|
case TIME:
|
|
|
|
return item.sec;
|
|
|
|
case PRESSURE:
|
2017-07-20 21:39:02 +00:00
|
|
|
return item.pressure[0][0];
|
2014-02-28 04:09:57 +00:00
|
|
|
case TEMPERATURE:
|
|
|
|
return item.temperature;
|
|
|
|
case COLOR:
|
|
|
|
return item.velocity;
|
|
|
|
case USERENTERED:
|
|
|
|
return false;
|
|
|
|
case SENSOR_PRESSURE:
|
2017-07-20 21:39:02 +00:00
|
|
|
return item.pressure[0][0];
|
2014-02-28 04:09:57 +00:00
|
|
|
case INTERPOLATED_PRESSURE:
|
2017-07-20 21:39:02 +00:00
|
|
|
return item.pressure[0][1];
|
2014-02-28 04:09:57 +00:00
|
|
|
case CEILING:
|
|
|
|
return item.ceiling;
|
|
|
|
case SAC:
|
|
|
|
return item.sac;
|
|
|
|
case PN2:
|
2014-09-15 12:55:20 +00:00
|
|
|
return item.pressures.n2;
|
2014-02-28 04:09:57 +00:00
|
|
|
case PHE:
|
2014-09-15 12:55:20 +00:00
|
|
|
return item.pressures.he;
|
2014-02-28 04:09:57 +00:00
|
|
|
case PO2:
|
2014-09-15 12:55:20 +00:00
|
|
|
return item.pressures.o2;
|
2015-01-05 07:20:26 +00:00
|
|
|
case O2SETPOINT:
|
|
|
|
return item.o2setpoint.mbar / 1000.0;
|
2015-01-20 18:13:53 +00:00
|
|
|
case CCRSENSOR1:
|
|
|
|
return item.o2sensor[0].mbar / 1000.0;
|
|
|
|
case CCRSENSOR2:
|
|
|
|
return item.o2sensor[1].mbar / 1000.0;
|
|
|
|
case CCRSENSOR3:
|
|
|
|
return item.o2sensor[2].mbar / 1000.0;
|
2018-03-14 15:13:37 +00:00
|
|
|
case SCR_OC_PO2:
|
|
|
|
return item.scr_OC_pO2.mbar / 1000.0;
|
2014-02-28 04:09:57 +00:00
|
|
|
case HEARTBEAT:
|
|
|
|
return item.heartbeat;
|
2014-09-15 12:09:00 +00:00
|
|
|
case AMBPRESSURE:
|
|
|
|
return AMB_PERCENTAGE;
|
|
|
|
case GFLINE:
|
|
|
|
return item.gfline;
|
2014-12-30 22:27:39 +00:00
|
|
|
case INSTANT_MEANDEPTH:
|
|
|
|
return item.running_sum;
|
2014-01-14 18:43:58 +00:00
|
|
|
}
|
|
|
|
}
|
2014-01-21 17:31:56 +00:00
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
if (role == Qt::DisplayRole && index.column() >= TISSUE_1 && index.column() <= TISSUE_16) {
|
|
|
|
return item.ceilings[index.column() - TISSUE_1];
|
2014-01-21 17:31:56 +00:00
|
|
|
}
|
|
|
|
|
2014-09-15 12:09:00 +00:00
|
|
|
if (role == Qt::DisplayRole && index.column() >= PERCENTAGE_1 && index.column() <= PERCENTAGE_16) {
|
|
|
|
return item.percentages[index.column() - PERCENTAGE_1];
|
|
|
|
}
|
|
|
|
|
2014-01-16 04:50:56 +00:00
|
|
|
if (role == Qt::BackgroundRole) {
|
|
|
|
switch (index.column()) {
|
2014-02-28 04:09:57 +00:00
|
|
|
case COLOR:
|
2018-01-10 16:33:20 +00:00
|
|
|
return getColor((color_index_t)(VELOCITY_COLORS_START_IDX + item.velocity));
|
2014-01-14 18:43:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return QVariant();
|
|
|
|
}
|
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
const plot_info &DivePlotDataModel::data() const
|
2014-01-21 15:27:08 +00:00
|
|
|
{
|
2014-02-04 19:34:16 +00:00
|
|
|
return pInfo;
|
2014-01-21 15:27:08 +00:00
|
|
|
}
|
|
|
|
|
2018-05-21 15:53:42 +00:00
|
|
|
int DivePlotDataModel::rowCount(const QModelIndex&) const
|
2014-01-14 18:43:58 +00:00
|
|
|
{
|
2014-02-04 19:34:16 +00:00
|
|
|
return pInfo.nr;
|
2014-01-14 18:43:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
QVariant DivePlotDataModel::headerData(int section, Qt::Orientation orientation, int role) const
|
|
|
|
{
|
|
|
|
if (orientation != Qt::Horizontal)
|
|
|
|
return QVariant();
|
|
|
|
|
|
|
|
if (role != Qt::DisplayRole)
|
|
|
|
return QVariant();
|
|
|
|
|
2014-01-16 04:50:56 +00:00
|
|
|
switch (section) {
|
2014-02-28 04:09:57 +00:00
|
|
|
case DEPTH:
|
|
|
|
return tr("Depth");
|
|
|
|
case TIME:
|
|
|
|
return tr("Time");
|
|
|
|
case PRESSURE:
|
|
|
|
return tr("Pressure");
|
|
|
|
case TEMPERATURE:
|
|
|
|
return tr("Temperature");
|
|
|
|
case COLOR:
|
|
|
|
return tr("Color");
|
|
|
|
case USERENTERED:
|
2014-07-11 17:39:05 +00:00
|
|
|
return tr("User entered");
|
2014-02-28 04:09:57 +00:00
|
|
|
case SENSOR_PRESSURE:
|
2014-06-22 14:41:44 +00:00
|
|
|
return tr("Pressure S");
|
2014-02-28 04:09:57 +00:00
|
|
|
case INTERPOLATED_PRESSURE:
|
|
|
|
return tr("Pressure I");
|
|
|
|
case CEILING:
|
|
|
|
return tr("Ceiling");
|
|
|
|
case SAC:
|
|
|
|
return tr("SAC");
|
|
|
|
case PN2:
|
2014-06-22 14:41:44 +00:00
|
|
|
return tr("pN₂");
|
2014-02-28 04:09:57 +00:00
|
|
|
case PHE:
|
2014-06-22 14:41:44 +00:00
|
|
|
return tr("pHe");
|
2014-02-28 04:09:57 +00:00
|
|
|
case PO2:
|
2014-06-22 14:41:44 +00:00
|
|
|
return tr("pO₂");
|
2015-01-05 07:20:26 +00:00
|
|
|
case O2SETPOINT:
|
|
|
|
return tr("Setpoint");
|
2015-01-20 18:13:53 +00:00
|
|
|
case CCRSENSOR1:
|
2015-01-27 15:06:13 +00:00
|
|
|
return tr("Sensor 1");
|
2015-01-20 18:13:53 +00:00
|
|
|
case CCRSENSOR2:
|
2015-01-27 15:06:13 +00:00
|
|
|
return tr("Sensor 2");
|
2015-01-20 18:13:53 +00:00
|
|
|
case CCRSENSOR3:
|
2015-01-27 15:06:13 +00:00
|
|
|
return tr("Sensor 3");
|
2014-09-15 12:09:00 +00:00
|
|
|
case AMBPRESSURE:
|
|
|
|
return tr("Ambient pressure");
|
2014-12-30 22:16:25 +00:00
|
|
|
case HEARTBEAT:
|
2015-01-26 06:51:18 +00:00
|
|
|
return tr("Heart rate");
|
2014-12-30 22:17:23 +00:00
|
|
|
case GFLINE:
|
2015-01-05 13:53:02 +00:00
|
|
|
return tr("Gradient factor");
|
2014-12-30 22:27:39 +00:00
|
|
|
case INSTANT_MEANDEPTH:
|
2015-01-26 06:51:19 +00:00
|
|
|
return tr("Mean depth @ s");
|
2014-01-14 18:43:58 +00:00
|
|
|
}
|
2014-02-28 04:09:57 +00:00
|
|
|
if (role == Qt::DisplayRole && section >= TISSUE_1 && section <= TISSUE_16) {
|
2014-01-21 17:31:56 +00:00
|
|
|
return QString("Ceiling: %1").arg(section - TISSUE_1);
|
|
|
|
}
|
2014-09-15 12:09:00 +00:00
|
|
|
if (role == Qt::DisplayRole && section >= PERCENTAGE_1 && section <= PERCENTAGE_16) {
|
|
|
|
return QString("Tissue: %1").arg(section - PERCENTAGE_1);
|
|
|
|
}
|
2014-01-14 18:43:58 +00:00
|
|
|
return QVariant();
|
|
|
|
}
|
|
|
|
|
|
|
|
void DivePlotDataModel::clear()
|
|
|
|
{
|
2014-01-16 04:50:56 +00:00
|
|
|
if (rowCount() != 0) {
|
2014-01-14 18:43:58 +00:00
|
|
|
beginRemoveRows(QModelIndex(), 0, rowCount() - 1);
|
2014-02-10 16:41:59 +00:00
|
|
|
pInfo.nr = 0;
|
2016-01-19 18:27:38 +00:00
|
|
|
free(pInfo.entry);
|
|
|
|
pInfo.entry = 0;
|
2014-02-17 22:15:40 +00:00
|
|
|
diveId = -1;
|
|
|
|
dcNr = -1;
|
2014-01-14 18:43:58 +00:00
|
|
|
endRemoveRows();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
void DivePlotDataModel::setDive(dive *d, const plot_info &info)
|
2014-01-14 18:43:58 +00:00
|
|
|
{
|
|
|
|
clear();
|
2014-02-11 00:27:05 +00:00
|
|
|
Q_ASSERT(d != NULL);
|
2014-01-21 16:05:29 +00:00
|
|
|
diveId = d->id;
|
2014-02-11 17:55:14 +00:00
|
|
|
dcNr = dc_number;
|
2016-01-19 18:27:38 +00:00
|
|
|
free(pInfo.entry);
|
2014-02-04 19:34:16 +00:00
|
|
|
pInfo = info;
|
2016-01-19 18:27:38 +00:00
|
|
|
pInfo.entry = (struct plot_data *)malloc(sizeof(struct plot_data) * pInfo.nr);
|
|
|
|
memcpy(pInfo.entry, info.entry, sizeof(plot_data) * pInfo.nr);
|
2014-02-28 04:09:57 +00:00
|
|
|
beginInsertRows(QModelIndex(), 0, pInfo.nr - 1);
|
2014-01-14 18:43:58 +00:00
|
|
|
endInsertRows();
|
|
|
|
}
|
2014-01-21 16:05:29 +00:00
|
|
|
|
2014-03-18 18:26:29 +00:00
|
|
|
unsigned int DivePlotDataModel::dcShown() const
|
2014-02-11 17:55:14 +00:00
|
|
|
{
|
|
|
|
return dcNr;
|
|
|
|
}
|
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
#define MAX_PPGAS_FUNC(GAS, GASFUNC) \
|
|
|
|
double DivePlotDataModel::GASFUNC() \
|
|
|
|
{ \
|
|
|
|
double ret = -1; \
|
|
|
|
for (int i = 0, count = rowCount(); i < count; i++) { \
|
2014-09-15 12:55:20 +00:00
|
|
|
if (pInfo.entry[i].pressures.GAS > ret) \
|
|
|
|
ret = pInfo.entry[i].pressures.GAS; \
|
2014-02-28 04:09:57 +00:00
|
|
|
} \
|
|
|
|
return ret; \
|
|
|
|
}
|
2014-01-27 17:14:42 +00:00
|
|
|
|
2014-09-15 12:55:20 +00:00
|
|
|
MAX_PPGAS_FUNC(he, pheMax);
|
|
|
|
MAX_PPGAS_FUNC(n2, pn2Max);
|
|
|
|
MAX_PPGAS_FUNC(o2, po2Max);
|
2014-01-27 17:14:42 +00:00
|
|
|
|
|
|
|
void DivePlotDataModel::emitDataChanged()
|
|
|
|
{
|
|
|
|
emit dataChanged(QModelIndex(), QModelIndex());
|
|
|
|
}
|
2014-02-04 19:34:16 +00:00
|
|
|
|
2016-02-06 04:45:18 +00:00
|
|
|
#ifndef SUBSURFACE_MOBILE
|
2014-02-04 19:34:16 +00:00
|
|
|
void DivePlotDataModel::calculateDecompression()
|
|
|
|
{
|
2014-07-03 21:34:24 +00:00
|
|
|
struct divecomputer *dc = select_dc(&displayed_dive);
|
2017-11-22 19:42:33 +00:00
|
|
|
init_decompression(&plot_deco_state, &displayed_dive);
|
2017-11-24 13:17:01 +00:00
|
|
|
calculate_deco_information(&plot_deco_state, &(DivePlannerPointsModel::instance()->final_deco_state), &displayed_dive, dc, &pInfo, false);
|
2014-02-28 04:09:57 +00:00
|
|
|
dataChanged(index(0, CEILING), index(pInfo.nr - 1, TISSUE_16));
|
2014-02-04 19:34:16 +00:00
|
|
|
}
|
2016-02-06 04:45:18 +00:00
|
|
|
#endif
|