From 00516f2a39645ad52d0522b5932e2724ab6cdb01 Mon Sep 17 00:00:00 2001 From: Attila Farago Date: Sat, 30 Aug 2025 22:42:40 +0000 Subject: [PATCH] firmware/installPybricksDialog: finish EV3 implementation Add missing bits to get firmware flashing on EV3 working. Currently requires custom firmware since we don't have a packaged one yet. --- .../InstallPybricksDialog.tsx | 4 ++++ src/firmware/installPybricksDialog/index.ts | 1 + src/firmware/sagas.ts | 21 +++++++++++++++++-- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/firmware/installPybricksDialog/InstallPybricksDialog.tsx b/src/firmware/installPybricksDialog/InstallPybricksDialog.tsx index d4725a9b..810df008 100644 --- a/src/firmware/installPybricksDialog/InstallPybricksDialog.tsx +++ b/src/firmware/installPybricksDialog/InstallPybricksDialog.tsx @@ -72,6 +72,8 @@ function getHubTypeFromMetadata( return Hub.Prime; case HubType.EssentialHub: return Hub.Essential; + case HubType.EV3: + return Hub.EV3; default: return fallback; } @@ -89,6 +91,8 @@ function getHubTypeNameFromMetadata(metadata: FirmwareMetadata | undefined): str return 'SPIKE Prime/MINDSTORMS Robot Inventor hub'; case HubType.EssentialHub: return 'SPIKE Essential hub'; + case HubType.EV3: + return 'MINDSTORMS EV3 hub'; default: return '?'; } diff --git a/src/firmware/installPybricksDialog/index.ts b/src/firmware/installPybricksDialog/index.ts index 129c51fe..7b83d51b 100644 --- a/src/firmware/installPybricksDialog/index.ts +++ b/src/firmware/installPybricksDialog/index.ts @@ -37,6 +37,7 @@ const supportHubs: readonly HubType[] = [ HubType.TechnicHub, HubType.PrimeHub, HubType.EssentialHub, + HubType.EV3, ]; export function validateMetadata(metadata: FirmwareMetadata) { diff --git a/src/firmware/sagas.ts b/src/firmware/sagas.ts index 214f5b03..d4c3f469 100644 --- a/src/firmware/sagas.ts +++ b/src/firmware/sagas.ts @@ -935,8 +935,25 @@ function* handleInstallPybricks(): Generator { } break; case 'usb-ev3': - // TODO: implement flashing via EV3 USB - console.error('Flashing via EV3 USB is not implemented yet'); + try { + const { firmware } = yield* loadFirmware( + accepted.firmwareZip, + accepted.hubName, + ); + + yield* put(firmwareFlashEV3(firmware.buffer as ArrayBuffer)); + } catch (err) { + // istanbul ignore if + if (process.env.NODE_ENV !== 'test') { + console.error(err); + } + + yield* put( + alertsShowAlert('alerts', 'unexpectedError', { + error: ensureError(err), + }), + ); + } break; } }