diff --git a/src/firmware/bootloaderInstructions/BootloaderInstructions.tsx b/src/firmware/bootloaderInstructions/BootloaderInstructions.tsx index 6f68ced3c..0edd5fdde 100644 --- a/src/firmware/bootloaderInstructions/BootloaderInstructions.tsx +++ b/src/firmware/bootloaderInstructions/BootloaderInstructions.tsx @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// Copyright (c) 2022-2025 The Pybricks Authors +// Copyright (c) 2022-2026 The Pybricks Authors import './bootloaderInstructions.scss'; import { Callout, Intent } from '@blueprintjs/core'; @@ -19,6 +19,8 @@ import cityHubMp4 from './assets/bootloader-cityhub-540.mp4'; import cityHubVtt from './assets/bootloader-cityhub-metadata.vtt'; import essentialHubMp4 from './assets/bootloader-essentialhub-540.mp4'; import essentialHubVtt from './assets/bootloader-essentialhub-metadata.vtt'; +import ev3BrickMp4 from './assets/bootloader-ev3brick-540.mp4'; +import ev3BrickVtt from './assets/bootloader-ev3brick-metadata.vtt'; import inventorHubMp4 from './assets/bootloader-inventorhub-540.mp4'; import inventorHubVtt from './assets/bootloader-inventorhub-metadata.vtt'; import moveHubMp4 from './assets/bootloader-movehub-540.mp4'; @@ -54,6 +56,7 @@ type BootloaderInstructionsProps = { const bootloaderDeviceNameMap: ReadonlyMap = new Map([ [Hub.City, 'LEGO Bootloader'], [Hub.Essential, 'LEGO Technic Small Hub in DFU Mode'], + [Hub.EV3, 'LEGO EV3 Firmware Update'], [Hub.Inventor, 'LEGO Technic Large Hub in DFU Mode'], [Hub.Move, 'LEGO Bootloader'], [Hub.Prime, 'LEGO Technic Large Hub in DFU Mode'], @@ -63,6 +66,7 @@ const bootloaderDeviceNameMap: ReadonlyMap = new Map([ const videoFileMap: ReadonlyMap = new Map([ [Hub.City, cityHubMp4], [Hub.Essential, essentialHubMp4], + [Hub.EV3, ev3BrickMp4], [Hub.Inventor, inventorHubMp4], [Hub.Move, moveHubMp4], [Hub.Prime, primeHubMp4], @@ -72,6 +76,7 @@ const videoFileMap: ReadonlyMap = new Map([ const metadataFileMap: ReadonlyMap = new Map([ [Hub.City, cityHubVtt], [Hub.Essential, essentialHubVtt], + [Hub.EV3, ev3BrickVtt], [Hub.Inventor, inventorHubVtt], [Hub.Move, moveHubVtt], [Hub.Prime, primeHubVtt], @@ -81,6 +86,7 @@ const metadataFileMap: ReadonlyMap = new Map([ const recoveryVideoFileMap: ReadonlyMap = new Map([ [Hub.City, cityHubRecoveryMp4], [Hub.Essential, essentialHubMp4], + [Hub.EV3, ev3BrickMp4], [Hub.Inventor, inventorHubMp4], [Hub.Move, moveHubRecoveryMp4], [Hub.Prime, primeHubMp4], @@ -90,6 +96,7 @@ const recoveryVideoFileMap: ReadonlyMap = new Map([ const recoveryMetadataFileMap: ReadonlyMap = new Map([ [Hub.City, cityHubRecoveryVtt], [Hub.Essential, essentialHubVtt], + [Hub.EV3, ev3BrickVtt], [Hub.Inventor, inventorHubVtt], [Hub.Move, moveHubRecoveryVtt], [Hub.Prime, primeHubVtt], @@ -186,12 +193,6 @@ const BootloaderInstructions: React.FunctionComponent )} - - {hubType === Hub.EV3 && ( -
  • - {i18n.translate('instructionGroup.bootloaderMode.connectUsb')} -
  • - )} ), [i18n, recovery, hubType], @@ -314,6 +315,16 @@ const BootloaderInstructions: React.FunctionComponent )} + + {hubType === Hub.EV3 && hubHasUSB(hubType) && ( +
  • + {i18n.translate('instructionGroup.bootloaderMode.connectUsb')} +
  • + )} ), [recovery, activeStep, i18n, button, hubType, light, lightPattern], @@ -377,7 +388,7 @@ const BootloaderInstructions: React.FunctionComponent - {hubType === Hub.EV3 && ( + {hubType === Hub.EV3 && recovery && (
  • {i18n.translate( 'instructionGroup.connect.selectEV3FirmwareType', diff --git a/src/firmware/bootloaderInstructions/assets/bootloader-ev3brick-540.mp4 b/src/firmware/bootloaderInstructions/assets/bootloader-ev3brick-540.mp4 new file mode 100644 index 000000000..554bb2939 Binary files /dev/null and b/src/firmware/bootloaderInstructions/assets/bootloader-ev3brick-540.mp4 differ diff --git a/src/firmware/bootloaderInstructions/assets/bootloader-ev3brick-metadata.vtt b/src/firmware/bootloaderInstructions/assets/bootloader-ev3brick-metadata.vtt new file mode 100644 index 000000000..c21ad7d3e --- /dev/null +++ b/src/firmware/bootloaderInstructions/assets/bootloader-ev3brick-metadata.vtt @@ -0,0 +1,15 @@ +WEBVTT + +hold-button +00:00.100 --> 00:02.200 + +press-power-button +00:02.200 --> 00:05.210 + +release-button +00:05.210 --> 00:08.010 + +connect-usb +00:08.010 --> 00:11.200 + +