Exemplo n.º 1
0
    private void Update()
    {
        if (CurrentState != NextState)
        {
            UpdateStateDelegate = null;
            FinishStateDelegate?.Invoke();
            FinishStateDelegate = null;

            CurrentState = NextState;

            StartEvents();

            StartStateDelegate?.Invoke();
            StartStateDelegate = null;
            OnStartState?.Invoke(CurrentState);

            return;
        }

        UpdateStateDelegate?.Invoke();
    }
Exemplo n.º 2
0
        public bool FwUpdate(UpdateStateDelegate handler, string fileName, bool programWrite = true, bool programVerify = true, bool programStart = true, string password = "******")
        {
            try
            {
                handler?.Invoke(UpdateState.ReadHex);
                byte[] buffer = new byte[MaximumBufferSize];
                if (!LoadProgramFile(fileName, buffer, out uint updateBufferUsed))
                {
                    return(false);
                }

                handler?.Invoke(UpdateState.Connect);
                if (!Connect(password, out bool oneWireMode))
                {
                    return(false);
                }

                _failureAddress = 0;
                _oneWire        = oneWireMode;

                bool supportsCrc = DetectSupport(CommandProgramCheckCRC);
                ResetCrc();
                bool supportsVerify = DetectSupport(CommandProgramVerify);

                string deviceRevision = ReadRevisionInfo();
                if (string.IsNullOrEmpty(deviceRevision))
                {
                    return(false);
                }

                if (string.Compare(deviceRevision, ValidBootloader, StringComparison.OrdinalIgnoreCase) != 0)
                {
                    return(false);
                }

                string deviceSignature = ReadSignatureInfo();
                if (string.IsNullOrEmpty(deviceSignature))
                {
                    return(false);
                }

                string deviceName = GetDeviceName(deviceSignature);
                if (string.IsNullOrEmpty(deviceName))
                {
                    return(false);
                }

                long deviceFlashSize = ReadFlashSizeInfo();
                if (deviceFlashSize < 0)
                {
                    return(false);
                }

                if (deviceFlashSize > buffer.Length)
                {
                    return(false);
                }

                if (deviceFlashSize < updateBufferUsed)
                {
                    return(false);
                }

                long deviceWriteBuffer = ReadBufferSizeInfo();
                if (deviceWriteBuffer < MinimumWriteBuffer)
                {
                    return(false);
                }

                if (supportsCrc)
                {
                    if (!CheckCrc())
                    {
                        return(false);
                    }
                }

                if (programWrite)
                {
                    handler?.Invoke(UpdateState.Update);
                    if (!WriteFirmware(buffer, (int)updateBufferUsed, (int)deviceWriteBuffer))
                    {
                        return(false);
                    }
                }

                if (programVerify && supportsVerify)
                {
                    handler?.Invoke(UpdateState.Verify);
                    if (!VerifyFirmware(buffer, (int)updateBufferUsed))
                    {
                        return(false);
                    }
                }

                if (supportsCrc)
                {
                    if (!CheckCrc())
                    {
                        return(false);
                    }
                }

                if (programStart)
                {
                    handler?.Invoke(UpdateState.StartFw);
                    if (!StartFirmware())
                    {
                        return(false);
                    }
                }

                Thread.Sleep(500);

                return(true);
            }
            catch (Exception)
            {
                return(false);
            }
        }