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