diff options
author | Anton Lundin <glance@acc.umu.se> | 2014-10-27 21:55:02 +0100 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2014-10-27 14:41:37 -0700 |
commit | e2b579881f8157a186d738889e25a352299a3990 (patch) | |
tree | 6a3fa50f46617be781c7585046ecd80dd999c1eb | |
parent | 84c0ea951a05b0ad65fd663d7a14502b365968d6 (diff) | |
download | subsurface-e2b579881f8157a186d738889e25a352299a3990.tar.gz |
Decode CF configuration data from OSTC
This adds code to decode the custom functions data.
We only decode the relevant CF's. The relevant ones are chosen by which
ones have corresponding settings in the OSTC3.
Signed-off-by: Anton Lundin <glance@acc.umu.se>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r-- | configuredivecomputerthreads.cpp | 57 |
1 files changed, 45 insertions, 12 deletions
diff --git a/configuredivecomputerthreads.cpp b/configuredivecomputerthreads.cpp index 43d0bcbb4..e35585e81 100644 --- a/configuredivecomputerthreads.cpp +++ b/configuredivecomputerthreads.cpp @@ -112,6 +112,19 @@ ReadSettingsThread::ReadSettingsThread(QObject *parent, device_data_t *data) } +static int read_ostc_cf(unsigned char data[], unsigned char cf) { + return data[128 + (cf % 32) * 4 + 3] << 8 ^ data[128 + (cf % 32) * 4 + 2]; +} + +static void write_ostc_cf(unsigned char data[], unsigned char cf, unsigned char max_CF, unsigned int value) { + // Only write settings supported by this firmware. + if (cf > max_CF) + return; + + data[128 + (cf % 32) * 4 + 3] = (value & 0xff00) >> 8; + data[128 + (cf % 32) * 4 + 2] = (value & 0x00ff); +} + void ReadSettingsThread::run() { bool supported = false; @@ -699,10 +712,20 @@ void ReadSettingsThread::run() // not used/reserved // Byte129-256: // 32 custom Functions (CF0-CF31) - // The custom functions are stored in the internal EEPROM after 0x080 - // Any custom function occupies 4 byte: - // 2 byte (low:high) store the default value, reset from menu "reset" (Will be overwritten by hard-coded defaults if reset in the unit!) - // 2 byte (low:high) store the actual value + + // Decode the relevant ones + // CF11: Factor for saturation processes + m_deviceDetails->setSaturation(read_ostc_cf(data, 11)); + // CF12: Factor for desaturation processes + m_deviceDetails->setDesaturation(read_ostc_cf(data, 12)); + // CF17: Lower threshold for ppO2 warning + m_deviceDetails->setPpO2Min(read_ostc_cf(data, 17)); + // CF18: Upper threshold for ppO2 warning + m_deviceDetails->setPpO2Max(read_ostc_cf(data, 18)); + // CF20: Depth sampling rate for Profile storage + m_deviceDetails->setSamplingRate(read_ostc_cf(data, 20)); + // CF29: Depth of last decompression stop + m_deviceDetails->setLastDeco(read_ostc_cf(data, 29)); #ifdef DEBUG_OSTC local_hw_ostc_device_eeprom_write(m_data->device, 0, data, sizeof(data)); #endif @@ -722,10 +745,14 @@ void ReadSettingsThread::run() // not used/reserved // Byte129-256: // 32 custom Functions (CF 32-63) - // The custom functions are stored in the internal EEPROM after 0x180 - // Any custom function occupies 4 byte: - // 2 byte (low:high) store the default value, reset from menu "reset" (Will be overwritten by hard-coded defaults if reset in the unit!) - // 2 byte (low:high) store the actual value + + // Decode the relevant ones + // CF32: Gradient Factor low + m_deviceDetails->setGfLow(read_ostc_cf(data, 32)); + // CF33: Gradient Factor high + m_deviceDetails->setGfHigh(read_ostc_cf(data, 33)); + // CF58: Future time to surface setFutureTTS + m_deviceDetails->setFutureTTS(read_ostc_cf(data, 58)); #ifdef DEBUG_OSTC local_hw_ostc_device_eeprom_write(m_data->device, 1, data, sizeof(data)); #endif @@ -738,10 +765,16 @@ void ReadSettingsThread::run() // not used/reserved // Byte129-256: // 32 custom Functions (CF 64-95) - // The custom functions are stored in the internal EEPROM after 0x280 - // Any custom function occupies 4 byte: - // 2 byte (low:high) store the default value, reset from menu "reset" (Will be overwritten by hard-coded defaults if reset in the unit!) - // 2 byte (low:high) store the actual value + + // Decode the relevant ones + // CF65: Show safety stop + m_deviceDetails->setSafetyStop(read_ostc_cf(data, 65)); + // CF67: Alternaitve Gradient Factor low + m_deviceDetails->setAGFLow(read_ostc_cf(data, 67)); + // CF68: Alternative Gradient Factor high + m_deviceDetails->setAGFHigh(read_ostc_cf(data, 68)); + // CF69: Allow Gradient Factor change + m_deviceDetails->setAGFSelectable(read_ostc_cf(data, 69)); #ifdef DEBUG_OSTC local_hw_ostc_device_eeprom_write(m_data->device, 2, data, sizeof(data)); #endif |