diff options
author | Anton Lundin <glance@acc.umu.se> | 2014-12-29 08:52:11 +0100 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2014-12-28 23:58:29 -0800 |
commit | 79327d7181a57216cb78c752ac863a6d555b0085 (patch) | |
tree | 28138b52b2c593d4973514d6647d89bc0e58c33b /configuredivecomputerthreads.cpp | |
parent | 89e197a16be08be9002eb9cdeb7b63adb8ecf04f (diff) | |
download | subsurface-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.cpp | 394 |
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 |