100 Commits
Author SHA1 Message Date
David Lechner 529ae9e1bf github: include date in version for labs build
Make labs version a bit easier to identify by also including the build date.
2026-01-25 17:05:21 -06:00
David Lechner d629c225f0 app: update copyright year to 2026 2026-01-25 17:05:21 -06:00
David Lechner 86e08e4c94 alerts/UnexpectedErrorAlert: expand the message
Expand the unexpected error alert message to include instructions on
what information to provide to make a useful bug report.
2026-01-25 16:53:39 -06:00
David Lechner ed886745ff usb/sagas: show unexpected error alerts
Add more error alerts when failing to connect to a Pybricks hub over USB.
We will need user feedback on what triggered the error to be able to
write a helpful error message, so we are using the unexpected error
alert for now.
2026-01-25 16:53:39 -06:00
David Lechner 209b7ef974 usb: show error message if opening device fails
So far, we've just seen this on Linux when the user doesn't have the
correct udev rules installed. We'll have to wait for more user feedback
to see what other situations might cause this.
2026-01-25 16:53:39 -06:00
David Lechner b6cf5e8491 usb: implement AlreadyInUse alert
Add an alert that notifies the user when the USB device is already in
use by another application.

Closes: https://github.com/pybricks/support/issues/2373
2026-01-25 16:53:39 -06:00
David Lechner 457fa8b6b2 usb/sagas: Fix command response race condition
Fix a race condition where a response to a USB command could be missed
if it arrives before the USB transferOut() call returns. This is done
by using a channel to buffer incoming responses.

Fixes: https://github.com/pybricks/support/issues/2467
2026-01-25 14:30:05 -06:00
David Lechner fa275b8000 github: upload build artifact
Add a step to upload the build artifact after building the project.

This will make it easy for people to test it without having to build it
themselves.
2026-01-25 14:30:05 -06:00
David Lechner 368ab7cb96 usb/sagas: Retry USB device open on Linux if SecurityError occurs
On slow machines, udev rules may not have finished processing by the time
we try to open the USB device. This causes a SecurityError, so we add a
retry loop to handle this case.

Closes: https://github.com/pybricks/support/issues/2372
2026-01-25 14:30:05 -06:00
David Lechner 7a415e7c85 firmware/ev3: pad firmware to avoid bugs
Add a function to pad EV3 firmware size to avoid potentially triggering
bugs in the EV3 bootloader. When we do a download command with too small
of a payload, the bootloader can send a bad response. We can work around
this by ensuring that the firmware size is such that the last chunk is
the maximum size. This way we never send a small chunk that could
trigger the bug.
2026-01-24 16:16:02 -06:00
David Lechner 38bb4f3092 firmware/ev3: add extra progress report
Add an extra progress between erasing and writing. This makes the
progress not stall for quite as long before progressing when flashing
smaller firmwares.
2026-01-24 16:16:02 -06:00
David Lechner 055d2c8ca8 firmware/ev3: erase 2 sectors at one time
Change from erasing 1 sector at a time to erasing 2 sectors at a time.
This works around a USB issue where commands that don't take long to
execute can receive an incorrect response.

The point of erasing 2 sectors at a time is that when we write the data
to the sectors that we just erased, the last (partial) chunk of data is
now twice as large, which makes it take twice as long to write. This
seems to be long enough to avoid the USB issue.
2026-01-24 16:16:02 -06:00
David Lechner 04697e9afa firmware/ev3: allow buggy replies from EV3 bootloader
Add a hack to not fail if the EV3 bootloader sends an echo of the request
instead of the expected response. There is a known compatibility issue
with the EV3 bootloader USB and, e.g. Windows with USB 3.0 ports. This
apparently causes a race condition where commands that don't take long
to process before sending a response will have the request echoed back
instead of receiving the actual response. If this happens, we can
ignore it and assume the command was successful. It just won't work, e.g.
for the version command since that has a payload in the response.
2026-01-24 16:16:02 -06:00
David Lechner a4aade5a29 firmware/actions: remove didStart and didFinish actions
Remove didStart and didFinish actions from firmware flashing sagas as
they are not used for anything.

