private async Task <IEnumerable <DeviceStateAttemptResult> > ResolveAsync(IEnumerable <IDeviceAdapter> devices, CancellationToken token) { List <DeviceStateAttemptResult> results = new List <DeviceStateAttemptResult>(); try { foreach (var device in devices) { token.ThrowIfCancellationRequested(); DeviceStateAttempt attempt = null; if (_attempts.CanAttemptCommand(device.Code.DeviceType, device.State, out attempt) && device.RecentCommandExecution.IsWorking == false) { _logger.Info(LogHelper.Prepare($"Device: {device.Code.DeviceType.Code}, State: {attempt.TargetState}, Attempts: {attempt.Attempts}")); DeviceStateAttemptResult result = await AttemptDeviceToStateAsync(device, attempt.TargetState, token); attempt.AddResult(result.Result); results.Add(result); } } } catch (OperationCanceledException) { _logger.Info(LogHelper.Prepare("Cancelled")); } return(results); }
public void DisableAttempt(DeviceType device) { DeviceStateAttempt attempt = null; if (_attempts.TryGetValue(device, out attempt)) { attempt.IsEnabled = false; } }
public DeviceStateAttempt SetAttempt(DeviceType device, DeviceState state) { DeviceStateAttempt attempt; if (_attempts.TryGetValue(device, out attempt)) { attempt.TargetState = state; } else { attempt = new DeviceStateAttempt(state); _attempts.TryAdd(device, attempt); } attempt.IsEnabled = true; return(attempt); }
public bool CanAttemptCommand(DeviceType device, DeviceState state, out DeviceStateAttempt attempt) { return(_attempts.TryGetValue(device, out attempt) && attempt.IsEnabled && attempt.TargetState != state); }