@nordicsemiconductor/pc-nrfconnect-shared 104.0.0 → 106.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,534 @@
1
+ /*
2
+ * Copyright (c) 2023 Nordic Semiconductor ASA
3
+ *
4
+ * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
+ */
6
+
7
+ import EventEmitter from 'events';
8
+ import { Terminal } from 'xterm-headless';
9
+
10
+ import logger from '../logging';
11
+ import { SerialPort } from '../SerialPort/SerialPort';
12
+
13
+ interface Callbacks {
14
+ onSuccess: (response: string, command: string) => void;
15
+ onError: (message: string, command: string) => void;
16
+ onTimeout?: (message: string, command: string) => void;
17
+ }
18
+
19
+ export interface ShellParserSettings {
20
+ shellPromptUart?: string;
21
+ logRegex: RegExp;
22
+ errorRegex: RegExp;
23
+ timeout: number;
24
+ columnWidth: number;
25
+ }
26
+
27
+ interface CommandEnqueue {
28
+ command: string;
29
+ callbacks: Callbacks[];
30
+ sent: boolean;
31
+ sentTime: number;
32
+ timeout?: number;
33
+ }
34
+
35
+ export type ShellParser = Awaited<ReturnType<typeof shellParser>>;
36
+ export type XTerminalShellParser = ReturnType<
37
+ typeof xTerminalShellParserWrapper
38
+ >;
39
+
40
+ export const xTerminalShellParserWrapper = (terminal: Terminal) => ({
41
+ getTerminalData: () => {
42
+ let out = '';
43
+ for (let i = 0; i <= terminal.buffer.active.cursorY; i += 1) {
44
+ const line = terminal.buffer.active.getLine(i);
45
+ if (typeof line !== 'undefined') {
46
+ out += `\r\n${line.translateToString()}`;
47
+ }
48
+ }
49
+
50
+ return out.trim();
51
+ },
52
+ clear: () => terminal.clear(),
53
+ getLastLine: () => {
54
+ const lastLine = terminal.buffer.active.getLine(
55
+ terminal.buffer.active.cursorY
56
+ );
57
+ if (typeof lastLine === 'undefined') {
58
+ return '';
59
+ }
60
+
61
+ return lastLine.translateToString().trim();
62
+ },
63
+ write: (data: string, callback: () => void | undefined) =>
64
+ terminal.write(data, callback),
65
+ });
66
+
67
+ export const shellParser = async (
68
+ serialPort: SerialPort,
69
+ xTerminalShellParser: XTerminalShellParser,
70
+ settings: ShellParserSettings = {
71
+ logRegex:
72
+ /[[][0-9]{2,}:[0-9]{2}:[0-9]{2}.[0-9]{3},[0-9]{3}] <([^<^>]+)> ([^:]+): .*(\r\n|\r|\n)$/,
73
+ errorRegex: /Error /,
74
+ timeout: 1000,
75
+ columnWidth: 80,
76
+ },
77
+ shellEchos = true
78
+ ) => {
79
+ const eventEmitter = new EventEmitter();
80
+
81
+ let commandBuffer = '';
82
+ const commandQueueCallbacks = new Map<string, Callbacks[]>();
83
+ const commandQueue: CommandEnqueue[] = [];
84
+ let cr = false;
85
+ let crnl = false;
86
+ let pausedState = true; // Assume we have some command in the shell that has user has started typing
87
+
88
+ // init shell mode
89
+
90
+ if (await serialPort.isOpen()) {
91
+ serialPort.write(
92
+ `${String.fromCharCode(12)}${String.fromCharCode(21)}`
93
+ );
94
+ }
95
+
96
+ const initDataSend = async () => {
97
+ if (!(await serialPort.isOpen())) return;
98
+ if (pausedState) return; // user is typing
99
+
100
+ sendCommands();
101
+ };
102
+
103
+ const sendCommands = () => {
104
+ if (commandQueue.length > 0 && canProcess()) {
105
+ const command = commandQueue[0];
106
+ if (command && !command.sent) {
107
+ serialPort.write(`${command.command}\r\n`);
108
+ command.sent = true;
109
+ command.sentTime = Date.now();
110
+ const t = setTimeout(() => {
111
+ const elapsedTime = Date.now() - command.sentTime;
112
+ command.callbacks.forEach(callback => {
113
+ if (callback.onTimeout)
114
+ callback.onTimeout(
115
+ `Callback timeout after ${elapsedTime}ms`,
116
+ command.command
117
+ );
118
+ });
119
+
120
+ commandQueue.shift();
121
+ sendCommands();
122
+ }, command.timeout ?? settings.timeout);
123
+ command.callbacks.push({
124
+ onSuccess: () => clearTimeout(t),
125
+ onError: () => clearTimeout(t),
126
+ });
127
+ }
128
+ }
129
+ };
130
+
131
+ const parseShellCommands = (data: string, endToken: string) => {
132
+ // Buffer does not have the end token hence we have to consider the response
133
+ // to still have pending bytes hence we need to wait more.
134
+ if (data.indexOf(endToken.trim()) !== -1) {
135
+ const responseFromShell = data.split(endToken.trim());
136
+ responseFromShell.forEach((response, index) => {
137
+ if (index === responseFromShell.length - 1) return;
138
+
139
+ if (response.trim().length === 0 && response !== '\r\n') return;
140
+
141
+ responseCallback(response.trimStart());
142
+ });
143
+
144
+ // Incomplete command leave it for future processing
145
+ const remainingCommandPart = responseFromShell.pop();
146
+ if (remainingCommandPart && remainingCommandPart.length > 0) {
147
+ return remainingCommandPart;
148
+ }
149
+
150
+ return '';
151
+ }
152
+
153
+ return data;
154
+ };
155
+
156
+ const responseCallback = (commandAndResponse: string) => {
157
+ if (settings.shellPromptUart == null) {
158
+ logger.error(
159
+ 'Shell Parser: responseCallback: Shell prompt has not been set'
160
+ );
161
+ return;
162
+ }
163
+
164
+ let callbackFound = false;
165
+ let usedBufferedDataWrittenData = false;
166
+
167
+ commandAndResponse = commandAndResponse.trim();
168
+
169
+ if (bufferedDataWrittenData.includes('\r')) {
170
+ const splitDataWrittenData = bufferedDataWrittenData
171
+ .split('\r')
172
+ .filter(v => v.trim() !== '');
173
+
174
+ if (splitDataWrittenData) {
175
+ commandAndResponse = `${
176
+ splitDataWrittenData[0]?.trim() ?? ''
177
+ }\r\n${commandAndResponse}`;
178
+
179
+ bufferedDataWrittenData = splitDataWrittenData
180
+ .splice(1)
181
+ .join('\r');
182
+ usedBufferedDataWrittenData = true;
183
+ } else {
184
+ bufferedDataWrittenData = '';
185
+ }
186
+ }
187
+
188
+ const isError = commandAndResponse.match(settings.errorRegex) !== null;
189
+
190
+ // Trigger one time callbacks
191
+ if (commandQueue.length > 0) {
192
+ let cmd = commandQueue[0].command;
193
+
194
+ if (
195
+ !usedBufferedDataWrittenData &&
196
+ cmd.length + settings.shellPromptUart.length >
197
+ settings.columnWidth
198
+ ) {
199
+ cmd = settings.shellPromptUart + cmd;
200
+ const chunks = [];
201
+ while (cmd.length > 0) {
202
+ chunks.push(cmd.substring(0, settings.columnWidth).trim());
203
+ cmd = cmd.substring(settings.columnWidth, cmd.length);
204
+ }
205
+ cmd = chunks.join('\r\n');
206
+ cmd = cmd.replace(settings.shellPromptUart, '');
207
+ }
208
+
209
+ const regex = `^(${cmd.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`;
210
+
211
+ // we need to replace \r and \n as shell might add \r \n when shell wraps
212
+ const matched = commandAndResponse.match(regex);
213
+ if (matched && commandQueue[0].sent) {
214
+ const response = commandAndResponse
215
+ .replace(commandQueue[0].command, '')
216
+ .trim();
217
+ if (isError) {
218
+ commandQueue[0].callbacks.forEach(callback =>
219
+ callback.onError(response, commandQueue[0].command)
220
+ );
221
+ callbackFound = true;
222
+ } else {
223
+ commandQueue[0].callbacks.forEach(callback =>
224
+ callback.onSuccess(response, commandQueue[0].command)
225
+ );
226
+ callbackFound = true;
227
+ }
228
+
229
+ eventEmitter.emit('anyCommandResponse', {
230
+ command: commandQueue[0].command,
231
+ response,
232
+ error: isError,
233
+ });
234
+
235
+ commandQueue.shift();
236
+
237
+ serialPort.isOpen().then(isOpen => {
238
+ if (isOpen && commandQueue.length > 0 && !pausedState) {
239
+ sendCommands();
240
+ }
241
+ });
242
+ }
243
+ }
244
+
245
+ // Trigger permanent time callbacks
246
+ commandQueueCallbacks.forEach((callbacks, key) => {
247
+ const commandMatch = commandAndResponse.match(`^(${key})`);
248
+ if (commandMatch) {
249
+ const response = commandAndResponse
250
+ .replace(new RegExp(`^(${key})\r\n`), '')
251
+ .trim();
252
+ if (isError) {
253
+ callbacks.forEach(callback => {
254
+ callback.onError(response, commandMatch[0]);
255
+ });
256
+ } else {
257
+ callbacks.forEach(callback => {
258
+ callback.onSuccess(response, commandMatch[0]);
259
+ });
260
+ }
261
+
262
+ if (!callbackFound) {
263
+ eventEmitter.emit('anyCommandResponse', {
264
+ command: commandMatch[0],
265
+ response,
266
+ error: isError,
267
+ });
268
+ }
269
+
270
+ callbackFound = true;
271
+ }
272
+ });
273
+
274
+ if (!callbackFound && commandAndResponse !== '') {
275
+ eventEmitter.emit('unknownCommand', commandAndResponse);
276
+ }
277
+ };
278
+
279
+ const loadToBuffer = (newline: boolean) => {
280
+ commandBuffer = `${commandBuffer}${xTerminalShellParser.getTerminalData()}${
281
+ newline ? '\r\n' : ''
282
+ }`;
283
+
284
+ xTerminalShellParser.clear();
285
+
286
+ if (settings.shellPromptUart == null) {
287
+ logger.debug(
288
+ 'Shell Parser: loadToBuffer: Shell prompt has not been set'
289
+ );
290
+ return;
291
+ }
292
+
293
+ if (commandBuffer.match(settings.logRegex)) {
294
+ eventEmitter.emit(
295
+ 'shellLogging',
296
+ commandBuffer
297
+ .replace(settings.shellPromptUart.trim(), '')
298
+ .trim()
299
+ ); // TODO Consider improving tests instead of cleaning this here
300
+ commandBuffer = '';
301
+ return;
302
+ }
303
+
304
+ if (commandBuffer === settings.shellPromptUart.trim()) {
305
+ commandBuffer = '';
306
+ }
307
+ };
308
+
309
+ const processBuffer = () => {
310
+ if (!canProcess()) {
311
+ return;
312
+ }
313
+
314
+ loadToBuffer(false);
315
+
316
+ if (settings.shellPromptUart == null) {
317
+ const match = commandBuffer.match(/[a-zA-Z]+:~\$/);
318
+ if (match) {
319
+ settings.shellPromptUart = `${match[0]} `;
320
+ logger.debug(
321
+ `Shell Parser: found shell prompt: "${settings.shellPromptUart}"`
322
+ );
323
+ }
324
+ } else {
325
+ commandBuffer = parseShellCommands(
326
+ commandBuffer,
327
+ settings.shellPromptUart.trim()
328
+ );
329
+ }
330
+
331
+ xTerminalShellParser.clear();
332
+ pausedState = false;
333
+ eventEmitter.emit('pausedChanged', false);
334
+ };
335
+
336
+ const unregisterOnClosed = serialPort.onClosed(() => {
337
+ if (settings.shellPromptUart == null) {
338
+ logger.debug(
339
+ 'Shell Parser: unregisterOnClosed: Shell prompt has not been set'
340
+ );
341
+ return;
342
+ }
343
+
344
+ loadToBuffer(false);
345
+
346
+ commandBuffer += settings.shellPromptUart.trim();
347
+
348
+ commandBuffer = parseShellCommands(
349
+ commandBuffer,
350
+ settings.shellPromptUart.trim()
351
+ );
352
+
353
+ xTerminalShellParser.clear();
354
+ });
355
+
356
+ const processSerialData = (data: Uint8Array) => {
357
+ data.forEach((byte, index) => {
358
+ cr = byte === 13 || (cr && byte === 10);
359
+ crnl = cr && byte === 10;
360
+
361
+ const callback = crnl ? () => loadToBuffer(true) : processBuffer;
362
+
363
+ xTerminalShellParser.write(String.fromCharCode(byte), () => {
364
+ if (index + 1 === data.length) updateIsPaused();
365
+ callback();
366
+ });
367
+ });
368
+ };
369
+
370
+ // Hook to listen to all modem data
371
+ const unregisterOnResponse = serialPort.onData(processSerialData);
372
+
373
+ let bufferedDataWrittenData = '';
374
+ const unregisterOnDataWritten = serialPort.onDataWritten(data => {
375
+ if (!shellEchos) {
376
+ bufferedDataWrittenData += Buffer.from(data).toString();
377
+ bufferedDataWrittenData.replaceAll('\r\n', '\r');
378
+ }
379
+
380
+ if (!pausedState) {
381
+ eventEmitter.emit('pausedChanged', true);
382
+ }
383
+
384
+ updateIsPaused();
385
+ });
386
+
387
+ const canProcess = () => {
388
+ if (settings.shellPromptUart == null) return true;
389
+
390
+ return (
391
+ xTerminalShellParser.getLastLine() ===
392
+ settings.shellPromptUart.trim() &&
393
+ (bufferedDataWrittenData === '' ||
394
+ bufferedDataWrittenData.endsWith('\r')) !== null
395
+ );
396
+ };
397
+
398
+ const updateIsPaused = () => {
399
+ const shellPaused = !canProcess();
400
+ if (pausedState !== shellPaused) {
401
+ pausedState = shellPaused;
402
+ eventEmitter.emit('pausedChanged', pausedState);
403
+ }
404
+ if (!shellPaused) sendCommands();
405
+ };
406
+
407
+ const unPause = () => serialPort.write(String.fromCharCode(21));
408
+
409
+ updateIsPaused();
410
+
411
+ return {
412
+ onPausedChange: (handler: (state: boolean) => void) => {
413
+ eventEmitter.on('pausedChanged', handler);
414
+ handler(pausedState);
415
+ return () => {
416
+ eventEmitter.removeListener('pausedChanged', handler);
417
+ };
418
+ },
419
+ onShellLoggingEvent: (handler: (state: string) => void) => {
420
+ eventEmitter.on('shellLogging', handler);
421
+ return () => {
422
+ eventEmitter.removeListener('shellLogging', handler);
423
+ };
424
+ },
425
+ onAnyCommandResponse: (
426
+ handler: ({
427
+ command,
428
+ response,
429
+ error,
430
+ }: {
431
+ command: string;
432
+ response: string;
433
+ error: boolean;
434
+ }) => void
435
+ ) => {
436
+ eventEmitter.on('anyCommandResponse', handler);
437
+ return () => {
438
+ eventEmitter.removeListener('anyCommandResponse', handler);
439
+ };
440
+ },
441
+ onUnknownCommand: (handler: (state: string) => void) => {
442
+ eventEmitter.on('unknownCommand', handler);
443
+ return () => {
444
+ eventEmitter.removeListener('unknownCommand', handler);
445
+ };
446
+ },
447
+ enqueueRequest: async (
448
+ command: string,
449
+ callbacks?: Callbacks,
450
+ timeout?: number,
451
+ unique = false
452
+ ) => {
453
+ command = command.trim();
454
+
455
+ if (unique) {
456
+ const existingCommand = commandQueue.find(
457
+ item => item.command === command
458
+ );
459
+ if (existingCommand) {
460
+ if (callbacks) existingCommand.callbacks.push(callbacks);
461
+
462
+ if (timeout !== undefined && existingCommand.sent) {
463
+ console.warn(
464
+ `Timeout of ${timeout} for command ${command} has been ignored as command
465
+ has already been sent. Timeout of ${existingCommand.timeout} was used.`
466
+ );
467
+ } else if (timeout !== undefined) {
468
+ console.warn(
469
+ `Timeout for command ${command} has been updated to ${timeout}`
470
+ );
471
+ existingCommand.timeout = timeout;
472
+ }
473
+
474
+ // init sending of commands
475
+ await initDataSend();
476
+ return;
477
+ }
478
+ }
479
+
480
+ commandQueue.push({
481
+ command,
482
+ callbacks: callbacks ? [callbacks] : [],
483
+ sent: false,
484
+ sentTime: -1,
485
+ timeout,
486
+ });
487
+
488
+ // init sending of commands
489
+ await initDataSend();
490
+ },
491
+ registerCommandCallback: (
492
+ command: string,
493
+ onSuccess: (data: string, command: string) => void,
494
+ onError: (error: string, command: string) => void
495
+ ) => {
496
+ // Add Callbacks to the queue for future responses
497
+ const callbacks = { onSuccess, onError };
498
+ const existingCallbacks = commandQueueCallbacks.get(command);
499
+ if (typeof existingCallbacks !== 'undefined') {
500
+ commandQueueCallbacks.set(command, [
501
+ ...existingCallbacks,
502
+ callbacks,
503
+ ]);
504
+ } else {
505
+ commandQueueCallbacks.set(command, [{ onSuccess, onError }]);
506
+ }
507
+
508
+ return () => {
509
+ const cb = commandQueueCallbacks.get(command);
510
+
511
+ if (cb === undefined) return;
512
+
513
+ if (cb.length === 1) {
514
+ commandQueueCallbacks.delete(command);
515
+ return;
516
+ }
517
+
518
+ cb.splice(cb.indexOf(callbacks), 1);
519
+ commandQueueCallbacks.set(command, cb);
520
+ };
521
+ },
522
+ unregister: () => {
523
+ unregisterOnResponse();
524
+ unregisterOnDataWritten();
525
+ unregisterOnClosed();
526
+ },
527
+ isPaused: () => pausedState,
528
+ unPause,
529
+ setShellEchos: (value: boolean) => {
530
+ shellEchos = value;
531
+ if (shellEchos) bufferedDataWrittenData = '';
532
+ },
533
+ };
534
+ };
@@ -23,6 +23,7 @@ interface Props {
23
23
  showIcon?: boolean;
24
24
  variant?: ButtonVariants;
25
25
  className?: string;
26
+ title?: string;
26
27
  }
