From 816053ba7c4ae766fa9d44f88f48f726ca372307 Mon Sep 17 00:00:00 2001 From: David Lechner Date: Tue, 19 Jan 2021 11:35:25 -0600 Subject: [PATCH] don't expect response on disconnect commands The LWP3 bootloader disconnect and reboot commands cause the device to disconnect before sending a response, so we must always use write without response for these, otherwise the program can hang waiting for a response. --- src/sagas/lwp3-bootloader-protocol.test.ts | 7 ++++++- src/sagas/lwp3-bootloader-protocol.ts | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/sagas/lwp3-bootloader-protocol.test.ts b/src/sagas/lwp3-bootloader-protocol.test.ts index b79d4839..8e59a032 100644 --- a/src/sagas/lwp3-bootloader-protocol.test.ts +++ b/src/sagas/lwp3-bootloader-protocol.test.ts @@ -121,6 +121,11 @@ describe('message encoder', () => { ], ], ])('encode %s request', async (_n, request, expected) => { + const messageTypesThatShouldBeCalledWithoutResponse = [ + BootloaderRequestActionType.Program, + BootloaderRequestActionType.Reboot, + BootloaderRequestActionType.Disconnect, + ]; const saga = new AsyncSaga(bootloader); saga.put(request); const message = new Uint8Array(expected); @@ -128,7 +133,7 @@ describe('message encoder', () => { expect(action).toEqual( send( message, - /* withResponse */ request.type !== BootloaderRequestActionType.Program, + !messageTypesThatShouldBeCalledWithoutResponse.includes(request.type), ), ); await saga.end(); diff --git a/src/sagas/lwp3-bootloader-protocol.ts b/src/sagas/lwp3-bootloader-protocol.ts index 8cc4cc33..e60f5422 100644 --- a/src/sagas/lwp3-bootloader-protocol.ts +++ b/src/sagas/lwp3-bootloader-protocol.ts @@ -81,7 +81,7 @@ function* encodeRequest(): Generator { ); break; case BootloaderRequestActionType.Reboot: - yield put(send(createStartAppRequest())); + yield put(send(createStartAppRequest(), /* withResponse */ false)); break; case BootloaderRequestActionType.Init: yield put(send(createInitLoaderRequest(action.firmwareSize))); @@ -96,7 +96,7 @@ function* encodeRequest(): Generator { yield put(send(createGetFlashStateRequest())); break; case BootloaderRequestActionType.Disconnect: - yield put(send(createDisconnectRequest())); + yield put(send(createDisconnectRequest(), /* withResponse */ false)); break; /* istanbul ignore next: should not be possible to reach */ default: