static WearableConstants() { // Ensure that empty frame has a valid rotation quaternion EMPTY_FRAME = new SensorFrame { rotationNineDof = new SensorQuaternion { value = Quaternion.identity }, rotationSixDof = new SensorQuaternion { value = Quaternion.identity } }; CONNECTING_STATES = new List <ConnectionStatus> { ConnectionStatus.FirmwareUpdateRequired, ConnectionStatus.FirmwareUpdateAvailable, ConnectionStatus.Connecting, ConnectionStatus.AutoReconnect, ConnectionStatus.SecurePairingRequired }; EMPTY_DEVICE_LIST = new Device[0]; GESTURE_IDS = (GestureId[])Enum.GetValues(typeof(GestureId)); SENSOR_IDS = (SensorId[])Enum.GetValues(typeof(SensorId)); UPDATE_INTERVALS = (SensorUpdateInterval[])Enum.GetValues(typeof(SensorUpdateInterval)); SIGNAL_STRENGTHS = (SignalStrength[])Enum.GetValues(typeof(SignalStrength)); ACTIVE_NOISE_REDUCTION_MODES = (ActiveNoiseReductionMode[])Enum.GetValues(typeof(ActiveNoiseReductionMode)); EMPTY_ACTIVE_NOISE_REDUCTION_MODES = new ActiveNoiseReductionMode[0]; DEVICE_STATUS_FLAGS = (DeviceStatusFlags[])Enum.GetValues(typeof(DeviceStatusFlags)); OS_PERMISSIONS = (OSPermission[])Enum.GetValues(typeof(OSPermission)); OS_SERVICES = (OSService[])Enum.GetValues(typeof(OSService)); DISABLED_DEVICE_CONFIG = new WearableDeviceConfig(); DISABLED_DEVICE_CONFIG.DisableAllSensors(); DISABLED_DEVICE_CONFIG.DisableAllGestures(); #pragma warning disable 618 DISALLOWED_EDITOR_PROVIDERS = new[] { ProviderId.BluetoothProvider }; DISALLOWED_RUNTIME_PROVIDERS = new[] { ProviderId.USBProvider }; #pragma warning restore 618 DEBUG_PROVIDER_DEFAULT_AVAILABLE_ANR_MODES = new[] { ActiveNoiseReductionMode.Off, ActiveNoiseReductionMode.Low, ActiveNoiseReductionMode.High }; EMPTY_DEVICE_STATUS = new DeviceStatus(); EMPTY_DYNAMIC_DEVICE_INFO = new DynamicDeviceInfo { transmissionPeriod = -1, activeNoiseReductionMode = ActiveNoiseReductionMode.Invalid, availableActiveNoiseReductionModes = WearableTools.GetActiveNoiseReductionModesAsInt(EMPTY_ACTIVE_NOISE_REDUCTION_MODES), controllableNoiseCancellationLevel = 0, controllableNoiseCancellationEnabled = false, totalControllableNoiseCancellationLevels = 0 }; }
public DynamicDeviceInfo GetDynamicDeviceInfo() { DynamicDeviceInfo dynamicDeviceInfo = new DynamicDeviceInfo(); dynamicDeviceInfo.deviceStatus = GetDeviceStatus(); dynamicDeviceInfo.transmissionPeriod = GetTransmissionPeriod(); return(dynamicDeviceInfo); }
private static DynamicDeviceInfo CreateDynamicDeviceInfo(BridgeDynamicDeviceInfo bridgeDynamicDeviceInfo) { DynamicDeviceInfo dynamicDeviceInfo = new DynamicDeviceInfo(); dynamicDeviceInfo.deviceStatus = bridgeDynamicDeviceInfo.deviceStatus; dynamicDeviceInfo.transmissionPeriod = bridgeDynamicDeviceInfo.transmissionPeriod; return(dynamicDeviceInfo); }
/// <summary> /// Copies dynamic info into this device. /// </summary> internal void SetDynamicInfo(DynamicDeviceInfo dynamicDeviceInfo) { deviceStatus = dynamicDeviceInfo.deviceStatus; transmissionPeriod = dynamicDeviceInfo.transmissionPeriod; activeNoiseReductionMode = dynamicDeviceInfo.activeNoiseReductionMode; availableActiveNoiseReductionModes = dynamicDeviceInfo.availableActiveNoiseReductionModes; controllableNoiseCancellationLevel = dynamicDeviceInfo.controllableNoiseCancellationLevel; totalControllableNoiseCancellationLevels = dynamicDeviceInfo.totalControllableNoiseCancellationLevels; controllableNoiseCancellationEnabled = dynamicDeviceInfo.controllableNoiseCancellationEnabled; }
/// <summary> /// Checks the device for dynamic data changes during a session. /// </summary> private void MonitorDynamicDeviceInfo() { if (!_connectedDevice.HasValue) { return; } Device device = _connectedDevice.Value; Device lastDevice = device; DynamicDeviceInfo dynamicDeviceInfo = GetDynamicDeviceInfo(); // Copy dynamic info to the device struct, then update the provider's device. // Do this at the beginning so any callbacks invoked will have up-to-date info available. device.SetDynamicInfo(dynamicDeviceInfo); _connectedDevice = device; // Calculate incoming outgoing events DeviceStatus deviceStatus = device.deviceStatus; DeviceStatus risingEvents = deviceStatus.GetRisingEdges(lastDevice.deviceStatus); DeviceStatus fallingEvents = deviceStatus.GetFallingEdges(lastDevice.deviceStatus); // Service suspended/resumes CheckForServiceSuspended(risingEvents); if (fallingEvents.GetFlagValue(DeviceStatusFlags.SensorServiceSuspended)) { if (SensorServiceResumed != null) { SensorServiceResumed.Invoke(); } } // ANR state changed if (lastDevice.activeNoiseReductionMode != device.activeNoiseReductionMode) { if (ActiveNoiseReductionModeChanged != null) { ActiveNoiseReductionModeChanged.Invoke(device.activeNoiseReductionMode); } } // CNC state changed if ((lastDevice.controllableNoiseCancellationLevel != device.controllableNoiseCancellationLevel) || (lastDevice.controllableNoiseCancellationEnabled != device.controllableNoiseCancellationEnabled)) { if (ControllableNoiseCancellationInfoChanged != null) { ControllableNoiseCancellationInfoChanged.Invoke( device.controllableNoiseCancellationLevel, device.controllableNoiseCancellationEnabled); } } }
private static DynamicDeviceInfo CreateDynamicDeviceInfo(BridgeDynamicDeviceInfo bridgeDynamicDeviceInfo) { DynamicDeviceInfo dynamicDeviceInfo = new DynamicDeviceInfo(); dynamicDeviceInfo.deviceStatus = bridgeDynamicDeviceInfo.deviceStatus; dynamicDeviceInfo.transmissionPeriod = bridgeDynamicDeviceInfo.transmissionPeriod; dynamicDeviceInfo.activeNoiseReductionMode = (ActiveNoiseReductionMode)bridgeDynamicDeviceInfo.activeNoiseReductionMode; dynamicDeviceInfo.availableActiveNoiseReductionModes = bridgeDynamicDeviceInfo.availableActiveNoiseReductionModes; dynamicDeviceInfo.controllableNoiseCancellationLevel = bridgeDynamicDeviceInfo.controllableNoiseCancellationLevel; dynamicDeviceInfo.controllableNoiseCancellationEnabled = bridgeDynamicDeviceInfo.controllableNoiseCancellationEnabled; dynamicDeviceInfo.totalControllableNoiseCancellationLevels = bridgeDynamicDeviceInfo.totalControllableNoiseCancellationLevels; return(dynamicDeviceInfo); }
static WearableConstants() { // Ensure that empty frame has a valid rotation quaternion EmptyFrame = new SensorFrame { rotationNineDof = new SensorQuaternion { value = Quaternion.identity }, rotationSixDof = new SensorQuaternion { value = Quaternion.identity } }; ConnectingStates = new List <ConnectionStatus> { ConnectionStatus.FirmwareUpdateRequired, ConnectionStatus.FirmwareUpdateAvailable, ConnectionStatus.Connecting, ConnectionStatus.AutoReconnect, ConnectionStatus.SecurePairingRequired }; EmptyDeviceList = new Device[0]; EmptyLayoutOptions = new GUILayoutOption[0]; GestureIds = (GestureId[])Enum.GetValues(typeof(GestureId)); SensorIds = (SensorId[])Enum.GetValues(typeof(SensorId)); UpdateIntervals = (SensorUpdateInterval[])Enum.GetValues(typeof(SensorUpdateInterval)); SignalStrengths = (SignalStrength[])Enum.GetValues(typeof(SignalStrength)); DisabledDeviceConfig = new WearableDeviceConfig(); DisabledDeviceConfig.DisableAllSensors(); DisabledDeviceConfig.DisableAllGestures(); #pragma warning disable 618 DisallowedEditorProviders = new[] { ProviderId.MobileProvider, ProviderId.WearableDevice }; DisallowedRuntimeProviders = new[] { ProviderId.MobileProvider, ProviderId.USBProvider }; #pragma warning restore 618 EmptyDeviceStatus = new DeviceStatus(); EmptyDynamicDeviceInfo = new DynamicDeviceInfo { transmissionPeriod = -1 }; }
public DynamicDeviceInfo GetDynamicDeviceInfo(bool supportsANR, bool supportsCNC) { DynamicDeviceInfo dynamicDeviceInfo = new DynamicDeviceInfo(); dynamicDeviceInfo.deviceStatus = GetDeviceStatus(); dynamicDeviceInfo.transmissionPeriod = GetTransmissionPeriod(); if (supportsANR) { dynamicDeviceInfo.activeNoiseReductionMode = (ActiveNoiseReductionMode)GetCurrentActiveNoiseReductionMode(); dynamicDeviceInfo.availableActiveNoiseReductionModes = GetAvailableActiveNoiseReductionModes(); } if (supportsCNC) { dynamicDeviceInfo.controllableNoiseCancellationLevel = GetCurrentControllableNoiseCancellationLevel(); dynamicDeviceInfo.controllableNoiseCancellationEnabled = GetControllableNoiseCancellationEnabled(); dynamicDeviceInfo.totalControllableNoiseCancellationLevels = GetTotalControllableNoiseCancellationLevels(); } return(dynamicDeviceInfo); }
/// <summary> /// Checks the device for dynamic data changes during a session. /// </summary> private void MonitorDynamicDeviceInfo() { DynamicDeviceInfo dynamicDeviceInfo = GetDynamicDeviceInfo(); if (_connectedDevice.HasValue) { Device device = _connectedDevice.Value; device.deviceStatus = dynamicDeviceInfo.deviceStatus; device.transmissionPeriod = dynamicDeviceInfo.transmissionPeriod; _connectedDevice = device; } // Calculate incoming outgoing events DeviceStatus deviceStatus = dynamicDeviceInfo.deviceStatus; DeviceStatus risingEvents = deviceStatus.GetRisingEdges(_lastDeviceStatus); DeviceStatus fallingEvents = deviceStatus.GetFallingEdges(_lastDeviceStatus); _lastDeviceStatus = deviceStatus; // Service suspended/resumes if (risingEvents.GetFlagValue(DeviceStatusFlags.SensorServiceSuspended)) { SensorServiceSuspendedReason reason = deviceStatus.GetServiceSuspendedReason(); if (SensorServiceSuspended != null) { SensorServiceSuspended.Invoke(reason); } } if (fallingEvents.GetFlagValue(DeviceStatusFlags.SensorServiceSuspended)) { if (SensorServiceResumed != null) { SensorServiceResumed.Invoke(); } } }
internal WearableDebugProvider() { _virtualDevice = new Device { name = _name, firmwareVersion = _firmwareVersion, rssi = _rssi, availableSensors = _availableSensors, availableGestures = _availableGestures, productId = _productId, variantId = _variantId, uid = _uid, transmissionPeriod = 0, maximumPayloadPerTransmissionPeriod = 0, // NB: an extra sensor needs to be added to account for RotationSource maximumActiveSensors = WearableConstants.SensorIds.Length + 1 }; _name = WearableConstants.DebugProviderDefaultDeviceName; _firmwareVersion = WearableConstants.DefaultFirmwareVersion; _boseArEnabled = true; _firmwareUpdateAvailable = false; _acceptSecurePairing = true; _rssi = WearableConstants.DebugProviderDefaultRSSI; _availableSensors = WearableConstants.AllSensors; _availableGestures = WearableConstants.AllGestures; _productId = WearableConstants.DebugProviderDefaultProductId; _variantId = WearableConstants.DebugProviderDefaultVariantId; _uid = WearableConstants.DebugProviderDefaultUID; _simulatedDelayTime = WearableConstants.DebugProviderDefaultDelayTime; _searchingForDevice = false; _verbose = true; _eulerSpinRate = Vector3.zero; _axisAngleSpinRate = Vector3.up; _config = new WearableDeviceConfig(); _pendingGestures = new Queue <GestureData>(); _nextSensorUpdateTime = 0.0f; _rotation = Quaternion.identity; _dynamicDeviceInfo = WearableConstants.EmptyDynamicDeviceInfo; _updateInformation = new FirmwareUpdateInformation { icon = BoseUpdateIcon.Music, options = new[] { new FirmwareUpdateAlertOption { style = AlertStyle.Affirmative }, new FirmwareUpdateAlertOption { style = AlertStyle.Negative } } }; }
/// <summary> /// Attempts to create a session to a specified device and then checks for the session status perpetually until /// a SessionStatus of either Open or Closed is returned, equating to either successful or failed. /// </summary> private void PerformDeviceConnection() { if (Application.isEditor) { return; } string errorMessage = string.Empty; ConnectionStatus sessionStatus = GetConnectionStatus(ref errorMessage); switch (sessionStatus) { // Receiving a session status of Closed while attempting to open a session indicates an error occured. case ConnectionStatus.Failed: if (string.IsNullOrEmpty(errorMessage)) { Debug.LogWarning(WearableConstants.DEVICE_CONNECTION_FAILED); } else { Debug.LogWarningFormat(WearableConstants.DEVICE_CONNECTION_FAILED_WITH_MESSAGE, errorMessage); } StopDeviceConnection(); OnConnectionStatusChanged(ConnectionStatus.Failed, _deviceToConnect); break; case ConnectionStatus.Searching: case ConnectionStatus.Connecting: // Device is still connecting, just wait break; case ConnectionStatus.SecurePairingRequired: if (_currentConnectionStatus != ConnectionStatus.SecurePairingRequired) { OnConnectionStatusChanged(ConnectionStatus.SecurePairingRequired, _deviceToConnect); } break; case ConnectionStatus.FirmwareUpdateAvailable: if (_currentConnectionStatus != ConnectionStatus.FirmwareUpdateAvailable) { OnConnectionStatusChanged(ConnectionStatus.FirmwareUpdateAvailable, _deviceToConnect); } break; case ConnectionStatus.FirmwareUpdateRequired: if (_currentConnectionStatus != ConnectionStatus.FirmwareUpdateRequired) { OnConnectionStatusChanged(ConnectionStatus.FirmwareUpdateRequired, _deviceToConnect); } break; case ConnectionStatus.Connected: Debug.Log(WearableConstants.DEVICE_CONNECTION_OPENED); // ProductId and VariantId are only accessible after a connection has been opened. Update the values for the _connectDevice. GetDeviceInfo(ref _deviceToConnect); // Make sure productId and variantId values are defined. if (!Enum.IsDefined(typeof(ProductId), _deviceToConnect.productId)) { _deviceToConnect.productId = ProductId.Undefined; } DynamicDeviceInfo dynamicDeviceInfo = GetDynamicDeviceInfoInternal(); _supportsActiveNoiseReduction = (ActiveNoiseReductionMode)dynamicDeviceInfo.availableActiveNoiseReductionModes != ActiveNoiseReductionMode.Invalid; _supportsControllableNoiseCancellation = dynamicDeviceInfo.totalControllableNoiseCancellationLevels > 0; _deviceToConnect.SetDynamicInfo(dynamicDeviceInfo); _connectedDevice = _deviceToConnect; OnConnectionStatusChanged(ConnectionStatus.Connected, _connectedDevice); StartDeviceMonitor(); StopDeviceConnection(); break; default: throw new ArgumentOutOfRangeException("sessionStatus", sessionStatus, null); } _currentConnectionStatus = sessionStatus; }
/// <summary> /// Attempts to create a session to a specified device and then checks for the connection status perpetually until /// a ConnectionStatus of either Connected or Failed is returned, equating to either successful or failed. /// </summary> private void PerformDeviceConnection() { if (Application.isEditor) { return; } string errorMessage = string.Empty; ConnectionStatus connectionStatus = GetConnectionStatus(ref errorMessage); switch (connectionStatus) { case ConnectionStatus.Disconnected: StopDeviceConnection(); OnConnectionStatusChanged(ConnectionStatus.Disconnected, _deviceToConnect); break; case ConnectionStatus.Failed: SendDeviceFailure(errorMessage); break; case ConnectionStatus.Searching: case ConnectionStatus.Connecting: // Device is still connecting, just wait break; case ConnectionStatus.SecurePairingRequired: if (_connectionStatus != ConnectionStatus.SecurePairingRequired) { OnConnectionStatusChanged(ConnectionStatus.SecurePairingRequired, _deviceToConnect); } break; case ConnectionStatus.FirmwareUpdateAvailable: if (_connectionStatus != ConnectionStatus.FirmwareUpdateAvailable) { OnConnectionStatusChanged(ConnectionStatus.FirmwareUpdateAvailable, _deviceToConnect); } break; case ConnectionStatus.FirmwareUpdateRequired: if (_connectionStatus != ConnectionStatus.FirmwareUpdateRequired) { OnConnectionStatusChanged(ConnectionStatus.FirmwareUpdateRequired, _deviceToConnect); } break; case ConnectionStatus.Connected: Debug.Log(WearableConstants.DEVICE_CONNECTION_OPENED); // ProductId and VariantId are only accessible after a connection has been opened. Update the values for the _connectDevice. GetDeviceInfo(ref _deviceToConnect); // Make sure uid is defined. if (_autoReconnectWithoutPrompts && string.IsNullOrEmpty(_deviceToConnect.uid)) { _deviceToConnect.uid = LastConnectedDeviceUID; } // Make sure productId and variantId values are defined. if (!Enum.IsDefined(typeof(ProductId), _deviceToConnect.productId)) { _deviceToConnect.productId = ProductId.Undefined; } DynamicDeviceInfo dynamicDeviceInfo = GetDynamicDeviceInfoInternal(); _supportsActiveNoiseReduction = (ActiveNoiseReductionMode)dynamicDeviceInfo.availableActiveNoiseReductionModes != ActiveNoiseReductionMode.Off; _supportsControllableNoiseCancellation = dynamicDeviceInfo.totalControllableNoiseCancellationLevels > 0; _deviceToConnect.SetDynamicInfo(dynamicDeviceInfo); _connectedDevice = _deviceToConnect; OnConnectionStatusChanged(ConnectionStatus.Connected, _connectedDevice); StartDeviceMonitor(); StopDeviceConnection(); break; case ConnectionStatus.Cancelled: const string CANCEL_WARNING_FORMAT = "[Bose Wearable] Received a ConnectionStatus.Cancelled status from the bridge, this " + "should not be possible. The previous status was: [{0}]."; Debug.LogWarningFormat(CANCEL_WARNING_FORMAT, _connectionStatus); break; default: throw new ArgumentOutOfRangeException("connectionStatus", connectionStatus, null); } }