1
1
import { webSerialDevices , vendorIdNames } from "./devices" ;
2
2
import { checkBrowserCompatibility } from "../utils/checkBrowserCompatibilty" ;
3
+ import GUI from "../gui" ;
3
4
4
5
const logHead = "[SERIAL]" ;
5
6
@@ -69,7 +70,7 @@ class WebSerial extends EventTarget {
69
70
navigator . serial . addEventListener ( "connect" , ( e ) => this . handleNewDevice ( e . target ) ) ;
70
71
navigator . serial . addEventListener ( "disconnect" , ( e ) => this . handleRemovedDevice ( e . target ) ) ;
71
72
}
72
-
73
+ this . isNeedBatchWrite = false ;
73
74
this . loadDevices ( ) ;
74
75
}
75
76
@@ -181,6 +182,10 @@ class WebSerial extends EventTarget {
181
182
182
183
const connectionInfo = this . port . getInfo ( ) ;
183
184
this . connectionInfo = connectionInfo ;
185
+ this . isNeedBatchWrite = this . checkIsNeedBatchWrite ( ) ;
186
+ if ( this . isNeedBatchWrite ) {
187
+ console . log ( `${ logHead } Enabling batch write mode for AT32 on macOS` ) ;
188
+ }
184
189
this . writer = this . port . writable . getWriter ( ) ;
185
190
this . reader = this . port . readable . getReader ( ) ;
186
191
@@ -328,6 +333,29 @@ class WebSerial extends EventTarget {
328
333
}
329
334
}
330
335
336
+ checkIsNeedBatchWrite ( ) {
337
+ const isMac = GUI . operating_system === "MacOS" ;
338
+ return isMac && vendorIdNames [ this . connectionInfo . usbVendorId ] === "AT32" ;
339
+ }
340
+
341
+ async batchWrite ( data ) {
342
+ // AT32 on macOS requires smaller chunks (63 bytes) to work correctly due to
343
+ // USB buffer size limitations in the macOS implementation
344
+ const batchWriteSize = 63 ;
345
+ let remainingData = data ;
346
+ while ( remainingData . byteLength > batchWriteSize ) {
347
+ const sliceData = remainingData . slice ( 0 , batchWriteSize ) ;
348
+ remainingData = remainingData . slice ( batchWriteSize ) ;
349
+ try {
350
+ await this . writer . write ( sliceData ) ;
351
+ } catch ( error ) {
352
+ console . error ( `${ logHead } Error writing batch chunk:` , error ) ;
353
+ throw error ; // Re-throw to be caught by the send method
354
+ }
355
+ }
356
+ await this . writer . write ( remainingData ) ;
357
+ }
358
+
331
359
async send ( data , callback ) {
332
360
if ( ! this . connected || ! this . writer ) {
333
361
console . error ( `${ logHead } Failed to send data, serial port not open` ) ;
@@ -338,7 +366,11 @@ class WebSerial extends EventTarget {
338
366
}
339
367
340
368
try {
341
- await this . writer . write ( data ) ;
369
+ if ( this . isNeedBatchWrite ) {
370
+ await this . batchWrite ( data ) ;
371
+ } else {
372
+ await this . writer . write ( data ) ;
373
+ }
342
374
this . bytesSent += data . byteLength ;
343
375
344
376
const result = { bytesSent : data . byteLength } ;
0 commit comments