11/* global SerialPort, ParityType, FlowControlType */
22
3- import { AbstractTransport , ISerialOptions } from "./ITransport" ;
3+ import { AbstractTransport , ISerialOptions } from "./AbstractTransport" ;
4+ import { hexConvert } from "../utils/hex" ;
5+ import { appendArray } from "../utils/convert" ;
6+ import { slipWriter } from "../utils/slip" ;
47
58/**
69 * Options for device serialPort.
@@ -86,6 +89,9 @@ export class WebSerialTransport implements AbstractTransport {
8689 this . traceLog += traceMessage + "\n" ;
8790 }
8891
92+ /**
93+ * Return the whole trace output to the user clipboard.
94+ */
8995 async returnTrace ( ) {
9096 try {
9197 await navigator . clipboard . writeText ( this . traceLog ) ;
@@ -95,86 +101,24 @@ export class WebSerialTransport implements AbstractTransport {
95101 }
96102 }
97103
98- hexify ( s : Uint8Array ) {
99- return Array . from ( s )
100- . map ( ( byte ) => byte . toString ( 16 ) . padStart ( 2 , "0" ) )
101- . join ( "" )
102- . padEnd ( 16 , " " ) ;
103- }
104-
105- hexConvert ( uint8Array : Uint8Array , autoSplit = true ) {
106- if ( autoSplit && uint8Array . length > 16 ) {
107- let result = "" ;
108- let s = uint8Array ;
109-
110- while ( s . length > 0 ) {
111- const line = s . slice ( 0 , 16 ) ;
112- const asciiLine = String . fromCharCode ( ...line )
113- . split ( "" )
114- . map ( ( c ) => ( c === " " || ( c >= " " && c <= "~" && c !== " " ) ? c : "." ) )
115- . join ( "" ) ;
116- s = s . slice ( 16 ) ;
117- result += `\n ${ this . hexify ( line . slice ( 0 , 8 ) ) } ${ this . hexify ( line . slice ( 8 ) ) } | ${ asciiLine } ` ;
118- }
119-
120- return result ;
121- } else {
122- return this . hexify ( uint8Array ) ;
123- }
124- }
125-
126- /**
127- * Format data packet using the Serial Line Internet Protocol (SLIP).
128- * @param {Uint8Array } data Binary unsigned 8 bit array data to format.
129- * @returns {Uint8Array } Formatted unsigned 8 bit data array.
130- */
131- slipWriter ( data : Uint8Array ) {
132- const outData = [ ] ;
133- outData . push ( 0xc0 ) ;
134- for ( let i = 0 ; i < data . length ; i ++ ) {
135- if ( data [ i ] === 0xdb ) {
136- outData . push ( 0xdb , 0xdd ) ;
137- } else if ( data [ i ] === 0xc0 ) {
138- outData . push ( 0xdb , 0xdc ) ;
139- } else {
140- outData . push ( data [ i ] ) ;
141- }
142- }
143- outData . push ( 0xc0 ) ;
144- return new Uint8Array ( outData ) ;
145- }
146-
147104 /**
148105 * Write binary data to device using the WebSerial device writable stream.
149106 * @param {Uint8Array } data 8 bit unsigned data array to write to device.
150107 */
151108 async write ( data : Uint8Array ) {
152- const outData = this . slipWriter ( data ) ;
109+ const outData = slipWriter ( data ) ;
153110
154111 if ( this . device . writable ) {
155112 const writer = this . device . writable . getWriter ( ) ;
156113 if ( this . tracing ) {
157114 console . log ( "Write bytes" ) ;
158- this . trace ( `Write ${ outData . length } bytes: ${ this . hexConvert ( outData ) } ` ) ;
115+ this . trace ( `Write ${ outData . length } bytes: ${ hexConvert ( outData ) } ` ) ;
159116 }
160117 await writer . write ( outData ) ;
161118 writer . releaseLock ( ) ;
162119 }
163120 }
164121
165- /**
166- * Concatenate buffer2 to buffer1 and return the resulting ArrayBuffer.
167- * @param {ArrayBuffer } buffer1 First buffer to concatenate.
168- * @param {ArrayBuffer } buffer2 Second buffer to concatenate.
169- * @returns {ArrayBuffer } Result Array buffer.
170- */
171- _appendBuffer ( buffer1 : ArrayBuffer , buffer2 : ArrayBuffer ) {
172- const tmp = new Uint8Array ( buffer1 . byteLength + buffer2 . byteLength ) ;
173- tmp . set ( new Uint8Array ( buffer1 ) , 0 ) ;
174- tmp . set ( new Uint8Array ( buffer2 ) , buffer1 . byteLength ) ;
175- return tmp . buffer ;
176- }
177-
178122 /**
179123 * Take a data array and return the first well formed packet after
180124 * replacing the escape sequence. Reads at least 8 bytes.
@@ -260,7 +204,7 @@ export class WebSerialTransport implements AbstractTransport {
260204 this . leftOver = packet ;
261205 throw new Error ( "Timeout" ) ;
262206 }
263- const p = new Uint8Array ( this . _appendBuffer ( packet . buffer , value . buffer ) ) ;
207+ const p = appendArray ( packet , value ) ;
264208 packet = p ;
265209 } while ( packet . length < minData ) ;
266210 } finally {
@@ -272,14 +216,14 @@ export class WebSerialTransport implements AbstractTransport {
272216
273217 if ( this . tracing ) {
274218 console . log ( "Read bytes" ) ;
275- this . trace ( `Read ${ packet . length } bytes: ${ this . hexConvert ( packet ) } ` ) ;
219+ this . trace ( `Read ${ packet . length } bytes: ${ hexConvert ( packet ) } ` ) ;
276220 }
277221
278222 if ( this . slipReaderEnabled ) {
279223 const slipReaderResult = this . slipReader ( packet ) ;
280224 if ( this . tracing ) {
281225 console . log ( "Slip reader results" ) ;
282- this . trace ( `Read ${ slipReaderResult . length } bytes: ${ this . hexConvert ( slipReaderResult ) } ` ) ;
226+ this . trace ( `Read ${ slipReaderResult . length } bytes: ${ hexConvert ( slipReaderResult ) } ` ) ;
283227 }
284228 return slipReaderResult ;
285229 }
@@ -314,7 +258,7 @@ export class WebSerialTransport implements AbstractTransport {
314258 }
315259 if ( this . tracing ) {
316260 console . log ( "Raw Read bytes" ) ;
317- this . trace ( `Read ${ value . length } bytes: ${ this . hexConvert ( value ) } ` ) ;
261+ this . trace ( `Read ${ value . length } bytes: ${ hexConvert ( value ) } ` ) ;
318262 }
319263 return value ;
320264 } finally {
@@ -352,7 +296,7 @@ export class WebSerialTransport implements AbstractTransport {
352296
353297 /**
354298 * Connect to serial device using the Webserial open method.
355- * @param {SerialOptions } serialOptions Serial Options for WebUSB SerialPort class.
299+ * @param {SerialOptions } serialOptions Serial Options for ESP Loader class.
356300 */
357301 async connect ( serialOptions : SerialOptions ) {
358302 await this . device . open ( {
0 commit comments