summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Anton Lundin <glance@acc.umu.se>2014-10-27 21:55:02 +0100
committerGravatar Dirk Hohndel <dirk@hohndel.org>2014-10-27 14:41:37 -0700
commite2b579881f8157a186d738889e25a352299a3990 (patch)
tree6a3fa50f46617be781c7585046ecd80dd999c1eb
parent84c0ea951a05b0ad65fd663d7a14502b365968d6 (diff)
downloadsubsurface-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.cpp57
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