didFailToFinish is not so easily removed as it is used to trigger error
toasts.
2026-01-04 17:27:08 -06:00
David Lechner 7fe080bf1a firmware/reducers: remove 'flashing' state
The 'flashing' state variable in the firmware reducer is not used
anymore so can be removed.
2026-01-04 17:27:08 -06:00
David Lechner 6911bdd3da firmware/sagas: fix duplicate error alerts for ev3 flashing
Remove alertsShowAlert() calls. didFailToFinish() already triggers
an error toast.
2026-01-04 17:27:08 -06:00
David Lechner 71a6727a8f firmware/actions: reuse isError from utils
Remove duplicate isError function.
2026-01-04 17:27:08 -06:00
David Lechner 0d0e366cba firmware/sagas: fix progress toasts not being removed on error
Add some calls to hide the progress toasts when an error occurs during
firmware flashing. Without this, the toasts would remain visible even
after the error alert was shown.
2026-01-03 21:01:53 -06:00
David Lechner 830855e428 firmware: remove progress/didProgress
Remove the didProgress action and progress state, as they were not being used.
2026-01-03 21:01:53 -06:00
David Lechner 4469e173cd firmware/sagas: add check for new SPIKE Prime bootloader version 2026-01-03 21:01:53 -06:00
David Lechner 4516cc8764 yarn: Bump @types/w3c-web-usb from 1.0.10 to 1.0.11
Patch got merged upstream, so we no longer need it.
2025-09-06 12:51:33 -04:00
David Lechner fa21abc7ec firmware/sagas: fix missing error arg when unknown reason
For some reason, the type checker doesn't catch this, but
FailToFinishReasonType.Unknown requires an error argument, otherwise
we get an unhandled exception.
2025-08-30 19:12:53 -04:00
David Lechner 84cca9d8e6 firmware/sagas: finish EV3 message ID TODO
Implement unique message ID for EV3 firmware messages.
2025-08-30 19:12:53 -04:00
David Lechner 426305116b firmware/sagas: handle case of checksum-type == 'none'
The v2.1 spec allows this, but up to now, Pybricks code didn't handle it.
2025-08-30 19:12:53 -04:00
David Lechner 6fc327a917 yarn: patch @types/w3c-web-usb
Fix issues with null vs. undefined.

Based on https://github.com/DefinitelyTyped/DefinitelyTyped/pull/73568
2025-08-30 19:12:53 -04:00
David Lechner 1f81fbb8c7 webpack: bump precache size to 16MiB for EV3 firmware 2025-08-09 21:51:47 -05:00
David Lechner c0b2c13e7c github: update codevcov action version 2025-08-09 21:51:47 -05:00
David Lechner 8365f71ca3 npx update-browserslist-db@latest 2025-08-09 21:51:47 -05:00
David Lechner 70bedecb83 firmware: implement EV3 official firmware restore
Basic support for restoring the official EV3 firmware. Is missing a video
and needs a bunch of helpful error messages, but basic functionality
is working.
2025-08-09 21:51:47 -05:00
David Lechner 007640c7b6 firmware: add UI for EV3 firmware flashing
This is just the UI bits (new file template, Pybricks firmware install,
official firmware restore).

