예제 #1
0
        private bool BootloaderUpdateFirmware(FirmwareDetails firmwareDetails)
        {
            var flag = true;

            if ((CurrentBootloaderStep == BootloaderController.BootLoaderStep.ForceFirmwareUpdate || CurrentBootloaderStep == BootloaderController.BootLoaderStep.UpdateFirmware || MyPrinterInfo.FirmwareIsInvalid) && !string.IsNullOrEmpty(firmwareDetails.embedded_firmware))
            {
                Stream manifestResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(firmwareDetails.embedded_firmware);
                if (manifestResourceStream == null)
                {
                    WriteLog("Embedded Firmware Resource Not Found", Logger.TextType.Error);
                    flag = true;
                }
                else
                {
                    try
                    {
                        byte[] firmwareBytesFromStream = GetFirmwareBytesFromStream(manifestResourceStream, MyPrinterProfile.ProductConstants.m_uFirmwareMaxSizeBytes);
                        Status = PrinterStatus.Bootloader_UpdatingFirmware;
                        WriteFirmwareVersionToEEPROM(0U, 0U);
                        m_oBootloaderConnection.UploadNewFirmware(firmwareBytesFromStream, firmwareDetails.firmware_crc);
                        CheckEEPROMValuesAfterUpdate();
                        WriteFirmwareVersionToEEPROM(firmwareDetails.firmware_version, firmwareDetails.firmware_crc);
                        ValidateCRCWithPrinter(firmwareDetails.firmware_crc);
                        flag = false;
                    }
                    catch (Exception ex)
                    {
                        WriteLog(string.Format("Error updating firmware:{0}", ex.Message), Logger.TextType.Error);
                        Status = PrinterStatus.Bootloader_FirmwareUpdateFailed;
                        flag   = true;
                    }
                }
            }
            return(flag);
        }
예제 #2
0
        private BootloaderController.FirmwareStatus BootloadCheckFirmware(FirmwareDetails firmwareDetails, uint firmwareVersionFromEEPROM, uint firmwareCRCFromEEPROM)
        {
            var flag1 = firmwareVersionFromEEPROM < 150994944U;

            try
            {
                ValidateCRCWithPrinter(firmwareCRCFromEEPROM);
            }
            catch (Exception ex)
            {
                WriteLog(ex.Message, Logger.TextType.Error);
                if (ex.Message == "Firmware failed redundancy check.")
                {
                    flag1 = true;
                }
                else if (ex.Message == "Unsupported Bootloader Interface")
                {
                    throw ex;
                }
            }
            var flag2 = SpoolerServer.CHECK_INCOMPATIBLE_FIRMWARE && (int)firmwareVersionFromEEPROM != (int)firmwareDetails.firmware_version;

            if (!(flag1 | flag2))
            {
                return(BootloaderController.FirmwareStatus.Good);
            }

            Status = PrinterStatus.Bootloader_InvalidFirmware;
            return(BootloaderController.FirmwareStatus.Bad);
        }
예제 #3
0
        private bool QuitBootloaderAndGotoApp()
        {
            var flag = true;

            foreach (KeyValuePair <char, FirmwareDetails> firmware in MyPrinterProfile.ProductConstants.FirmwareList)
            {
                FirmwareDetails firmwareDetails = firmware.Value;
                var             key             = firmware.Key;
                if (mCheckedFirmwareStatus.ContainsKey(key))
                {
                    switch (mCheckedFirmwareStatus[key])
                    {
                    case BootloaderController.FirmwareStatus.Unknown:
                    case BootloaderController.FirmwareStatus.Good:
                        if (mInterfaceVersion == BootloaderController.BootloaderInterfaceVersion.V2)
                        {
                            SetBootloader(key);
                            if (key != 'M')
                            {
                                flag = QuitSecondaryBootloader();
                                break;
                            }
                            break;
                        }
                        break;

                    case BootloaderController.FirmwareStatus.GoodQuit:
                        continue;

                    default:
                        flag = false;
                        break;
                    }
                    if (flag)
                    {
                        mCheckedFirmwareStatus[key] = BootloaderController.FirmwareStatus.GoodQuit;
                    }
                    else
                    {
                        mCheckedFirmwareStatus[key] = BootloaderController.FirmwareStatus.Bad;
                        return(false);
                    }
                }
            }
            broadcast_shutdown = false;
            m_oBootloaderConnection.FlushIncomingBytes();
            WriteLog("<< Q", Logger.TextType.Write);
            if (!m_oBootloaderConnection.JumpToApplication())
            {
                return(false);
            }

            Status = PrinterStatus.Error_PrinterNotAlive;
            return(true);
        }
