| 
									
										
										
										
											2014-01-14 16:43:58 -02:00
										 |  |  | #include "diveplotdatamodel.h"
 | 
					
						
							|  |  |  | #include "dive.h"
 | 
					
						
							|  |  |  | #include "profile.h"
 | 
					
						
							|  |  |  | #include "graphicsview-common.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-04 17:34:16 -02:00
										 |  |  | #include "divelist.h"
 | 
					
						
							| 
									
										
										
										
											2014-01-14 16:43:58 -02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-22 06:42:02 -07:00
										 |  |  | DivePlotDataModel::DivePlotDataModel(QObject *parent) : | 
					
						
							|  |  |  | 	QAbstractTableModel(parent), | 
					
						
							|  |  |  | 	diveId(0), | 
					
						
							|  |  |  | 	dcNr(0) | 
					
						
							| 
									
										
										
										
											2014-01-14 16:43:58 -02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-02-09 18:47:56 +01:00
										 |  |  | 	memset(&pInfo, 0, sizeof(pInfo)); | 
					
						
							| 
									
										
										
										
											2014-01-14 16:43:58 -02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | int DivePlotDataModel::columnCount(const QModelIndex &parent) 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
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	if ((!index.isValid()) || (index.row() >= pInfo.nr)) | 
					
						
							| 
									
										
										
										
											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: | 
					
						
							|  |  |  | 			return item.pressure[0]; | 
					
						
							|  |  |  | 		case TEMPERATURE: | 
					
						
							|  |  |  | 			return item.temperature; | 
					
						
							|  |  |  | 		case COLOR: | 
					
						
							|  |  |  | 			return item.velocity; | 
					
						
							|  |  |  | 		case USERENTERED: | 
					
						
							|  |  |  | 			return false; | 
					
						
							|  |  |  | 		case CYLINDERINDEX: | 
					
						
							|  |  |  | 			return item.cylinderindex; | 
					
						
							|  |  |  | 		case SENSOR_PRESSURE: | 
					
						
							|  |  |  | 			return item.pressure[0]; | 
					
						
							|  |  |  | 		case INTERPOLATED_PRESSURE: | 
					
						
							|  |  |  | 			return item.pressure[1]; | 
					
						
							|  |  |  | 		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; | 
					
						
							| 
									
										
										
										
											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: | 
					
						
							|  |  |  | 			return getColor((color_indice_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
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | int DivePlotDataModel::rowCount(const QModelIndex &parent) 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 CYLINDERINDEX: | 
					
						
							| 
									
										
										
										
											2014-07-11 18:39:05 +01:00
										 |  |  | 		return tr("Cylinder index"); | 
					
						
							| 
									
										
										
										
											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() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-01-16 11:50:56 +07:00
										 |  |  | 	if (rowCount() != 0) { | 
					
						
							| 
									
										
										
										
											2014-01-14 16:43:58 -02:00
										 |  |  | 		beginRemoveRows(QModelIndex(), 0, rowCount() - 1); | 
					
						
							| 
									
										
										
										
											2014-02-10 14:41:59 -02:00
										 |  |  | 		pInfo.nr = 0; | 
					
						
							| 
									
										
										
										
											2014-02-17 19:15:40 -03:00
										 |  |  | 		diveId = -1; | 
					
						
							|  |  |  | 		dcNr = -1; | 
					
						
							| 
									
										
										
										
											2014-01-14 16:43:58 -02:00
										 |  |  | 		endRemoveRows(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | { | 
					
						
							|  |  |  | 	clear(); | 
					
						
							| 
									
										
										
										
											2014-02-10 16:27:05 -08:00
										 |  |  | 	Q_ASSERT(d != NULL); | 
					
						
							| 
									
										
										
										
											2014-01-21 14:05:29 -02:00
										 |  |  | 	diveId = d->id; | 
					
						
							| 
									
										
										
										
											2014-02-11 09:55:14 -08:00
										 |  |  | 	dcNr = dc_number; | 
					
						
							| 
									
										
										
										
											2014-02-04 17:34:16 -02:00
										 |  |  | 	pInfo = info; | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	beginInsertRows(QModelIndex(), 0, pInfo.nr - 1); | 
					
						
							| 
									
										
										
										
											2014-01-14 16:43:58 -02:00
										 |  |  | 	endInsertRows(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											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++) { \ | 
					
						
							| 
									
										
										
										
											2014-09-15 14:55:20 +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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-20 20:13:53 +02:00
										 |  |  | #define MAX_SENSOR_GAS_FUNC(GASFUNC) \
 | 
					
						
							|  |  |  | 	double DivePlotDataModel::GASFUNC()	/* CCR: This function finds the largest measured po2 value */ \ | 
					
						
							|  |  |  | 	{					/* by scanning the readings from the three individual o2 sensors. */ \ | 
					
						
							|  |  |  | 		double ret = -1; 		/* This is used for scaling the Y-axis for partial pressures */ \ | 
					
						
							|  |  |  | 		for (int s = 0; s < 3; s++) {	/* when displaying the graphs for individual o2 sensors */ \ | 
					
						
							|  |  |  | 			for (int i = 0, count = rowCount(); i < count; i++) {   /* POTENTIAL PROBLEM: the '3' (no_sensors) is hard-coded here */\ | 
					
						
							|  |  |  | 				if (pInfo.entry[i].o2sensor[s].mbar > ret)      \ | 
					
						
							|  |  |  | 					ret = pInfo.entry[i].o2sensor[s].mbar;  \ | 
					
						
							|  |  |  | 			}							\ | 
					
						
							|  |  |  | 		}								\ | 
					
						
							|  |  |  | 		return (ret / 1000.0);		/* mbar -> bar conversion */				\ | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-15 14:55:20 +02:00
										 |  |  | MAX_PPGAS_FUNC(he, pheMax); | 
					
						
							|  |  |  | MAX_PPGAS_FUNC(n2, pn2Max); | 
					
						
							|  |  |  | MAX_PPGAS_FUNC(o2, po2Max); | 
					
						
							| 
									
										
										
										
											2015-01-20 20:13:53 +02:00
										 |  |  | MAX_SENSOR_GAS_FUNC(CCRMax); | 
					
						
							| 
									
										
										
										
											2014-01-27 15:14:42 -02:00
										 |  |  | 
 | 
					
						
							|  |  |  | void DivePlotDataModel::emitDataChanged() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	emit dataChanged(QModelIndex(), QModelIndex()); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							|  |  |  | 	init_decompression(&displayed_dive); | 
					
						
							|  |  |  | 	calculate_deco_information(&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
										 |  |  | } |