27
28
 
28
29
  const StartStopButton: FC<Props> = ({
@@ -35,12 +36,14 @@ const StartStopButton: FC<Props> = ({
35
36
  className,
36
37
  large = true,
37
38
  showIcon = true,
39
+ title,
38
40
  }) => {
39
41
  const label = started ? stopText : startText;
40
42
  const src = started ? stopSvg : playSvg;
41
43
 
42
44
  return (
43
45
  <Button
46
+ title={title}
44
47
  className={classNames(
45
48
  'start-stop',
46
49
  `${started ? 'active-animation' : ''}`,
package/src/index.ts CHANGED
@@ -143,6 +143,12 @@ export {
143
143
  prepareDevice,
144
144
  } from './Device/deviceSetup';
145
145
 
146
+ export {
147
+ shellParser,
148
+ xTerminalShellParserWrapper,
149
+ type ShellParser,
150
+ } from './Parsers/shellParser';
151
+
146
152
  export {
147
153
  addNewMessage,
148
154
  newCopiedFlashMessage,
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../nrfutil/device/list.ts"],"names":[],"mappings":"AAMA,OAAO,EACH,YAAY,EAGZ,aAAa,EACb,6BAA6B,EAChC,MAAM,UAAU,CAAC;AAElB,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACtB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC5B;iCAUW,YAAY,0BACI,6BAA6B,EAAE,KAAK,IAAI,mBAC/C,KAAK,KAAK,IAAI;8BAED,6BAA6B,KAAK,IAAI;uBAC7C,MAAM,KAAK,IAAI;;;;;;AAN1C,wBAoDE"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../nrfutil/device/list.ts"],"names":[],"mappings":"AAOA,OAAO,EACH,YAAY,EAGZ,aAAa,EACb,6BAA6B,EAChC,MAAM,UAAU,CAAC;AAElB,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACtB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC5B;iCAUW,YAAY,0BACI,6BAA6B,EAAE,KAAK,IAAI,mBAC/C,KAAK,KAAK,IAAI;8BAED,6BAA6B,KAAK,IAAI;uBAC7C,MAAM,KAAK,IAAI;;;;;;AAN1C,wBAkEE"}
@@ -1 +1 @@
1
- {"version":3,"file":"deviceLister.d.ts","sourceRoot":"","sources":["../../../../src/Device/deviceLister.ts"],"names":[],"mappings":"AAMA,OAAO,EACH,YAAY,EACZ,aAAa,EAEhB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAYpD,OAAO,EAAa,MAAM,EAAgB,MAAM,eAAe,CAAC;AA6EhE;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,WAAY,aAAa,KAAG,MAK1D,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,YAAa,aAAa,EAAE,KAAG,MAAM,EAClC,CAAC;AAErC,eAAO,MAAM,oBAAoB,iBACf,YAAY,kBACV,YAAY,YAS3B,CAAC;AAkCN,eAAO,MAAM,oBAAoB,kBAEV,YAAY,8BACC,MAAM,KAAK,IAAI,iCACZ,MAAM,KAAK,IAAI,sBAC1B,MAAM,IAAI,2BACL,MAAM,kBAAkB,OAAO,KAAK,IAAI,KAClE,SAAS,SAAS,EAAE,IAAI,CAwL1B,CAAC;AAQN,eAAO,MAAM,mBAAmB,cAAe,MAAM,IAAI,SAGxD,CAAC"}
1
+ {"version":3,"file":"deviceLister.d.ts","sourceRoot":"","sources":["../../../../src/Device/deviceLister.ts"],"names":[],"mappings":"AAMA,OAAO,EACH,YAAY,EACZ,aAAa,EAEhB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAYpD,OAAO,EAAa,MAAM,EAAgB,MAAM,eAAe,CAAC;AA6EhE;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,WAAY,aAAa,KAAG,MAK1D,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,YAAa,aAAa,EAAE,KAAG,MAAM,EAClC,CAAC;AAErC,eAAO,MAAM,oBAAoB,iBACf,YAAY,kBACV,YAAY,YAS3B,CAAC;AAkCN,eAAO,MAAM,oBAAoB,kBAEV,YAAY,8BACC,MAAM,KAAK,IAAI,iCACZ,MAAM,KAAK,IAAI,sBAC1B,MAAM,IAAI,2BACL,MAAM,kBAAkB,OAAO,KAAK,IAAI,KAClE,SAAS,SAAS,EAAE,IAAI,CA0L1B,CAAC;AAQN,eAAO,MAAM,mBAAmB,cAAe,MAAM,IAAI,SAGxD,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { Terminal } from 'xterm-headless';
2
+ import { SerialPort } from '../SerialPort/SerialPort';
3
+ interface Callbacks {
4
+ onSuccess: (response: string, command: string) => void;
5
+ onError: (message: string, command: string) => void;
6
+ onTimeout?: (message: string, command: string) => void;
7
+ }
8
+ export interface ShellParserSettings {
9
+ shellPromptUart?: string;
10
+ logRegex: RegExp;
11
+ errorRegex: RegExp;
12
+ timeout: number;
13
+ columnWidth: number;
14
+ }
15
+ export type ShellParser = Awaited<ReturnType<typeof shellParser>>;
16
+ export type XTerminalShellParser = ReturnType<typeof xTerminalShellParserWrapper>;
17
+ export declare const xTerminalShellParserWrapper: (terminal: Terminal) => {
18
+ getTerminalData: () => string;
19
+ clear: () => void;
20
+ getLastLine: () => string;
21
+ write: (data: string, callback: () => void | undefined) => void;
22
+ };
23
+ export declare const shellParser: (serialPort: SerialPort, xTerminalShellParser: XTerminalShellParser, settings?: ShellParserSettings, shellEchos?: boolean) => Promise<{
24
+ onPausedChange: (handler: (state: boolean) => void) => () => void;
25
+ onShellLoggingEvent: (handler: (state: string) => void) => () => void;
26
+ onAnyCommandResponse: (handler: ({ command, response, error, }: {
27
+ command: string;
28
+ response: string;
29
+ error: boolean;
30
+ }) => void) => () => void;
31
+ onUnknownCommand: (handler: (state: string) => void) => () => void;
32
+ enqueueRequest: (command: string, callbacks?: Callbacks, timeout?: number, unique?: boolean) => Promise<void>;
33
+ registerCommandCallback: (command: string, onSuccess: (data: string, command: string) => void, onError: (error: string, command: string) => void) => () => void;
34
+ unregister: () => void;
35
+ isPaused: () => boolean;
36
+ unPause: () => Promise<void>;
37
+ setShellEchos: (value: boolean) => void;
38
+ }>;
39
+ export {};
40
+ //# sourceMappingURL=shellParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellParser.d.ts","sourceRoot":"","sources":["../../../../src/Parsers/shellParser.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,UAAU,SAAS;IACf,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1D;AAED,MAAM,WAAW,mBAAmB;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACvB;AAUD,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC;AAClE,MAAM,MAAM,oBAAoB,GAAG,UAAU,CACzC,OAAO,2BAA2B,CACrC,CAAC;AAEF,eAAO,MAAM,2BAA2B,aAAc,QAAQ;;;;kBAuB5C,MAAM,YAAY,MAAM,IAAI,GAAG,SAAS;CAExD,CAAC;AAEH,eAAO,MAAM,WAAW,eACR,UAAU,wBACA,oBAAoB,aAChC,mBAAmB;sCAsVS,OAAO,KAAK,IAAI;2CAOX,MAAM,KAAK,IAAI;;iBAYrC,MAAM;kBACL,MAAM;eACT,OAAO;UACZ,IAAI;wCAOsB,MAAM,KAAK,IAAI;8BAOtC,MAAM,cACH,SAAS,YACX,MAAM;uCA0CP,MAAM,oBACG,MAAM,WAAW,MAAM,KAAK,IAAI,mBACjC,MAAM,WAAW,MAAM,KAAK,IAAI;;;;2BAmC9B,OAAO;EAKrC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=shellParser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellParser.test.d.ts","sourceRoot":"","sources":["../../../../src/Parsers/shellParser.test.ts"],"names":[],"mappings":"AAwgCA,OAAO,EAAE,CAAC"}
@@ -11,6 +11,7 @@ interface Props {
11
11
  showIcon?: boolean;
12
12
  variant?: ButtonVariants;
13
13
  className?: string;
14
+ title?: string;
14
15
  }
15
16
  declare const StartStopButton: FC<Props>;
16
17
  export default StartStopButton;
@@ -1 +1 @@
1
- {"version":3,"file":"StartStopButton.d.ts","sourceRoot":"","sources":["../../../../src/StartStopButton/StartStopButton.tsx"],"names":[],"mappings":"AAMA,OAAc,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAK1D,OAAO,0BAA0B,CAAC;AAElC,UAAU,KAAK;IACX,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,QAAA,MAAM,eAAe,EAAE,EAAE,CAAC,KAAK,CA8B9B,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"StartStopButton.d.ts","sourceRoot":"","sources":["../../../../src/StartStopButton/StartStopButton.tsx"],"names":[],"mappings":"AAMA,OAAc,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAK1D,OAAO,0BAA0B,CAAC;AAElC,UAAU,KAAK;IACX,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,QAAA,MAAM,eAAe,EAAE,EAAE,CAAC,KAAK,CAgC9B,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -68,6 +68,7 @@ export { createSerialPort, getSerialPortOptions, type SerialPort, } from './Seri
68
68
  export { default as ConflictingSettingsDialog } from './SerialPort/ConflictingSettingsDialog';
69
69
  export type { AppDispatch, AppThunk, NrfConnectState } from './store';
70
70
  export { type DeviceSetupConfig, type DeviceSetup, prepareDevice, } from './Device/deviceSetup';
71
+ export { shellParser, xTerminalShellParserWrapper, type ShellParser, } from './Parsers/shellParser';
71
72
  export { addNewMessage, newCopiedFlashMessage, newInfoFlashMessage, newWarningFlashMessage, newErrorFlashMessage, newSuccessFlashMessage, } from './FlashMessage/FlashMessageSlice';
72
73
  export { inMain as apps, type App as AppType, type AppSpec, type AppWithError, type DownloadableApp, type InstalledDownloadableApp, type LaunchableApp, type LocalApp, type SourceWithError, type UninstalledDownloadableApp, type WithdrawnApp, } from '../ipc/apps';
73
74
  export { inMain as openWindow } from '../ipc/openWindow';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}