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,119 +1083,17 @@ static dc_status_t read_ostc_settings(dc_device_t *device, DeviceDetails *m_devi | ||||||
| 	return rc; | 	return rc; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ReadSettingsThread::run() | static dc_status_t write_ostc_settings(dc_device_t *device, DeviceDetails *m_deviceDetails) | ||||||
| { | { | ||||||
| 	bool supported = false; |  | ||||||
| 	dc_status_t rc; | 	dc_status_t rc; | ||||||
| #ifdef DEBUG_OSTC |  | ||||||
| 	if (strcmp(m_data->vendor, "Heinrichs Weikamp") == 0 && strcmp(m_data->product, "OSTC 2N") == 0) |  | ||||||
| 		rc = DC_STATUS_SUCCESS; |  | ||||||
| 	else |  | ||||||
| #endif |  | ||||||
| 		rc = dc_device_open(&m_data->device, m_data->context, m_data->descriptor, m_data->devname); |  | ||||||
| 	if (rc == DC_STATUS_SUCCESS) { |  | ||||||
| 		DeviceDetails *m_deviceDetails = new DeviceDetails(0); |  | ||||||
| 		switch (dc_device_get_type(m_data->device)) { |  | ||||||
| 		case DC_FAMILY_SUUNTO_VYPER: |  | ||||||
| 			rc = read_suunto_vyper_settings(m_data->device, m_deviceDetails); |  | ||||||
| 			if (rc == DC_STATUS_SUCCESS) { |  | ||||||
| 				supported = true; |  | ||||||
| 				emit devicedetails(m_deviceDetails); |  | ||||||
| 			} else if (rc == DC_STATUS_UNSUPPORTED) { |  | ||||||
| 				supported = false; |  | ||||||
| 			} else { |  | ||||||
| 				emit error("Failed!"); |  | ||||||
| 			} |  | ||||||
| 			break; |  | ||||||
| #if DC_VERSION_CHECK(0, 5, 0) |  | ||||||
| 		case DC_FAMILY_HW_OSTC3: |  | ||||||
| 			supported = true; |  | ||||||
| 			rc = read_ostc3_settings(m_data->device, m_deviceDetails); |  | ||||||
| 			if (rc == DC_STATUS_SUCCESS) |  | ||||||
| 				emit devicedetails(m_deviceDetails); |  | ||||||
| 			else |  | ||||||
| 				emit error("Failed!"); |  | ||||||
| 			break; |  | ||||||
| #endif	// divecomputer 0.5.0
 |  | ||||||
| #ifdef DEBUG_OSTC |  | ||||||
| 		case DC_FAMILY_NULL: |  | ||||||
| #endif |  | ||||||
| 		case DC_FAMILY_HW_OSTC: |  | ||||||
| 			supported = true; |  | ||||||
| 			rc = read_ostc_settings(m_data->device, m_deviceDetails); |  | ||||||
| 			if (rc == DC_STATUS_SUCCESS) |  | ||||||
| 				emit devicedetails(m_deviceDetails); |  | ||||||
| 			else |  | ||||||
| 				emit error("Failed!"); |  | ||||||
| 			break; |  | ||||||
| 		default: |  | ||||||
| 			supported = false; |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 	} else { |  | ||||||
| 		lastError = tr("Could not a establish connection to the dive computer."); |  | ||||||
| 		emit error(lastError); |  | ||||||
| 		// So we don't trigger the "unsupported" clause later..
 |  | ||||||
| 		supported = true; |  | ||||||
| 	} |  | ||||||
| 	dc_device_close(m_data->device); |  | ||||||
| 
 |  | ||||||
| 	if (!supported) { |  | ||||||
| 		lastError = tr("This feature is not yet available for the selected dive computer."); |  | ||||||
| 		emit error(lastError); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| WriteSettingsThread::WriteSettingsThread(QObject *parent, device_data_t *data) : QThread(parent), m_data(data) |  | ||||||
| { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void WriteSettingsThread::setDeviceDetails(DeviceDetails *details) |  | ||||||
| { |  | ||||||
| 	m_deviceDetails = details; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void WriteSettingsThread::run() |  | ||||||
| { |  | ||||||
| 	bool supported = false; |  | ||||||
| 	dc_status_t rc; |  | ||||||
| #ifdef DEBUG_OSTC |  | ||||||
| 	rc = DC_STATUS_SUCCESS; |  | ||||||
| #else |  | ||||||
| 	rc = dc_device_open(&m_data->device, m_data->context, m_data->descriptor, m_data->devname); |  | ||||||
| #endif |  | ||||||
| 	if (rc == DC_STATUS_SUCCESS) { |  | ||||||
| 		switch (dc_device_get_type(m_data->device)) { |  | ||||||
| 		case DC_FAMILY_SUUNTO_VYPER: |  | ||||||
| 			rc = write_suunto_vyper_settings(m_data->device, m_deviceDetails); |  | ||||||
| 			if (rc == DC_STATUS_SUCCESS) { |  | ||||||
| 				supported = true; |  | ||||||
| 			} else if (rc == DC_STATUS_UNSUPPORTED) { |  | ||||||
| 				supported = false; |  | ||||||
| 			} else { |  | ||||||
| 				emit error(tr("Failed!")); |  | ||||||
| 			} |  | ||||||
| 			break; |  | ||||||
| #if DC_VERSION_CHECK(0,5,0) |  | ||||||
| 		case DC_FAMILY_HW_OSTC3: |  | ||||||
| 			supported = true; |  | ||||||
| 			rc = write_ostc3_settings(m_data->device, m_deviceDetails); |  | ||||||
| 			if (rc != DC_STATUS_SUCCESS) |  | ||||||
| 				emit error(tr("Failed!")); |  | ||||||
| 			break; |  | ||||||
| #endif	// divecomputer 0.5.0
 |  | ||||||
| #ifdef DEBUG_OSTC |  | ||||||
| 		case DC_FAMILY_NULL: |  | ||||||
| #endif |  | ||||||
| 		case DC_FAMILY_HW_OSTC: { |  | ||||||
| 			supported = true; |  | ||||||
| 	unsigned char data[256] = {}; | 	unsigned char data[256] = {}; | ||||||
| 	unsigned char max_CF = 0; | 	unsigned char max_CF = 0; | ||||||
| 
 | 
 | ||||||
| 	// Because we write whole memory blocks, we read all the current
 | 	// Because we write whole memory blocks, we read all the current
 | ||||||
| 	// values out and then change then ones we should change.
 | 	// values out and then change then ones we should change.
 | ||||||
| 			rc = hw_ostc_device_eeprom_read(m_data->device, 0, data, sizeof(data)); | 	rc = hw_ostc_device_eeprom_read(device, 0, data, sizeof(data)); | ||||||
| 			if (rc == DC_STATUS_SUCCESS) { | 	if (rc != DC_STATUS_SUCCESS) | ||||||
|  | 		return rc; | ||||||
| 	//Byte5-6:
 | 	//Byte5-6:
 | ||||||
| 	//Gas 1 default (%O2=21, %He=0)
 | 	//Gas 1 default (%O2=21, %He=0)
 | ||||||
| 	gas gas1 = m_deviceDetails->gas1(); | 	gas gas1 = m_deviceDetails->gas1(); | ||||||
|  | @ -1307,7 +1205,7 @@ void WriteSettingsThread::run() | ||||||
| 	// Custom Text active (=1), Custom Text Disabled (<>1)
 | 	// Custom Text active (=1), Custom Text Disabled (<>1)
 | ||||||
| 	// Byte66-90:
 | 	// Byte66-90:
 | ||||||
| 	// (25Bytes): Custom Text for Surfacemode (Real text must end with "}")
 | 	// (25Bytes): Custom Text for Surfacemode (Real text must end with "}")
 | ||||||
| 				// Example: OSTC Dive Computer} (19 Characters incl. "}") Bytes 85-90 will be ignored.
 | 	// Example: "OSTC Dive Computer}" (19 Characters incl. "}") Bytes 85-90 will be ignored.
 | ||||||
| 	if (m_deviceDetails->customText() == "") { | 	if (m_deviceDetails->customText() == "") { | ||||||
| 		data[64] = 0; | 		data[64] = 0; | ||||||
| 	} else { | 	} else { | ||||||
|  | @ -1410,13 +1308,13 @@ void WriteSettingsThread::run() | ||||||
| 	for (int cf = 0; cf <= 31 && cf <= max_CF; cf++) | 	for (int cf = 0; cf <= 31 && cf <= max_CF; cf++) | ||||||
| 		printf("CF %d: %d\n", cf, read_ostc_cf(data, cf)); | 		printf("CF %d: %d\n", cf, read_ostc_cf(data, cf)); | ||||||
| #endif | #endif | ||||||
| 				rc = hw_ostc_device_eeprom_write(m_data->device, 0, data, sizeof(data)); | 	rc = hw_ostc_device_eeprom_write(device, 0, data, sizeof(data)); | ||||||
| 				if (rc != DC_STATUS_SUCCESS) { | 	if (rc != DC_STATUS_SUCCESS) | ||||||
| 					//FIXME: ERROR!
 | 		return rc; | ||||||
| 				} | 
 | ||||||
| 			} | 	rc = hw_ostc_device_eeprom_read(device, 1, data, sizeof(data)); | ||||||
| 			rc = hw_ostc_device_eeprom_read(m_data->device, 1, data, sizeof(data)); | 	if (rc != DC_STATUS_SUCCESS) | ||||||
| 			if (rc == DC_STATUS_SUCCESS) { | 		return rc; | ||||||
| 	// Byte1:
 | 	// Byte1:
 | ||||||
| 	// Logbook version indicator (Not writable!)
 | 	// Logbook version indicator (Not writable!)
 | ||||||
| 	// Byte2-3:
 | 	// Byte2-3:
 | ||||||
|  | @ -1441,13 +1339,13 @@ void WriteSettingsThread::run() | ||||||
| 	for (int cf = 32; cf <= 63 && cf <= max_CF; cf++) | 	for (int cf = 32; cf <= 63 && cf <= max_CF; cf++) | ||||||
| 		printf("CF %d: %d\n", cf, read_ostc_cf(data, cf)); | 		printf("CF %d: %d\n", cf, read_ostc_cf(data, cf)); | ||||||
| #endif | #endif | ||||||
| 				rc = hw_ostc_device_eeprom_write(m_data->device, 1, data, sizeof(data)); | 	rc = hw_ostc_device_eeprom_write(device, 1, data, sizeof(data)); | ||||||
| 				if (rc != DC_STATUS_SUCCESS) { | 	if (rc != DC_STATUS_SUCCESS) | ||||||
| 					//FIXME: ERROR!
 | 		return rc; | ||||||
| 				} | 
 | ||||||
| 			} | 	rc = hw_ostc_device_eeprom_read(device, 2, data, sizeof(data)); | ||||||
| 			rc = hw_ostc_device_eeprom_read(m_data->device, 2, data, sizeof(data)); | 	if (rc != DC_STATUS_SUCCESS) | ||||||
| 			if (rc == DC_STATUS_SUCCESS) { | 		return rc; | ||||||
| 	// Byte1-4:
 | 	// Byte1-4:
 | ||||||
| 	// not used/reserved (Not writable!)
 | 	// not used/reserved (Not writable!)
 | ||||||
| 	// Byte5-128:
 | 	// Byte5-128:
 | ||||||
|  | @ -1468,11 +1366,10 @@ void WriteSettingsThread::run() | ||||||
| 	for (int cf = 64; cf <= 95 && cf <= max_CF; cf++) | 	for (int cf = 64; cf <= 95 && cf <= max_CF; cf++) | ||||||
| 		printf("CF %d: %d\n", cf, read_ostc_cf(data, cf)); | 		printf("CF %d: %d\n", cf, read_ostc_cf(data, cf)); | ||||||
| #endif | #endif | ||||||
| 				rc = hw_ostc_device_eeprom_write(m_data->device, 2, data, sizeof(data)); | 	rc = hw_ostc_device_eeprom_write(device, 2, data, sizeof(data)); | ||||||
| 				if (rc != DC_STATUS_SUCCESS) { | 	if (rc != DC_STATUS_SUCCESS) | ||||||
| 					//FIXME: ERROR!
 | 		return rc; | ||||||
| 				} | 
 | ||||||
| 			} |  | ||||||
| 	//sync date and time
 | 	//sync date and time
 | ||||||
| 	if (m_deviceDetails->syncTime()) { | 	if (m_deviceDetails->syncTime()) { | ||||||
| 		QDateTime timeToSet = QDateTime::currentDateTime(); | 		QDateTime timeToSet = QDateTime::currentDateTime(); | ||||||
|  | @ -1483,13 +1380,121 @@ void WriteSettingsThread::run() | ||||||
| 		time.hour = timeToSet.time().hour(); | 		time.hour = timeToSet.time().hour(); | ||||||
| 		time.minute = timeToSet.time().minute(); | 		time.minute = timeToSet.time().minute(); | ||||||
| 		time.second = timeToSet.time().second(); | 		time.second = timeToSet.time().second(); | ||||||
| 				rc = hw_ostc_device_clock(m_data->device, &time); | 		rc = hw_ostc_device_clock(device, &time); | ||||||
| 				if (rc != DC_STATUS_SUCCESS) { |  | ||||||
| 					//FIXME: ERROR!
 |  | ||||||
| 	} | 	} | ||||||
|  | 	return rc; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void ReadSettingsThread::run() | ||||||
|  | { | ||||||
|  | 	bool supported = false; | ||||||
|  | 	dc_status_t rc; | ||||||
|  | #ifdef DEBUG_OSTC | ||||||
|  | 	if (strcmp(m_data->vendor, "Heinrichs Weikamp") == 0 && strcmp(m_data->product, "OSTC 2N") == 0) | ||||||
|  | 		rc = DC_STATUS_SUCCESS; | ||||||
|  | 	else | ||||||
|  | #endif | ||||||
|  | 		rc = dc_device_open(&m_data->device, m_data->context, m_data->descriptor, m_data->devname); | ||||||
|  | 	if (rc == DC_STATUS_SUCCESS) { | ||||||
|  | 		DeviceDetails *m_deviceDetails = new DeviceDetails(0); | ||||||
|  | 		switch (dc_device_get_type(m_data->device)) { | ||||||
|  | 		case DC_FAMILY_SUUNTO_VYPER: | ||||||
|  | 			rc = read_suunto_vyper_settings(m_data->device, m_deviceDetails); | ||||||
|  | 			if (rc == DC_STATUS_SUCCESS) { | ||||||
|  | 				supported = true; | ||||||
|  | 				emit devicedetails(m_deviceDetails); | ||||||
|  | 			} else if (rc == DC_STATUS_UNSUPPORTED) { | ||||||
|  | 				supported = false; | ||||||
|  | 			} else { | ||||||
|  | 				emit error("Failed!"); | ||||||
| 			} | 			} | ||||||
| 			break; | 			break; | ||||||
|  | #if DC_VERSION_CHECK(0, 5, 0) | ||||||
|  | 		case DC_FAMILY_HW_OSTC3: | ||||||
|  | 			supported = true; | ||||||
|  | 			rc = read_ostc3_settings(m_data->device, m_deviceDetails); | ||||||
|  | 			if (rc == DC_STATUS_SUCCESS) | ||||||
|  | 				emit devicedetails(m_deviceDetails); | ||||||
|  | 			else | ||||||
|  | 				emit error("Failed!"); | ||||||
|  | 			break; | ||||||
|  | #endif	// divecomputer 0.5.0
 | ||||||
|  | #ifdef DEBUG_OSTC | ||||||
|  | 		case DC_FAMILY_NULL: | ||||||
|  | #endif | ||||||
|  | 		case DC_FAMILY_HW_OSTC: | ||||||
|  | 			supported = true; | ||||||
|  | 			rc = read_ostc_settings(m_data->device, m_deviceDetails); | ||||||
|  | 			if (rc == DC_STATUS_SUCCESS) | ||||||
|  | 				emit devicedetails(m_deviceDetails); | ||||||
|  | 			else | ||||||
|  | 				emit error("Failed!"); | ||||||
|  | 			break; | ||||||
|  | 		default: | ||||||
|  | 			supported = false; | ||||||
|  | 			break; | ||||||
| 		} | 		} | ||||||
|  | 	} else { | ||||||
|  | 		lastError = tr("Could not a establish connection to the dive computer."); | ||||||
|  | 		emit error(lastError); | ||||||
|  | 		// So we don't trigger the "unsupported" clause later..
 | ||||||
|  | 		supported = true; | ||||||
|  | 	} | ||||||
|  | 	dc_device_close(m_data->device); | ||||||
|  | 
 | ||||||
|  | 	if (!supported) { | ||||||
|  | 		lastError = tr("This feature is not yet available for the selected dive computer."); | ||||||
|  | 		emit error(lastError); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | WriteSettingsThread::WriteSettingsThread(QObject *parent, device_data_t *data) : QThread(parent), m_data(data) | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void WriteSettingsThread::setDeviceDetails(DeviceDetails *details) | ||||||
|  | { | ||||||
|  | 	m_deviceDetails = details; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void WriteSettingsThread::run() | ||||||
|  | { | ||||||
|  | 	bool supported = false; | ||||||
|  | 	dc_status_t rc; | ||||||
|  | #ifdef DEBUG_OSTC | ||||||
|  | 	rc = DC_STATUS_SUCCESS; | ||||||
|  | #else | ||||||
|  | 	rc = dc_device_open(&m_data->device, m_data->context, m_data->descriptor, m_data->devname); | ||||||
|  | #endif | ||||||
|  | 	if (rc == DC_STATUS_SUCCESS) { | ||||||
|  | 		switch (dc_device_get_type(m_data->device)) { | ||||||
|  | 		case DC_FAMILY_SUUNTO_VYPER: | ||||||
|  | 			rc = write_suunto_vyper_settings(m_data->device, m_deviceDetails); | ||||||
|  | 			if (rc == DC_STATUS_SUCCESS) { | ||||||
|  | 				supported = true; | ||||||
|  | 			} else if (rc == DC_STATUS_UNSUPPORTED) { | ||||||
|  | 				supported = false; | ||||||
|  | 			} else { | ||||||
|  | 				emit error(tr("Failed!")); | ||||||
|  | 			} | ||||||
|  | 			break; | ||||||
|  | #if DC_VERSION_CHECK(0,5,0) | ||||||
|  | 		case DC_FAMILY_HW_OSTC3: | ||||||
|  | 			supported = true; | ||||||
|  | 			rc = write_ostc3_settings(m_data->device, m_deviceDetails); | ||||||
|  | 			if (rc != DC_STATUS_SUCCESS) | ||||||
|  | 				emit error(tr("Failed!")); | ||||||
|  | 			break; | ||||||
|  | #endif	// divecomputer 0.5.0
 | ||||||
|  | #ifdef DEBUG_OSTC | ||||||
|  | 		case DC_FAMILY_NULL: | ||||||
|  | #endif | ||||||
|  | 		case DC_FAMILY_HW_OSTC: | ||||||
|  | 			supported = true; | ||||||
|  | 			rc = write_ostc_settings(m_data->device, m_deviceDetails); | ||||||
|  | 			if (rc != DC_STATUS_SUCCESS) | ||||||
|  | 				emit error(tr("Failed!")); | ||||||
|  | 			break; | ||||||
| 		default: | 		default: | ||||||
| 			supported = false; | 			supported = false; | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue