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
+7 -7
View File
@@ -136,7 +136,7 @@ describe('flashFirmware', () => {
// erase first
action = await saga.take();
expect(action).toEqual(eraseRequest(1));
expect(action).toEqual(eraseRequest(1, /* isCityHub */ false));
saga.put(didRequest(1));
saga.put(eraseResponse(Result.OK));
@@ -857,7 +857,7 @@ describe('flashFirmware', () => {
// erase first
action = await saga.take();
expect(action).toEqual(eraseRequest(1));
expect(action).toEqual(eraseRequest(1, /* isCityHub */ false));
saga.put(didRequest(1));
saga.put(eraseResponse(Result.Error));
@@ -958,7 +958,7 @@ describe('flashFirmware', () => {
// erase first
action = await saga.take();
expect(action).toEqual(eraseRequest(1));
expect(action).toEqual(eraseRequest(1, /* isCityHub */ false));
saga.put(didRequest(1));
saga.put(eraseResponse(Result.OK));
@@ -1068,7 +1068,7 @@ describe('flashFirmware', () => {
// erase first
action = await saga.take();
expect(action).toEqual(eraseRequest(1));
expect(action).toEqual(eraseRequest(1, /* isCityHub */ false));
saga.put(didRequest(1));
saga.put(eraseResponse(Result.OK));
@@ -1218,7 +1218,7 @@ describe('flashFirmware', () => {
// erase first
action = await saga.take();
expect(action).toEqual(eraseRequest(1));
expect(action).toEqual(eraseRequest(1, /* isCityHub */ false));
saga.put(didRequest(1));
saga.put(eraseResponse(Result.OK));
@@ -1370,7 +1370,7 @@ describe('flashFirmware', () => {
// erase first
action = await saga.take();
expect(action).toEqual(eraseRequest(1));
expect(action).toEqual(eraseRequest(1, /* isCityHub */ false));
saga.put(didRequest(1));
saga.put(eraseResponse(Result.OK));
@@ -1900,7 +1900,7 @@ describe('flashFirmware', () => {
// erase first
action = await saga.take();
expect(action).toEqual(eraseRequest(1));
expect(action).toEqual(eraseRequest(1, /* isCityHub */ false));
saga.put(didRequest(1));
saga.put(eraseResponse(Result.OK));
+13 -1
View File
@@ -38,6 +38,7 @@ import {
connect,
disconnect,
eraseRequest,
eraseResponse,
infoRequest,
initRequest,
programRequest,
@@ -126,6 +127,15 @@ function* waitForResponse<T extends BootloaderResponseAction>(
});
if (timedOut) {
// istanbul ignore if: this hacks around a hardware/OS issue
if (type === BootloaderResponseActionType.Erase) {
// It has been observed that sometimes this response is not received
// or gets stuck in the Bluetooth stack until another request is sent.
// So, we ignore the timeout and continue. If there really was a
// problem, then the next request should fail anyway.
console.warn('Timeout waiting for erase response, continuing anyway.');
return eraseResponse(Result.OK) as T;
}
yield* put(didFailToFinish(FailToFinishReasonType.TimedOut));
yield* disconnectAndCancel();
}
@@ -335,7 +345,9 @@ function* flashFirmware(action: FlashFirmwareFlashAction): Generator {
yield* put(didStart());
const eraseAction = yield* put(eraseRequest(nextMessageId()));
const eraseAction = yield* put(
eraseRequest(nextMessageId(), deviceId === HubType.CityHub),
);
const { erase } = yield* all({
sent: waitForDidRequest(eraseAction.id),
erase: waitForResponse<BootloaderEraseResponseAction>(