The Pybricks firmware flashing hangs because we don't have a EV3 firmware
yet in @pybricks/firmware. Official firmware restore has an alert()
placeholder so at least it does something.
2025-08-09 21:51:47 -05:00
David Lechner 8b5cab4760 s/Web USB/WebUSB/g 2025-08-09 21:51:47 -05:00
David Lechner 5e8c8b8743 firmware: installPybricksDialog: add exception for Technic Move hub
The Technic Move hub requires signed firmware, so we cannot install
Pybricks on it.
2025-08-09 21:51:47 -05:00
David Lechner a546109273 usb: add USB support
Initial working USB support.
2025-08-08 21:36:18 -05:00
David Lechner 38db0d016c hub: move hub info reducers to hub
Most of the hub state doesn't depend on the connection type. To make it
generic, move it out of ble and into hub so that we can share it with
usb.
2025-08-08 21:36:18 -05:00
David Lechner 1fe01b5719 status-bar: make visibility depend on runtime state
Change dependency on Bluetooth connection state to runtime state. This
way it works for USB connection as well.
2025-08-08 21:36:18 -05:00
David Lechner 3c4cc20c53 ble-pybricks-service: add support for slots
The firmware has added some additional info for hubs that support slots
for user programs. Add these additional parameters accordingly.
2025-07-26 16:14:40 -05:00
David Lechner 1a7663a383 ble-pybricks-service: rename slot to progId
Rename the requested program ID from slot to progId and the running
program ID to runningProgId. These can also have the value of built-in
programs, not just slot numbers, so it doesn't make sense to call them
slots.
2025-07-26 16:14:40 -05:00
David Lechner 9e092ca469 explorer: fix tree item button translations not updating 2022-05-16 01:11:10 -05:00
David Lechner 3245fc5853 Merge pull request #431 from pybricks/dlech
add .gitattibutes
2021-05-17 14:49:32 -05:00
David Lechner b001748f95 Merge pull request #424 from pybricks/dlech
use overflow: hidden on splitter panes
2021-05-11 14:44:08 -05:00
David Lechner 877c2157c1 Merge pull request #421 from pybricks/dlech
RC1
2021-05-11 13:12:27 -05:00
David Lechner d2771aaa05 Merge pull request #414 from pybricks/dlech
bump linter version
2021-04-26 14:18:14 -05:00
David Lechner 4c802e811f Merge pull request #412 from pybricks/dlech
beta 15
2021-04-26 13:50:43 -05:00
David Lechner 0bd90e76d1 Merge pull request #404 from pybricks/dlech
beta 14
2021-04-12 16:50:42 -05:00
David Lechner 028a7dc549 Merge pull request #403 from pybricks/dlech
beta 13
2021-04-12 13:55:07 -05:00
David Lechner 800acf5081 Merge pull request #395 from pybricks/dlech
Fix <p> element on notification action
2021-04-07 13:26:50 -05:00
David Lechner a21b8e8bab Merge pull request #393 from pybricks/dlech
beta 12
2021-04-07 12:37:29 -05:00
David Lechner decf3e909d Merge pull request #391 from pybricks/dlech
beta 11
2021-04-07 11:37:59 -05:00
David Lechner 7a8dab1bb4 Merge pull request #389 from pybricks/dlech
yarn upgrade
2021-04-06 14:29:47 -05:00
David Lechner 595cb05b04 Merge pull request #388 from pybricks/dlech
beta 10
2021-04-06 13:55:49 -05:00
David Lechner 6dc700d396 Merge pull request #384 from pybricks/dlech
beta 9
2021-04-05 16:15:20 -05:00
David Lechner bbcfe4530e Merge pull request #383 from pybricks/dlech
beta 8
2021-04-02 16:13:45 -05:00
David Lechner ac07e4ba61 Merge pull request #378 from pybricks/dlech
update packages
2021-03-30 14:00:45 -05:00
David Lechner b783f7f7d9 Merge pull request #353 from pybricks/dlech
Pybricks BLE service implementation
2021-03-12 08:58:32 -06:00
David Lechner 5c6adcb851 Merge pull request #351 from pybricks/dependabot/npm_and_yarn/blueprintjs/core-3.40.1
Bump @blueprintjs/core from 3.40.0 to 3.40.1
2021-03-09 08:53:04 -06:00
David Lechner 2f4d3396a6 Merge pull request #349 from pybricks/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-4.17.0
Bump @typescript-eslint/eslint-plugin from 4.16.1 to 4.17.0
2021-03-09 08:38:57 -06:00
David Lechner 01271205d6 Merge pull request #347 from pybricks/dependabot/npm_and_yarn/types/react-16.14.5
Bump @types/react from 16.14.4 to 16.14.5
2021-03-08 09:59:10 -06:00
David Lechner 15a475a929 Merge pull request #345 from pybricks/dependabot/npm_and_yarn/typescript-4.2.3
Bump typescript from 4.2.2 to 4.2.3
2021-03-05 10:37:55 -06:00
David Lechner cfbb0dc180 Merge pull request #342 from pybricks/dependabot/npm_and_yarn/license-webpack-plugin-2.3.15
Bump license-webpack-plugin from 2.3.14 to 2.3.15
2021-03-04 11:34:24 -06:00
David Lechner f7cb54b2b3 Merge pull request #339 from pybricks/dependabot/npm_and_yarn/typescript-eslint/parser-4.16.1
Bump @typescript-eslint/parser from 4.15.2 to 4.16.1
2021-03-02 10:18:58 -06:00
David Lechner d8ba550fd5 Merge pull request #337 from pybricks/dependabot/npm_and_yarn/eslint-7.21.0
Bump eslint from 7.20.0 to 7.21.0
2021-03-01 10:07:31 -06:00
David Lechner 405bcca7dc Merge pull request #333 from pybricks/dependabot/npm_and_yarn/typescript-4.2.2
Bump typescript from 4.1.5 to 4.2.2
2021-02-24 10:05:09 -06:00
David Lechner 02f6d74471 Merge pull request #330 from pybricks/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-4.15.2
Bump @typescript-eslint/eslint-plugin from 4.15.1 to 4.15.2
2021-02-23 09:03:12 -06:00
David Lechner 9f1f371337 Merge pull request #331 from pybricks/dependabot/npm_and_yarn/typescript-eslint/parser-4.15.2
Bump @typescript-eslint/parser from 4.15.1 to 4.15.2
2021-02-23 08:52:14 -06:00
David Lechner ab8d5c923a Merge pull request #327 from pybricks/dependabot/npm_and_yarn/testing-library/dom-7.29.6
Bump @testing-library/dom from 7.29.4 to 7.29.6
2021-02-22 11:06:51 -06:00
David Lechner 1f7bab0e7e Merge pull request #326 from pybricks/dependabot/npm_and_yarn/testing-library/user-event-12.7.2
Bump @testing-library/user-event from 12.7.1 to 12.7.2
2021-02-22 10:55:56 -06:00
David Lechner 791f81ffd0 Merge pull request #325 from pybricks/dependabot/npm_and_yarn/license-webpack-plugin-2.3.14
Bump license-webpack-plugin from 2.3.13 to 2.3.14
2021-02-22 10:45:46 -06:00
David Lechner 1b1ef988f8 Merge pull request #321 from pybricks/dependabot/npm_and_yarn/shopify/react-i18n-5.2.3
Bump @shopify/react-i18n from 5.2.2 to 5.2.3
2021-02-19 11:30:41 -06:00
David Lechner 39289e4ceb Merge pull request #322 from pybricks/dependabot/npm_and_yarn/blueprintjs/core-3.39.0
Bump @blueprintjs/core from 3.38.2 to 3.39.0
2021-02-19 11:20:44 -06:00
David Lechner a4496b00b8 Merge pull request #319 from pybricks/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-4.15.1
Bump @typescript-eslint/eslint-plugin from 4.15.0 to 4.15.1
2021-02-16 15:37:59 -06:00
David Lechner 6613e28962 Merge pull request #315 from pybricks/dependabot/npm_and_yarn/testing-library/user-event-12.7.1
Bump @testing-library/user-event from 12.7.0 to 12.7.1
2021-02-15 09:06:39 -06:00
David Lechner 9314b1d3a3 Merge pull request #314 from pybricks/dependabot/npm_and_yarn/types/react-16.14.4
Bump @types/react from 16.14.3 to 16.14.4
2021-02-15 08:54:33 -06:00
David Lechner a268aff125 Merge pull request #313 from pybricks/dependabot/npm_and_yarn/types/node-12.20.1
Bump @types/node from 12.19.16 to 12.20.1
2021-02-15 08:43:58 -06:00
David Lechner 66d2fa522f Merge pull request #316 from pybricks/dependabot/npm_and_yarn/license-webpack-plugin-2.3.13
Bump license-webpack-plugin from 2.3.12 to 2.3.13
2021-02-15 08:34:14 -06:00
David Lechner 552cd345b2 Merge pull request #309 from pybricks/dependabot/npm_and_yarn/testing-library/user-event-12.7.0
Bump @testing-library/user-event from 12.6.3 to 12.7.0
2021-02-11 11:28:21 -06:00
David Lechner c7285046af Merge pull request #307 from pybricks/dependabot/npm_and_yarn/typescript-4.1.4
Bump typescript from 4.1.3 to 4.1.4
2021-02-10 10:56:36 -06:00
David Lechner 3da30dfa57 Merge pull request #305 from pybricks/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-4.15.0
Bump @typescript-eslint/eslint-plugin from 4.14.2 to 4.15.0
2021-02-09 09:14:36 -06:00
David Lechner 9f848ce872 Merge pull request #304 from pybricks/dependabot/npm_and_yarn/types/node-12.19.16
Bump @types/node from 12.19.14 to 12.19.16
2021-02-08 11:47:04 -06:00
David Lechner 0aaed76152 Merge pull request #303 from pybricks/dependabot/npm_and_yarn/types/react-16.14.3
Bump @types/react from 16.14.2 to 16.14.3
2021-02-08 11:34:27 -06:00
David Lechner 85fa8e0ad2 Merge pull request #302 from pybricks/dlech
dependabot updates
2021-02-08 11:21:35 -06:00
David Lechner 86d2317924 Merge pull request #301 from pybricks/dependabot/npm_and_yarn/jest-mock-extended-1.0.13
Bump jest-mock-extended from 1.0.10 to 1.0.13
2021-02-08 11:16:20 -06:00
David Lechner b6d5297825 Merge pull request #293 from pybricks/dependabot/npm_and_yarn/craco/craco-6.1.1
Bump @craco/craco from 6.1.0 to 6.1.1
2021-02-08 11:03:41 -06:00
David Lechner c8bcaa8546 Merge pull request #299 from pybricks/dependabot/npm_and_yarn/react-dropzone-11.3.1
Bump react-dropzone from 11.2.4 to 11.3.1
2021-02-08 10:51:17 -06:00
David Lechner 6be7d65d33 Merge pull request #297 from pybricks/dependabot/npm_and_yarn/react-scripts-4.0.2
Bump react-scripts from 4.0.1 to 4.0.2
2021-02-08 10:39:47 -06:00
David Lechner 9cf5dea702 Merge pull request #295 from pybricks/dependabot/npm_and_yarn/testing-library/user-event-12.6.3
Bump @testing-library/user-event from 12.6.2 to 12.6.3
2021-02-08 10:28:35 -06:00
David Lechner 5b4d0109f1 Merge pull request #300 from pybricks/dependabot/npm_and_yarn/testing-library/react-11.2.5
Bump @testing-library/react from 11.2.3 to 11.2.5
2021-02-08 10:17:55 -06:00
David Lechner cede200c9e Merge pull request #298 from pybricks/dependabot/npm_and_yarn/shopify/react-i18n-5.2.2
Bump @shopify/react-i18n from 5.2.1 to 5.2.2
2021-02-08 09:47:15 -06:00
David Lechner 48850d7669 Merge pull request #296 from pybricks/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-4.14.2
Bump @typescript-eslint/eslint-plugin from 4.14.1 to 4.14.2
2021-02-08 09:35:44 -06:00
David Lechner 153c9ac8ed Merge pull request #291 from pybricks/dlech
Add Python 2 dependency
2021-02-04 19:12:10 -06:00
David Lechner f3197c34f9 Merge pull request #290 from pybricks/dlech
final updates for 1.0.0-beta.6
2021-02-01 14:25:11 -06:00
David Lechner 8d77004aed improve print margin contrast in dark mode 2021-01-26 21:33:17 -06:00
David Lechner 547dff7150 better fit of license dialog on small screens 2021-01-26 21:09:45 -06:00
David Lechner d37459b3f7 version bump 2021-01-23 17:38:25 -06:00
David Lechner 467627dc75 flash-firmware: drop error on fail to connect
This error is already handled elsewhere.
2021-01-23 17:29:43 -06:00
David Lechner d44fcad411 yarn upgrade 2020-06-17 16:52:21 -05:00
David Lechner 4a3440d8a5 fix typo 2020-06-17 16:52:21 -05:00
David Lechner 8d2d6e12ed add notes about authenticating to Github package manager 2020-06-17 16:52:21 -05:00
David Lechner b1e99e0582 implement notifications 2020-04-20 13:57:58 -05:00
David Lechner cf5d801a9a enable progressive web app 2020-04-19 17:54:44 -05:00
David Lechner 530f164af1 alphabetize imports 2020-04-19 15:53:28 -05:00