Exemple #1
0
 public DeviceActionQueue(DeviceConnection connection)
 {
     lock (_lock)
     {
         _connection  = connection;
         _tokenSource = new CancellationTokenSource();
         _token       = _tokenSource.Token;
         var worker = new Task(WorkerThreadAction, _token, TaskCreationOptions.LongRunning);
         worker.Start();
         Count = 0;
     }
 }
Exemple #2
0
 internal DeviceConnectionSession(DeviceConnection parent)
 {
     _connection = parent;
 }
        /// <summary>
        /// This method opens the device using the WinRT Serial API. After the device is opened, save the device
        /// so that it can be used across scenarios.
        ///
        /// It is important that the FromIdAsync call is made on the UI thread because the consent prompt can only be displayed
        /// on the UI thread.
        ///
        /// This method is used to reopen the device after the device reconnects to the computer and when the app resumes.
        /// </summary>
        /// <param name="deviceInfo">Device information of the device to be opened</param>
        /// <param name="deviceSelector">The AQS used to find this device</param>
        /// <returns>True if the device was successfully opened, false if the device could not be opened for well known reasons.
        /// An exception may be thrown if the device could not be opened for extraordinary reasons.</returns>
        public async Task <bool> OpenDeviceAsync(DeviceInformation deviceInfo, string deviceSelector)
        {
            Device = await SerialDevice.FromIdAsync(deviceInfo.Id);

            bool       successfullyOpenedDevice = false;
            NotifyType notificationStatus;
            string     notificationMessage;

            // Device could have been blocked by user or the device has already been opened by another app.
            if (Device != null)
            {
                successfullyOpenedDevice = true;

                DeviceInformation = deviceInfo;
                DeviceSelector    = deviceSelector;

                Connection  = new DeviceConnection(Device);
                ActionQueue = new DeviceActionQueue(Connection);

                notificationStatus  = NotifyType.StatusMessage;
                notificationMessage = "Device " + DeviceInformation.Properties["System.ItemNameDisplay"] + " opened";

                // Notify registered callback handle that the device has been opened
                OnDeviceConnected?.Invoke(this, DeviceInformation);

                if (_appSuspendEventHandler == null || _appResumeEventHandler == null)
                {
                    RegisterForAppEvents();
                }

                // Register for DeviceAccessInformation.AccessChanged event and react to any changes to the
                // user access after the device handle was opened.
                if (_deviceAccessEventHandler == null)
                {
                    RegisterForDeviceAccessStatusChange();
                }

                // Create and register device watcher events for the device to be opened unless we're reopening the device
                if (_deviceWatcher == null)
                {
                    _deviceWatcher = DeviceInformation.CreateWatcher(deviceSelector);

                    RegisterForDeviceWatcherEvents();
                }

                if (!_watcherStarted)
                {
                    // Start the device watcher after we made sure that the device is opened.
                    StartDeviceWatcher();
                }
            }
            else
            {
                notificationStatus = NotifyType.ErrorMessage;

                var deviceAccessStatus = DeviceAccessInformation.CreateFromId(deviceInfo.Id).CurrentStatus;

                switch (deviceAccessStatus)
                {
                case DeviceAccessStatus.DeniedByUser:
                    notificationMessage = "Access to the device was blocked by the user : "******"System.ItemNameDisplay"];
                    break;

                case DeviceAccessStatus.DeniedBySystem:
                    // This status is most likely caused by app permissions (did not declare the device in the app's package.appxmanifest)
                    // This status does not cover the case where the device is already opened by another app.
                    notificationMessage = "Access to the device was blocked by the system : " + deviceInfo.Properties["System.ItemNameDisplay"];
                    break;

                default:
                    notificationMessage = "Unknown error, possibly opened by another app : " + deviceInfo.Properties["System.ItemNameDisplay"];
                    break;
                }
            }

            MainPage.Current.NotifyUser(notificationMessage, notificationStatus);

            return(successfullyOpenedDevice);
        }