public async Task <JArray> Get(string deviceGuid, DateTime?timestamp = null, string names = null, int?waitTimeout = null)
        {
            var device = GetDeviceEnsureAccess(deviceGuid);

            var start             = timestamp ?? _timestampRepository.GetCurrentTimestamp();
            var notificationNames = names != null?names.Split(',') : null;

            if (waitTimeout <= 0)
            {
                var filter = new DeviceNotificationFilter {
                    Start = start, IsDateInclusive = false, Notifications = notificationNames
                };
                var notifications = DataContext.DeviceNotification.GetByDevice(device.ID, filter);
                return(new JArray(notifications.Select(n => MapDeviceNotification(n, device))));
            }

            var config    = DeviceHiveConfiguration.RestEndpoint;
            var delayTask = Task.Delay(1000 * Math.Min(config.NotificationPollMaxInterval, waitTimeout ?? config.NotificationPollDefaultInterval));

            using (var waiterHandle = _notificationByDeviceIdWaiter.BeginWait(new object[] { device.ID },
                                                                              notificationNames == null ? null : notificationNames.Cast <object>().ToArray()))
            {
                do
                {
                    var filter = new DeviceNotificationFilter {
                        Start = start, IsDateInclusive = false, Notifications = notificationNames
                    };
                    var notifications = DataContext.DeviceNotification.GetByDevice(device.ID, filter);
                    if (notifications != null && notifications.Any())
                    {
                        return(new JArray(notifications.Select(n => MapDeviceNotification(n, device))));
                    }
                }while (await Task.WhenAny(waiterHandle.Wait(), delayTask) != delayTask);
            }

            return(new JArray());
        }
        public JArray Get(Guid deviceGuid, DateTime?timestamp = null, int?waitTimeout = null)
        {
            var device = DataContext.Device.Get(deviceGuid);

            if (device == null || !IsNetworkAccessible(device.NetworkID))
            {
                ThrowHttpResponse(HttpStatusCode.NotFound, "Device not found!");
            }

            var start = timestamp != null?timestamp.Value.AddTicks(10) : _timestampRepository.GetCurrentTimestamp();

            if (waitTimeout <= 0)
            {
                var notifications = DataContext.DeviceNotification.GetByDevice(device.ID, start, null);
                return(new JArray(notifications.Select(n => Mapper.Map(n))));
            }

            var waitUntil = DateTime.UtcNow.AddSeconds(Math.Min(_maxWaitTimeout, waitTimeout ?? _defaultWaitTimeout));

            while (true)
            {
                using (var waiterHandle = _notificationByDeviceIdWaiter.BeginWait(device.ID))
                {
                    var notifications = DataContext.DeviceNotification.GetByDevice(device.ID, start, null);
                    if (notifications != null && notifications.Any())
                    {
                        return(new JArray(notifications.Select(n => Mapper.Map(n))));
                    }

                    var now = DateTime.UtcNow;
                    if (now >= waitUntil || !waiterHandle.Handle.WaitOne(waitUntil - now))
                    {
                        return(new JArray());
                    }
                }
            }
        }
Beispiel #3
0
        public JObject Get(Guid deviceGuid, int id, int?waitTimeout = null)
        {
            var device = DataContext.Device.Get(deviceGuid);

            if (device == null || !IsNetworkAccessible(device.NetworkID))
            {
                ThrowHttpResponse(HttpStatusCode.NotFound, "Device not found!");
            }

            var command = DataContext.DeviceCommand.Get(id);

            if (command == null || command.DeviceID != device.ID)
            {
                ThrowHttpResponse(HttpStatusCode.NotFound, "Device command not found!");
            }

            if (command.Status != null)
            {
                return(Mapper.Map(command));
            }

            if (waitTimeout <= 0)
            {
                return(null);
            }

            var waitUntil = DateTime.UtcNow.AddSeconds(Math.Min(_maxWaitTimeout, waitTimeout ?? _defaultWaitTimeout));

            while (true)
            {
                using (var waiterHandle = _commandByCommandIdWaiter.BeginWait(id))
                {
                    command = DataContext.DeviceCommand.Get(id);
                    if (command != null && command.Status != null)
                    {
                        return(Mapper.Map(command));
                    }

                    var now = DateTime.UtcNow;
                    if (now >= waitUntil || !waiterHandle.Handle.WaitOne(waitUntil - now))
                    {
                        return(null);
                    }
                }
            }
        }
        public async Task <JObject> Get(string deviceGuid, int id, int?waitTimeout = null)
        {
            var device = GetDeviceEnsureAccess(deviceGuid);

            var command = DataContext.DeviceCommand.Get(id);

            if (command == null || command.DeviceID != device.ID)
            {
                ThrowHttpResponse(HttpStatusCode.NotFound, "Device command not found!");
            }

            if (command.Status != null)
            {
                return(Mapper.Map(command));
            }

            if (waitTimeout <= 0)
            {
                return(null);
            }

            var config    = DeviceHiveConfiguration.RestEndpoint;
            var delayTask = Task.Delay(1000 * Math.Min(config.CommandPollMaxInterval, waitTimeout ?? config.CommandPollDefaultInterval));

            using (var waiterHandle = _commandByCommandIdWaiter.BeginWait(new object[] { id }, null))
            {
                do
                {
                    command = DataContext.DeviceCommand.Get(id);
                    if (command != null && command.Status != null)
                    {
                        return(Mapper.Map(command));
                    }
                }while (await Task.WhenAny(waiterHandle.Wait(), delayTask) != delayTask);
            }

            return(null);
        }