@@ -18,8 +18,10 @@ ctx.addEventListener("message", (event) => {
18
18
19
19
let buffer = "" ;
20
20
let discardFirstLine = true ;
21
- const separator = "\n" ;
22
- var re = new RegExp ( `(${ separator } )` , "g" ) ;
21
+ const separator = "\r?\n" ;
22
+ const delimiter = "[, \t]+" ; // Serial Plotter protocol supports Comma, Space & Tab characters as delimiters
23
+ var separatorRegex = new RegExp ( `(${ separator } )` , "g" ) ;
24
+ var delimiterRegex = new RegExp ( delimiter , "g" ) ;
23
25
24
26
export const parseSerialMessages = (
25
27
messages : string [ ]
@@ -31,10 +33,11 @@ export const parseSerialMessages = (
31
33
// so we need to discard it and start aggregating from the first encountered separator
32
34
let joinMessages = messages . join ( "" ) ;
33
35
if ( discardFirstLine ) {
34
- const firstSeparatorIndex = joinMessages . indexOf ( separator ) ;
35
- if ( firstSeparatorIndex > - 1 ) {
36
+ separatorRegex . lastIndex = 0 ; // Reset lastIndex to ensure match happens from beginning of string
37
+ const separatorMatch = separatorRegex . exec ( joinMessages ) ;
38
+ if ( separatorMatch && separatorMatch . index > - 1 ) {
36
39
joinMessages = joinMessages . substring (
37
- firstSeparatorIndex + separator . length
40
+ separatorMatch . index + separatorMatch [ 0 ] . length
38
41
) ;
39
42
discardFirstLine = false ;
40
43
} else {
@@ -47,13 +50,14 @@ export const parseSerialMessages = (
47
50
48
51
//add any leftover from the buffer to the first line
49
52
const messagesAndBuffer = ( ( buffer || "" ) + joinMessages )
50
- . split ( re )
53
+ . split ( separatorRegex )
51
54
. filter ( ( message ) => message . length > 0 ) ;
52
55
53
56
// remove the previous buffer
54
57
buffer = "" ;
58
+ separatorRegex . lastIndex = 0 ;
55
59
// check if the last message contains the delimiter, if not, it's an incomplete string that needs to be added to the buffer
56
- if ( messagesAndBuffer [ messagesAndBuffer . length - 1 ] !== separator ) {
60
+ if ( ! separatorRegex . test ( messagesAndBuffer [ messagesAndBuffer . length - 1 ] ) ) {
57
61
buffer = messagesAndBuffer [ messagesAndBuffer . length - 1 ] ;
58
62
messagesAndBuffer . splice ( - 1 ) ;
59
63
}
@@ -62,19 +66,21 @@ export const parseSerialMessages = (
62
66
const parsedLines : { [ key : string ] : number } [ ] = [ ] ;
63
67
64
68
// for each line, explode variables
69
+ separatorRegex . lastIndex = 0 ;
65
70
messagesAndBuffer
66
- . filter ( ( message ) => message !== separator )
71
+ . filter ( ( message ) => ! separatorRegex . test ( message ) )
67
72
. forEach ( ( message ) => {
68
73
const parsedLine : { [ key : string ] : number } = { } ;
69
74
70
- //there are two supported formats:
71
- // format1: <value1> <value2> <value3>
72
- // format2: name1:<value1>,name2:<value2>,name3:<value3>
75
+ // Part Separator symbols i.e. Space, Tab & Comma are fully supported
76
+ // SerialPlotter protocol specifies 3 message formats. The following 2 formats are supported
77
+ // Value only format: <value1> <value2> <value3>
78
+ // Label-Value format: name1:<value1>,name2:<value2>,name3:<value3>
73
79
74
80
// if we find a colon, we assume the latter is being used
75
81
let tokens : string [ ] = [ ] ;
76
82
if ( message . indexOf ( ":" ) > 0 ) {
77
- message . split ( "," ) . forEach ( ( keyValue : string ) => {
83
+ message . split ( delimiterRegex ) . forEach ( ( keyValue : string ) => {
78
84
let [ key , value ] = keyValue . split ( ":" ) ;
79
85
key = key && key . trim ( ) ;
80
86
value = value && value . trim ( ) ;
@@ -83,8 +89,8 @@ export const parseSerialMessages = (
83
89
}
84
90
} ) ;
85
91
} else {
86
- // otherwise they are spaces
87
- const values = message . split ( / \s / ) ;
92
+ // otherwise they are unlabelled
93
+ const values = message . split ( delimiterRegex ) ;
88
94
values . forEach ( ( value , i ) => {
89
95
if ( value . length ) {
90
96
tokens . push ( ...[ `value ${ i + 1 } ` , value ] ) ;
0 commit comments