mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	Lift code out to write_ostc_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>
This commit is contained in:
		
							parent
							
								
									79327d7181
								
							
						
					
					
						commit
						8e33c0ce38
					
				
					 1 changed files with 306 additions and 301 deletions
				
			
		|  | @ -1083,6 +1083,308 @@ static dc_status_t read_ostc_settings(dc_device_t *device, DeviceDetails *m_devi | |||
| 	return rc; | ||||
| } | ||||
| 
 | ||||
| static dc_status_t write_ostc_settings(dc_device_t *device, DeviceDetails *m_deviceDetails) | ||||
| { | ||||
| 	dc_status_t rc; | ||||
| 	unsigned char data[256] = {}; | ||||
| 	unsigned char max_CF = 0; | ||||
| 
 | ||||
| 	// Because we write whole memory blocks, we read all the current
 | ||||
| 	// values out and then change then ones we should change.
 | ||||
| 	rc = hw_ostc_device_eeprom_read(device, 0, data, sizeof(data)); | ||||
| 	if (rc != DC_STATUS_SUCCESS) | ||||
| 		return rc; | ||||
| 	//Byte5-6:
 | ||||
| 	//Gas 1 default (%O2=21, %He=0)
 | ||||
| 	gas gas1 = m_deviceDetails->gas1(); | ||||
| 	data[6] = gas1.oxygen; | ||||
| 	data[7] = gas1.helium; | ||||
| 	//Byte9-10:
 | ||||
| 	//Gas 2 default (%O2=21, %He=0)
 | ||||
| 	gas gas2 = m_deviceDetails->gas2(); | ||||
| 	data[10] = gas2.oxygen; | ||||
| 	data[11] = gas2.helium; | ||||
| 	//Byte13-14:
 | ||||
| 	//Gas 3 default (%O2=21, %He=0)
 | ||||
| 	gas gas3 = m_deviceDetails->gas3(); | ||||
| 	data[14] = gas3.oxygen; | ||||
| 	data[15] = gas3.helium; | ||||
| 	//Byte17-18:
 | ||||
| 	//Gas 4 default (%O2=21, %He=0)
 | ||||
| 	gas gas4 = m_deviceDetails->gas4(); | ||||
| 	data[18] = gas4.oxygen; | ||||
| 	data[19] = gas4.helium; | ||||
| 	//Byte21-22:
 | ||||
| 	//Gas 5 default (%O2=21, %He=0)
 | ||||
| 	gas gas5 = m_deviceDetails->gas5(); | ||||
| 	data[22] = gas5.oxygen; | ||||
| 	data[23] = gas5.helium; | ||||
| 	//Byte25-26:
 | ||||
| 	//Gas 6 current (%O2, %He)
 | ||||
| 	data[26] = m_deviceDetails->salinity(); | ||||
| 	// Gas types, 0=Disabled, 1=Active, 2=Fist
 | ||||
| 	// Active Gas Flag Register
 | ||||
| 	data[27] = 0; | ||||
| 	if (gas1.type) | ||||
| 		data[27] ^= 0x01; | ||||
| 	if (gas2.type) | ||||
| 		data[27] ^= 0x02; | ||||
| 	if (gas3.type) | ||||
| 		data[27] ^= 0x04; | ||||
| 	if (gas4.type) | ||||
| 		data[27] ^= 0x08; | ||||
| 	if (gas5.type) | ||||
| 		data[27] ^= 0x10; | ||||
| 
 | ||||
| 	// Gas switch depths
 | ||||
| 	data[28] = gas1.depth; | ||||
| 	data[29] = gas2.depth; | ||||
| 	data[30] = gas3.depth; | ||||
| 	data[31] = gas4.depth; | ||||
| 	data[32] = gas5.depth; | ||||
| 	// 33 which gas is Fist gas
 | ||||
| 	if (gas1.type == 2) | ||||
| 		data[33] = 1; | ||||
| 	else if (gas2.type == 2) | ||||
| 		data[33] = 2; | ||||
| 	else if (gas3.type == 2) | ||||
| 		data[33] = 3; | ||||
| 	else if (gas4.type == 2) | ||||
| 		data[33] = 4; | ||||
| 	else if (gas5.type == 2) | ||||
| 		data[33] = 5; | ||||
| 	else | ||||
| 		// FIXME: No gas was First?
 | ||||
| 		// Set gas 1 to first
 | ||||
| 		data[33] = 1; | ||||
| 
 | ||||
| 	data[34] = m_deviceDetails->decoType(); | ||||
| 	//Byte36:
 | ||||
| 	//Use O2 Sensor Module in CC Modes (0= OFF, 1= ON) (Only available in old OSTC1 - unused for OSTC Mk.2/2N)
 | ||||
| 	//m_deviceDetails->setCcrMode(data[35]);
 | ||||
| 	data[36] = m_deviceDetails->sp1().sp; | ||||
| 	data[37] = m_deviceDetails->sp2().sp; | ||||
| 	data[38] = m_deviceDetails->sp3().sp; | ||||
| 	// Byte41-42:
 | ||||
| 	// Lowest Battery voltage seen (in mV)
 | ||||
| 	// Byte43:
 | ||||
| 	// Lowest Battery voltage seen at (Month)
 | ||||
| 	// Byte44:
 | ||||
| 	// Lowest Battery voltage seen at (Day)
 | ||||
| 	// Byte45:
 | ||||
| 	// Lowest Battery voltage seen at (Year)
 | ||||
| 	// Byte46-47:
 | ||||
| 	// Lowest Battery voltage seen at (Temperature in 0.1 °C)
 | ||||
| 	// Byte48:
 | ||||
| 	// Last complete charge at (Month)
 | ||||
| 	// Byte49:
 | ||||
| 	// Last complete charge at (Day)
 | ||||
| 	// Byte50:
 | ||||
| 	// Last complete charge at (Year)
 | ||||
| 	// Byte51-52:
 | ||||
| 	// Total charge cycles
 | ||||
| 	// Byte53-54:
 | ||||
| 	// Total complete charge cycles
 | ||||
| 	// Byte55-56:
 | ||||
| 	// Temperature Extrema minimum (Temperature in 0.1 °C)
 | ||||
| 	// Byte57:
 | ||||
| 	// Temperature Extrema minimum at (Month)
 | ||||
| 	// Byte58:
 | ||||
| 	// Temperature Extrema minimum at (Day)
 | ||||
| 	// Byte59:
 | ||||
| 	// Temperature Extrema minimum at (Year)
 | ||||
| 	// Byte60-61:
 | ||||
| 	// Temperature Extrema maximum (Temperature in 0.1 °C)
 | ||||
| 	// Byte62:
 | ||||
| 	// Temperature Extrema maximum at (Month)
 | ||||
| 	// Byte63:
 | ||||
| 	// Temperature Extrema maximum at (Day)
 | ||||
| 	// Byte64:
 | ||||
| 	// Temperature Extrema maximum at (Year)
 | ||||
| 	// Byte65:
 | ||||
| 	// Custom Text active (=1), Custom Text Disabled (<>1)
 | ||||
| 	// Byte66-90:
 | ||||
| 	// (25Bytes): Custom Text for Surfacemode (Real text must end with "}")
 | ||||
| 	// Example: "OSTC Dive Computer}" (19 Characters incl. "}") Bytes 85-90 will be ignored.
 | ||||
| 	if (m_deviceDetails->customText() == "") { | ||||
| 		data[64] = 0; | ||||
| 	} else { | ||||
| 		data[64] = 1; | ||||
| 		// Copy the string to the right place in the memory, padded with 0x20 (" ")
 | ||||
| 		strncpy((char *)data + 65, QString("%1").arg(m_deviceDetails->customText(), -23, QChar(' ')).toUtf8().data(), 23); | ||||
| 		// And terminate the string.
 | ||||
| 		if (m_deviceDetails->customText().length() <= 23) | ||||
| 			data[65 + m_deviceDetails->customText().length()] = '}'; | ||||
| 		else | ||||
| 			data[90] = '}'; | ||||
| 	} | ||||
| 	// Byte91:
 | ||||
| 	// Dim OLED in Divemode (>0), Normal mode (=0)
 | ||||
| 	// Byte92:
 | ||||
| 	// Date format for all outputs:
 | ||||
| 	// =0: MM/DD/YY
 | ||||
| 	// =1: DD/MM/YY
 | ||||
| 	// =2: YY/MM/DD
 | ||||
| 	data[91] = m_deviceDetails->dateFormat(); | ||||
| 	// Byte93:
 | ||||
| 	// Total number of CF used in installed firmware
 | ||||
| 	max_CF = data[92]; | ||||
| 	// Byte94:
 | ||||
| 	// Last selected view for customview area in surface mode
 | ||||
| 	// Byte95:
 | ||||
| 	// Last selected view for customview area in dive mode
 | ||||
| 	// Byte96-97:
 | ||||
| 	// Diluent 1 Default (%O2,%He)
 | ||||
| 	// Byte98-99:
 | ||||
| 	// Diluent 1 Current (%O2,%He)
 | ||||
| 	gas dil1 = m_deviceDetails->dil1(); | ||||
| 	data[97] = dil1.oxygen; | ||||
| 	data[98] = dil1.helium; | ||||
| 	// Byte100-101:
 | ||||
| 	// Gasuent 2 Default (%O2,%He)
 | ||||
| 	// Byte102-103:
 | ||||
| 	// Gasuent 2 Current (%O2,%He)
 | ||||
| 	gas dil2 = m_deviceDetails->dil2(); | ||||
| 	data[101] = dil2.oxygen; | ||||
| 	data[102] = dil2.helium; | ||||
| 	// Byte104-105:
 | ||||
| 	// Gasuent 3 Default (%O2,%He)
 | ||||
| 	// Byte106-107:
 | ||||
| 	// Gasuent 3 Current (%O2,%He)
 | ||||
| 	gas dil3 = m_deviceDetails->dil3(); | ||||
| 	data[105] = dil3.oxygen; | ||||
| 	data[106] = dil3.helium; | ||||
| 	// Byte108-109:
 | ||||
| 	// Gasuent 4 Default (%O2,%He)
 | ||||
| 	// Byte110-111:
 | ||||
| 	// Gasuent 4 Current (%O2,%He)
 | ||||
| 	gas dil4 = m_deviceDetails->dil4(); | ||||
| 	data[109] = dil4.oxygen; | ||||
| 	data[110] = dil4.helium; | ||||
| 	// Byte112-113:
 | ||||
| 	// Gasuent 5 Default (%O2,%He)
 | ||||
| 	// Byte114-115:
 | ||||
| 	// Gasuent 5 Current (%O2,%He)
 | ||||
| 	gas dil5 = m_deviceDetails->dil5(); | ||||
| 	data[113] = dil5.oxygen; | ||||
| 	data[114] = dil5.helium; | ||||
| 	// Byte116:
 | ||||
| 	// First Diluent (1-5)
 | ||||
| 	if (dil1.type == 2) | ||||
| 		data[115] = 1; | ||||
| 	else if (dil2.type == 2) | ||||
| 		data[115] = 2; | ||||
| 	else if (dil3.type == 2) | ||||
| 		data[115] = 3; | ||||
| 	else if (dil4.type == 2) | ||||
| 		data[115] = 4; | ||||
| 	else if (dil5.type == 2) | ||||
| 		data[115] = 5; | ||||
| 	else | ||||
| 		// FIXME: No first diluent?
 | ||||
| 		// Set gas 1 to fist
 | ||||
| 		data[115] = 1; | ||||
| 
 | ||||
| 	// Byte117-128:
 | ||||
| 	// not used/reserved
 | ||||
| 	// Byte129-256:
 | ||||
| 	// 32 custom Functions (CF0-CF31)
 | ||||
| 
 | ||||
| 	// Write the relevant ones
 | ||||
| 	// CF11: Factor for saturation processes
 | ||||
| 	write_ostc_cf(data, 11, max_CF, m_deviceDetails->saturation()); | ||||
| 	// CF12: Factor for desaturation processes
 | ||||
| 	write_ostc_cf(data, 12, max_CF, m_deviceDetails->desaturation()); | ||||
| 	// CF17: Lower threshold for ppO2 warning
 | ||||
| 	write_ostc_cf(data, 17, max_CF, m_deviceDetails->ppO2Min()); | ||||
| 	// CF18: Upper threshold for ppO2 warning
 | ||||
| 	write_ostc_cf(data, 18, max_CF, m_deviceDetails->ppO2Max()); | ||||
| 	// CF20: Depth sampling rate for Profile storage
 | ||||
| 	write_ostc_cf(data, 20, max_CF, m_deviceDetails->samplingRate()); | ||||
| 	// CF29: Depth of last decompression stop
 | ||||
| 	write_ostc_cf(data, 29, max_CF, m_deviceDetails->lastDeco()); | ||||
| 
 | ||||
| #ifdef DEBUG_OSTC_CF | ||||
| 	for (int cf = 0; cf <= 31 && cf <= max_CF; cf++) | ||||
| 		printf("CF %d: %d\n", cf, read_ostc_cf(data, cf)); | ||||
| #endif | ||||
| 	rc = hw_ostc_device_eeprom_write(device, 0, data, sizeof(data)); | ||||
| 	if (rc != DC_STATUS_SUCCESS) | ||||
| 		return rc; | ||||
| 
 | ||||
| 	rc = hw_ostc_device_eeprom_read(device, 1, data, sizeof(data)); | ||||
| 	if (rc != DC_STATUS_SUCCESS) | ||||
| 		return rc; | ||||
| 	// Byte1:
 | ||||
| 	// Logbook version indicator (Not writable!)
 | ||||
| 	// Byte2-3:
 | ||||
| 	// Last Firmware installed, 1st Byte.2nd Byte (e.g. „1.90“) (Not writable!)
 | ||||
| 	// Byte4:
 | ||||
| 	// OLED brightness (=0: Eco, =1 High) (Not writable!)
 | ||||
| 	// Byte5-11:
 | ||||
| 	// Time/Date vault during firmware updates
 | ||||
| 	// Byte12-128
 | ||||
| 	// not used/reserved
 | ||||
| 	// Byte129-256:
 | ||||
| 	// 32 custom Functions (CF 32-63)
 | ||||
| 
 | ||||
| 	// Decode the relevant ones
 | ||||
| 	// CF32: Gradient Factor low
 | ||||
| 	write_ostc_cf(data, 32, max_CF, m_deviceDetails->gfLow()); | ||||
| 	// CF33: Gradient Factor high
 | ||||
| 	write_ostc_cf(data, 33, max_CF, m_deviceDetails->gfHigh()); | ||||
| 	// CF58: Future time to surface setFutureTTS
 | ||||
| 	write_ostc_cf(data, 58, max_CF, m_deviceDetails->futureTTS()); | ||||
| #ifdef DEBUG_OSTC_CF | ||||
| 	for (int cf = 32; cf <= 63 && cf <= max_CF; cf++) | ||||
| 		printf("CF %d: %d\n", cf, read_ostc_cf(data, cf)); | ||||
| #endif | ||||
| 	rc = hw_ostc_device_eeprom_write(device, 1, data, sizeof(data)); | ||||
| 	if (rc != DC_STATUS_SUCCESS) | ||||
| 		return rc; | ||||
| 
 | ||||
| 	rc = hw_ostc_device_eeprom_read(device, 2, data, sizeof(data)); | ||||
| 	if (rc != DC_STATUS_SUCCESS) | ||||
| 		return rc; | ||||
| 	// Byte1-4:
 | ||||
| 	// not used/reserved (Not writable!)
 | ||||
| 	// Byte5-128:
 | ||||
| 	// not used/reserved
 | ||||
| 	// Byte129-256:
 | ||||
| 	// 32 custom Functions (CF 64-95)
 | ||||
| 
 | ||||
| 	// Decode the relevant ones
 | ||||
| 	// CF65: Show safety stop
 | ||||
| 	write_ostc_cf(data, 65, max_CF, m_deviceDetails->safetyStop()); | ||||
| 	// CF67: Alternaitve Gradient Factor low
 | ||||
| 	write_ostc_cf(data, 67, max_CF, m_deviceDetails->aGFLow()); | ||||
| 	// CF68: Alternative Gradient Factor high
 | ||||
| 	write_ostc_cf(data, 68, max_CF, m_deviceDetails->aGFHigh()); | ||||
| 	// CF69: Allow Gradient Factor change
 | ||||
| 	write_ostc_cf(data, 69, max_CF, m_deviceDetails->aGFSelectable()); | ||||
| #ifdef DEBUG_OSTC_CF | ||||
| 	for (int cf = 64; cf <= 95 && cf <= max_CF; cf++) | ||||
| 		printf("CF %d: %d\n", cf, read_ostc_cf(data, cf)); | ||||
| #endif | ||||
| 	rc = hw_ostc_device_eeprom_write(device, 2, 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_ostc_device_clock(device, &time); | ||||
| 	} | ||||
| 	return rc; | ||||
| } | ||||
| 
 | ||||
