Пример #1
0
        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
            };
        }
Пример #2
0
            public DynamicDeviceInfo GetDynamicDeviceInfo()
            {
                DynamicDeviceInfo dynamicDeviceInfo = new DynamicDeviceInfo();

                dynamicDeviceInfo.deviceStatus       = GetDeviceStatus();
                dynamicDeviceInfo.transmissionPeriod = GetTransmissionPeriod();

                return(dynamicDeviceInfo);
            }
Пример #3
0
        private static DynamicDeviceInfo CreateDynamicDeviceInfo(BridgeDynamicDeviceInfo bridgeDynamicDeviceInfo)
        {
            DynamicDeviceInfo dynamicDeviceInfo = new DynamicDeviceInfo();

            dynamicDeviceInfo.deviceStatus       = bridgeDynamicDeviceInfo.deviceStatus;
            dynamicDeviceInfo.transmissionPeriod = bridgeDynamicDeviceInfo.transmissionPeriod;

            return(dynamicDeviceInfo);
        }
Пример #4
0
 /// <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);
        }
Пример #7
0
        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);
            }
Пример #9
0
        /// <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();
                }
            }
        }
Пример #10
0
        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);
            }
        }