mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	Merge branch 'macBLE' of github.com:Subsurface-divelog/subsurface
This commit is contained in:
		
						commit
						ae209a3d9f
					
				
					 9 changed files with 112 additions and 23 deletions
				
			
		|  | @ -220,9 +220,8 @@ if (BTSUPPORT AND "${Qt5Core_VERSION}" VERSION_LESS 5.4.0) | |||
| endif() | ||||
| 
 | ||||
| # Windows Qt doesn't support BLE at all | ||||
| # Mac hasn't been tested, yet - so far it's disabled | ||||
| # the rest of them need at least 5.6 to be reasonable but really, you want 5.9.1 | ||||
| if (BTSUPPORT AND (ANDROID OR CMAKE_SYSTEM_NAME STREQUAL "Linux")) | ||||
| if (BTSUPPORT AND NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") | ||||
| 	if ("${Qt5Core_VERSION}" VERSION_LESS 5.6.0) | ||||
| 		message(STATUS "Turning off BLE support as Qt version ${Qt5Core_VERSION} is insufficient for that") | ||||
| 	else() | ||||
|  |  | |||
|  | @ -174,11 +174,10 @@ QString markBLEAddress(const QBluetoothDeviceInfo *device) | |||
| 	flags = device->coreConfigurations(); | ||||
| 	if (flags == QBluetoothDeviceInfo::LowEnergyCoreConfiguration) | ||||
| 		prefix = "LE:"; | ||||
| #if defined(Q_OS_IOS) | ||||
| 	return prefix + device->deviceUuid().toString(); | ||||
| #else | ||||
| 	return prefix + device->address().toString(); | ||||
| #endif | ||||
| 	if (device->address().isNull()) | ||||
| 		return prefix + device->deviceUuid().toString(); | ||||
| 	else | ||||
| 		return prefix + device->address().toString(); | ||||
| } | ||||
| 
 | ||||
| void BTDiscovery::btDeviceDiscovered(const QBluetoothDeviceInfo &device) | ||||
|  | @ -308,4 +307,18 @@ bool BTDiscovery::checkException(const char* method, const QAndroidJniObject *ob | |||
| } | ||||
| #endif // Q_OS_ANDROID
 | ||||
| 
 | ||||
| QHash<QString, QBluetoothDeviceInfo> btDeviceInfo; | ||||
| 
 | ||||
| void saveBtDeviceInfo(const char* devaddr, QBluetoothDeviceInfo deviceInfo) | ||||
| { | ||||
| 	btDeviceInfo[devaddr] = deviceInfo; | ||||
| } | ||||
| 
 | ||||
| QBluetoothDeviceInfo getBtDeviceInfo(const char* devaddr) | ||||
| { | ||||
| 	if (btDeviceInfo.contains(devaddr)) | ||||
| 		return btDeviceInfo[devaddr]; | ||||
| 	qDebug() << "need to scan for" << devaddr; | ||||
| 	return QBluetoothDeviceInfo(); | ||||
| } | ||||
| #endif // BT_SUPPORT
 | ||||
|  |  | |||
|  | @ -18,6 +18,9 @@ | |||
| #include <QAndroidJniEnvironment> | ||||
| #endif | ||||
| 
 | ||||
| void saveBtDeviceInfo(const char* devaddr, QBluetoothDeviceInfo deviceInfo); | ||||
| QBluetoothDeviceInfo getBtDeviceInfo(const char* devaddr); | ||||
| 
 | ||||
| class ConnectionListModel : public QAbstractListModel { | ||||
| 	Q_OBJECT | ||||
| public: | ||||
|  |  | |||
|  | @ -1121,6 +1121,7 @@ const char *do_libdivecomputer_import(device_data_t *data) | |||
| 		/* TODO: Show the logfile to the user on error. */ | ||||
| 		dc_device_close(data->device); | ||||
| 		data->device = NULL; | ||||
| 		dev_info(data, translate("gettextFromC", "No new dives downloaded from dive computer")); | ||||
| 	} | ||||
| 
 | ||||
| 	dc_context_free(data->context); | ||||
|  |  | |||
|  | @ -16,6 +16,7 @@ | |||
| 
 | ||||
| #include "libdivecomputer.h" | ||||
| #include "core/qt-ble.h" | ||||
| #include "core/btdiscovery.h" | ||||
| 
 | ||||
