summaryrefslogtreecommitdiffstats
path: root/configuredivecomputerthreads.cpp
diff options
context:
space:
mode:
authorGravatar Anton Lundin <glance@acc.umu.se>2014-12-29 08:52:09 +0100
committerGravatar Dirk Hohndel <dirk@hohndel.org>2014-12-28 23:57:57 -0800
commit3655a726c2d78f2d9a28bec395aba00c355f83ba (patch)
tree14eb7f4706875fefe38871f834773703338cefe8 /configuredivecomputerthreads.cpp
parentec369141a3b9bdb1cf70371d0aa1eb490b3f25df (diff)
downloadsubsurface-3655a726c2d78f2d9a28bec395aba00c355f83ba.tar.gz
Lift code out to read_ostc3_settings
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@acc.umu.se> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'configuredivecomputerthreads.cpp')
-rw-r--r--configuredivecomputerthreads.cpp451
1 files changed, 222 insertions, 229 deletions
diff --git a/configuredivecomputerthreads.cpp b/configuredivecomputerthreads.cpp
index dd46da504..11eed252d 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