[PATCH 3/7] Lift code out to read_ostc3_settings

Anton Lundin glance at acc.umu.se
Sun Dec 28 23:52:09 PST 2014


This lifts the reading of settings out of the run() method and
introduces better error handling when libdivecomputer returns a
error.

Signed-off-by: Anton Lundin <glance at acc.umu.se>
---
 configuredivecomputerthreads.cpp | 451 +++++++++++++++++++--------------------
 1 file changed, 222 insertions(+), 229 deletions(-)

diff --git a/configuredivecomputerthreads.cpp b/configuredivecomputerthreads.cpp
index dd46da5..11eed25 100644
--- a/configuredivecomputerthreads.cpp
+++ b/configuredivecomputerthreads.cpp
@@ -332,6 +332,221 @@ static dc_status_t write_suunto_vyper_settings(dc_device_t *device, DeviceDetail
 	return rc;
 }
 
+static dc_status_t read_ostc3_settings(dc_device_t *device, DeviceDetails *m_deviceDetails)
+{
+	dc_status_t rc;
+	//Read gas mixes
+	gas gas1;
+	gas gas2;
+	gas gas3;
+	gas gas4;
+	gas gas5;
+	unsigned char gasData[4] = { 0, 0, 0, 0 };
+
+	rc = hw_ostc3_device_config_read(device, OSTC3_GAS1, gasData, sizeof(gasData));
+	if (rc != DC_STATUS_SUCCESS)
+		return rc;
+	gas1.oxygen = gasData[0];
+	gas1.helium = gasData[1];
+	gas1.type = gasData[2];
+	gas1.depth = gasData[3];
+
+	rc = hw_ostc3_device_config_read(device, OSTC3_GAS2, gasData, sizeof(gasData));
+	if (rc != DC_STATUS_SUCCESS)
+		return rc;
+	gas2.oxygen = gasData[0];
+	gas2.helium = gasData[1];
+	gas2.type = gasData[2];
+	gas2.depth = gasData[3];
+
+	rc = hw_ostc3_device_config_read(device, OSTC3_GAS3, gasData, sizeof(gasData));
+	if (rc != DC_STATUS_SUCCESS)
+		return rc;
+	gas3.oxygen = gasData[0];
+	gas3.helium = gasData[1];
+	gas3.type = gasData[2];
+	gas3.depth = gasData[3];
+
+	rc = hw_ostc3_device_config_read(device, OSTC3_GAS4, gasData, sizeof(gasData));
+	if (rc != DC_STATUS_SUCCESS)
+		return rc;
+	gas4.oxygen = gasData[0];
+	gas4.helium = gasData[1];
+	gas4.type = gasData[2];
+	gas4.depth = gasData[3];
+
+	rc = hw_ostc3_device_config_read(device, OSTC3_GAS5, gasData, sizeof(gasData));
+	if (rc != DC_STATUS_SUCCESS)
+		return rc;
+	gas5.oxygen = gasData[0];
+	gas5.helium = gasData[1];
+	gas5.type = gasData[2];
+	gas5.depth = gasData[3];
+
+	m_deviceDetails->setGas1(gas1);
+	m_deviceDetails->setGas2(gas2);
+	m_deviceDetails->setGas3(gas3);
+	m_deviceDetails->setGas4(gas4);
+	m_deviceDetails->setGas5(gas5);
+
+	//Read Dil Values
+	gas dil1;
+	gas dil2;
+	gas dil3;
+	gas dil4;
+	gas dil5;
+	unsigned char dilData[4] = { 0, 0, 0, 0 };
+
+	rc = hw_ostc3_device_config_read(device, OSTC3_DIL1, dilData, sizeof(dilData));
+	if (rc != DC_STATUS_SUCCESS)
+		return rc;
+	dil1.oxygen = dilData[0];
+	dil1.helium = dilData[1];
+	dil1.type = dilData[2];
+	dil1.depth = dilData[3];
+
+	rc = hw_ostc3_device_config_read(device, OSTC3_DIL2, dilData, sizeof(dilData));
+	if (rc != DC_STATUS_SUCCESS)
+		return rc;
+	dil2.oxygen = dilData[0];
+	dil2.helium = dilData[1];
+	dil2.type = dilData[2];
+	dil2.depth = dilData[3];
+
+	rc = hw_ostc3_device_config_read(device, OSTC3_DIL3, dilData, sizeof(dilData));
+	if (rc != DC_STATUS_SUCCESS)
+		return rc;
+	dil3.oxygen = dilData[0];
+	dil3.helium = dilData[1];
+	dil3.type = dilData[2];
+	dil3.depth = dilData[3];
+
+	rc = hw_ostc3_device_config_read(device, OSTC3_DIL4, dilData, sizeof(dilData));
+	if (rc != DC_STATUS_SUCCESS)
+		return rc;
+	dil4.oxygen = dilData[0];
+	dil4.helium = dilData[1];
+	dil4.type = dilData[2];
+	dil4.depth = dilData[3];
+
+	rc = hw_ostc3_device_config_read(device, OSTC3_DIL5, dilData, sizeof(dilData));
+	if (rc != DC_STATUS_SUCCESS)
+		return rc;
+	dil5.oxygen = dilData[0];
+	dil5.helium = dilData[1];
+	dil5.type = dilData[2];
+	dil5.depth = dilData[3];
+
+	m_deviceDetails->setDil1(dil1);
+	m_deviceDetails->setDil2(dil2);
+	m_deviceDetails->setDil3(dil3);
+	m_deviceDetails->setDil4(dil4);
+	m_deviceDetails->setDil5(dil5);
+
+	//Read set point Values
+	setpoint sp1;
+	setpoint sp2;
+	setpoint sp3;
+	setpoint sp4;
+	setpoint sp5;
+	unsigned char spData[2] = { 0, 0 };
+
+	rc = hw_ostc3_device_config_read(device, OSTC3_SP1, spData, sizeof(spData));
+	if (rc != DC_STATUS_SUCCESS)
+		return rc;
+	sp1.sp = spData[0];
+	sp1.depth = spData[1];
+
+	rc = hw_ostc3_device_config_read(device, OSTC3_SP2, spData, sizeof(spData));
+	if (rc != DC_STATUS_SUCCESS)
+		return rc;
+	sp2.sp = spData[0];
+	sp2.depth = spData[1];
+
+	rc = hw_ostc3_device_config_read(device, OSTC3_SP3, spData, sizeof(spData));
+	if (rc != DC_STATUS_SUCCESS)
+		return rc;
+	sp3.sp = spData[0];
+	sp3.depth = spData[1];
+
+	rc = hw_ostc3_device_config_read(device, OSTC3_SP4, spData, sizeof(spData));
+	if (rc != DC_STATUS_SUCCESS)
+		return rc;
+	sp4.sp = spData[0];
+	sp4.depth = spData[1];
+
+	rc = hw_ostc3_device_config_read(device, OSTC3_SP5, spData, sizeof(spData));
+	if (rc != DC_STATUS_SUCCESS)
+		return rc;
+	sp5.sp = spData[0];
+	sp5.depth = spData[1];
+
+	m_deviceDetails->setSp1(sp1);
+	m_deviceDetails->setSp2(sp2);
+	m_deviceDetails->setSp3(sp3);
+	m_deviceDetails->setSp4(sp4);
+	m_deviceDetails->setSp5(sp5);
+
+	//Read other settings
+	unsigned char uData[1] = { 0 };
+
+#define READ_SETTING(_OSTC3_SETTING, _DEVICE_DETAIL) \
+	do { \
+		rc = hw_ostc3_device_config_read(device, _OSTC3_SETTING, uData, sizeof(uData)); \
+		if (rc != DC_STATUS_SUCCESS) \
+			return rc; \
+		m_deviceDetails->_DEVICE_DETAIL(uData[0]); \
+	} while (0)
+
+	READ_SETTING(OSTC3_DIVE_MODE, setDiveMode);
+	READ_SETTING(OSTC3_SATURATION, setSaturation);
+	READ_SETTING(OSTC3_DESATURATION, setDesaturation);
+	READ_SETTING(OSTC3_LAST_DECO, setLastDeco);
+	READ_SETTING(OSTC3_BRIGHTNESS, setBrightness);
+	READ_SETTING(OSTC3_UNITS, setUnits);
+	READ_SETTING(OSTC3_SAMPLING_RATE, setSamplingRate);
+	READ_SETTING(OSTC3_SALINITY, setSalinity);
+	READ_SETTING(OSTC3_DIVEMODE_COLOR, setDiveModeColor);
+	READ_SETTING(OSTC3_LANGUAGE, setLanguage);
+	READ_SETTING(OSTC3_DATE_FORMAT, setDateFormat);
+	READ_SETTING(OSTC3_COMPASS_GAIN, setCompassGain);
+	READ_SETTING(OSTC3_SAFETY_STOP, setSafetyStop);
+	READ_SETTING(OSTC3_GF_HIGH, setGfHigh);
+	READ_SETTING(OSTC3_GF_LOW, setGfLow);
+	READ_SETTING(OSTC3_PPO2_MIN, setPpO2Min);
+	READ_SETTING(OSTC3_PPO2_MAX, setPpO2Max);
+	READ_SETTING(OSTC3_FUTURE_TTS, setFutureTTS);
+	READ_SETTING(OSTC3_CCR_MODE, setCcrMode);
+	READ_SETTING(OSTC3_DECO_TYPE, setDecoType);
+	READ_SETTING(OSTC3_AGF_SELECTABLE, setAGFSelectable);
+	READ_SETTING(OSTC3_AGF_HIGH, setAGFHigh);
+	READ_SETTING(OSTC3_AGF_LOW, setAGFLow);
+	READ_SETTING(OSTC3_CALIBRATION_GAS_O2, setCalibrationGas);
+	READ_SETTING(OSTC3_FLIP_SCREEN, setFlipScreen);
+	READ_SETTING(OSTC3_SETPOINT_FALLBACK, setSetPointFallback);
+
+#undef READ_SETTING
+
+	rc = hw_ostc3_device_config_read(device, OSTC3_PRESSURE_SENSOR_OFFSET, uData, sizeof(uData));
+	if (rc != DC_STATUS_SUCCESS)
+		return rc;
+	// OSTC3 stores the pressureSensorOffset in two-complement
+	m_deviceDetails->setPressureSensorOffset((signed char)uData[0]);
+
+	//read firmware settings
+	unsigned char fData[64] = { 0 };
+	rc = hw_ostc3_device_version(device, fData, sizeof (fData));
+	if (rc != DC_STATUS_SUCCESS)
+		return rc;
+	int serial = fData[0] + (fData[1] << 8);
+	m_deviceDetails->setSerialNo(QString::number(serial));
+	m_deviceDetails->setFirmwareVersion(QString::number(fData[2]) + "." + QString::number(fData[3]));
+	QByteArray ar((char *)fData + 4, 60);
+	m_deviceDetails->setCustomText(ar.trimmed());
+
+	return rc;
+}
+
 void ReadSettingsThread::run()
 {
 	bool supported = false;
@@ -357,237 +572,15 @@ void ReadSettingsThread::run()
 			}
 			break;
 #if DC_VERSION_CHECK(0, 5, 0)
