protected override async Task <bool> OnLeaveStateProc(DMTaskState state, ITransport transport) { var report = new TwinCollection(); switch (state) { case DMTaskState.DM_IDLE: report = null; // No report for leaving idle state break; case DMTaskState.CU_PENDING: report = null; // No report for leaving pending state break; case DMTaskState.CU_DOWNLOADING: report.Set(LogPath, _logBuilder.Append($"Downloaded({(int)_watch.Elapsed.TotalSeconds}s)")); break; case DMTaskState.CU_APPLYING: report.Set(LogPath, _logBuilder.Append($"Applied({(int)_watch.Elapsed.TotalSeconds}s)")); break; default: throw new ArgumentOutOfRangeException(nameof(state)); } if (report != null) { await transport.UpdateReportedPropertiesAsync(report); } return(true); }
public async Task Run(ITransport transport) { DMTaskState state = _steps.First().CurrentState; while (true) { if (!await OnEnterStateProc(state, transport)) { break; } var step = _steps.SingleOrDefault(s => s.CurrentState == state); if (step == null) { break; } await Task.Delay(step.ExecuteTime); if (!await OnLeaveStateProc(state, transport)) { break; } state = step.NextState; } }
protected override async Task <bool> OnEnterStateProc(DMTaskState state, ITransport transport) { bool succeed = true; var report = new TwinCollection(); string status; switch (state) { case DMTaskState.CU_PENDING: report = null; // No report for entering pending state break; case DMTaskState.CU_DOWNLOADING: _watch = Stopwatch.StartNew(); succeed = Version != "downloadFail"; status = succeed ? "Downloading" : "Dowload failed"; report.Set(LogPath, _logBuilder.Append(status, succeed)); break; case DMTaskState.CU_APPLYING: _watch = Stopwatch.StartNew(); succeed = Version != "applyFail"; status = succeed ? "Applying" : "Apply failed"; report.Set(LogPath, _logBuilder.Append(status, succeed)); break; case DMTaskState.DM_IDLE: report.Set(DeviceBase.ConfigurationVersionPropertyName, Version); break; default: throw new ArgumentOutOfRangeException(nameof(state)); } if (report != null) { await transport.UpdateReportedPropertiesAsync(report); } return(succeed); }
protected override async Task <bool> OnLeaveStateProc(DMTaskState state, ITransport transport) { var report = new TwinCollection(); switch (state) { case DMTaskState.DM_IDLE: report = null; // No report for leaving idle state break; case DMTaskState.FU_PENDING: report = null; // No report for leaving pending state break; case DMTaskState.FU_DOWNLOADING: BuildReport(report, "Download", Complete); break; case DMTaskState.FU_APPLYING: BuildReport(report, "Applied", Complete); break; case DMTaskState.FU_REBOOTING: BuildReport(report, "Reboot", Complete); break; default: throw new ArgumentOutOfRangeException(nameof(state)); } if (report != null) { await transport.UpdateReportedPropertiesAsync(report); } return(true); }
protected override async Task <bool> OnEnterStateProc(DMTaskState state, ITransport transport) { bool succeed = true; var report = new TwinCollection(); switch (state) { case DMTaskState.FU_PENDING: var clear = new TwinCollection(); clear.Set(ReportPrefix, null); await transport.UpdateReportedPropertiesAsync(clear); _masterWatch = Stopwatch.StartNew(); _stepWatch = Stopwatch.StartNew(); BuildReport(report, Running); break; case DMTaskState.FU_DOWNLOADING: _stepWatch = Stopwatch.StartNew(); try { using (var client = new HttpClient()) { FirmwareVersion = (await client.GetStringAsync(Uri)).Trim(); } } catch { succeed = false; } BuildReport(report, "Download", succeed ? Running : Failed); break; case DMTaskState.FU_APPLYING: _stepWatch = Stopwatch.StartNew(); succeed = FirmwareVersion != "applyFail"; BuildReport(report, "Applied", succeed ? Running : Failed); break; case DMTaskState.FU_REBOOTING: _stepWatch = Stopwatch.StartNew(); succeed = FirmwareVersion != "rebootFail"; BuildReport(report, "Reboot", succeed ? Running : Failed); break; case DMTaskState.DM_IDLE: BuildReport(report, Complete); report.Set(DeviceBase.StartupTimePropertyName, DateTime.UtcNow.ToString()); report.Set(DeviceBase.FirmwareVersionPropertyName, FirmwareVersion); break; default: throw new ArgumentOutOfRangeException(nameof(state)); } if (report != null) { await transport.UpdateReportedPropertiesAsync(report); } return(succeed); }
abstract protected Task <bool> OnLeaveStateProc(DMTaskState state, ITransport transport);