예제 #4
0
        private void UpdateFirmwareStep()
        {
            var flag = false;

            foreach (KeyValuePair <char, FirmwareDetails> firmware in MyPrinterProfile.ProductConstants.FirmwareList)
            {
                FirmwareDetails firmwareDetails = firmware.Value;
                var             key             = firmware.Key;
                if (!mCheckedFirmwareStatus.ContainsKey(key) || mCheckedFirmwareStatus[key] != BootloaderController.FirmwareStatus.Good && mCheckedFirmwareStatus[key] != BootloaderController.FirmwareStatus.GoodQuit)
                {
                    if (mInterfaceVersion == BootloaderController.BootloaderInterfaceVersion.V2)
                    {
                        SetBootloader(key);
                    }

                    try
                    {
                        var stopwatch = new Stopwatch();
                        stopwatch.Reset();
                        stopwatch.Start();
                        flag = BootloaderUpdateFirmware(firmwareDetails);
                        stopwatch.Stop();
                        WriteLog("<< time: " + stopwatch.Elapsed, Logger.TextType.Write);
                    }
                    catch (Exception ex)
                    {
                        ErrorLogger.LogException("Exception in BootloaderConnection.DoBootLoop " + ex.Message, ex);
                        flag = true;
                    }
                    if (!flag)
                    {
                        mCheckedFirmwareStatus[key] = BootloaderController.FirmwareStatus.Good;
                    }

                    if (flag)
                    {
                        break;
                    }
                }
            }
            if (flag)
            {
                BroadcastServer.BroadcastMessage(new SpoolerMessage(MessageType.FirmwareUpdateFailed, MySerialNumber, "null").Serialize());
                CurrentBootloaderStep = BootloaderController.BootLoaderStep.Waiting;
                Status = PrinterStatus.Bootloader_FirmwareUpdateFailed;
            }
            else
            {
                BroadcastServer.BroadcastMessage(new SpoolerMessage(MessageType.FirmwareUpdateComplete, MySerialNumber, "null").Serialize());
                CurrentBootloaderStep = BootloaderController.BootLoaderStep.GotoApp;
            }
        }