-		case DC_FAMILY_HW_OSTC3: {
+		case DC_FAMILY_HW_OSTC3:
 			supported = true;
-			//Read gas mixes
-			gas gas1;
-			gas gas2;
-			gas gas3;
-			gas gas4;
-			gas gas5;
-			//Gas 1
-			unsigned char gasData[4] = { 0, 0, 0, 0 };
-			rc = hw_ostc3_device_config_read(m_data->device, OSTC3_GAS1, gasData, sizeof(gasData));
-			if (rc == DC_STATUS_SUCCESS) {
-				//Gas data read successful
-				gas1.oxygen = gasData[0];
-				gas1.helium = gasData[1];
-				gas1.type = gasData[2];
-				gas1.depth = gasData[3];
-			}
-			//Gas 2
-			rc = hw_ostc3_device_config_read(m_data->device, OSTC3_GAS2, gasData, sizeof(gasData));
-			if (rc == DC_STATUS_SUCCESS) {
-				//Gas data read successful
-				gas2.oxygen = gasData[0];
-				gas2.helium = gasData[1];
-				gas2.type = gasData[2];
-				gas2.depth = gasData[3];
-			}
-			//Gas 3
-			rc = hw_ostc3_device_config_read(m_data->device, OSTC3_GAS3, gasData, sizeof(gasData));
-			if (rc == DC_STATUS_SUCCESS) {
-				//Gas data read successful
-				gas3.oxygen = gasData[0];
-				gas3.helium = gasData[1];
-				gas3.type = gasData[2];
-				gas3.depth = gasData[3];
-			}
-			//Gas 4
-			rc = hw_ostc3_device_config_read(m_data->device, OSTC3_GAS4, gasData, sizeof(gasData));
-			if (rc == DC_STATUS_SUCCESS) {
-				//Gas data read successful
-				gas4.oxygen = gasData[0];
-				gas4.helium = gasData[1];
-				gas4.type = gasData[2];
-				gas4.depth = gasData[3];
-			}
-			//Gas 5
-			rc = hw_ostc3_device_config_read(m_data->device, OSTC3_GAS5, gasData, sizeof(gasData));
-			if (rc == DC_STATUS_SUCCESS) {
-				//Gas data read successful
-				gas5.oxygen = gasData[0];
-				gas5.helium = gasData[1];
-				gas5.type = gasData[2];
-				gas5.depth = gasData[3];
-			}
-
-			m_deviceDetails->setGas1(gas1);
-			m_deviceDetails->setGas2(gas2);
-			m_deviceDetails->setGas3(gas3);
-			m_deviceDetails->setGas4(gas4);
-			m_deviceDetails->setGas5(gas5);
-
-			//Read Dil Values
-			gas dil1;
-			gas dil2;
-			gas dil3;
-			gas dil4;
-			gas dil5;
-			//Dil 1
-			unsigned char dilData[4] = { 0, 0, 0, 0 };
-			rc = hw_ostc3_device_config_read(m_data->device, OSTC3_DIL1, dilData, sizeof(dilData));
-			if (rc == DC_STATUS_SUCCESS) {
-				//Data read successful
-				dil1.oxygen = dilData[0];
-				dil1.helium = dilData[1];
-				dil1.type = dilData[2];
-				dil1.depth = dilData[3];
-			}
-			//Dil 2
-			rc = hw_ostc3_device_config_read(m_data->device, OSTC3_DIL2, dilData, sizeof(dilData));
-			if (rc == DC_STATUS_SUCCESS) {
-				//Data read successful
-				dil2.oxygen = dilData[0];
-				dil2.helium = dilData[1];
-				dil2.type = dilData[2];
-				dil2.depth = dilData[3];
-			}
-			//Dil 3
-			rc = hw_ostc3_device_config_read(m_data->device, OSTC3_DIL3, dilData, sizeof(dilData));
-			if (rc == DC_STATUS_SUCCESS) {
-				//Data read successful
-				dil3.oxygen = dilData[0];
-				dil3.helium = dilData[1];
-				dil3.type = dilData[2];
-				dil3.depth = dilData[3];
-			}
-			//Dil 4
-			rc = hw_ostc3_device_config_read(m_data->device, OSTC3_DIL4, dilData, sizeof(dilData));
-			if (rc == DC_STATUS_SUCCESS) {
-				//Data read successful
-				dil4.oxygen = dilData[0];
-				dil4.helium = dilData[1];
-				dil4.type = dilData[2];
-				dil4.depth = dilData[3];
-			}
-			//Dil 5
-			rc = hw_ostc3_device_config_read(m_data->device, OSTC3_DIL5, dilData, sizeof(dilData));
-			if (rc == DC_STATUS_SUCCESS) {
-				//Data read successful
-				dil5.oxygen = dilData[0];
-				dil5.helium = dilData[1];
-				dil5.type = dilData[2];
-				dil5.depth = dilData[3];
-			}
-
-			m_deviceDetails->setDil1(dil1);
-			m_deviceDetails->setDil2(dil2);
-			m_deviceDetails->setDil3(dil3);
-			m_deviceDetails->setDil4(dil4);
-			m_deviceDetails->setDil5(dil5);
-
-			//Read set point Values
-			setpoint sp1;
-			setpoint sp2;
-			setpoint sp3;
-			setpoint sp4;
-			setpoint sp5;
-
-			unsigned char spData[2] = { 0, 0 };
-
-			//Sp 1
-			rc = hw_ostc3_device_config_read(m_data->device, OSTC3_SP1, spData, sizeof(spData));
-			if (rc == DC_STATUS_SUCCESS) {
-				//Data read successful
-				sp1.sp = spData[0];
-				sp1.depth = spData[1];
-			}
-			//Sp 2
-			rc = hw_ostc3_device_config_read(m_data->device, OSTC3_SP2, spData, sizeof(spData));
-			if (rc == DC_STATUS_SUCCESS) {
-				//Data read successful
-				sp2.sp = spData[0];
-				sp2.depth = spData[1];
-			}
-			//Sp 3
-			rc = hw_ostc3_device_config_read(m_data->device, OSTC3_SP3, spData, sizeof(spData));
-			if (rc == DC_STATUS_SUCCESS) {
-				//Data read successful
-				sp3.sp = spData[0];
-				sp3.depth = spData[1];
-			}
-			//Sp 4
-			rc = hw_ostc3_device_config_read(m_data->device, OSTC3_SP4, spData, sizeof(spData));
-			if (rc == DC_STATUS_SUCCESS) {
-				//Data read successful
-				sp4.sp = spData[0];
-				sp4.depth = spData[1];
-			}
-			//Sp 5
-			rc = hw_ostc3_device_config_read(m_data->device, OSTC3_SP5, spData, sizeof(spData));
-			if (rc == DC_STATUS_SUCCESS) {
-				//Data read successful
-				sp5.sp = spData[0];
-				sp5.depth = spData[1];
-			}
-
-			m_deviceDetails->setSp1(sp1);
-			m_deviceDetails->setSp2(sp2);
-			m_deviceDetails->setSp3(sp3);
-			m_deviceDetails->setSp4(sp4);
-			m_deviceDetails->setSp5(sp5);
-
-			//Read other settings
-			unsigned char uData[1] = { 0 };
-
-#define READ_SETTING(_OSTC3_SETTING, _DEVICE_DETAIL)                                                    \
-	do {                                                                                            \
-		rc = hw_ostc3_device_config_read(m_data->device, _OSTC3_SETTING, uData, sizeof(uData)); \
-		if (rc == DC_STATUS_SUCCESS)                                                            \
-			m_deviceDetails->_DEVICE_DETAIL(uData[0]);                                      \
-	} while (0)
-
-			READ_SETTING(OSTC3_DIVE_MODE, setDiveMode);
-			READ_SETTING(OSTC3_SATURATION, setSaturation);
-			READ_SETTING(OSTC3_DESATURATION, setDesaturation);
-			READ_SETTING(OSTC3_LAST_DECO, setLastDeco);
-			READ_SETTING(OSTC3_BRIGHTNESS, setBrightness);
-			READ_SETTING(OSTC3_UNITS, setUnits);
-			READ_SETTING(OSTC3_SAMPLING_RATE, setSamplingRate);
-			READ_SETTING(OSTC3_SALINITY, setSalinity);
-			READ_SETTING(OSTC3_DIVEMODE_COLOR, setDiveModeColor);
-			READ_SETTING(OSTC3_LANGUAGE, setLanguage);
-			READ_SETTING(OSTC3_DATE_FORMAT, setDateFormat);
-			READ_SETTING(OSTC3_COMPASS_GAIN, setCompassGain);
-			READ_SETTING(OSTC3_SAFETY_STOP, setSafetyStop);
-			READ_SETTING(OSTC3_GF_HIGH, setGfHigh);
-			READ_SETTING(OSTC3_GF_LOW, setGfLow);
-			READ_SETTING(OSTC3_PPO2_MIN, setPpO2Min);
-			READ_SETTING(OSTC3_PPO2_MAX, setPpO2Max);
-			READ_SETTING(OSTC3_FUTURE_TTS, setFutureTTS);
-			READ_SETTING(OSTC3_CCR_MODE, setCcrMode);
-			READ_SETTING(OSTC3_DECO_TYPE, setDecoType);
-			READ_SETTING(OSTC3_AGF_SELECTABLE, setAGFSelectable);
-			READ_SETTING(OSTC3_AGF_HIGH, setAGFHigh);
-			READ_SETTING(OSTC3_AGF_LOW, setAGFLow);
-			READ_SETTING(OSTC3_CALIBRATION_GAS_O2, setCalibrationGas);
-			READ_SETTING(OSTC3_FLIP_SCREEN, setFlipScreen);
-			READ_SETTING(OSTC3_SETPOINT_FALLBACK, setSetPointFallback);
-
-#undef READ_SETTING
-
-			rc = hw_ostc3_device_config_read(m_data->device, OSTC3_PRESSURE_SENSOR_OFFSET, uData, sizeof(uData));
-			if (rc == DC_STATUS_SUCCESS) {
-				// OSTC3 stores the pressureSensorOffset in two-complement
-				m_deviceDetails->setPressureSensorOffset((signed char)uData[0]);
-			}
-
-			//read firmware settings
-			unsigned char fData[64] = { 0 };
-			rc = hw_ostc3_device_version(m_data->device, fData, sizeof(fData));
-			if (rc == DC_STATUS_SUCCESS) {
-				int serial = fData[0] + (fData[1] << 8);
-				m_deviceDetails->setSerialNo(QString::number(serial));
-				m_deviceDetails->setFirmwareVersion(QString::number(fData[2]) + "." + QString::number(fData[3]));
-				QByteArray ar((char *)fData + 4, 60);
-				m_deviceDetails->setCustomText(ar.trimmed());
-			}
-
-			emit devicedetails(m_deviceDetails);
+			rc = read_ostc3_settings(m_data->device, m_deviceDetails);
+			if (rc == DC_STATUS_SUCCESS)
+				emit devicedetails(m_deviceDetails);
+			else
+				emit error("Failed!");
 			break;
-		}
-#endif // divecomputer 0.5.0
+#endif	// divecomputer 0.5.0
 #ifdef DEBUG_OSTC
 		case DC_FAMILY_NULL:
 #endif
-- 
2.1.0



More information about the subsurface mailing list