| #if defined(SSRF_CUSTOM_IO) | ||||
| 
 | ||||
|  | @ -287,12 +288,11 @@ dc_status_t qt_ble_open(dc_custom_io_t *io, dc_context_t *context, const char *d | |||
| 	if (!strncmp(devaddr, "LE:", 3)) | ||||
| 		devaddr += 3; | ||||
| 
 | ||||
| 	QBluetoothAddress remoteDeviceAddress(devaddr); | ||||
| 
 | ||||
| 	// HACK ALERT! Qt 5.9 needs this for proper Bluez operation
 | ||||
| 	qputenv("QT_DEFAULT_CENTRAL_SERVICES", "1"); | ||||
| 
 | ||||
| 	QLowEnergyController *controller = new QLowEnergyController(remoteDeviceAddress); | ||||
| 	QBluetoothDeviceInfo remoteDevice = getBtDeviceInfo(devaddr); | ||||
| 	QLowEnergyController *controller = QLowEnergyController::createCentral(remoteDevice); | ||||
| 
 | ||||
| 	qDebug() << "qt_ble_open(" << devaddr << ")"; | ||||
| 
 | ||||
|  | @ -382,8 +382,19 @@ dc_status_t qt_ble_open(dc_custom_io_t *io, dc_context_t *context, const char *d | |||
| 				qDebug() << "Descriptor:" << d.name() << "uuid:" << d.uuid().toString(); | ||||
| 
 | ||||
| 			if (!l.isEmpty()) { | ||||
| 				d = l.first(); | ||||
| 				qDebug() << "now writing \"0x0100\" to the first descriptor"; | ||||
| 				bool foundCCC = false; | ||||
| 				foreach (d, l) { | ||||
| 					if (d.type() == QBluetoothUuid::ClientCharacteristicConfiguration) { | ||||
| 						// pick the correct characteristic
 | ||||
| 						foundCCC = true; | ||||
| 						break; | ||||
| 					} | ||||
| 				} | ||||
| 				if (!foundCCC) | ||||
| 					// if we didn't find a ClientCharacteristicConfiguration, try the first one
 | ||||
| 					d = l.first(); | ||||
| 
 | ||||
| 				qDebug() << "now writing \"0x0100\" to the descriptor" << d.uuid().toString(); | ||||
| 
 | ||||
| 				ble->preferredService()->writeDescriptor(d, QByteArray::fromHex("0100")); | ||||
| 			} | ||||
|  |  | |||
|  | @ -3,6 +3,9 @@ | |||
| #include <QDebug> | ||||
| #include <QMessageBox> | ||||
| #include <QMenu> | ||||
| #include "core/btdiscovery.h" | ||||
| 
 | ||||
| #include <QBluetoothUuid> | ||||
| 
 | ||||
| #include "ui_btdeviceselectiondialog.h" | ||||
| #include "btdeviceselectiondialog.h" | ||||
|  | @ -149,7 +152,9 @@ void BtDeviceSelectionDialog::on_save_clicked() | |||
| 
 | ||||
| 	// Save the selected device
 | ||||
| 	selectedRemoteDeviceInfo = QSharedPointer<QBluetoothDeviceInfo>(new QBluetoothDeviceInfo(remoteDeviceInfo)); | ||||
| 
 | ||||
| 	QString address = remoteDeviceInfo.address().isNull() ? remoteDeviceInfo.deviceUuid().toString() : | ||||
| 								remoteDeviceInfo.address().toString(); | ||||
| 	saveBtDeviceInfo(address.toUtf8().constData(), remoteDeviceInfo); | ||||
| 	if (remoteDeviceDiscoveryAgent->isActive()) { | ||||
| 		// Stop the SDP agent if the clear button is pressed and enable the Scan button
 | ||||
| 		remoteDeviceDiscoveryAgent->stop(); | ||||
|  | @ -236,8 +241,16 @@ void BtDeviceSelectionDialog::addRemoteDevice(const QBluetoothDeviceInfo &remote | |||
| 	if (remoteDeviceInfo.address().isNull()) | ||||
| 		pairingColor = QColor(Qt::gray); | ||||
| 
 | ||||
| 	QString deviceLabel; | ||||
| 
 | ||||
| 	QString deviceLabel = tr("%1 (%2)   [State: %3]").arg(remoteDeviceInfo.name(), | ||||
| #if defined(Q_OS_MACOS) || defined(Q_OS_IOS) | ||||
| 	if (!remoteDeviceInfo.deviceUuid().isNull()) { | ||||
| 		// we have only a Uuid, no address, so show that and reset the pairing color
 | ||||
| 		deviceLabel = QString("%1 (%2)").arg(remoteDeviceInfo.name(),remoteDeviceInfo.deviceUuid().toString()); | ||||
| 		pairingColor = QColor(Qt::white); | ||||
| 	} else | ||||
| #endif | ||||
| 	deviceLabel = tr("%1 (%2)   [State: %3]").arg(remoteDeviceInfo.name(), | ||||
| 							      remoteDeviceInfo.address().toString(), | ||||
| 							      pairingStatusLabel); | ||||
| #endif | ||||
|  | @ -255,19 +268,24 @@ void BtDeviceSelectionDialog::itemClicked(QListWidgetItem *item) | |||
| 	// By default we assume that the devices are paired
 | ||||
| 	QBluetoothDeviceInfo remoteDeviceInfo = item->data(Qt::UserRole).value<QBluetoothDeviceInfo>(); | ||||
| 	QString statusMessage = tr("The device %1 can be used for connection. You can press the Save button.") | ||||
| 				  .arg(remoteDeviceInfo.address().toString()); | ||||
| 				  .arg(remoteDeviceInfo.address().isNull() ? | ||||
| 					       remoteDeviceInfo.deviceUuid().toString() : | ||||
| 					       remoteDeviceInfo.address().toString()); | ||||
| 	bool enableSaveButton = true; | ||||
| 
 | ||||
| #if !defined(Q_OS_WIN) | ||||
| 	// On other platforms than Windows we can obtain the pairing status so if the devices are not paired we disable the button
 | ||||
| 	QBluetoothLocalDevice::Pairing pairingStatus = localDevice->pairingStatus(remoteDeviceInfo.address()); | ||||
| 	// except on MacOS for those devices that only give us a Uuid and not and address (as we have no pairing status for those, either)
 | ||||
| 	if (!remoteDeviceInfo.address().isNull()) { | ||||
| 		QBluetoothLocalDevice::Pairing pairingStatus = localDevice->pairingStatus(remoteDeviceInfo.address()); | ||||
| 
 | ||||
| 	if (pairingStatus == QBluetoothLocalDevice::Unpaired) { | ||||
| 		statusMessage = tr("The device %1 must be paired in order to be used. Please use the context menu for pairing options.") | ||||
| 				  .arg(remoteDeviceInfo.address().toString()); | ||||
| 		enableSaveButton = false; | ||||
| 		if (pairingStatus == QBluetoothLocalDevice::Unpaired) { | ||||
| 			statusMessage = tr("The device %1 must be paired in order to be used. Please use the context menu for pairing options.") | ||||
| 					.arg(remoteDeviceInfo.address().toString()); | ||||
| 			enableSaveButton = false; | ||||
| 		} | ||||
| 	} | ||||
| 	if (remoteDeviceInfo.address().isNull()) { | ||||
| 	if (remoteDeviceInfo.address().isNull() && remoteDeviceInfo.deviceUuid().isNull()) { | ||||
| 		statusMessage = tr("A device needs a non-zero address for a connection."); | ||||
| 		enableSaveButton = false; | ||||
| 	} | ||||
|  |  | |||
|  | @ -112,8 +112,24 @@ void DownloadFromDCWidget::updateProgressBar() | |||
| 	} | ||||
| 	if (!same_string(progress_bar_text , "")) { | ||||
| 		ui.progressBar->setFormat(progress_bar_text); | ||||
| #if defined(Q_OS_MAC) | ||||
| 		// on mac the progress bar doesn't show its text
 | ||||
| 		ui.progressText->setText(progress_bar_text); | ||||
| #endif | ||||
| 	} else { | ||||
| 		ui.progressBar->setFormat("%p%"); | ||||
| 		if (IS_FP_SAME(progress_bar_fraction, 0.0)) { | ||||
| 			ui.progressBar->setFormat(tr("Connecting to dive computer")); | ||||
| #if defined(Q_OS_MAC) | ||||
| 		// on mac the progress bar doesn't show its text
 | ||||
| 		ui.progressText->setText(tr("Connecting to dive computer")); | ||||
| #endif | ||||
| 		} else { | ||||
| 			ui.progressBar->setFormat("%p%"); | ||||
| #if defined(Q_OS_MAC) | ||||
| 			// on mac the progress bar doesn't show its text
 | ||||
| 			ui.progressText->setText(QString("%1%").arg(lrint(progress_bar_fraction * 100))); | ||||
| #endif | ||||
| 		} | ||||
| 	} | ||||
| 	ui.progressBar->setValue(lrint(progress_bar_fraction * 100)); | ||||
| 	free(last_text); | ||||
|  | @ -131,6 +147,10 @@ void DownloadFromDCWidget::updateState(states state) | |||
| 		markChildrenAsEnabled(); | ||||
| 		timer->stop(); | ||||
| 		progress_bar_text = ""; | ||||
| #if defined(Q_OS_MAC) | ||||
| 		// on mac we show the text in a label
 | ||||
| 		ui.progressText->setText(progress_bar_text); | ||||
| #endif | ||||
| 	} | ||||
| 
 | ||||
| 	// tries to cancel an on going download
 | ||||
|  | @ -153,6 +173,10 @@ void DownloadFromDCWidget::updateState(states state) | |||
| 		ui.progressBar->hide(); | ||||
| 		markChildrenAsEnabled(); | ||||
| 		progress_bar_text = ""; | ||||
| #if defined(Q_OS_MAC) | ||||
| 		// on mac we show the text in a label
 | ||||
| 		ui.progressText->setText(progress_bar_text); | ||||
| #endif | ||||
| 	} | ||||
| 
 | ||||
| 	// DOWNLOAD is finally done, but we don't know if there was an error as libdivecomputer doesn't pass
 | ||||
|  | @ -165,10 +189,15 @@ void DownloadFromDCWidget::updateState(states state) | |||
| 			markChildrenAsEnabled(); | ||||
| 			progress_bar_text = ""; | ||||
| 		} else { | ||||
| 			progress_bar_text = ""; | ||||
| 			if (downloadTable.nr != 0) | ||||
| 				progress_bar_text = ""; | ||||
| 			ui.progressBar->setValue(100); | ||||
| 			markChildrenAsEnabled(); | ||||
| 		} | ||||
| #if defined(Q_OS_MAC) | ||||
| 		// on mac we show the text in a label
 | ||||
| 		ui.progressText->setText(progress_bar_text); | ||||
| #endif | ||||
| 	} | ||||
| 
 | ||||
| 	// DOWNLOAD is started.
 | ||||
|  | @ -188,6 +217,10 @@ void DownloadFromDCWidget::updateState(states state) | |||
| 		markChildrenAsEnabled(); | ||||
| 		progress_bar_text = ""; | ||||
| 		ui.progressBar->hide(); | ||||
| #if defined(Q_OS_MAC) | ||||
| 		// on mac we show the text in a label
 | ||||
| 		ui.progressText->setText(progress_bar_text); | ||||
| #endif | ||||
| 	} | ||||
| 
 | ||||
| 	// properly updating the widget state
 | ||||
|  |  | |||
|  | @ -189,6 +189,13 @@ | |||
|          </property> | ||||
|         </widget> | ||||
|        </item> | ||||
|        <item> | ||||
|         <widget class="QLabel" name="progressText"> | ||||
|          <property name="text"> | ||||
|           <string/> | ||||
|          </property> | ||||
|         </widget> | ||||
|        </item> | ||||
|        <item> | ||||
|         <spacer name="aboveOKCancelSpacer"> | ||||
|          <property name="orientation"> | ||||
|  |  | |||
|  | @ -71,6 +71,10 @@ pushd Subsurface.app/Contents/PlugIns/grantlee | |||
| ln -s . 5.0 | ||||
| popd | ||||
| 
 | ||||
| if [ "$1" = "-nodmg" ] ; then | ||||
| 	exit 0 | ||||
| fi | ||||
| 
 | ||||
| # copy things into staging so we can create a nice DMG | ||||
| rm -rf ./staging | ||||
| mkdir ./staging | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue