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:
David Lechner
2021-05-16 16:18:34 -05:00
parent b001748f95
commit 956b6f3c96
7 changed files with 63 additions and 19 deletions
+9 -3
View File
@@ -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 };
}
/**
+7 -6
View File
@@ -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
+7 -1
View File
@@ -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(