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