mirror of
https://github.com/pybricks/pybricks-code.git
synced 2026-09-12 09:36:27 +00:00
firmware: add windows BLE hacks
This works around some issues that have been observed on a specific Windows computer. Issue: https://github.com/pybricks/support/issues/256
This commit is contained in:
@@ -251,13 +251,19 @@ type BaseBootloaderRequestAction<T extends BootloaderRequestActionType> = Action
|
||||
* Action that requests to erase the flash memory.
|
||||
*/
|
||||
export type BootloaderEraseRequestAction =
|
||||
BaseBootloaderRequestAction<BootloaderRequestActionType.Erase>;
|
||||
BaseBootloaderRequestAction<BootloaderRequestActionType.Erase> & {
|
||||
/* City hub requires special handling due to buggy bootloader */
|
||||
isCityHub: boolean;
|
||||
};
|
||||
|
||||
/**
|
||||
* Creates a request to erase the flash memory.
|
||||
*/
|
||||
export function eraseRequest(id: number): BootloaderEraseRequestAction {
|
||||
return { type: BootloaderRequestActionType.Erase, id };
|
||||
export function eraseRequest(
|
||||
id: number,
|
||||
isCityHub: boolean,
|
||||
): BootloaderEraseRequestAction {
|
||||
return { type: BootloaderRequestActionType.Erase, id, isCityHub };
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -33,7 +33,7 @@ describe('message encoder', () => {
|
||||
test.each([
|
||||
[
|
||||
'erase',
|
||||
eraseRequest(0),
|
||||
eraseRequest(0, /* isCityHub */ false),
|
||||
[
|
||||
0x11, // erase command
|
||||
],
|
||||
@@ -116,6 +116,7 @@ describe('message encoder', () => {
|
||||
],
|
||||
])('encode %s request', async (_n, request, expected) => {
|
||||
const messageTypesThatShouldBeCalledWithoutResponse = [
|
||||
BootloaderRequestActionType.Erase,
|
||||
BootloaderRequestActionType.Program,
|
||||
BootloaderRequestActionType.Reboot,
|
||||
BootloaderRequestActionType.Disconnect,
|
||||
@@ -137,10 +138,10 @@ describe('message encoder', () => {
|
||||
const saga = new AsyncSaga(bootloader);
|
||||
|
||||
// we send 4 requests
|
||||
saga.put(eraseRequest(0));
|
||||
saga.put(eraseRequest(1));
|
||||
saga.put(eraseRequest(2));
|
||||
saga.put(eraseRequest(3));
|
||||
saga.put(checksumRequest(0));
|
||||
saga.put(checksumRequest(1));
|
||||
saga.put(checksumRequest(2));
|
||||
saga.put(checksumRequest(3));
|
||||
|
||||
// but only two didSend action meaning only the first two completed
|
||||
saga.put(didSend());
|
||||
@@ -152,7 +153,7 @@ describe('message encoder', () => {
|
||||
const numPending = saga.numPending();
|
||||
expect(numPending).toEqual(5);
|
||||
|
||||
const message = new Uint8Array([Command.EraseFlash]);
|
||||
const message = new Uint8Array([Command.GetChecksum]);
|
||||
const nextId = createCountFunc();
|
||||
|
||||
// every other action is the "send" action
|
||||
|
||||
@@ -13,6 +13,7 @@ import {
|
||||
} from 'typed-redux-saga/macro';
|
||||
import { Action } from '../actions';
|
||||
import { hex } from '../utils';
|
||||
import { isWindows } from '../utils/os';
|
||||
import {
|
||||
BootloaderConnectionActionType,
|
||||
BootloaderConnectionDidFailToSendAction,
|
||||
@@ -79,7 +80,12 @@ function* encodeRequest(): Generator {
|
||||
|
||||
switch (action.type) {
|
||||
case BootloaderRequestActionType.Erase:
|
||||
yield* put(send(createEraseFlashRequest()));
|
||||
yield* put(
|
||||
send(
|
||||
createEraseFlashRequest(),
|
||||
/* withResponse */ action.isCityHub && !isWindows(),
|
||||
),
|
||||
);
|
||||
break;
|
||||
case BootloaderRequestActionType.Program:
|
||||
yield* put(
|
||||
|
||||
Reference in New Issue
Block a user