| void ReadSettingsThread::run() | ||||
| { | ||||
| 	bool supported = false; | ||||
|  | @ -1187,309 +1489,12 @@ void WriteSettingsThread::run() | |||
| #ifdef DEBUG_OSTC | ||||
| 		case DC_FAMILY_NULL: | ||||
| #endif | ||||
| 		case DC_FAMILY_HW_OSTC: { | ||||
| 		case DC_FAMILY_HW_OSTC: | ||||
| 			supported = true; | ||||
| 			unsigned char data[256] = {}; | ||||
| 			unsigned char max_CF = 0; | ||||
| 
 | ||||
| 			// Because we write whole memory blocks, we read all the current
 | ||||
| 			// values out and then change then ones we should change.
 | ||||
| 			rc = hw_ostc_device_eeprom_read(m_data->device, 0, data, sizeof(data)); | ||||
| 			if (rc == DC_STATUS_SUCCESS) { | ||||
| 				//Byte5-6:
 | ||||
| 				//Gas 1 default (%O2=21, %He=0)
 | ||||
| 				gas gas1 = m_deviceDetails->gas1(); | ||||
| 				data[6] = gas1.oxygen; | ||||
| 				data[7] = gas1.helium; | ||||
| 				//Byte9-10:
 | ||||
| 				//Gas 2 default (%O2=21, %He=0)
 | ||||
| 				gas gas2 = m_deviceDetails->gas2(); | ||||
| 				data[10] = gas2.oxygen; | ||||
| 				data[11] = gas2.helium; | ||||
| 				//Byte13-14:
 | ||||
| 				//Gas 3 default (%O2=21, %He=0)
 | ||||
| 				gas gas3 = m_deviceDetails->gas3(); | ||||
| 				data[14] = gas3.oxygen; | ||||
| 				data[15] = gas3.helium; | ||||
| 				//Byte17-18:
 | ||||
| 				//Gas 4 default (%O2=21, %He=0)
 | ||||
| 				gas gas4 = m_deviceDetails->gas4(); | ||||
| 				data[18] = gas4.oxygen; | ||||
| 				data[19] = gas4.helium; | ||||
| 				//Byte21-22:
 | ||||
| 				//Gas 5 default (%O2=21, %He=0)
 | ||||
| 				gas gas5 = m_deviceDetails->gas5(); | ||||
| 				data[22] = gas5.oxygen; | ||||
| 				data[23] = gas5.helium; | ||||
| 				//Byte25-26:
 | ||||
| 				//Gas 6 current (%O2, %He)
 | ||||
| 				data[26] = m_deviceDetails->salinity(); | ||||
| 				// Gas types, 0=Disabled, 1=Active, 2=Fist
 | ||||
| 				// Active Gas Flag Register
 | ||||
| 				data[27] = 0; | ||||
| 				if (gas1.type) | ||||
| 					data[27] ^= 0x01; | ||||
| 				if (gas2.type) | ||||
| 					data[27] ^= 0x02; | ||||
| 				if (gas3.type) | ||||
| 					data[27] ^= 0x04; | ||||
| 				if (gas4.type) | ||||
| 					data[27] ^= 0x08; | ||||
| 				if (gas5.type) | ||||
| 					data[27] ^= 0x10; | ||||
| 
 | ||||
| 				// Gas switch depths
 | ||||
| 				data[28] = gas1.depth; | ||||
| 				data[29] = gas2.depth; | ||||
| 				data[30] = gas3.depth; | ||||
| 				data[31] = gas4.depth; | ||||
| 				data[32] = gas5.depth; | ||||
| 				// 33 which gas is Fist gas
 | ||||
| 				if (gas1.type == 2) | ||||
| 					data[33] = 1; | ||||
| 				else if (gas2.type == 2) | ||||
| 					data[33] = 2; | ||||
| 				else if (gas3.type == 2) | ||||
| 					data[33] = 3; | ||||
| 				else if (gas4.type == 2) | ||||
| 					data[33] = 4; | ||||
| 				else if (gas5.type == 2) | ||||
| 					data[33] = 5; | ||||
| 				else | ||||
| 					// FIXME: No gas was First?
 | ||||
| 					// Set gas 1 to first
 | ||||
| 					data[33] = 1; | ||||
| 
 | ||||
| 				data[34] = m_deviceDetails->decoType(); | ||||
| 				//Byte36:
 | ||||
| 				//Use O2 Sensor Module in CC Modes (0= OFF, 1= ON) (Only available in old OSTC1 - unused for OSTC Mk.2/2N)
 | ||||
| 				//m_deviceDetails->setCcrMode(data[35]);
 | ||||
| 				data[36] = m_deviceDetails->sp1().sp; | ||||
| 				data[37] = m_deviceDetails->sp2().sp; | ||||
| 				data[38] = m_deviceDetails->sp3().sp; | ||||
| 				// Byte41-42:
 | ||||
| 				// Lowest Battery voltage seen (in mV)
 | ||||
| 				// Byte43:
 | ||||
| 				// Lowest Battery voltage seen at (Month)
 | ||||
| 				// Byte44:
 | ||||
| 				// Lowest Battery voltage seen at (Day)
 | ||||
| 				// Byte45:
 | ||||
| 				// Lowest Battery voltage seen at (Year)
 | ||||
| 				// Byte46-47:
 | ||||
| 				// Lowest Battery voltage seen at (Temperature in 0.1 °C)
 | ||||
| 				// Byte48:
 | ||||
| 				// Last complete charge at (Month)
 | ||||
| 				// Byte49:
 | ||||
| 				// Last complete charge at (Day)
 | ||||
| 				// Byte50:
 | ||||
| 				// Last complete charge at (Year)
 | ||||
| 				// Byte51-52:
 | ||||
| 				// Total charge cycles
 | ||||
| 				// Byte53-54:
 | ||||
| 				// Total complete charge cycles
 | ||||
| 				// Byte55-56:
 | ||||
| 				// Temperature Extrema minimum (Temperature in 0.1 °C)
 | ||||
| 				// Byte57:
 | ||||
| 				// Temperature Extrema minimum at (Month)
 | ||||
| 				// Byte58:
 | ||||
| 				// Temperature Extrema minimum at (Day)
 | ||||
| 				// Byte59:
 | ||||
| 				// Temperature Extrema minimum at (Year)
 | ||||
| 				// Byte60-61:
 | ||||
| 				// Temperature Extrema maximum (Temperature in 0.1 °C)
 | ||||
| 				// Byte62:
 | ||||
| 				// Temperature Extrema maximum at (Month)
 | ||||
| 				// Byte63:
 | ||||
| 				// Temperature Extrema maximum at (Day)
 | ||||
| 				// Byte64:
 | ||||
| 				// Temperature Extrema maximum at (Year)
 | ||||
| 				// Byte65:
 | ||||
| 				// Custom Text active (=1), Custom Text Disabled (<>1)
 | ||||
| 				// Byte66-90:
 | ||||
| 				// (25Bytes): Custom Text for Surfacemode (Real text must end with "}")
 | ||||
| 				// Example: OSTC Dive Computer} (19 Characters incl. "}") Bytes 85-90 will be ignored.
 | ||||
| 				if (m_deviceDetails->customText() == "") { | ||||
| 					data[64] = 0; | ||||
| 				} else { | ||||
| 					data[64] = 1; | ||||
| 					// Copy the string to the right place in the memory, padded with 0x20 (" ")
 | ||||
| 					strncpy((char *)data + 65, QString("%1").arg(m_deviceDetails->customText(), -23, QChar(' ')).toUtf8().data(), 23); | ||||
| 					// And terminate the string.
 | ||||
| 					if (m_deviceDetails->customText().length() <= 23) | ||||
| 						data[65 + m_deviceDetails->customText().length()] = '}'; | ||||
| 					else | ||||
| 						data[90] = '}'; | ||||
| 				} | ||||
| 				// Byte91:
 | ||||
| 				// Dim OLED in Divemode (>0), Normal mode (=0)
 | ||||
| 				// Byte92:
 | ||||
| 				// Date format for all outputs:
 | ||||
| 				// =0: MM/DD/YY
 | ||||
| 				// =1: DD/MM/YY
 | ||||
| 				// =2: YY/MM/DD
 | ||||
| 				data[91] = m_deviceDetails->dateFormat(); | ||||
| 				// Byte93:
 | ||||
| 				// Total number of CF used in installed firmware
 | ||||
| 				max_CF = data[92]; | ||||
| 				// Byte94:
 | ||||
| 				// Last selected view for customview area in surface mode
 | ||||
| 				// Byte95:
 | ||||
| 				// Last selected view for customview area in dive mode
 | ||||
| 				// Byte96-97:
 | ||||
| 				// Diluent 1 Default (%O2,%He)
 | ||||
| 				// Byte98-99:
 | ||||
| 				// Diluent 1 Current (%O2,%He)
 | ||||
| 				gas dil1 = m_deviceDetails->dil1(); | ||||
| 				data[97] = dil1.oxygen; | ||||
| 				data[98] = dil1.helium; | ||||
| 				// Byte100-101:
 | ||||
| 				// Gasuent 2 Default (%O2,%He)
 | ||||
| 				// Byte102-103:
 | ||||
| 				// Gasuent 2 Current (%O2,%He)
 | ||||
| 				gas dil2 = m_deviceDetails->dil2(); | ||||
| 				data[101] = dil2.oxygen; | ||||
| 				data[102] = dil2.helium; | ||||
| 				// Byte104-105:
 | ||||
| 				// Gasuent 3 Default (%O2,%He)
 | ||||
| 				// Byte106-107:
 | ||||
| 				// Gasuent 3 Current (%O2,%He)
 | ||||
| 				gas dil3 = m_deviceDetails->dil3(); | ||||
| 				data[105] = dil3.oxygen; | ||||
| 				data[106] = dil3.helium; | ||||
| 				// Byte108-109:
 | ||||
| 				// Gasuent 4 Default (%O2,%He)
 | ||||
| 				// Byte110-111:
 | ||||
| 				// Gasuent 4 Current (%O2,%He)
 | ||||
| 				gas dil4 = m_deviceDetails->dil4(); | ||||
| 				data[109] = dil4.oxygen; | ||||
| 				data[110] = dil4.helium; | ||||
| 				// Byte112-113:
 | ||||
| 				// Gasuent 5 Default (%O2,%He)
 | ||||
| 				// Byte114-115:
 | ||||
| 				// Gasuent 5 Current (%O2,%He)
 | ||||
| 				gas dil5 = m_deviceDetails->dil5(); | ||||
| 				data[113] = dil5.oxygen; | ||||
| 				data[114] = dil5.helium; | ||||
| 				// Byte116:
 | ||||
| 				// First Diluent (1-5)
 | ||||
| 				if (dil1.type == 2) | ||||
| 					data[115] = 1; | ||||
| 				else if (dil2.type == 2) | ||||
| 					data[115] = 2; | ||||
| 				else if (dil3.type == 2) | ||||
| 					data[115] = 3; | ||||
| 				else if (dil4.type == 2) | ||||
| 					data[115] = 4; | ||||
| 				else if (dil5.type == 2) | ||||
| 					data[115] = 5; | ||||
| 				else | ||||
| 					// FIXME: No first diluent?
 | ||||
| 					// Set gas 1 to fist
 | ||||
| 					data[115] = 1; | ||||
| 
 | ||||
| 				// Byte117-128:
 | ||||
| 				// not used/reserved
 | ||||
| 				// Byte129-256:
 | ||||
| 				// 32 custom Functions (CF0-CF31)
 | ||||
| 
 | ||||
| 				// Write the relevant ones
 | ||||
| 				// CF11: Factor for saturation processes
 | ||||
| 				write_ostc_cf(data, 11, max_CF, m_deviceDetails->saturation()); | ||||
| 				// CF12: Factor for desaturation processes
 | ||||
| 				write_ostc_cf(data, 12, max_CF, m_deviceDetails->desaturation()); | ||||
| 				// CF17: Lower threshold for ppO2 warning
 | ||||
| 				write_ostc_cf(data, 17, max_CF, m_deviceDetails->ppO2Min()); | ||||
| 				// CF18: Upper threshold for ppO2 warning
 | ||||
| 				write_ostc_cf(data, 18, max_CF, m_deviceDetails->ppO2Max()); | ||||
| 				// CF20: Depth sampling rate for Profile storage
 | ||||
| 				write_ostc_cf(data, 20, max_CF, m_deviceDetails->samplingRate()); | ||||
| 				// CF29: Depth of last decompression stop
 | ||||
| 				write_ostc_cf(data, 29, max_CF, m_deviceDetails->lastDeco()); | ||||
| 
 | ||||
| #ifdef DEBUG_OSTC_CF | ||||
| 				for (int cf = 0; cf <= 31 && cf <= max_CF; cf++) | ||||
| 					printf("CF %d: %d\n", cf, read_ostc_cf(data, cf)); | ||||
| #endif | ||||
| 				rc = hw_ostc_device_eeprom_write(m_data->device, 0, data, sizeof(data)); | ||||
| 				if (rc != DC_STATUS_SUCCESS) { | ||||
| 					//FIXME: ERROR!
 | ||||
| 				} | ||||
| 			} | ||||
| 			rc = hw_ostc_device_eeprom_read(m_data->device, 1, data, sizeof(data)); | ||||
| 			if (rc == DC_STATUS_SUCCESS) { | ||||
| 				// Byte1:
 | ||||
| 				// Logbook version indicator (Not writable!)
 | ||||
| 				// Byte2-3:
 | ||||
| 				// Last Firmware installed, 1st Byte.2nd Byte (e.g. „1.90“) (Not writable!)
 | ||||
| 				// Byte4:
 | ||||
| 				// OLED brightness (=0: Eco, =1 High) (Not writable!)
 | ||||
| 				// Byte5-11:
 | ||||
| 				// Time/Date vault during firmware updates
 | ||||
| 				// Byte12-128
 | ||||
| 				// not used/reserved
 | ||||
| 				// Byte129-256:
 | ||||
| 				// 32 custom Functions (CF 32-63)
 | ||||
| 
 | ||||
| 				// Decode the relevant ones
 | ||||
| 				// CF32: Gradient Factor low
 | ||||
| 				write_ostc_cf(data, 32, max_CF, m_deviceDetails->gfLow()); | ||||
| 				// CF33: Gradient Factor high
 | ||||
| 				write_ostc_cf(data, 33, max_CF, m_deviceDetails->gfHigh()); | ||||
| 				// CF58: Future time to surface setFutureTTS
 | ||||
| 				write_ostc_cf(data, 58, max_CF, m_deviceDetails->futureTTS()); | ||||
| #ifdef DEBUG_OSTC_CF | ||||
| 				for (int cf = 32; cf <= 63 && cf <= max_CF; cf++) | ||||
| 					printf("CF %d: %d\n", cf, read_ostc_cf(data, cf)); | ||||
| #endif | ||||
| 				rc = hw_ostc_device_eeprom_write(m_data->device, 1, data, sizeof(data)); | ||||
| 				if (rc != DC_STATUS_SUCCESS) { | ||||
| 					//FIXME: ERROR!
 | ||||
| 				} | ||||
| 			} | ||||
| 			rc = hw_ostc_device_eeprom_read(m_data->device, 2, data, sizeof(data)); | ||||
| 			if (rc == DC_STATUS_SUCCESS) { | ||||
| 				// Byte1-4:
 | ||||
| 				// not used/reserved (Not writable!)
 | ||||
| 				// Byte5-128:
 | ||||
| 				// not used/reserved
 | ||||
| 				// Byte129-256:
 | ||||
| 				// 32 custom Functions (CF 64-95)
 | ||||
| 
 | ||||
| 				// Decode the relevant ones
 | ||||
| 				// CF65: Show safety stop
 | ||||
| 				write_ostc_cf(data, 65, max_CF, m_deviceDetails->safetyStop()); | ||||
| 				// CF67: Alternaitve Gradient Factor low
 | ||||
| 				write_ostc_cf(data, 67, max_CF, m_deviceDetails->aGFLow()); | ||||
| 				// CF68: Alternative Gradient Factor high
 | ||||
| 				write_ostc_cf(data, 68, max_CF, m_deviceDetails->aGFHigh()); | ||||
| 				// CF69: Allow Gradient Factor change
 | ||||
| 				write_ostc_cf(data, 69, max_CF, m_deviceDetails->aGFSelectable()); | ||||
| #ifdef DEBUG_OSTC_CF | ||||
| 				for (int cf = 64; cf <= 95 && cf <= max_CF; cf++) | ||||
| 					printf("CF %d: %d\n", cf, read_ostc_cf(data, cf)); | ||||
| #endif | ||||
| 				rc = hw_ostc_device_eeprom_write(m_data->device, 2, data, sizeof(data)); | ||||
| 				if (rc != DC_STATUS_SUCCESS) { | ||||
| 					//FIXME: ERROR!
 | ||||
| 				} | ||||
| 			} | ||||
| 			//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_ostc_device_clock(m_data->device, &time); | ||||
| 				if (rc != DC_STATUS_SUCCESS) { | ||||
| 					//FIXME: ERROR!
 | ||||
| 				} | ||||
| 			} | ||||
| 			rc = write_ostc_settings(m_data->device, m_deviceDetails); | ||||
| 			if (rc != DC_STATUS_SUCCESS) | ||||
| 				emit error(tr("Failed!")); | ||||
| 			break; | ||||
| 		} | ||||
| 		default: | ||||
| 			supported = false; | ||||
| 			break; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue