@packet-net/pdn-aprs 0.0.1

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 (120) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/LICENSE +661 -0
  3. package/README.md +192 -0
  4. package/THIRD-PARTY-NOTICES.md +5 -0
  5. package/dist/builder.d.ts +232 -0
  6. package/dist/builder.d.ts.map +1 -0
  7. package/dist/builder.js +508 -0
  8. package/dist/builder.js.map +1 -0
  9. package/dist/bytes.d.ts +19 -0
  10. package/dist/bytes.d.ts.map +1 -0
  11. package/dist/bytes.js +120 -0
  12. package/dist/bytes.js.map +1 -0
  13. package/dist/codes.d.ts +13 -0
  14. package/dist/codes.d.ts.map +1 -0
  15. package/dist/codes.js +112 -0
  16. package/dist/codes.js.map +1 -0
  17. package/dist/decode/context.d.ts +33 -0
  18. package/dist/decode/context.d.ts.map +1 -0
  19. package/dist/decode/context.js +65 -0
  20. package/dist/decode/context.js.map +1 -0
  21. package/dist/decode/index.d.ts +10 -0
  22. package/dist/decode/index.d.ts.map +1 -0
  23. package/dist/decode/index.js +121 -0
  24. package/dist/decode/index.js.map +1 -0
  25. package/dist/decode/message.d.ts +5 -0
  26. package/dist/decode/message.d.ts.map +1 -0
  27. package/dist/decode/message.js +190 -0
  28. package/dist/decode/message.js.map +1 -0
  29. package/dist/decode/other.d.ts +25 -0
  30. package/dist/decode/other.d.ts.map +1 -0
  31. package/dist/decode/other.js +326 -0
  32. package/dist/decode/other.js.map +1 -0
  33. package/dist/decode/positioned.d.ts +132 -0
  34. package/dist/decode/positioned.d.ts.map +1 -0
  35. package/dist/decode/positioned.js +1063 -0
  36. package/dist/decode/positioned.js.map +1 -0
  37. package/dist/decode/reports.d.ts +13 -0
  38. package/dist/decode/reports.d.ts.map +1 -0
  39. package/dist/decode/reports.js +375 -0
  40. package/dist/decode/reports.js.map +1 -0
  41. package/dist/decoder.d.ts +23 -0
  42. package/dist/decoder.d.ts.map +1 -0
  43. package/dist/decoder.js +75 -0
  44. package/dist/decoder.js.map +1 -0
  45. package/dist/deviceid-data.d.ts +33 -0
  46. package/dist/deviceid-data.d.ts.map +1 -0
  47. package/dist/deviceid-data.js +2941 -0
  48. package/dist/deviceid-data.js.map +1 -0
  49. package/dist/deviceid.d.ts +12 -0
  50. package/dist/deviceid.d.ts.map +1 -0
  51. package/dist/deviceid.js +86 -0
  52. package/dist/deviceid.js.map +1 -0
  53. package/dist/diagnostics.d.ts +48 -0
  54. package/dist/diagnostics.d.ts.map +1 -0
  55. package/dist/diagnostics.js +65 -0
  56. package/dist/diagnostics.js.map +1 -0
  57. package/dist/encode/common.d.ts +19 -0
  58. package/dist/encode/common.d.ts.map +1 -0
  59. package/dist/encode/common.js +84 -0
  60. package/dist/encode/common.js.map +1 -0
  61. package/dist/encode/index.d.ts +35 -0
  62. package/dist/encode/index.d.ts.map +1 -0
  63. package/dist/encode/index.js +248 -0
  64. package/dist/encode/index.js.map +1 -0
  65. package/dist/encode/other.d.ts +21 -0
  66. package/dist/encode/other.d.ts.map +1 -0
  67. package/dist/encode/other.js +253 -0
  68. package/dist/encode/other.js.map +1 -0
  69. package/dist/encode/position.d.ts +31 -0
  70. package/dist/encode/position.d.ts.map +1 -0
  71. package/dist/encode/position.js +729 -0
  72. package/dist/encode/position.js.map +1 -0
  73. package/dist/header.d.ts +42 -0
  74. package/dist/header.d.ts.map +1 -0
  75. package/dist/header.js +206 -0
  76. package/dist/header.js.map +1 -0
  77. package/dist/index.d.ts +13 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +14 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/neutral.d.ts +22 -0
  82. package/dist/neutral.d.ts.map +1 -0
  83. package/dist/neutral.js +593 -0
  84. package/dist/neutral.js.map +1 -0
  85. package/dist/symbols-data.d.ts +832 -0
  86. package/dist/symbols-data.d.ts.map +1 -0
  87. package/dist/symbols-data.js +173 -0
  88. package/dist/symbols-data.js.map +1 -0
  89. package/dist/symbols.d.ts +35 -0
  90. package/dist/symbols.d.ts.map +1 -0
  91. package/dist/symbols.js +71 -0
  92. package/dist/symbols.js.map +1 -0
  93. package/dist/types.d.ts +458 -0
  94. package/dist/types.d.ts.map +1 -0
  95. package/dist/types.js +4 -0
  96. package/dist/types.js.map +1 -0
  97. package/package.json +68 -0
  98. package/src/builder.ts +617 -0
  99. package/src/bytes.ts +118 -0
  100. package/src/codes.ts +218 -0
  101. package/src/decode/context.ts +63 -0
  102. package/src/decode/index.ts +135 -0
  103. package/src/decode/message.ts +194 -0
  104. package/src/decode/other.ts +307 -0
  105. package/src/decode/positioned.ts +1161 -0
  106. package/src/decode/reports.ts +378 -0
  107. package/src/decoder.ts +76 -0
  108. package/src/deviceid-data.ts +2954 -0
  109. package/src/deviceid.ts +83 -0
  110. package/src/diagnostics.ts +86 -0
  111. package/src/encode/common.ts +87 -0
  112. package/src/encode/index.ts +280 -0
  113. package/src/encode/other.ts +247 -0
  114. package/src/encode/position.ts +656 -0
  115. package/src/header.ts +221 -0
  116. package/src/index.ts +57 -0
  117. package/src/neutral.ts +595 -0
  118. package/src/symbols-data.ts +181 -0
  119. package/src/symbols.ts +85 -0
  120. package/src/types.ts +571 -0
