@samlab-corp/sfm-node 0.2.0 → 0.4.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.
Files changed (54) hide show
  1. package/dist/commands/data.d.ts +4 -4
  2. package/dist/commands/data.js +12 -12
  3. package/dist/commands/data.js.map +1 -1
  4. package/dist/commands/fingerprint.d.ts +23 -23
  5. package/dist/commands/fingerprint.d.ts.map +1 -1
  6. package/dist/commands/fingerprint.js +114 -114
  7. package/dist/commands/fingerprint.js.map +1 -1
  8. package/dist/commands/firmware.d.ts +5 -5
  9. package/dist/commands/firmware.d.ts.map +1 -1
  10. package/dist/commands/firmware.js +32 -32
  11. package/dist/commands/firmware.js.map +1 -1
  12. package/dist/commands/freescan.d.ts +16 -16
  13. package/dist/commands/freescan.d.ts.map +1 -1
  14. package/dist/commands/freescan.js +41 -41
  15. package/dist/commands/freescan.js.map +1 -1
  16. package/dist/commands/index.d.ts +12 -12
  17. package/dist/commands/index.d.ts.map +1 -1
  18. package/dist/commands/index.js +14 -14
  19. package/dist/commands/index.js.map +1 -1
  20. package/dist/commands/system.d.ts +12 -12
  21. package/dist/commands/system.d.ts.map +1 -1
  22. package/dist/commands/system.js +14 -14
  23. package/dist/commands/system.js.map +1 -1
  24. package/dist/constants/protocol.d.ts +25 -0
  25. package/dist/constants/protocol.d.ts.map +1 -1
  26. package/dist/constants/protocol.js +26 -1
  27. package/dist/constants/protocol.js.map +1 -1
  28. package/dist/core/client.d.ts +33 -21
  29. package/dist/core/client.d.ts.map +1 -1
  30. package/dist/core/client.js +72 -52
  31. package/dist/core/client.js.map +1 -1
  32. package/dist/core/crypto.d.ts +19 -19
  33. package/dist/core/crypto.js +26 -26
  34. package/dist/core/crypto.js.map +1 -1
  35. package/dist/core/errors.d.ts +6 -6
  36. package/dist/core/errors.d.ts.map +1 -1
  37. package/dist/core/errors.js +46 -32
  38. package/dist/core/errors.js.map +1 -1
  39. package/dist/core/index.d.ts +3 -3
  40. package/dist/core/index.d.ts.map +1 -1
  41. package/dist/core/index.js +5 -2
  42. package/dist/core/index.js.map +1 -1
  43. package/dist/core/packet.d.ts +81 -41
  44. package/dist/core/packet.d.ts.map +1 -1
  45. package/dist/core/packet.js +256 -60
  46. package/dist/core/packet.js.map +1 -1
  47. package/dist/core/serial.d.ts +37 -27
  48. package/dist/core/serial.d.ts.map +1 -1
  49. package/dist/core/serial.js +91 -62
  50. package/dist/core/serial.js.map +1 -1
  51. package/dist/core/tcp.d.ts +14 -14
  52. package/dist/core/tcp.js +17 -17
  53. package/dist/core/tcp.js.map +1 -1
  54. package/package.json +2 -2
@@ -1,36 +1,36 @@
1
1
  "use strict";
2
2
  /**
3
- * Suprema SFM Series Packet Protocol V3.6.0
3
+ * Suprema SFM 시리즈 패킷 프로토콜 V3.6.0
4
4
  *
5
- * [Normal Packet Structure - 13 bytes]
6
- * Byte 0: Start Code (0x40)
7
- * Byte 1: Command
8
- * Byte 2-5: Param (4 bytes, little-endian) - User ID or system parameter value
9
- * Byte 6-9: Size (4 bytes, little-endian) - Size of following binary data
10
- * Byte 10: Flag/Error - Flag on request, Error Code on response
11
- * Byte 11: Checksum - Lower byte of sum of bytes 0~10
12
- * Byte 12: End Code (0x0A)
5
+ * [일반 패킷 구조 - 13바이트]
6
+ * Byte 0: 시작 코드 (0x40)
7
+ * Byte 1: 명령
8
+ * Byte 2-5: Param (4바이트, 리틀엔디안) - 사용자 ID 또는 시스템 파라미터
9
+ * Byte 6-9: Size (4바이트, 리틀엔디안) - 후속 바이너리 데이터 크기
10
+ * Byte 10: Flag/Error - 요청 Flag, 응답 에러 코드
11
+ * Byte 11: 체크섬 - 바이트 0~10 합의 하위 바이트
12
+ * Byte 12: 종료 코드 (0x0A)
13
13
  *
14
- * [Network Packet Structure - 15 bytes (RS422/485)]
15
- * Byte 0: Start Code (0x41)
16
- * Byte 1-2: Terminal ID (2 bytes, little-endian)
17
- * Byte 3: Command
18
- * Byte 4-7: Param (4 bytes, little-endian)
19
- * Byte 8-11: Size (4 bytes, little-endian)
14
+ * [네트워크 패킷 구조 - 15바이트 (RS422/485)]
15
+ * Byte 0: 시작 코드 (0x41)
16
+ * Byte 1-2: 터미널 ID (2바이트, 리틀엔디안)
17
+ * Byte 3: 명령
18
+ * Byte 4-7: Param (4바이트, 리틀엔디안)
19
+ * Byte 8-11: Size (4바이트, 리틀엔디안)
20
20
  * Byte 12: Flag/Error
21
- * Byte 13: Checksum - Lower byte of sum of bytes 0~12
22
- * Byte 14: End Code (0x0A)
21
+ * Byte 13: 체크섬 - 바이트 0~12 합의 하위 바이트
22
+ * Byte 14: 종료 코드 (0x0A)
23
23
  *
24
- * [Secure Packet Structure - 35 bytes]
25
- * Byte 0: 0x50 (Send) / 0x51 (Receive)
26
- * Byte 1-32: AES256 encrypted data (32 bytes)
27
- * Byte 33: Checksum
28
- * Byte 34: 0x0A (End)
24
+ * [보안 패킷 구조 - 35바이트]
25
+ * Byte 0: 0x50 (전송) / 0x51 (수신)
26
+ * Byte 1-32: AES256 암호화 데이터 (32바이트)
27
+ * Byte 33: 체크섬
28
+ * Byte 34: 0x0A (종료)
29
29
  *
30
- * [Data Transfer Packet - Variable length]
31
- * Byte 0-3: Total length (little-endian uint32)
32
- * Byte 4+: Payload data
33
- * Last 2: 16-bit checksum (little-endian)
30
+ * [데이터 전송 패킷 - 가변 길이]
31
+ * Byte 0-3: 전체 길이 (리틀엔디안 uint32)
32
+ * Byte 4+: 페이로드 데이터
33
+ * 마지막 2: 16비트 체크섬 (리틀엔디안)
34
34
  */
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.PACKET_SIZE = exports.END_CODE = exports.START_CODE = void 0;
@@ -47,15 +47,18 @@ exports.isValidStartByte = isValidStartByte;
47
47
  exports.scanForStartByte = scanForStartByte;
