From 33fe97272b32ad0b4d5816982eb40096e730cfa3 Mon Sep 17 00:00:00 2001 From: Asad Memon Date: Fri, 22 Jul 2022 21:06:09 +0000 Subject: [PATCH] pw_web_ui: Export WebSerial.WebSerialTransport helper class This exports a helper class to connect to serial port and subscribe to uint8 chunks easily without having to re-implement that logic. Change-Id: Ie6563d0cfc71acf2d3eb79d5b10309da38b746ff Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/103002 Reviewed-by: Anthony DiGirolamo Commit-Queue: Asad Memon --- package.json | 2 +- pw_web_ui/docs.rst | 24 +++++++++++++++++++ ts/index.ts | 1 + ts/index_test.ts | 7 +++++- .../src => ts}/transport/device_transport.ts | 0 .../src => ts}/transport/serial_mock.ts | 2 +- .../transport/web_serial_transport.ts | 4 ++-- .../transport/web_serial_transport_test.ts | 4 ++-- {pw_web_ui => ts}/types/serial.d.ts | 0 tsconfig.json | 3 +++ 10 files changed, 40 insertions(+), 7 deletions(-) rename {pw_web_ui/src => ts}/transport/device_transport.ts (100%) rename {pw_web_ui/src => ts}/transport/serial_mock.ts (98%) rename {pw_web_ui/src => ts}/transport/web_serial_transport.ts (99%) rename {pw_web_ui/src => ts}/transport/web_serial_transport_test.ts (97%) rename {pw_web_ui => ts}/types/serial.d.ts (100%) diff --git a/package.json b/package.json index a8814b84a..a665e456d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pigweedjs", - "version": "0.0.1", + "version": "0.0.2", "description": "An open source collection of embedded-targeted libraries", "author": "The Pigweed Authors", "license": "Apache-2.0", diff --git a/pw_web_ui/docs.rst b/pw_web_ui/docs.rst index 1fac318e0..94b83ccac 100644 --- a/pw_web_ui/docs.rst +++ b/pw_web_ui/docs.rst @@ -19,6 +19,30 @@ Following Pigweed modules are included in the NPM package: - `pw_tokenizer `_ - `pw_transfer `_ +To help with connecting to WebSerial and listening for serial data, a helper +class is also included under ``WebSerial.WebSerialTransport``. Here is an example +usage: + +.. code:: javascript + + import { WebSerial, pw_hdlc } from 'pigweedjs'; + + const transport = new WebSerial.WebSerialTransport(); + const decoder = new pw_hdlc.Decoder(); + + // Present device selection prompt to user + await transport.connect(); + + // Listen and decode HDLC frames + transport.chunks.subscribe((item) => { + const decoded = decoder.process(item); + for (const frame of decoded) { + if (frame.address === 1) { + const decodedLine = new TextDecoder().decode(frame.data); + console.log(decodedLine); + } + } + }); Installation ============= diff --git a/ts/index.ts b/ts/index.ts index a276ed6a7..b6b710bb0 100644 --- a/ts/index.ts +++ b/ts/index.ts @@ -18,3 +18,4 @@ export * as pw_status from "../pw_status/ts"; export * as pw_tokenizer from "../pw_tokenizer/ts"; export * as pw_protobuf_compiler from "../pw_protobuf_compiler/ts"; export * as pw_transfer from "../pw_transfer/ts"; +export * as WebSerial from "./transport/web_serial_transport"; diff --git a/ts/index_test.ts b/ts/index_test.ts index d916535cd..b762d447b 100644 --- a/ts/index_test.ts +++ b/ts/index_test.ts @@ -21,7 +21,8 @@ import { pw_hdlc, pw_rpc, pw_tokenizer, - pw_transfer + pw_transfer, + WebSerial } from "../dist/index.umd"; import {ProtoCollection} from "../dist/protos/collection.umd"; @@ -61,4 +62,8 @@ describe('Pigweed Bundle', () => { expect(pw_transfer.Manager).toBeDefined(); }); + it('has WebSerialTransport defined', () => { + expect(WebSerial.WebSerialTransport).toBeDefined(); + }); + }); diff --git a/pw_web_ui/src/transport/device_transport.ts b/ts/transport/device_transport.ts similarity index 100% rename from pw_web_ui/src/transport/device_transport.ts rename to ts/transport/device_transport.ts diff --git a/pw_web_ui/src/transport/serial_mock.ts b/ts/transport/serial_mock.ts similarity index 98% rename from pw_web_ui/src/transport/serial_mock.ts rename to ts/transport/serial_mock.ts index e704efdbd..dcf3cbc8c 100644 --- a/pw_web_ui/src/transport/serial_mock.ts +++ b/ts/transport/serial_mock.ts @@ -14,7 +14,7 @@ /* eslint-env browser */ import {Subject} from 'rxjs'; -import type {SerialConnectionEvent, SerialPort, Serial, SerialPortRequestOptions, SerialOptions} from "../../types/serial" +import type {SerialConnectionEvent, SerialPort, Serial, SerialPortRequestOptions, SerialOptions} from "pigweed/types/serial" /** * AsyncQueue is a queue that allows values to be dequeued * before they are enqueued, returning a promise that resolves diff --git a/pw_web_ui/src/transport/web_serial_transport.ts b/ts/transport/web_serial_transport.ts similarity index 99% rename from pw_web_ui/src/transport/web_serial_transport.ts rename to ts/transport/web_serial_transport.ts index 41c65f744..32634f2f5 100644 --- a/pw_web_ui/src/transport/web_serial_transport.ts +++ b/ts/transport/web_serial_transport.ts @@ -15,7 +15,7 @@ /* eslint-env browser */ import {BehaviorSubject, Observable, Subject, Subscription} from 'rxjs'; import DeviceTransport from './device_transport'; -import type {SerialPort, Serial, SerialOptions, Navigator, SerialPortFilter} from "../../types/serial" +import type {SerialPort, Serial, SerialOptions, Navigator, SerialPortFilter} from "pigweed/types/serial" const DEFAULT_SERIAL_OPTIONS: SerialOptions & {baudRate: number} = { // Some versions of chrome use `baudrate` (linux) @@ -62,7 +62,7 @@ export class WebSerialTransport implements DeviceTransport { private serial: Serial = (navigator as unknown as Navigator).serial, private filters: SerialPortFilter[] = [], private serialOptions = DEFAULT_SERIAL_OPTIONS - ) {} + ) { } /** * Send a UInt8Array chunk of data to the connected device. diff --git a/pw_web_ui/src/transport/web_serial_transport_test.ts b/ts/transport/web_serial_transport_test.ts similarity index 97% rename from pw_web_ui/src/transport/web_serial_transport_test.ts rename to ts/transport/web_serial_transport_test.ts index df51f9934..9309a73c3 100644 --- a/pw_web_ui/src/transport/web_serial_transport_test.ts +++ b/ts/transport/web_serial_transport_test.ts @@ -16,8 +16,8 @@ import {last, take} from 'rxjs/operators'; import {SerialMock} from './serial_mock'; -import {DeviceLockedError, WebSerialTransport} from './web_serial_transport'; -import type {Serial} from "../../types/serial" +import {WebSerialTransport, DeviceLockedError} from './web_serial_transport'; +import type {Serial} from "pigweed/types/serial" describe('WebSerialTransport', () => { let serialMock: SerialMock; diff --git a/pw_web_ui/types/serial.d.ts b/ts/types/serial.d.ts similarity index 100% rename from pw_web_ui/types/serial.d.ts rename to ts/types/serial.d.ts diff --git a/tsconfig.json b/tsconfig.json index 4ba08aa2f..38fa1f667 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,6 +19,9 @@ ], "pigweed/protos/*": [ "./dist/protos/*" + ], + "pigweed/types/*": [ + "./ts/types/*" ] } },