@@ -0,0 +1,508 @@
1
+ // A fluent builder for the packets an application typically sends.
2
+ //
3
+ // const packet = Aprs.from('M0LTE-9')
4
+ // .via('WIDE1-1', 'WIDE2-1')
5
+ // .position(51.45, -0.98)
6
+ // .symbol(Symbols.car)
7
+ // .course(88)
8
+ // .speed(36)
9
+ // .comment('Mobile')
10
+ // .build();
11
+ // packet.toTnc2(); // 'M0LTE-9>APZ001,WIDE1-1,WIDE2-1:!5127.00N/00058.80W>088/036Mobile'
12
+ //
13
+ // `build()` encodes the packet, so anything the spec does not allow is refused there, with an
14
+ // `AprsEncodeError` that says why.
15
+ import { encodeInformation, encodeAx25, encodeTnc2, encodeTnc2Bytes, wrapKiss } from './encode/index.js';
16
+ import { symbolOf } from './symbols.js';
17
+ /** The tocall used when none is given: the experimental `APZ` range. */
18
+ export const DEFAULT_DESTINATION = 'APZ001';
19
+ function built(header, data) {
20
+ const encoded = encodeInformation(data);
21
+ const destination = encoded.destination ?? header.destination ?? DEFAULT_DESTINATION;
22
+ const toEncode = { source: header.source, destination, path: header.path, data };
23
+ return Object.freeze({
24
+ source: header.source,
25
+ destination,
26
+ path: Object.freeze([...header.path]),
27
+ data,
28
+ information: encoded.info,
29
+ toTnc2: () => encodeTnc2(toEncode),
30
+ toTnc2Bytes: () => encodeTnc2Bytes(toEncode),
31
+ toAx25: () => encodeAx25(toEncode),
32
+ toKiss: (port = 0) => wrapKiss(encodeAx25(toEncode), port),
33
+ });
34
+ }
35
+ function asSymbol(symbol) {
36
+ return typeof symbol === 'string' ? symbolOf(symbol) : symbol;
37
+ }
38
+ /**
39
+ * A timestamp from a `Date`, in UTC: day, hour and minute (`dhm-zulu`, the recommended form),
40
+ * or hours, minutes and seconds (`hms`).
41
+ */
42
+ export function timestampOf(date, kind = 'dhm-zulu') {
43
+ return kind === 'hms'
44
+ ? { kind: 'hms', hour: date.getUTCHours(), minute: date.getUTCMinutes(), second: date.getUTCSeconds() }
45
+ : { kind: 'dhm-zulu', day: date.getUTCDate(), hour: date.getUTCHours(), minute: date.getUTCMinutes() };
46
+ }
47
+ function asTimestamp(t, kind) {
48
+ return t instanceof Date ? timestampOf(t, kind) : t;
49
+ }
50
+ /** Starts a packet: `Aprs.from('M0LTE-9')`. */
51
+ export const Aprs = {
52
+ /** A packet from `source`. */
53
+ from(source) {
54
+ return new PacketBuilder({ source, path: [] });
55
+ },
56
+ };
57
+ /** The header, then the kind of packet. */
58
+ export class PacketBuilder {
59
+ header;
60
+ constructor(header) {
61
+ this.header = header;
62
+ }
63
+ /** The destination (tocall) identifying the sending software; ignored for Mic-E. */
64
+ to(destination) {
65
+ return new PacketBuilder({ ...this.header, destination });
66
+ }
67
+ /** The digipeater path, e.g. `via('WIDE1-1', 'WIDE2-1')`. */
68
+ via(...path) {
69
+ return new PacketBuilder({ ...this.header, path: [...this.header.path, ...path] });
70
+ }
71
+ /** A position report. */
72
+ position(latitude, longitude) {
73
+ return new PositionBuilder(this.header, latitude, longitude);
74
+ }
75
+ /** A weather report at a position (the weather station symbol, unless you pick another `_`). */
76
+ weather(latitude, longitude, weather) {
77
+ return new PositionBuilder(this.header, latitude, longitude).symbol('/_').weather(weather);
78
+ }
79
+ /** An object: `timestamp` defaults to now (objects always carry one). */
80
+ object(name, latitude, longitude) {
81
+ return new ObjectBuilder(this.header, name, latitude, longitude);
82
+ }
83
+ /** An item. */
84
+ item(name, latitude, longitude) {
85
+ return new ItemBuilder(this.header, name, latitude, longitude);
86
+ }
87
+ /** A Mic-E report: its position and message type go in the destination address. */
88
+ micE(latitude, longitude) {
89
+ return new MicEBuilder(this.header, latitude, longitude);
90
+ }
91
+ /** A message to `addressee`. */
92
+ message(addressee, text) {
93
+ return new MessageBuilder(this.header, addressee, text);
94
+ }
95
+ /** An acknowledgement of message `id` from `addressee`. */
96
+ ack(addressee, id) {
97
+ return new DataBuilder(this.header, { type: 'ack', addressee, ackedId: id });
98
+ }
99
+ /** A rejection of message `id` from `addressee`. */
100
+ reject(addressee, id) {
101
+ return new DataBuilder(this.header, { type: 'reject', addressee, rejectedId: id });
102
+ }
103
+ /** A bulletin (`id` a digit) or announcement (`id` a letter), optionally to a group. */
104
+ bulletin(id, text, group = '') {
105
+ return new DataBuilder(this.header, { type: 'bulletin', addressee: `BLN${id}${group}`, text });
106
+ }
107
+ /** A status report. */
108
+ status(text) {
109
+ return new StatusBuilder(this.header, text);
110
+ }
111
+ /** A telemetry report: sequence, five analog values and eight bits (`'01101001'`, B1 first). */
112
+ telemetry(sequence, analog, bits) {
113
+ const seq = typeof sequence === 'number' ? String(sequence).padStart(3, '0') : sequence;
114
+ return new TelemetryBuilder(this.header, seq, analog, bits);
115
+ }
116
+ /** Telemetry channel names (`PARM.`), sent to the station whose telemetry they describe. */
117
+ telemetryNames(addressee, names) {
118
+ return new DataBuilder(this.header, { type: 'telemetry-names', addressee, names: [...names] });
119
+ }
120
+ /** Telemetry units and labels (`UNIT.`). */
121
+ telemetryUnits(addressee, units) {
122
+ return new DataBuilder(this.header, { type: 'telemetry-units', addressee, units: [...units] });
123
+ }
124
+ /** Telemetry equation coefficients (`EQNS.`): a, b, c for each analog channel. */
125
+ telemetryCoefficients(addressee, coefficients) {
126
+ return new DataBuilder(this.header, { type: 'telemetry-coefficients', addressee, coefficients: [...coefficients] });
127
+ }
128
+ /** Telemetry bit sense and project title (`BITS.`). */
129
+ telemetryBits(addressee, bits, project) {
130
+ const data = { type: 'telemetry-bits', addressee, bits };
131
+ if (project !== undefined)
132
+ data.project = project;
133
+ return new DataBuilder(this.header, data);
134
+ }
135
+ /** A positionless weather report (not recommended: a weather report with a position is better). */
136
+ weatherReport(weather, at = new Date()) {
137
+ const timestamp = {
138
+ kind: 'mdhm',
139
+ month: at.getUTCMonth() + 1,
140
+ day: at.getUTCDate(),
141
+ hour: at.getUTCHours(),
142
+ minute: at.getUTCMinutes(),
143
+ };
144
+ return new DataBuilder(this.header, { type: 'weather', timestamp, weather });
145
+ }
146
+ /** Any data, built by hand. */
147
+ data(data) {
148
+ return new DataBuilder(this.header, data);
149
+ }
150
+ }
151
+ /** Builds data that needs nothing more. */
152
+ export class DataBuilder {
153
+ header;
154
+ value;
155
+ constructor(header, value) {
156
+ this.header = header;
157
+ this.value = value;
158
+ }
159
+ /** Encodes the packet; throws `AprsEncodeError` if the spec does not allow it. */
160
+ build() {
161
+ return built(this.header, this.value);
162
+ }
163
+ /** Shorthand for `build().toTnc2()`. */
164
+ toTnc2() {
165
+ return this.build().toTnc2();
166
+ }
167
+ }
168
+ /** What positions, objects, items and Mic-E reports share. */
169
+ class PositionedBuilder {
170
+ header;
171
+ fields;
172
+ constructor(header, latitude, longitude) {
173
+ this.header = header;
174
+ this.fields = { latitude, longitude, symbol: { table: '/', code: '/' } };
175
+ }
176
+ /** The display symbol: `Symbols.car`, or its two characters (`'/>'`). */
177
+ symbol(symbol) {
178
+ this.fields.symbol = asSymbol(symbol);
179
+ return this.self();
180
+ }
181
+ /** Course over the ground, degrees 1-360 (360 is north). */
182
+ course(degrees) {
183
+ this.fields.courseDegrees = degrees;
184
+ return this.self();
185
+ }
186
+ /** Speed, knots. */
187
+ speed(knots) {
188
+ this.fields.speedKnots = knots;
189
+ return this.self();
190
+ }
191
+ /** Altitude, feet. */
192
+ altitude(feet) {
193
+ this.fields.altitudeFeet = feet;
194
+ return this.self();
195
+ }
196
+ /** Altitude, metres (sent in feet, rounded). */
197
+ altitudeMetres(metres) {
198
+ this.fields.altitudeFeet = Math.round(metres / 0.3048);
199
+ return this.self();
200
+ }
201
+ /** Free text. */
202
+ comment(text) {
203
+ this.fields.comment = text;
204
+ return this.self();
205
+ }
206
+ /** An APRS 1.2 voice frequency, e.g. `frequency(145.5, { tone: 'tone', toneValue: 77 })`. */
207
+ frequency(mhz, details = {}) {
208
+ this.fields.frequency = { mhz, ...details };
209
+ return this.self();
210
+ }
211
+ /** Base-91 comment telemetry: a sequence and one to five analog values (0-8280). */
212
+ commentTelemetry(sequence, analog, digital) {
213
+ const t = { sequence, analog: [...analog] };
214
+ if (digital !== undefined)
215
+ t.digital = digital;
216
+ this.fields.telemetry = t;
217
+ return this.self();
218
+ }
219
+ /** A `!DAO!` for about a foot of precision (base-91), with its datum (`W` is WGS84). */
220
+ dao(datum = 'W', precision = 'base91') {
221
+ this.fields.dao = { datum, precision };
222
+ return this.self();
223
+ }
224
+ /** Blanks 1-4 digits of the position (APRS12c ch. 6). */
225
+ ambiguity(digits) {
226
+ this.fields.ambiguity = digits;
227
+ return this.self();
228
+ }
229
+ }
230
+ /** A position (`!`, `=`, `/`, `@`), or an object or item's position. */
231
+ class ReportBuilder extends PositionedBuilder {
232
+ /** Power, antenna height, gain and directivity codes (APRS12c ch. 7). */
233
+ phg(power, height, gain, directivity = 0, beaconsPerHour) {
234
+ const phg = { power, height, gain, directivity };
235
+ if (beaconsPerHour !== undefined)
236
+ phg.beaconsPerHour = beaconsPerHour;
237
+ this.fields.phg = phg;
238
+ return this.self();
239
+ }
240
+ /** A pre-calculated radio range, miles. */
241
+ range(miles) {
242
+ this.fields.rangeMiles = miles;
243
+ return this.self();
244
+ }
245
+ /** Weather data (needs a weather station symbol, `_`). */
246
+ weather(weather) {
247
+ this.fields.weather = weather;
248
+ return this.self();
249
+ }
250
+ /** The compressed format (APRS12c ch. 9), with its type byte if you want to set it. */
251
+ compressed(compression) {
252
+ this.fields.compressed = true;
253
+ if (compression)
254
+ this.fields.compression = compression;
255
+ return this.self();
256
+ }
257
+ }
258
+ /** A position report. */
259
+ export class PositionBuilder extends ReportBuilder {
260
+ timestampValue;
261
+ messagingValue = false;
262
+ self() {
263
+ return this;
264
+ }
265
+ /** When the position was fixed: a `Date` (UTC) or a timestamp. */
266
+ timestamp(at, kind) {
267
+ this.timestampValue = asTimestamp(at, kind);
268
+ return this;
269
+ }
270
+ /** The sender can receive APRS messages. */
271
+ messaging(capable = true) {
272
+ this.messagingValue = capable;
273
+ return this;
274
+ }
275
+ build() {
276
+ const data = { type: 'position', ...this.fields };
277
+ if (this.timestampValue)
278
+ data.timestamp = this.timestampValue;
279
+ if (this.messagingValue)
280
+ data.messaging = true;
281
+ return built(this.header, data);
282
+ }
283
+ toTnc2() {
284
+ return this.build().toTnc2();
285
+ }
286
+ }
287
+ /** An object report. */
288
+ export class ObjectBuilder extends ReportBuilder {
289
+ name;
290
+ timestampValue = timestampOf(new Date());
291
+ killedValue = false;
292
+ constructor(header, name, latitude, longitude) {
293
+ super(header, latitude, longitude);
294
+ this.name = name;
295
+ }
296
+ self() {
297
+ return this;
298
+ }
299
+ /** When the object was at this position (defaults to now). */
300
+ timestamp(at, kind) {
301
+ this.timestampValue = asTimestamp(at, kind);
302
+ return this;
303
+ }
304
+ /** Kills the object: receivers remove it. */
305
+ killed(killed = true) {
306
+ this.killedValue = killed;
307
+ return this;
308
+ }
309
+ build() {
310
+ const data = {
311
+ type: 'object',
312
+ name: this.name,
313
+ timestamp: this.timestampValue,
314
+ ...this.fields,
315
+ };
316
+ if (this.killedValue)
317
+ data.killed = true;
318
+ return built(this.header, data);
319
+ }
320
+ toTnc2() {
321
+ return this.build().toTnc2();
322
+ }
323
+ }
324
+ /** An item report. */
325
+ export class ItemBuilder extends ReportBuilder {
326
+ name;
327
+ killedValue = false;
328
+ constructor(header, name, latitude, longitude) {
329
+ super(header, latitude, longitude);
330
+ this.name = name;
331
+ }
332
+ self() {
333
+ return this;
334
+ }
335
+ /** Kills the item: receivers remove it. */
336
+ killed(killed = true) {
337
+ this.killedValue = killed;
338
+ return this;
339
+ }
340
+ build() {
341
+ const data = { type: 'item', name: this.name, ...this.fields };
342
+ if (this.killedValue)
343
+ data.killed = true;
344
+ return built(this.header, data);
345
+ }
346
+ toTnc2() {
347
+ return this.build().toTnc2();
348
+ }
349
+ }
350
+ /** A Mic-E report. */
351
+ export class MicEBuilder extends PositionedBuilder {
352
+ messageValue = 'off-duty';
353
+ typeCodeValue = '`';
354
+ locatorValue;
355
+ oldValue = false;
356
+ self() {
357
+ return this;
358
+ }
359
+ /** The Mic-E message: `off-duty` (the default), `en-route`, `in-service`, `returning`, ... */
360
+ micEMessage(message) {
361
+ this.messageValue = message;
362
+ return this;
363
+ }
364
+ /** Whether the sender can receive messages: the `` ` `` (yes, the default) or `'` type code. */
365
+ messaging(capable = true) {
366
+ this.typeCodeValue = capable ? '`' : "'";
367
+ return this;
368
+ }
369
+ /** A Maidenhead locator in the status text. */
370
+ locator(locator) {
371
+ this.locatorValue = locator.toUpperCase();
372
+ return this;
373
+ }
374
+ /** Marks the position as old (not current) GPS data. */
375
+ old(old = true) {
376
+ this.oldValue = old;
377
+ return this;
378
+ }
379
+ build() {
380
+ const data = { type: 'mic-e', micEMessage: this.messageValue, ...this.fields };
381
+ if (this.typeCodeValue !== undefined)
382
+ data.typeCode = this.typeCodeValue;
383
+ if (this.locatorValue !== undefined)
384
+ data.locator = this.locatorValue;
385
+ if (this.oldValue)
386
+ data.oldData = true;
387
+ return built(this.header, data);
388
+ }
389
+ toTnc2() {
390
+ return this.build().toTnc2();
391
+ }
392
+ }
393
+ /** A message. */
394
+ export class MessageBuilder {
395
+ header;
396
+ addressee;
397
+ text;
398
+ idValue;
399
+ replyAckValue;
400
+ constructor(header, addressee, text) {
401
+ this.header = header;
402
+ this.addressee = addressee;
403
+ this.text = text;
404
+ }
405
+ /** A message ID (1-5 letters or digits), so the addressee acknowledges it. */
406
+ id(id) {
407
+ this.idValue = String(id);
408
+ return this;
409
+ }
410
+ /** A reply-ack: the ID of the other station's message this also acknowledges; `''` for none. */
411
+ replyAck(id = '') {
412
+ this.replyAckValue = id;
413
+ return this;
414
+ }
415
+ build() {
416
+ const data = {
417
+ type: 'message',
418
+ addressee: this.addressee,
419
+ text: this.text,
420
+ };
421
+ if (this.idValue !== undefined)
422
+ data.messageId = this.idValue;
423
+ if (this.replyAckValue !== undefined)
424
+ data.replyAck = this.replyAckValue;
425
+ return built(this.header, data);
426
+ }
427
+ toTnc2() {
428
+ return this.build().toTnc2();
429
+ }
430
+ }
431
+ /** A status report. */
432
+ export class StatusBuilder {
433
+ header;
434
+ text;
435
+ timestampValue;
436
+ locatorValue;
437
+ beamValue;
438
+ constructor(header, text) {
439
+ this.header = header;
440
+ this.text = text;
441
+ }
442
+ /** When (UTC day, hour and minute). A status with a locator has no timestamp. */
443
+ timestamp(at) {
444
+ this.timestampValue = asTimestamp(at, 'dhm-zulu');
445
+ return this;
446
+ }
447
+ /** A Maidenhead locator and a symbol, in place of a timestamp. */
448
+ locator(locator, symbol) {
449
+ this.locatorValue = { locator: locator.toUpperCase(), symbol: asSymbol(symbol) };
450
+ return this;
451
+ }
452
+ /** Meteor scatter beam heading and power codes (`^B7`). */
453
+ beam(headingCode, powerCode) {
454
+ this.beamValue = { headingCode, powerCode };
455
+ return this;
456
+ }
457
+ build() {
458
+ const data = { type: 'status' };
459
+ if (this.timestampValue)
460
+ data.timestamp = this.timestampValue;
461
+ if (this.locatorValue) {
462
+ data.locator = this.locatorValue.locator;
463
+ data.symbol = this.locatorValue.symbol;
464
+ }
465
+ if (this.beamValue)
466
+ data.beam = this.beamValue;
467
+ if (this.text !== undefined && this.text.length > 0)
468
+ data.text = this.text;
469
+ return built(this.header, data);
470
+ }
471
+ toTnc2() {
472
+ return this.build().toTnc2();
473
+ }
474
+ }
475
+ /** A telemetry report. */
476
+ export class TelemetryBuilder {
477
+ header;
478
+ sequence;
479
+ analog;
480
+ bits;
481
+ commentValue;
482
+ constructor(header, sequence, analog, bits) {
483
+ this.header = header;
484
+ this.sequence = sequence;
485
+ this.analog = analog;
486
+ this.bits = bits;
487
+ }
488
+ /** Free text after the bits. */
489
+ comment(text) {
490
+ this.commentValue = text;
491
+ return this;
492
+ }
493
+ build() {
494
+ const data = {
495
+ type: 'telemetry',
496
+ sequence: this.sequence,
497
+ analog: [...this.analog],
498
+ bits: this.bits,
499
+ };
500
+ if (this.commentValue !== undefined && this.commentValue.length > 0)
501
+ data.comment = this.commentValue;
502
+ return built(this.header, data);
503
+ }
504
+ toTnc2() {
505
+ return this.build().toTnc2();
506
+ }
507
+ }
508
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /** One character per byte. */
2
+ export declare function bytesToBinary(bytes: Uint8Array, start?: number, end?: number): string;
3
+ /** The bytes of a binary string (each character must be U+0000-U+00FF). */
4
+ export declare function binaryToBytes(s: string): Uint8Array;
5
+ /** Whether a binary string is all ASCII. */
6
+ export declare function isAscii(s: string): boolean;
7
+ /** Decodes a binary string as UTF-8; `undefined` if it is not valid UTF-8. */
8
+ export declare function decodeUtf8Binary(s: string): string | undefined;
9
+ /** Decodes bytes as UTF-8; `undefined` if they are not valid UTF-8. */
10
+ export declare function decodeUtf8(bytes: Uint8Array): string | undefined;
11
+ /** Encodes a string as UTF-8, as a binary string. */
12
+ export declare function encodeUtf8Binary(text: string): string;
13
+ /** Encodes a string as UTF-8. */
14
+ export declare function encodeUtf8(text: string): Uint8Array;
15
+ /** Parses hex (whitespace allowed) into bytes. */
16
+ export declare function hexToBytes(hex: string): Uint8Array;
17
+ /** Formats bytes as upper-case hex. */
18
+ export declare function bytesToHex(bytes: Uint8Array): string;
19
+ //# sourceMappingURL=bytes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bytes.d.ts","sourceRoot":"","sources":["../src/bytes.ts"],"names":[],"mappings":"AAIA,8BAA8B;AAC9B,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,SAAI,EAAE,GAAG,SAAe,GAAG,MAAM,CAOtF;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,CAInD;AAED,4CAA4C;AAC5C,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAG1C;AAED,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA2C9D;AAED,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAEhE;AAED,qDAAqD;AACrD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiBrD;AAED,iCAAiC;AACjC,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAEnD;AAED,kDAAkD;AAClD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAMlD;AAED,uCAAuC;AACvC,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIpD"}
package/dist/bytes.js ADDED
@@ -0,0 +1,120 @@
1
+ // Byte and text helpers. APRS parsing works on a "binary string", one character per byte
2
+ // (U+0000-U+00FF), so fixed-width fields line up with the bytes sent; text fields are then
3
+ // decoded from their bytes as UTF-8, or as Latin-1 when they are not valid UTF-8.
4
+ /** One character per byte. */
5
+ export function bytesToBinary(bytes, start = 0, end = bytes.length) {
6
+ let s = '';
7
+ const CHUNK = 8192;
8
+ for (let i = start; i < end; i += CHUNK) {
9
+ s += String.fromCharCode.apply(null, Array.from(bytes.subarray(i, Math.min(end, i + CHUNK))));
10
+ }
11
+ return s;
12
+ }
13
+ /** The bytes of a binary string (each character must be U+0000-U+00FF). */
14
+ export function binaryToBytes(s) {
15
+ const out = new Uint8Array(s.length);
16
+ for (let i = 0; i < s.length; i++)
17
+ out[i] = s.charCodeAt(i) & 0xff;
18
+ return out;
19
+ }
20
+ /** Whether a binary string is all ASCII. */
21
+ export function isAscii(s) {
22
+ for (let i = 0; i < s.length; i++)
23
+ if (s.charCodeAt(i) > 0x7f)
24
+ return false;
25
+ return true;
26
+ }
27
+ /** Decodes a binary string as UTF-8; `undefined` if it is not valid UTF-8. */
28
+ export function decodeUtf8Binary(s) {
29
+ let out = '';
30
+ let i = 0;
31
+ const n = s.length;
32
+ while (i < n) {
33
+ const b0 = s.charCodeAt(i);
34
+ if (b0 < 0x80) {
35
+ // Copy a run of ASCII at once.
36
+ let j = i + 1;
37
+ while (j < n && s.charCodeAt(j) < 0x80)
38
+ j++;
39
+ out += s.slice(i, j);
40
+ i = j;
41
+ continue;
42
+ }
43
+ let cp;
44
+ let need;
45
+ let min;
46
+ if (b0 >= 0xc2 && b0 <= 0xdf) {
47
+ cp = b0 & 0x1f;
48
+ need = 1;
49
+ min = 0x80;
50
+ }
51
+ else if (b0 >= 0xe0 && b0 <= 0xef) {
52
+ cp = b0 & 0x0f;
53
+ need = 2;
54
+ min = 0x800;
55
+ }
56
+ else if (b0 >= 0xf0 && b0 <= 0xf4) {
57
+ cp = b0 & 0x07;
58
+ need = 3;
59
+ min = 0x10000;
60
+ }
61
+ else {
62
+ return undefined;
63
+ }
64
+ if (i + need >= n)
65
+ return undefined;
66
+ for (let k = 1; k <= need; k++) {
67
+ const b = s.charCodeAt(i + k);
68
+ if ((b & 0xc0) !== 0x80)
69
+ return undefined;
70
+ cp = (cp << 6) | (b & 0x3f);
71
+ }
72
+ if (cp < min || cp > 0x10ffff || (cp >= 0xd800 && cp <= 0xdfff))
73
+ return undefined;
74
+ out += String.fromCodePoint(cp);
75
+ i += need + 1;
76
+ }
77
+ return out;
78
+ }
79
+ /** Decodes bytes as UTF-8; `undefined` if they are not valid UTF-8. */
80
+ export function decodeUtf8(bytes) {
81
+ return decodeUtf8Binary(bytesToBinary(bytes));
82
+ }
83
+ /** Encodes a string as UTF-8, as a binary string. */
84
+ export function encodeUtf8Binary(text) {
85
+ let out = '';
86
+ for (const ch of text) {
87
+ const cp = ch.codePointAt(0);
88
+ if (cp < 0x80)
89
+ out += ch;
90
+ else if (cp < 0x800)
91
+ out += String.fromCharCode(0xc0 | (cp >> 6), 0x80 | (cp & 0x3f));
92
+ else if (cp < 0x10000)
93
+ out += String.fromCharCode(0xe0 | (cp >> 12), 0x80 | ((cp >> 6) & 0x3f), 0x80 | (cp & 0x3f));
94
+ else
95
+ out += String.fromCharCode(0xf0 | (cp >> 18), 0x80 | ((cp >> 12) & 0x3f), 0x80 | ((cp >> 6) & 0x3f), 0x80 | (cp & 0x3f));
96
+ }
97
+ return out;
98
+ }
99
+ /** Encodes a string as UTF-8. */
100
+ export function encodeUtf8(text) {
101
+ return binaryToBytes(encodeUtf8Binary(text));
102
+ }
103
+ /** Parses hex (whitespace allowed) into bytes. */
104
+ export function hexToBytes(hex) {
105
+ const clean = hex.replace(/\s+/g, '');
106
+ if (clean.length % 2 !== 0 || /[^0-9a-fA-F]/.test(clean))
107
+ throw new RangeError('not hex');
108
+ const out = new Uint8Array(clean.length / 2);
109
+ for (let i = 0; i < out.length; i++)
110
+ out[i] = parseInt(clean.substr(i * 2, 2), 16);
111
+ return out;
112
+ }
113
+ /** Formats bytes as upper-case hex. */
114
+ export function bytesToHex(bytes) {
115
+ let s = '';
116
+ for (const b of bytes)
117
+ s += b.toString(16).toUpperCase().padStart(2, '0');
118
+ return s;
119
+ }
120
+ //# sourceMappingURL=bytes.js.map