48
48
  exports.encodeHexAscii = encodeHexAscii;
49
49
  exports.decodeHexAscii = decodeHexAscii;
50
+ exports.describeNormalPacket = describeNormalPacket;
51
+ exports.describeNetworkPacket = describeNetworkPacket;
52
+ exports.describePacketFields = describePacketFields;
50
53
  const index_js_1 = require("../constants/index.js");
51
- // Backward-compatible re-export
54
+ // 하위 호환 재내보내기
52
55
  var index_js_2 = require("../constants/index.js");
53
56
  Object.defineProperty(exports, "START_CODE", { enumerable: true, get: function () { return index_js_2.START_CODE; } });
54
57
  Object.defineProperty(exports, "END_CODE", { enumerable: true, get: function () { return index_js_2.END_CODE; } });
55
58
  Object.defineProperty(exports, "PACKET_SIZE", { enumerable: true, get: function () { return index_js_2.PACKET_SIZE; } });
56
59
  /**
57
- * Calculate checksum
58
- * Sum of byte array & 0xFF
60
+ * 체크섬 계산
61
+ * 바이트 배열 & 0xFF
59
62
  */
60
63
  function calcChecksum(data, length) {
61
64
  const buf = Buffer.isBuffer(data) ? data : Buffer.from(data);
@@ -67,7 +70,7 @@ function calcChecksum(data, length) {
67
70
  return sum & 0xFF;
68
71
  }
69
72
  /**
70
- * Calculate 16-bit checksum (for data transfer packets)
73
+ * 16비트 체크섬 계산 (데이터 전송 패킷용)
71
74
  */
72
75
  function calcChecksum16(data) {
73
76
  const buf = Buffer.isBuffer(data) ? data : Buffer.from(data);
@@ -78,41 +81,41 @@ function calcChecksum16(data) {
78
81
  return sum & 0xFFFF;
79
82
  }
80
83
  /**
81
- * Build normal packet (13 bytes)
84
+ * 일반 패킷 생성 (13바이트)
82
85
  * [Start(0x40)] [Command] [Param LE 4B] [Size LE 4B] [Flag] [Checksum] [End(0x0A)]
83
86
  */
84
87
  function buildNormalPacket(command, param = 0, size = 0, flag = 0) {
85
88
  const packet = Buffer.alloc(index_js_1.PACKET_SIZE.NORMAL);
86
- packet[0] = index_js_1.START_CODE.NORMAL; // Start Code
87
- packet[1] = command; // Command
88
- packet.writeUInt32LE(param >>> 0, 2); // Param (4 bytes)
89
- packet.writeUInt32LE(size >>> 0, 6); // Size (4 bytes)
89
+ packet[0] = index_js_1.START_CODE.NORMAL; // 시작 코드
90
+ packet[1] = command; // 명령
91
+ packet.writeUInt32LE(param >>> 0, 2); // Param (4바이트)
92
+ packet.writeUInt32LE(size >>> 0, 6); // Size (4바이트)
90
93
  packet[10] = flag; // Flag/Error
91
- // Checksum: sum of bytes 0~10 & 0xFF
94
+ // 체크섬: 바이트 0~10 & 0xFF
92
95
  packet[11] = calcChecksum(packet, 11);
93
- packet[12] = index_js_1.END_CODE; // End Code
96
+ packet[12] = index_js_1.END_CODE; // 종료 코드
94
97
  return packet;
95
98
  }
96
99
  /**
97
- * Build network packet (15 bytes, RS422/485)
100
+ * 네트워크 패킷 생성 (15바이트, RS422/485)
98
101
  * [Start(0x41)] [TermID LE 2B] [Command] [Param LE 4B] [Size LE 4B] [Flag] [Checksum] [End(0x0A)]
99
102
  */
100
103
  function buildNetworkPacket(command, terminalId = 0, param = 0, size = 0, flag = 0) {
101
104
  const packet = Buffer.alloc(index_js_1.PACKET_SIZE.NETWORK);
102
- packet[0] = index_js_1.START_CODE.NETWORK; // Start Code (0x41)
103
- packet.writeUInt16LE(terminalId, 1); // Terminal ID (2 bytes)
104
- packet[3] = command; // Command
105
- packet.writeUInt32LE(param >>> 0, 4); // Param (4 bytes)
106
- packet.writeUInt32LE(size >>> 0, 8); // Size (4 bytes)
105
+ packet[0] = index_js_1.START_CODE.NETWORK; // 시작 코드 (0x41)
106
+ packet.writeUInt16LE(terminalId, 1); // 터미널 ID (2바이트)
107
+ packet[3] = command; // 명령
108
+ packet.writeUInt32LE(param >>> 0, 4); // Param (4바이트)
109
+ packet.writeUInt32LE(size >>> 0, 8); // Size (4바이트)
107
110
  packet[12] = flag; // Flag/Error
108
- // Checksum: sum of bytes 0~12 & 0xFF
111
+ // 체크섬: 바이트 0~12 & 0xFF
109
112
  packet[13] = calcChecksum(packet, 13);
110
- packet[14] = index_js_1.END_CODE; // End Code
113
+ packet[14] = index_js_1.END_CODE; // 종료 코드
111
114
  return packet;
112
115
  }
113
116
  /**
114
- * Build data transfer packet (variable length)
115
- * [4-byte length LE] [N-byte data] [2-byte checksum LE]
117
+ * 데이터 전송 패킷 생성 (가변 길이)
118
+ * [4바이트 길이 LE] [N바이트 데이터] [2바이트 체크섬 LE]
116
119
  */
117
120
  function buildDataPacket(data) {
118
121
  const dataBuf = Buffer.isBuffer(data) ? data : Buffer.from(data);
@@ -125,12 +128,12 @@ function buildDataPacket(data) {
125
128
  return packet;
126
129
  }
127
130
  /**
128
- * Parse normal packet (13 bytes)
131
+ * 일반 패킷 파싱 (13바이트)
129
132
  */
130
133
  function parseNormalPacket(data) {
131
134
  const buf = Buffer.isBuffer(data) ? data : Buffer.from(data);
132
135
  if (buf.length < index_js_1.PACKET_SIZE.NORMAL) {
133
- return { valid: false, error: 'Insufficient packet size' };
136
+ return { valid: false, error: '패킷 크기 부족' };
134
137
  }
135
138
  const startCode = buf[0];
136
139
  const command = buf[1];
@@ -168,12 +171,12 @@ function parseNormalPacket(data) {
168
171
  };
169
172
  }
170
173
  /**
171
- * Parse network packet (15 bytes)
174
+ * 네트워크 패킷 파싱 (15바이트)
172
175
  */
173
176
  function parseNetworkPacket(data) {
174
177
  const buf = Buffer.isBuffer(data) ? data : Buffer.from(data);
175
178
  if (buf.length < index_js_1.PACKET_SIZE.NETWORK) {
176
- return { valid: false, error: 'Insufficient packet size' };
179
+ return { valid: false, error: '패킷 크기 부족' };
177
180
  }
178
181
  const startCode = buf[0];
179
182
  const terminalId = buf.readUInt16LE(1);
@@ -212,16 +215,16 @@ function parseNetworkPacket(data) {
212
215
  };
213
216
  }
214
217
  /**
215
- * Parse data transfer packet
218
+ * 데이터 전송 패킷 파싱
216
219
  */
217
220
  function parseDataPacket(data) {
218
221
  const buf = Buffer.isBuffer(data) ? data : Buffer.from(data);
219
222
  if (buf.length < 6) {
220
- return { valid: false, error: 'Insufficient packet size' };
223
+ return { valid: false, error: '패킷 크기 부족' };
221
224
  }
222
225
  const totalLen = buf.readUInt32LE(0);
223
226
  if (buf.length < totalLen) {
224
- return { valid: false, error: `Incomplete packet: expected=${totalLen}, got=${buf.length}` };
227
+ return { valid: false, error: `불완전한 패킷: expected=${totalLen}, got=${buf.length}` };
225
228
  }
226
229
  const dataLen = totalLen - 6;
227
230
  const payload = buf.subarray(4, 4 + dataLen);
@@ -233,18 +236,18 @@ function parseDataPacket(data) {
233
236
  payload: Buffer.from(payload),
234
237
  checksum: receivedChecksum,
235
238
  expectedChecksum,
236
- error: receivedChecksum !== expectedChecksum ? 'Checksum mismatch' : null,
239
+ error: receivedChecksum !== expectedChecksum ? '체크섬 불일치' : null,
237
240
  };
238
241
  }
239
242
  /**
240
- * Convert packet to hex string (for debugging)
243
+ * 패킷을 hex 문자열로 변환 (디버깅용)
241
244
  */
242
245
  function packetToHex(data) {
243
246
  const buf = Buffer.isBuffer(data) ? data : Buffer.from(data);
244
247
  return buf.toString('hex').toUpperCase().replace(/(.{2})/g, '$1 ').trim();
245
248
  }
246
249
  /**
247
- * Validate start byte
250
+ * 시작 바이트 유효성 검증
248
251
  */
249
252
  function isValidStartByte(byte, type = 'normal') {
250
253
  switch (type) {
@@ -259,7 +262,7 @@ function isValidStartByte(byte, type = 'normal') {
259
262
  }
260
263
  }
261
264
  /**
262
- * Find valid start byte position in buffer
265
+ * 버퍼에서 유효한 시작 바이트 위치 탐색
263
266
  */
264
267
  function scanForStartByte(buffer, type = 'normal', offset = 0) {
265
268
  for (let i = offset; i < buffer.length; i++) {
@@ -270,17 +273,210 @@ function scanForStartByte(buffer, type = 'normal', offset = 0) {
270
273
  return -1;
271
274
  }
272
275
  /**
273
- * Binary → Hex-ASCII encoding
276
+ * 바이너리 → Hex-ASCII 인코딩
274
277
  */
275
278
  function encodeHexAscii(data) {
276
279
  const buf = Buffer.isBuffer(data) ? data : Buffer.from(data);
277
280
  return Buffer.from(buf.toString('hex').toUpperCase(), 'ascii');
278
281
  }
279
282
  /**
280
- * Hex-ASCII → Binary decoding
283
+ * Hex-ASCII → 바이너리 디코딩
281
284
  */
282
285
  function decodeHexAscii(data) {
283
286
  const buf = Buffer.isBuffer(data) ? data : Buffer.from(data);
284
287
  return Buffer.from(buf.toString('ascii'), 'hex');
285
288
  }
289
+ // ─── 디버그용 패킷 해석 ───
290
+ // 코드 → 이름 역매핑 (최초 호출 시 1회 생성)
291
+ let _cmdNameMap = null;
292
+ let _errorNameMap = null;
293
+ let _flagNameMap = null;
294
+ function getCmdNameMap() {
295
+ if (!_cmdNameMap) {
296
+ _cmdNameMap = new Map();
297
+ for (const [name, code] of Object.entries(index_js_1.SFM_CMD)) {
298
+ _cmdNameMap.set(code, name);
299
+ }
300
+ }
301
+ return _cmdNameMap;
302
+ }
303
+ function getErrorNameMap() {
304
+ if (!_errorNameMap) {
305
+ _errorNameMap = new Map();
306
+ for (const [name, code] of Object.entries(index_js_1.SFM_ERROR)) {
307
+ _errorNameMap.set(code, name);
308
+ }
309
+ }
310
+ return _errorNameMap;
311
+ }
312
+ function getFlagNameMap() {
313
+ if (!_flagNameMap) {
314
+ _flagNameMap = new Map();
315
+ for (const [name, code] of Object.entries(index_js_1.SFM_FLAG)) {
316
+ _flagNameMap.set(code, name);
317
+ }
318
+ }
319
+ return _flagNameMap;
320
+ }
321
+ function hex(value, bytes = 1) {
322
+ return '0x' + value.toString(16).toUpperCase().padStart(bytes * 2, '0');
323
+ }
324
+ function resolveCmdName(code) {
325
+ return getCmdNameMap().get(code) ?? hex(code);
326
+ }
327
+ function resolveFlagOrErrorName(code) {
328
+ // 에러/응답 코드와 플래그 코드가 겹치는 경우 에러 이름 우선
329
+ const errorName = getErrorNameMap().get(code);
330
+ if (errorName)
331
+ return errorName;
332
+ const flagName = getFlagNameMap().get(code);
333
+ if (flagName)
334
+ return flagName;
335
+ return hex(code);
336
+ }
337
+ /**
338
+ * 일반 패킷(13B)을 사람이 읽을 수 있는 디버그 문자열로 해석
339
+ *
340
+ * @example
341
+ * const info = describeNormalPacket(Buffer.from([0x40,0x87,0x64,0,0,0,0x80,0x01,0x01,0x02,0x71,0x20,0x0A]));
342
+ * console.log(info.description);
343
+ * // "[ETX] param=100 size=0x02010180 flag=ADD_NEW(0x71)"
344
+ */
345
+ function describeNormalPacket(data) {
346
+ const buf = Buffer.isBuffer(data) ? data : Buffer.from(data);
347
+ const hexDump = packetToHex(buf);
348
+ if (buf.length < index_js_1.PACKET_SIZE.NORMAL) {
349
+ return {
350
+ hex: hexDump,
351
+ description: `[INVALID] 패킷 크기 부족 (${buf.length}B < 13B)`,
352
+ fields: { start: '?', command: '?', param: '?', size: '?', flag: '?', checksum: '?', end: '?' },
353
+ };
354
+ }
355
+ const startCode = buf[0];
356
+ const command = buf[1];
357
+ const param = buf.readUInt32LE(2);
358
+ const size = buf.readUInt32LE(6);
359
+ const flag = buf[10];
360
+ const checksum = buf[11];
361
+ const endCode = buf[12];
362
+ const cmdName = resolveCmdName(command);
363
+ const flagName = resolveFlagOrErrorName(flag);
364
+ // param 해석: 일반적으로 userId
365
+ const paramStr = param === 0 ? '0' : `${param} (${hex(param, 4)})`;
366
+ // size 해석: ETX/RTX는 복합 필드
367
+ let sizeStr;
368
+ if ((command === index_js_1.SFM_CMD.ETX || command === index_js_1.SFM_CMD.RTX) && size > 0xFFFF) {
369
+ const count = (size >>> 24) & 0xFF;
370
+ const enroll = (size >>> 16) & 0xFF;
371
+ const chunk = size & 0xFFFF;
372
+ sizeStr = `${hex(size, 4)} (count=${count}, enroll=${enroll}, chunk=${chunk})`;
373
+ }
374
+ else {
375
+ sizeStr = size === 0 ? '0' : `${size} (${hex(size, 4)})`;
376
+ }
377
+ const flagStr = flag === 0 ? 'NONE(0x00)' : `${flagName}(${hex(flag)})`;
378
+ // 체크섬 검증
379
+ const expected = calcChecksum(buf, 11);
380
+ const checksumOk = checksum === expected;
381
+ const checksumStr = checksumOk ? `${hex(checksum)} OK` : `${hex(checksum)} NG (expected ${hex(expected)})`;
382
+ const description = `[${cmdName}] param=${paramStr} size=${sizeStr} flag=${flagStr}`;
383
+ return {
384
+ hex: hexDump,
385
+ description,
386
+ fields: {
387
+ start: startCode === index_js_1.START_CODE.NORMAL ? 'NORMAL(0x40)' : hex(startCode),
388
+ command: `${cmdName}(${hex(command)})`,
389
+ param: paramStr,
390
+ size: sizeStr,
391
+ flag: flagStr,
392
+ checksum: checksumStr,
393
+ end: endCode === index_js_1.END_CODE ? 'END(0x0A)' : hex(endCode),
394
+ },
395
+ };
396
+ }
397
+ /**
398
+ * 네트워크 패킷(15B)을 사람이 읽을 수 있는 디버그 문자열로 해석
399
+ */
400
+ function describeNetworkPacket(data) {
401
+ const buf = Buffer.isBuffer(data) ? data : Buffer.from(data);
402
+ const hexDump = packetToHex(buf);
403
+ if (buf.length < index_js_1.PACKET_SIZE.NETWORK) {
404
+ return {
405
+ hex: hexDump,
406
+ description: `[INVALID] 패킷 크기 부족 (${buf.length}B < 15B)`,
407
+ fields: { start: '?', command: '?', param: '?', size: '?', flag: '?', checksum: '?', end: '?' },
408
+ };
409
+ }
410
+ const startCode = buf[0];
411
+ const terminalId = buf.readUInt16LE(1);
412
+ const command = buf[3];
413
+ const param = buf.readUInt32LE(4);
414
+ const size = buf.readUInt32LE(8);
415
+ const flag = buf[12];
416
+ const checksum = buf[13];
417
+ const endCode = buf[14];
418
+ const cmdName = resolveCmdName(command);
419
+ const flagName = resolveFlagOrErrorName(flag);
420
+ const paramStr = param === 0 ? '0' : `${param} (${hex(param, 4)})`;
421
+ const sizeStr = size === 0 ? '0' : `${size} (${hex(size, 4)})`;
422
+ const flagStr = flag === 0 ? 'NONE(0x00)' : `${flagName}(${hex(flag)})`;
423
+ const expected = calcChecksum(buf, 13);
424
+ const checksumOk = checksum === expected;
425
+ const checksumStr = checksumOk ? `${hex(checksum)} OK` : `${hex(checksum)} NG (expected ${hex(expected)})`;
426
+ const description = `[${cmdName}] termId=${terminalId} param=${paramStr} size=${sizeStr} flag=${flagStr}`;
427
+ return {
428
+ hex: hexDump,
429
+ description,
430
+ fields: {
431
+ start: startCode === index_js_1.START_CODE.NETWORK ? 'NETWORK(0x41)' : hex(startCode),
432
+ command: `${cmdName}(${hex(command)})`,
433
+ param: paramStr,
434
+ size: sizeStr,
435
+ flag: flagStr,
436
+ checksum: checksumStr,
437
+ end: endCode === index_js_1.END_CODE ? 'END(0x0A)' : hex(endCode),
438
+ terminalId: `${terminalId}`,
439
+ },
440
+ };
441
+ }
442
+ /**
443
+ * 패킷 바이트를 필드별 테이블 문자열로 표시 (디버그용)
444
+ *
445
+ * @example
446
+ * console.log(describePacketFields(buf));
447
+ * // Start | Cmd | Param | Size | Flag | Chk | End
448
+ * // 40 | 87 | 64 00 00 00 | 80 01 01 02 | 71 | 20 | 0A
449
+ * // NORMAL(0x40)| ETX(0x87) | 100 (0x00000064) | 0x02010180 (count=2, enroll=1, chunk=384)| ADD_NEW(0x71) | 0x20 OK | END(0x0A)
450
+ */
451
+ function describePacketFields(data, type = 'normal') {
452
+ const W = { start: 12, cmd: 10, param: 19, size: 42, flag: 20, chk: 10, end: 9, termId: 8 };
453
+ if (type === 'network') {
454
+ const info = describeNetworkPacket(data);
455
+ const buf = Buffer.isBuffer(data) ? data : Buffer.from(data);
456
+ if (buf.length < index_js_1.PACKET_SIZE.NETWORK)
457
+ return info.description;
458
+ const h = ['Start', 'TermID', 'Cmd', 'Param', 'Size', 'Flag', 'Chk', 'End'];
459
+ const hW = [W.start, W.termId, W.cmd, W.param, W.size, W.flag, W.chk, W.end];
460
+ const row1 = [hex(buf[0], 1), packetToHex(buf.subarray(1, 3)), hex(buf[3], 1), packetToHex(buf.subarray(4, 8)), packetToHex(buf.subarray(8, 12)), hex(buf[12], 1), hex(buf[13], 1), hex(buf[14], 1)];
461
+ const row2 = [info.fields.start, info.fields.terminalId ?? '', info.fields.command, info.fields.param, info.fields.size, info.fields.flag, info.fields.checksum, info.fields.end];
462
+ return [
463
+ h.map((v, i) => v.padEnd(hW[i])).join('| '),
464
+ row1.map((v, i) => v.padEnd(hW[i])).join('| '),
465
+ row2.map((v, i) => v.padEnd(hW[i])).join('| '),
466
+ ].join('\n');
467
+ }
468
+ const info = describeNormalPacket(data);
469
+ const buf = Buffer.isBuffer(data) ? data : Buffer.from(data);
470
+ if (buf.length < index_js_1.PACKET_SIZE.NORMAL)
471
+ return info.description;
472
+ const h = ['Start', 'Cmd', 'Param', 'Size', 'Flag', 'Chk', 'End'];
473
+ const hW = [W.start, W.cmd, W.param, W.size, W.flag, W.chk, W.end];
474
+ const row1 = [hex(buf[0], 1), hex(buf[1], 1), packetToHex(buf.subarray(2, 6)), packetToHex(buf.subarray(6, 10)), hex(buf[10], 1), hex(buf[11], 1), hex(buf[12], 1)];
475
+ const row2 = [info.fields.start, info.fields.command, info.fields.param, info.fields.size, info.fields.flag, info.fields.checksum, info.fields.end];
476
+ return [
477
+ h.map((v, i) => v.padEnd(hW[i])).join('| '),
478
+ row1.map((v, i) => v.padEnd(hW[i])).join('| '),
479
+ row2.map((v, i) => v.padEnd(hW[i])).join('| '),
480
+ ].join('\n');
481
+ }
286
482
  //# sourceMappingURL=packet.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"packet.js","sourceRoot":"","sources":["../../src/core/packet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"packet.js","sourceRoot":"","sources":["../../src/core/packet.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;;;AAkDH,oCAQC;AAKD,wCAOC;AAMD,8CAeC;AAMD,gDAgBC;AAMD,0CAYC;AAKD,8CA2CC;AAKD,gDA4CC;AAKD,0CAyBC;AAKD,kCAGC;AAKD,4CAWC;AAKD,4CAOC;AAKD,wCAGC;AAKD,wCAGC;AAkFD,oDA2DC;AAKD,sDAgDC;AAWD,oDAkCC;AAniBD,oDAAwG;AAExG,cAAc;AACd,kDAA0E;AAAjE,sGAAA,UAAU,OAAA;AAAE,oGAAA,QAAQ,OAAA;AAAE,uGAAA,WAAW,OAAA;AAyC1C;;;GAGG;AACH,SAAgB,YAAY,CAAC,IAAyB,EAAE,MAAe;IACrE,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,GAAG,IAAI,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,IAAyB;IACtD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,GAAG,MAAM,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,OAAe,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC;IAC9E,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,sBAAW,CAAC,MAAM,CAAC,CAAC;IAEhD,MAAM,CAAC,CAAC,CAAC,GAAG,qBAAU,CAAC,MAAM,CAAC,CAAS,QAAQ;IAC/C,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAmB,KAAK;IAC5C,MAAM,CAAC,aAAa,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,eAAe;IACtD,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAG,cAAc;IACrD,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAqB,aAAa;IAEpD,yBAAyB;IACzB,MAAM,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEtC,MAAM,CAAC,EAAE,CAAC,GAAG,mBAAQ,CAAC,CAAgB,QAAQ;IAE9C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,OAAe,EAAE,UAAU,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC;IAC/F,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,sBAAW,CAAC,OAAO,CAAC,CAAC;IAEjD,MAAM,CAAC,CAAC,CAAC,GAAG,qBAAU,CAAC,OAAO,CAAC,CAAW,eAAe;IACzD,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAM,gBAAgB;IAC1D,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAsB,KAAK;IAC/C,MAAM,CAAC,aAAa,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAK,eAAe;IACzD,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAM,cAAc;IACxD,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAwB,aAAa;IAEvD,yBAAyB;IACzB,MAAM,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEtC,MAAM,CAAC,EAAE,CAAC,GAAG,mBAAQ,CAAC,CAAmB,QAAQ;IAEjD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAAC,IAAyB;IACvD,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAEpC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAClC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAExB,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,IAAyB;IACzD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE7D,IAAI,GAAG,CAAC,MAAM,GAAG,sBAAW,CAAC,MAAM,EAAE,CAAC;QACpC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IACrB,MAAM,QAAQ,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IAExB,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAEvC,MAAM,KAAK,GAAG,QAAQ,KAAK,QAAQ,IAAI,SAAS,KAAK,qBAAU,CAAC,MAAM,IAAI,OAAO,KAAK,mBAAQ,CAAC;IAE/F,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,KAAK,GAAG,4BAA4B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,gBAAgB,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QACnG,CAAC;aAAM,IAAI,SAAS,KAAK,qBAAU,CAAC,MAAM,EAAE,CAAC;YAC3C,KAAK,GAAG,yBAAyB,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,uBAAuB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QACxD,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK;QACL,SAAS;QACT,OAAO;QACP,KAAK;QACL,IAAI;QACJ,IAAI;QACJ,QAAQ;QACR,gBAAgB,EAAE,QAAQ;QAC1B,OAAO;QACP,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,sBAAW,CAAC,MAAM,CAAC;QACzC,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,IAAyB;IAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE7D,IAAI,GAAG,CAAC,MAAM,GAAG,sBAAW,CAAC,OAAO,EAAE,CAAC;QACrC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,UAAU,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IACrB,MAAM,QAAQ,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IAExB,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAEvC,MAAM,KAAK,GAAG,QAAQ,KAAK,QAAQ,IAAI,SAAS,KAAK,qBAAU,CAAC,OAAO,IAAI,OAAO,KAAK,mBAAQ,CAAC;IAEhG,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,KAAK,GAAG,4BAA4B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,gBAAgB,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QACnG,CAAC;aAAM,IAAI,SAAS,KAAK,qBAAU,CAAC,OAAO,EAAE,CAAC;YAC5C,KAAK,GAAG,yBAAyB,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,uBAAuB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QACxD,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK;QACL,SAAS;QACT,UAAU;QACV,OAAO;QACP,KAAK;QACL,IAAI;QACJ,IAAI;QACJ,QAAQ;QACR,gBAAgB,EAAE,QAAQ;QAC1B,OAAO;QACP,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,IAAyB;IACvD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE7D,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,IAAI,GAAG,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC1B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,QAAQ,SAAS,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;IACrF,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,GAAG,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC;IAC7C,MAAM,gBAAgB,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;IACvD,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAEjD,OAAO;QACL,KAAK,EAAE,gBAAgB,KAAK,gBAAgB;QAC5C,WAAW,EAAE,QAAQ;QACrB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;QAC7B,QAAQ,EAAE,gBAAgB;QAC1B,gBAAgB;QAChB,KAAK,EAAE,gBAAgB,KAAK,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;KAChE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CAAC,IAAyB;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5E,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,IAAY,EAAE,OAAmB,QAAQ;IACxE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,IAAI,KAAK,qBAAU,CAAC,MAAM,CAAC;QACpC,KAAK,SAAS;YACZ,OAAO,IAAI,KAAK,qBAAU,CAAC,OAAO,CAAC;QACrC,KAAK,QAAQ;YACX,OAAO,IAAI,KAAK,qBAAU,CAAC,WAAW,IAAI,IAAI,KAAK,qBAAU,CAAC,WAAW,CAAC;QAC5E;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,MAAc,EAAE,OAAmB,QAAQ,EAAE,MAAM,GAAG,CAAC;IACtF,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,IAAyB;IACtD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,IAAyB;IACtD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;AACnD,CAAC;AAED,qBAAqB;AAErB,8BAA8B;AAC9B,IAAI,WAAW,GAA+B,IAAI,CAAC;AACnD,IAAI,aAAa,GAA+B,IAAI,CAAC;AACrD,IAAI,YAAY,GAA+B,IAAI,CAAC;AAEpD,SAAS,aAAa;IACpB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAO,CAAC,EAAE,CAAC;YACnD,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,aAAa,GAAG,IAAI,GAAG,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,oBAAS,CAAC,EAAE,CAAC;YACrD,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,SAAS,cAAc;IACrB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,mBAAQ,CAAC,EAAE,CAAC;YACpD,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,GAAG,CAAC,KAAa,EAAE,KAAK,GAAG,CAAC;IACnC,OAAO,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,aAAa,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY;IAC1C,oCAAoC;IACpC,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;AACnB,CAAC;AAoBD;;;;;;;GAOG;AACH,SAAgB,oBAAoB,CAAC,IAAyB;IAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAEjC,IAAI,GAAG,CAAC,MAAM,GAAG,sBAAW,CAAC,MAAM,EAAE,CAAC;QACpC,OAAO;YACL,GAAG,EAAE,OAAO;YACZ,WAAW,EAAE,uBAAuB,GAAG,CAAC,MAAM,UAAU;YACxD,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;SAChG,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IACrB,MAAM,QAAQ,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IAExB,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAE9C,yBAAyB;IACzB,MAAM,QAAQ,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC;IAEnE,0BAA0B;IAC1B,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC,OAAO,KAAK,kBAAO,CAAC,GAAG,IAAI,OAAO,KAAK,kBAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,MAAM,EAAE,CAAC;QAC1E,MAAM,KAAK,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;QACnC,MAAM,MAAM,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC;QAC5B,OAAO,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,KAAK,YAAY,MAAM,WAAW,KAAK,GAAG,CAAC;IACjF,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC;IAC3D,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;IAExE,SAAS;IACT,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,QAAQ,KAAK,QAAQ,CAAC;IACzC,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,iBAAiB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;IAE3G,MAAM,WAAW,GAAG,IAAI,OAAO,WAAW,QAAQ,SAAS,OAAO,SAAS,OAAO,EAAE,CAAC;IAErF,OAAO;QACL,GAAG,EAAE,OAAO;QACZ,WAAW;QACX,MAAM,EAAE;YACN,KAAK,EAAE,SAAS,KAAK,qBAAU,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;YACxE,OAAO,EAAE,GAAG,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG;YACtC,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,WAAW;YACrB,GAAG,EAAE,OAAO,KAAK,mBAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;SACvD;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,IAAyB;IAC7D,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAEjC,IAAI,GAAG,CAAC,MAAM,GAAG,sBAAW,CAAC,OAAO,EAAE,CAAC;QACrC,OAAO;YACL,GAAG,EAAE,OAAO;YACZ,WAAW,EAAE,uBAAuB,GAAG,CAAC,MAAM,UAAU;YACxD,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;SAChG,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,UAAU,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IACrB,MAAM,QAAQ,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IAExB,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC;IACnE,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC;IAC/D,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;IAExE,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,QAAQ,KAAK,QAAQ,CAAC;IACzC,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,iBAAiB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;IAE3G,MAAM,WAAW,GAAG,IAAI,OAAO,YAAY,UAAU,UAAU,QAAQ,SAAS,OAAO,SAAS,OAAO,EAAE,CAAC;IAE1G,OAAO;QACL,GAAG,EAAE,OAAO;QACZ,WAAW;QACX,MAAM,EAAE;YACN,KAAK,EAAE,SAAS,KAAK,qBAAU,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;YAC1E,OAAO,EAAE,GAAG,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG;YACtC,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,WAAW;YACrB,GAAG,EAAE,OAAO,KAAK,mBAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;YACtD,UAAU,EAAE,GAAG,UAAU,EAAE;SAC5B;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,oBAAoB,CAAC,IAAyB,EAAE,OAAmB,QAAQ;IACzF,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAE5F,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,GAAG,CAAC,MAAM,GAAG,sBAAW,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC;QAE9D,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5E,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC;QAC7L,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAElL,OAAO;YACL,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC3C,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9C,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SAC/C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,IAAI,GAAG,CAAC,MAAM,GAAG,sBAAW,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,WAAW,CAAC;IAE7D,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAClE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC;IAC7J,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAEpJ,OAAO;QACL,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3C,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;KAC/C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -1,17 +1,17 @@
1
1
  /**
2
- * SFM Serial Port Communication Module
2
+ * SFM 시리얼 포트 통신 모듈
3
3
  *
4
- * Based on Ghidra decompilation analysis - FUN_140010350 (Open), FUN_140010280 (Close),
4
+ * Ghidra 디컴파일 분석 기반 - FUN_140010350 (Open), FUN_140010280 (Close),
5
5
  * FUN_140010420 (Read), FUN_140010770 (Write)
6
6
  *
7
- * Serial settings:
7
+ * 시리얼 설정:
8
8
  * BaudRate: 115200 (0x1C200)
9
9
  * ByteSize: 8
10
10
  * Parity: None
11
11
  * StopBits: 1
12
12
  * FlowControl: RTS/CTS
13
13
  */
14
- import { SerialPort } from 'serialport';
14
+ import { SerialPort } from "serialport";
15
15
  export interface SerialPortInfo {
16
16
  path: string;
17
17
  manufacturer: string;
@@ -20,17 +20,17 @@ export interface SerialPortInfo {
20
20
  productId: string;
21
21
  }
22
22
  export interface AutoReconnectOptions {
23
- /** Enable auto-reconnect (default: false) */
23
+ /** 자동 재연결 활성화 (기본값: false) */
24
24
  enabled: boolean;
25
- /** Max retry count (default: 5, 0 = infinite) */
25
+ /** 최대 재시도 횟수 (기본값: 5, 0 = 무제한) */
26
26
  maxRetries?: number;
27
- /** Retry interval in ms (default: 2000) */
27
+ /** 재시도 간격 ms (기본값: 2000) */
28
28
  interval?: number;
29
- /** Reconnect attempt callback */
29
+ /** 재연결 시도 콜백 */
30
30
  onRetry?: (attempt: number, maxRetries: number) => void;
31
- /** Reconnect success callback */
31
+ /** 재연결 성공 콜백 */
32
32
  onReconnected?: () => void;
33
- /** Reconnect final failure callback */
33
+ /** 재연결 최종 실패 콜백 */
34
34
  onFailed?: (error: Error) => void;
35
35
  }
36
36
  export interface AutoReconnectCallbacks {
@@ -60,59 +60,69 @@ export declare class SfmSerial {
60
60
  private _reconnecting;
61
61
  private _reconnectTimer;
62
62
  constructor(options?: SfmSerialOptions);
63
- /** Set auto-reconnect options (constructor/internal use) */
63
+ /** 자동 재연결 옵션 설정 (생성자/내부 사용) */
64
64
  setAutoReconnect(options: AutoReconnectOptions | null): void;
65
- /** Set auto-reconnect callbacks only (preserves existing enabled/maxRetries/interval) */
65
+ /** 자동 재연결 콜백만 설정 (기존 enabled/maxRetries/interval 유지) */
66
66
  setAutoReconnectCallbacks(callbacks: AutoReconnectCallbacks): void;
67
- /** Whether reconnection is in progress */
67
+ /** 재연결 진행 여부 */
68
68
  get isReconnecting(): boolean;
69
- /** Set disconnect callback */
69
+ /** 연결 해제 콜백 설정 */
70
70
  setOnDisconnect(callback: ((error?: Error) => void) | null): void;
71
71
  /**
72
- * List available serial ports
73
- * (corresponds to registry HARDWARE\DEVICEMAP\SERIALCOMM)
72
+ * 사용 가능한 시리얼 포트 목록 조회
73
+ * (레지스트리 HARDWARE\DEVICEMAP\SERIALCOMM 대응)
74
74
  */
75
75
  static listPorts(): Promise<SerialPortInfo[]>;
76
76
  /**
77
- * Open serial port
77
+ * 시리얼 포트 열기
78
78
  * (FUN_140010350: CreateFileA + SetCommState + SetCommTimeouts)
79
79
  */
80
80
  open(path?: string): Promise<void>;
81
81
  /**
82
- * Close serial port
82
+ * 시리얼 포트 닫기
83
83
  * (FUN_140010280: PurgeComm + CloseHandle)
84
84
  */
85
85
  close(): Promise<void>;
86
86
  /**
87
- * Write data (chunked)
88
- * (FUN_140010770: 64-byte chunk WriteFile)
87
+ * 데이터 쓰기 (청크 분할)
88
+ * (FUN_140010770: 64바이트 청크 WriteFile)
89
+ *
90
+ * 시리얼 포트에 데이터를 한 번에 보내지 않고 64바이트(WRITE_CHUNK_SIZE)씩
91
+ * 쪼개서 전송한다. 각 청크 전송 후 drain()으로 하드웨어 전송 완료를 대기한다.
92
+ *
93
+ * 64바이트 단위로 분할하는 이유:
94
+ * - USB-Serial 변환기(FTDI, CH340 등)의 USB bulk transfer 단위가 64바이트
95
+ * - 시리얼 TX FIFO 버퍼 크기 제한으로 큰 데이터를 한 번에 넣으면 overflow 가능
96
+ *
97
+ * 일반 패킷(13바이트)은 1회로 끝나지만, 템플릿 데이터(지문 등) 전송 시
98
+ * 수백~수천 바이트가 될 수 있어 분할 전송이 필요하다.
89
99
  */
90
100
  write(data: Buffer | Uint8Array): Promise<void>;
91
101
  /**
92
- * Read data
93
- * (FUN_140010420: ReadFile with timeout)
102
+ * 데이터 읽기
103
+ * (FUN_140010420: 타임아웃 포함 ReadFile)
94
104
  */
95
105
  read(expectedLength: number, timeoutMs?: number): Promise<Buffer>;
96
106
  /**
97
- * Read single byte (for handshake)
107
+ * 단일 바이트 읽기 (핸드셰이크용)
98
108
  */
99
109
  readByte(timeoutMs?: number): Promise<number>;
100
110
  /**
101
- * Read until specific string (for firmware upgrade handshake)
111
+ * 특정 문자열까지 읽기 (펌웨어 업그레이드 핸드셰이크용)
102
112
  */
103
113
  readUntil(marker: string, timeoutMs?: number): Promise<string>;
104
114
  /**
105
- * Clear RX buffer (PurgeComm(hFile, 0xA) - PURGE_RXABORT | PURGE_RXCLEAR)
115
+ * RX 버퍼 클리어 (PurgeComm(hFile, 0xA) - PURGE_RXABORT | PURGE_RXCLEAR)
106
116
  * (FUN_1400101f0)
107
117
  */
108
118
  purgeRX(): Promise<void>;
109
119
  /**
110
- * Clear TX buffer (PurgeComm(hFile, 0x5) - PURGE_TXABORT | PURGE_TXCLEAR)
120
+ * TX 버퍼 클리어 (PurgeComm(hFile, 0x5) - PURGE_TXABORT | PURGE_TXCLEAR)
111
121
  * (FUN_140010230)
112
122
  */
113
123
  purgeTX(): Promise<void>;
114
124
  /**
115
- * Clear both TX/RX (PurgeComm(hFile, 0xF))
125
+ * TX/RX 모두 클리어 (PurgeComm(hFile, 0xF))
116
126
  */
117
127
  purgeAll(): Promise<void>;
118
128
  private _handleUnexpectedDisconnect;