summaryrefslogtreecommitdiffstats
path: root/configuredivecomputerthreads.cpp
diff options
context:
space:
mode:
authorGravatar Anton Lundin <glance@acc.umu.se>2014-12-29 08:52:11 +0100
committerGravatar Dirk Hohndel <dirk@hohndel.org>2014-12-28 23:58:29 -0800
commit79327d7181a57216cb78c752ac863a6d555b0085 (patch)
tree28138b52b2c593d4973514d6647d89bc0e58c33b /configuredivecomputerthreads.cpp
parent89e197a16be08be9002eb9cdeb7b63adb8ecf04f (diff)
downloadsubsurface-79327d7181a57216cb78c752ac863a6d555b0085.tar.gz
Lift code out to write_ostc3_settings
This lifts the writing 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.cpp394
1 files changed, 234 insertions, 160 deletions
diff --git a/configuredivecomputerthreads.cpp b/configuredivecomputerthreads.cpp
index 35b64bdac..9df0f6512 100644
--- a/configuredivecomputerthreads.cpp
+++ b/configuredivecomputerthreads.cpp
@@ -547,6 +547,234 @@ static dc_status_t read_ostc3_settings(dc_device_t *device, DeviceDetails *m_dev
return rc;
}
+static dc_status_t write_ostc3_settings(dc_device_t *device, DeviceDetails *m_deviceDetails)
+{
+ dc_status_t rc;
+ //write gas values
+ unsigned char gas1Data[4] = {
+ m_deviceDetails->gas1().oxygen,
+ m_deviceDetails->gas1().helium,
+ m_deviceDetails->gas1().type,
+ m_deviceDetails->gas1().depth
+ };
+
+ unsigned char gas2Data[4] = {
+ m_deviceDetails->gas2().oxygen,
+ m_deviceDetails->gas2().helium,
+ m_deviceDetails->gas2().type,
+ m_deviceDetails->gas2().depth
+ };
+
+ unsigned char gas3Data[4] = {
+ m_deviceDetails->gas3().oxygen,
+ m_deviceDetails->gas3().helium,
+ m_deviceDetails->gas3().type,
+ m_deviceDetails->gas3().depth
+ };
+
+ unsigned char gas4Data[4] = {
+ m_deviceDetails->gas4().oxygen,
+ m_deviceDetails->gas4().helium,
+ m_deviceDetails->gas4().type,
+ m_deviceDetails->gas4().depth
+ };
+
+ unsigned char gas5Data[4] = {
+ m_deviceDetails->gas5().oxygen,
+ m_deviceDetails->gas5().helium,
+ m_deviceDetails->gas5().type,
+ m_deviceDetails->gas5().depth
+ };
+ //gas 1
+ rc = hw_ostc3_device_config_write(device, OSTC3_GAS1, gas1Data, sizeof(gas1Data));
+ if (rc != DC_STATUS_SUCCESS)
+ return rc;
+ //gas 2
+ rc = hw_ostc3_device_config_write(device, OSTC3_GAS2, gas2Data, sizeof(gas2Data));
+ if (rc != DC_STATUS_SUCCESS)
+ return rc;
+ //gas 3
+ rc = hw_ostc3_device_config_write(device, OSTC3_GAS3, gas3Data, sizeof(gas3Data));
+ if (rc != DC_STATUS_SUCCESS)
+ return rc;
+ //gas 4
+ rc = hw_ostc3_device_config_write(device, OSTC3_GAS4, gas4Data, sizeof(gas4Data));
+ if (rc != DC_STATUS_SUCCESS)
+ return rc;
+ //gas 5
+ rc = hw_ostc3_device_config_write(device, OSTC3_GAS5, gas5Data, sizeof(gas5Data));
+ if (rc != DC_STATUS_SUCCESS)
+ return rc;
+
+ //write set point values
+ unsigned char sp1Data[2] = {
+ m_deviceDetails->sp1().sp,
+ m_deviceDetails->sp1().depth
+ };
+
+ unsigned char sp2Data[2] = {
+ m_deviceDetails->sp2().sp,
+ m_deviceDetails->sp2().depth
+ };
+
+ unsigned char sp3Data[2] = {
+ m_deviceDetails->sp3().sp,
+ m_deviceDetails->sp3().depth
+ };
+
+ unsigned char sp4Data[2] = {
+ m_deviceDetails->sp4().sp,
+ m_deviceDetails->sp4().depth
+ };
+
+ unsigned char sp5Data[2] = {
+ m_deviceDetails->sp5().sp,
+ m_deviceDetails->sp5().depth
+ };
+
+ //sp 1
+ rc = hw_ostc3_device_config_write(device, OSTC3_SP1, sp1Data, sizeof(sp1Data));
+ if (rc != DC_STATUS_SUCCESS)
+ return rc;
+ //sp 2
+ rc = hw_ostc3_device_config_write(device, OSTC3_SP2, sp2Data, sizeof(sp2Data));
+ if (rc != DC_STATUS_SUCCESS)
+ return rc;
+ //sp 3
+ rc = hw_ostc3_device_config_write(device, OSTC3_SP3, sp3Data, sizeof(sp3Data));
+ if (rc != DC_STATUS_SUCCESS)
+ return rc;
+ //sp 4
+ rc = hw_ostc3_device_config_write(device, OSTC3_SP4, sp4Data, sizeof(sp4Data));
+ if (rc != DC_STATUS_SUCCESS)
+ return rc;
+ //sp 5
+ rc = hw_ostc3_device_config_write(device, OSTC3_SP5, sp5Data, sizeof(sp5Data));
+ if (rc != DC_STATUS_SUCCESS)
+ return rc;
+
+ //write dil values
+ unsigned char dil1Data[4] = {
+ m_deviceDetails->dil1().oxygen,
+ m_deviceDetails->dil1().helium,
+ m_deviceDetails->dil1().type,
+ m_deviceDetails->dil1().depth
+ };
+
+ unsigned char dil2Data[4] = {
+ m_deviceDetails->dil2().oxygen,
+ m_deviceDetails->dil2().helium,
+ m_deviceDetails->dil2().type,
+ m_deviceDetails->dil2().depth
+ };
+
+ unsigned char dil3Data[4] = {
+ m_deviceDetails->dil3().oxygen,
+ m_deviceDetails->dil3().helium,
+ m_deviceDetails->dil3().type,
+ m_deviceDetails->dil3().depth
+ };
+
+ unsigned char dil4Data[4] = {
+ m_deviceDetails->dil4().oxygen,
+ m_deviceDetails->dil4().helium,
+ m_deviceDetails->dil4().type,
+ m_deviceDetails->dil4().depth
+ };
+
+ unsigned char dil5Data[4] = {
+ m_deviceDetails->dil5().oxygen,
+ m_deviceDetails->dil5().helium,
+ m_deviceDetails->dil5().type,
+ m_deviceDetails->dil5().depth
+ };
+ //dil 1
+ rc = hw_ostc3_device_config_write(device, OSTC3_DIL1, dil1Data, sizeof(gas1Data));
+ if (rc != DC_STATUS_SUCCESS)
+ return rc;
+ //dil 2
+ rc = hw_ostc3_device_config_write(device, OSTC3_DIL2, dil2Data, sizeof(dil2Data));
+ if (rc != DC_STATUS_SUCCESS)
+ return rc;
+ //dil 3
+ rc = hw_ostc3_device_config_write(device, OSTC3_DIL3, dil3Data, sizeof(dil3Data));
+ if (rc != DC_STATUS_SUCCESS)
+ return rc;
+ //dil 4
+ rc = hw_ostc3_device_config_write(device, OSTC3_DIL4, dil4Data, sizeof(dil4Data));
+ if (rc != DC_STATUS_SUCCESS)
+ return rc;
+ //dil 5
+ rc = hw_ostc3_device_config_write(device, OSTC3_DIL5, dil5Data, sizeof(dil5Data));
+ if (rc != DC_STATUS_SUCCESS)
+ return rc;
+
+ //write general settings
+ //custom text
+ rc = hw_ostc3_device_customtext(device, m_deviceDetails->customText().toUtf8().data());
+ if (rc != DC_STATUS_SUCCESS)
+ return rc;
+
+ unsigned char data[1] = {0};
+#define WRITE_SETTING(_OSTC3_SETTING, _DEVICE_DETAIL) \
+ do { \
+ data[0] = m_deviceDetails->_DEVICE_DETAIL(); \
+ rc = hw_ostc3_device_config_write(device, _OSTC3_SETTING, data, sizeof(data)); \
+ if (rc != DC_STATUS_SUCCESS) \
+ return rc; \
+ } while (0)
+
+ WRITE_SETTING(OSTC3_DIVE_MODE, diveMode);
+ WRITE_SETTING(OSTC3_SATURATION, saturation);
+ WRITE_SETTING(OSTC3_DESATURATION, desaturation);
+ WRITE_SETTING(OSTC3_LAST_DECO, lastDeco);
+ WRITE_SETTING(OSTC3_BRIGHTNESS, brightness);
+ WRITE_SETTING(OSTC3_UNITS, units);
+ WRITE_SETTING(OSTC3_SAMPLING_RATE, samplingRate);
+ WRITE_SETTING(OSTC3_SALINITY, salinity);
+ WRITE_SETTING(OSTC3_DIVEMODE_COLOR, diveModeColor);
+ WRITE_SETTING(OSTC3_LANGUAGE, language);
+ WRITE_SETTING(OSTC3_DATE_FORMAT, dateFormat);
+ WRITE_SETTING(OSTC3_COMPASS_GAIN, compassGain);
+ WRITE_SETTING(OSTC3_SAFETY_STOP, safetyStop);
+ WRITE_SETTING(OSTC3_GF_HIGH, gfHigh);
+ WRITE_SETTING(OSTC3_GF_LOW, gfLow);
+ WRITE_SETTING(OSTC3_PPO2_MIN, ppO2Min);
+ WRITE_SETTING(OSTC3_PPO2_MAX, ppO2Max);
+ WRITE_SETTING(OSTC3_FUTURE_TTS, futureTTS);
+ WRITE_SETTING(OSTC3_CCR_MODE, ccrMode);
+ WRITE_SETTING(OSTC3_DECO_TYPE, decoType);
+ WRITE_SETTING(OSTC3_AGF_SELECTABLE, aGFSelectable);
+ WRITE_SETTING(OSTC3_AGF_HIGH, aGFHigh);
+ WRITE_SETTING(OSTC3_AGF_LOW, aGFLow);
+ WRITE_SETTING(OSTC3_CALIBRATION_GAS_O2, calibrationGas);
+ WRITE_SETTING(OSTC3_FLIP_SCREEN, flipScreen);
+ WRITE_SETTING(OSTC3_SETPOINT_FALLBACK, setPointFallback);
+
+#undef WRITE_SETTING
+
+ // OSTC3 stores the pressureSensorOffset in two-complement
+ data[0] = (unsigned char) m_deviceDetails->pressureSensorOffset();
+ rc = hw_ostc3_device_config_write(device, OSTC3_PRESSURE_SENSOR_OFFSET, data, sizeof(data));
+ if (rc != DC_STATUS_SUCCESS)
+ return rc;
+
+ //sync date and time
+ if (m_deviceDetails->syncTime()) {
+ QDateTime timeToSet = QDateTime::currentDateTime();
+ dc_datetime_t time;
+ time.year = timeToSet.date().year();
+ time.month = timeToSet.date().month();
+ time.day = timeToSet.date().day();
+ time.hour = timeToSet.time().hour();
+ time.minute = timeToSet.time().minute();
+ time.second = timeToSet.time().second();
+ rc = hw_ostc3_device_clock(device, &time);
+ }
+
+ return rc;
+}
+
static dc_status_t read_ostc_settings(dc_device_t *device, DeviceDetails *m_deviceDetails)
{
dc_status_t rc;
@@ -948,168 +1176,14 @@ void WriteSettingsThread::run()
emit error(tr("Failed!"));
}
break;
-#if DC_VERSION_CHECK(0, 5, 0)
- case DC_FAMILY_HW_OSTC3: {
+#if DC_VERSION_CHECK(0,5,0)
+ case DC_FAMILY_HW_OSTC3:
supported = true;
- //write gas values
- unsigned char gas1Data[4] = { m_deviceDetails->gas1().oxygen,
- m_deviceDetails->gas1().helium,
- m_deviceDetails->gas1().type,
- m_deviceDetails->gas1().depth };
-
- unsigned char gas2Data[4] = { m_deviceDetails->gas2().oxygen,
- m_deviceDetails->gas2().helium,
- m_deviceDetails->gas2().type,
- m_deviceDetails->gas2().depth };
-
- unsigned char gas3Data[4] = { m_deviceDetails->gas3().oxygen,
- m_deviceDetails->gas3().helium,
- m_deviceDetails->gas3().type,
- m_deviceDetails->gas3().depth };
-
- unsigned char gas4Data[4] = { m_deviceDetails->gas4().oxygen,
- m_deviceDetails->gas4().helium,
- m_deviceDetails->gas4().type,
- m_deviceDetails->gas4().depth };
-
- unsigned char gas5Data[4] = { m_deviceDetails->gas5().oxygen,
- m_deviceDetails->gas5().helium,
- m_deviceDetails->gas5().type,
- m_deviceDetails->gas5().depth };
- //gas 1
- hw_ostc3_device_config_write(m_data->device, OSTC3_GAS1, gas1Data, sizeof(gas1Data));
- //gas 2
- hw_ostc3_device_config_write(m_data->device, OSTC3_GAS2, gas2Data, sizeof(gas2Data));
- //gas 3
- hw_ostc3_device_config_write(m_data->device, OSTC3_GAS3, gas3Data, sizeof(gas3Data));
- //gas 4
- hw_ostc3_device_config_write(m_data->device, OSTC3_GAS4, gas4Data, sizeof(gas4Data));
- //gas 5
- hw_ostc3_device_config_write(m_data->device, OSTC3_GAS5, gas5Data, sizeof(gas5Data));
-
- //write set point values
- unsigned char sp1Data[2] = { m_deviceDetails->sp1().sp,
- m_deviceDetails->sp1().depth };
-
- unsigned char sp2Data[2] = { m_deviceDetails->sp2().sp,
- m_deviceDetails->sp2().depth };
-
- unsigned char sp3Data[2] = { m_deviceDetails->sp3().sp,
- m_deviceDetails->sp3().depth };
-
- unsigned char sp4Data[2] = { m_deviceDetails->sp4().sp,
- m_deviceDetails->sp4().depth };
-
- unsigned char sp5Data[2] = { m_deviceDetails->sp5().sp,
- m_deviceDetails->sp5().depth };
-
- //sp 1
- hw_ostc3_device_config_write(m_data->device, OSTC3_SP1, sp1Data, sizeof(sp1Data));
- //sp 2
- hw_ostc3_device_config_write(m_data->device, OSTC3_SP2, sp2Data, sizeof(sp2Data));
- //sp 3
- hw_ostc3_device_config_write(m_data->device, OSTC3_SP3, sp3Data, sizeof(sp3Data));
- //sp 4
- hw_ostc3_device_config_write(m_data->device, OSTC3_SP4, sp4Data, sizeof(sp4Data));
- //sp 5
- hw_ostc3_device_config_write(m_data->device, OSTC3_SP5, sp5Data, sizeof(sp5Data));
-
- //write dil values
- unsigned char dil1Data[4] = { m_deviceDetails->dil1().oxygen,
- m_deviceDetails->dil1().helium,
- m_deviceDetails->dil1().type,
- m_deviceDetails->dil1().depth };
-
- unsigned char dil2Data[4] = { m_deviceDetails->dil2().oxygen,
- m_deviceDetails->dil2().helium,
- m_deviceDetails->dil2().type,
- m_deviceDetails->dil2().depth };
-
- unsigned char dil3Data[4] = { m_deviceDetails->dil3().oxygen,
- m_deviceDetails->dil3().helium,
- m_deviceDetails->dil3().type,
- m_deviceDetails->dil3().depth };
-
- unsigned char dil4Data[4] = { m_deviceDetails->dil4().oxygen,
- m_deviceDetails->dil4().helium,
- m_deviceDetails->dil4().type,
- m_deviceDetails->dil4().depth };
-
- unsigned char dil5Data[4] = { m_deviceDetails->dil5().oxygen,
- m_deviceDetails->dil5().helium,
- m_deviceDetails->dil5().type,
- m_deviceDetails->dil5().depth };
- //dil 1
- hw_ostc3_device_config_write(m_data->device, OSTC3_DIL1, dil1Data, sizeof(gas1Data));
- //dil 2
- hw_ostc3_device_config_write(m_data->device, OSTC3_DIL2, dil2Data, sizeof(dil2Data));
- //dil 3
- hw_ostc3_device_config_write(m_data->device, OSTC3_DIL3, dil3Data, sizeof(dil3Data));
- //dil 4
- hw_ostc3_device_config_write(m_data->device, OSTC3_DIL4, dil4Data, sizeof(dil4Data));
- //dil 5
- hw_ostc3_device_config_write(m_data->device, OSTC3_DIL5, dil5Data, sizeof(dil5Data));
-
-
- //write general settings
- //custom text
- hw_ostc3_device_customtext(m_data->device, m_deviceDetails->customText().toUtf8().data());
-
- unsigned char data[1] = { 0 };
-#define WRITE_SETTING(_OSTC3_SETTING, _DEVICE_DETAIL) \
- do { \
- data[0] = m_deviceDetails->_DEVICE_DETAIL(); \
- hw_ostc3_device_config_write(m_data->device, _OSTC3_SETTING, data, sizeof(data)); \
- } while (0)
-
- WRITE_SETTING(OSTC3_DIVE_MODE, diveMode);
- WRITE_SETTING(OSTC3_SATURATION, saturation);
- WRITE_SETTING(OSTC3_DESATURATION, desaturation);
- WRITE_SETTING(OSTC3_LAST_DECO, lastDeco);
- WRITE_SETTING(OSTC3_BRIGHTNESS, brightness);
- WRITE_SETTING(OSTC3_UNITS, units);
- WRITE_SETTING(OSTC3_SAMPLING_RATE, samplingRate);
- WRITE_SETTING(OSTC3_SALINITY, salinity);
- WRITE_SETTING(OSTC3_DIVEMODE_COLOR, diveModeColor);
- WRITE_SETTING(OSTC3_LANGUAGE, language);
- WRITE_SETTING(OSTC3_DATE_FORMAT, dateFormat);
- WRITE_SETTING(OSTC3_COMPASS_GAIN, compassGain);
- WRITE_SETTING(OSTC3_SAFETY_STOP, safetyStop);
- WRITE_SETTING(OSTC3_GF_HIGH, gfHigh);
- WRITE_SETTING(OSTC3_GF_LOW, gfLow);
- WRITE_SETTING(OSTC3_PPO2_MIN, ppO2Min);
- WRITE_SETTING(OSTC3_PPO2_MAX, ppO2Max);
- WRITE_SETTING(OSTC3_FUTURE_TTS, futureTTS);
- WRITE_SETTING(OSTC3_CCR_MODE, ccrMode);
- WRITE_SETTING(OSTC3_DECO_TYPE, decoType);
- WRITE_SETTING(OSTC3_AGF_SELECTABLE, aGFSelectable);
- WRITE_SETTING(OSTC3_AGF_HIGH, aGFHigh);
- WRITE_SETTING(OSTC3_AGF_LOW, aGFLow);
- WRITE_SETTING(OSTC3_CALIBRATION_GAS_O2, calibrationGas);
- WRITE_SETTING(OSTC3_FLIP_SCREEN, flipScreen);
- WRITE_SETTING(OSTC3_SETPOINT_FALLBACK, setPointFallback);
-
-#undef WRITE_SETTING
-
- // OSTC3 stores the pressureSensorOffset in two-complement
- data[0] = (unsigned char)m_deviceDetails->pressureSensorOffset();
- hw_ostc3_device_config_write(m_data->device, OSTC3_PRESSURE_SENSOR_OFFSET, data, sizeof(data));
-
- //sync date and time
- if (m_deviceDetails->syncTime()) {
- QDateTime timeToSet = QDateTime::currentDateTime();
- dc_datetime_t time;
- time.year = timeToSet.date().year();
- time.month = timeToSet.date().month();
- time.day = timeToSet.date().day();
- time.hour = timeToSet.time().hour();
- time.minute = timeToSet.time().minute();
- time.second = timeToSet.time().second();
- hw_ostc3_device_clock(m_data->device, &time);
- }
+ rc = write_ostc3_settings(m_data->device, m_deviceDetails);
+ if (rc != DC_STATUS_SUCCESS)
+ emit error(tr("Failed!"));
break;
- }
-#endif // divecomputer 0.5.0
+#endif // divecomputer 0.5.0
#ifdef DEBUG_OSTC
case DC_FAMILY_NULL:
#endif