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()); } } } }
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); }