示例#1
0
        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);
        }
示例#2
0
        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;
            }
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
 abstract protected Task <bool> OnLeaveStateProc(DMTaskState state, ITransport transport);