예제 #5
0
        private void CheckFirmwareStep()
        {
            foreach (KeyValuePair <char, FirmwareDetails> firmware in MyPrinterProfile.ProductConstants.FirmwareList)
            {
                var             key             = firmware.Key;
                FirmwareDetails firmwareDetails = firmware.Value;
                if (mInterfaceVersion == BootloaderController.BootloaderInterfaceVersion.V2)
                {
                    SetBootloader(key);
                }

                var eepromMapping = new EEPROMMapping(m_oBootloaderConnection.ReadAllReadableEEPROM(), MyPrinterProfile.EEPROMConstants);
                var uint32_1      = eepromMapping.GetUInt32("FirmwareVersion");
                var uint32_2      = eepromMapping.GetUInt32("FirmwareCRC");
                BootloaderController.FirmwareStatus firmwareStatus = BootloadCheckFirmware(firmwareDetails, uint32_1, uint32_2);
                if (mCheckedFirmwareStatus.ContainsKey(key))
                {
                    mCheckedFirmwareStatus[key] = firmwareStatus;
                }
                else
                {
                    mCheckedFirmwareStatus.Add(key, firmwareStatus);
                }
            }
            var bFirmwareIsInvalid = false;

            foreach (KeyValuePair <char, BootloaderController.FirmwareStatus> checkedFirmwareStatu in mCheckedFirmwareStatus)
            {
                if (BootloaderController.FirmwareStatus.Bad == checkedFirmwareStatu.Value)
                {
                    bFirmwareIsInvalid = true;
                    break;
                }
            }
            SetNextActionFromFirmwareStatus(bFirmwareIsInvalid);
        }
        public void ShowFirmwareDetails(string args)
        {
            FirmwareDetails firmwareDetails = SomneoApiClient.GetFirmwareDetails();

            if (firmwareDetails == null)
            {
                Console.WriteLine("Unable to retrieve the firmware details.");
                return;
            }

            StringBuilder consoleMessageBuilder = new StringBuilder();

            consoleMessageBuilder.Append(
                $@"Firmware details:
  Name: {firmwareDetails.Name}
  Version: {firmwareDetails.Version}
  State: {firmwareDetails.State}");

            if (!firmwareDetails.IsIdle)
            {
                consoleMessageBuilder.Append(
                    $@"
  Update progress: {firmwareDetails.Progress}
  Status message: {firmwareDetails.StatusMessage}");
            }

            if (firmwareDetails.CanUpgrade)
            {
                consoleMessageBuilder.Append(
                    $@"
  Available upgrade: {firmwareDetails.Upgrade}
  Mandatory: {(firmwareDetails.Mandatory ? "Yes" : "No")}");
            }

            Console.WriteLine(consoleMessageBuilder);
        }
예제 #7
0
        private void BootLoaderStartup()
        {
            FirmwareDetails firmware = MyPrinterProfile.ProductConstants.FirmwareList['M'];

            if (mInterfaceVersion == BootloaderController.BootloaderInterfaceVersion.V2)
            {
                SetBootloader('M');
            }

            MyPrinterInfo.hardware.machine_type = "The_Micro";
            var eepromMapping = new EEPROMMapping(m_oBootloaderConnection.ReadAllReadableEEPROM(), MyPrinterProfile.EEPROMConstants);
            var flag          = false;
            var str           = "";

            byte[] bytesFromLocation = eepromMapping.GetBytesFromLocation("SerialNumber", 16);
            for (var index = 0; index < 16; ++index)
            {
                if (bytesFromLocation[index] == byte.MaxValue)
                {
                    flag = true;
                }

                str += ((char)bytesFromLocation[index]).ToString();
            }
            if (flag)
            {
                BroadcastServer.BroadcastMessage(new SpoolerMessage(MessageType.UserDefined, MySerialNumber, "There was a major error in your printer. Please reset the printer. If the problem persist, contact M3D.").Serialize());
                Status = PrinterStatus.Error_PrinterNotAlive;
            }
            else
            {
                MySerialNumber = new PrinterSerialNumber(str);
                foreach (IFirstRunUpdater updater in MyPrinterProfile.FirstRunConstants.updater_list)
                {
                    updater.CheckForUpdate(str, eepromMapping.GetAllEEPROMData(), m_oBootloaderConnection, MyPrinterProfile);
                }

                logger.ResetWithSerialNumber(MySerialNumber.ToString());
                LoadPersistantData();
                PersistantDetails.hours_used     = eepromMapping.GetFloat("HoursCounterSpooler");
                HardwareDetails.firmware_version = eepromMapping.GetUInt32("FirmwareVersion");
                PersistantData.RestartOptions restartOptions = PersistantDetails.PopRestartAction();
                SavePersistantData();
                CurrentBootloaderStep = BootloaderController.BootLoaderStep.CheckFirmware;
                if (restartOptions.RestartAction == PersistantData.RestartAction.SetExtruderCurrent)
                {
                    SetExtruderCurrent((ushort)restartOptions.RestartActionParam);
                }
                else if (restartOptions.RestartAction == PersistantData.RestartAction.SetFan)
                {
                    SetFanConstants((FanConstValues.FanType)restartOptions.RestartActionParam);
                }
                else if (restartOptions.RestartAction == PersistantData.RestartAction.ForceStayBootloader)
                {
                    Status = PrinterStatus.Bootloader_Ready;
                    CurrentBootloaderStep = BootloaderController.BootLoaderStep.Waiting;
                }
                else
                {
                    if (restartOptions.RestartAction != PersistantData.RestartAction.ForceUpdateFirmware)
                    {
                        return;
                    }

                    CurrentBootloaderStep = BootloaderController.BootLoaderStep.ForceFirmwareUpdate;
                }
            }
        }