ngx-kel-agent 0.4.5 → 0.5.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.
@@ -1,83 +1,291 @@
1
+ import { Subject, BehaviorSubject, ReplaySubject } from 'rxjs';
1
2
  import * as i0 from '@angular/core';
2
3
  import { Injectable } from '@angular/core';
3
- import { BehaviorSubject, ReplaySubject, Subject } from 'rxjs';
4
4
  import { debounceTime, retryWhen, tap, delay } from 'rxjs/operators';
5
5
  import { webSocket } from 'rxjs/webSocket';
6
6
 
7
- class AgentService {
7
+ class AgentMessageService {
8
8
  constructor() {
9
- /** Whether we're connected to the agent. */
10
- this.connectedState$ = new BehaviorSubject(false);
11
- /* WSJT-X */
9
+ this.rxMessage$ = new Subject();
10
+ this.txMessage$ = new Subject();
11
+ }
12
+ }
13
+ AgentMessageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentMessageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
14
+ AgentMessageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentMessageService, providedIn: 'root' });
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentMessageService, decorators: [{
16
+ type: Injectable,
17
+ args: [{
18
+ providedIn: 'root',
19
+ }]
20
+ }], ctorParameters: function () { return []; } });
21
+
22
+ class WsjtxService {
23
+ constructor(messages) {
24
+ this.messages = messages;
12
25
  /** Whether we're getting any messages from WSJT-X. */
13
- this.wsjtxState$ = new BehaviorSubject(false);
26
+ this.connected$ = new BehaviorSubject(false);
14
27
  /** Subject for listening to WSJT-X "Heartbeat" messages. */
15
- this.wsjtxHeartbeat$ = new ReplaySubject(1);
28
+ this.heartbeat$ = new ReplaySubject(1);
16
29
  /** Subject for listening to WSJT-X "Status" messages. */
17
- this.wsjtxStatus$ = new ReplaySubject(1);
30
+ this.status$ = new ReplaySubject(1);
18
31
  /** Subject for listening to WSJT-X "Decode" messages. */
19
- this.wsjtxDecode$ = new Subject();
32
+ this.decode$ = new Subject();
20
33
  /** Subject for listening to WSJT-X "Clear" messages. */
21
- this.wsjtxClear$ = new Subject();
34
+ this.clear$ = new Subject();
22
35
  /** Subject for listening to WSJT-X "QsoLogged" messages. */
23
- this.wsjtxQsoLogged$ = new Subject();
36
+ this.qsoLogged$ = new Subject();
24
37
  /** Subject for listening to WSJT-X "Close" messages. */
25
- this.wsjtxClose$ = new Subject();
38
+ this.close$ = new Subject();
26
39
  /** Subject for listening to WSJT-X "WsprDecode" messages. */
27
- this.wsjtxWsprDecode$ = new Subject();
40
+ this.wsprDecode$ = new Subject();
28
41
  /** Subject for listening to WSJT-X "LoggedAdif" messages. */
29
- this.wsjtxLoggedAdif$ = new Subject();
30
- /* Hamlib */
31
- /** Whether we're getting any messages from Hamlib. */
32
- this.hamlibState$ = new BehaviorSubject(false);
33
- /** Subject for listening to Hamlib "RigState" messages. */
34
- this.hamlibRigState$ = new BehaviorSubject(null);
35
- this.defaultAgentHost = 'localhost';
36
- this.defaultAgentPort = 8081;
37
- this.localStorageHostKey = 'agent-host';
38
- this.localStoragePortKey = 'agent-port';
39
- this.agentHost = this.defaultAgentHost;
40
- this.agentPort = this.defaultAgentPort;
41
- this.agentWebSocketSubject = null;
42
- this.agentWebsocketSubscription = null;
42
+ this.loggedAdif$ = new Subject();
43
43
  this.wsjtxId = 'WSJT-X';
44
+ this.setupBehaviors();
44
45
  }
45
- init() {
46
- this.agentHost = this.getHost();
47
- this.agentPort = this.getPort();
48
- this.setupWsjtxBehaviors();
49
- this.setupHamlibBehaviors();
50
- this.connect();
51
- }
52
- setupWsjtxBehaviors() {
46
+ setupBehaviors() {
47
+ this.messages.rxMessage$.subscribe((msg) => this.handleMessage(msg));
53
48
  // if we haven't heard from WSJT-X in 15 seconds, consider it "down"
54
- this.wsjtxState$
49
+ this.connected$
55
50
  .pipe(debounceTime(15000))
56
- .subscribe(() => this.wsjtxState$.next(false));
51
+ .subscribe(() => this.connected$.next(false));
57
52
  // When WSJT-X announces it's closing, set it to "down" immediately
58
- this.wsjtxClose$.subscribe(() => {
59
- this.wsjtxState$.next(false);
53
+ this.close$.subscribe(() => {
54
+ this.connected$.next(false);
60
55
  });
61
56
  // When WSJT-X goes down, clear its persistent message subjects
62
- this.wsjtxState$.subscribe((isUp) => {
57
+ this.connected$.subscribe((isUp) => {
63
58
  if (!isUp) {
64
- this.wsjtxHeartbeat$.next(null);
65
- this.wsjtxStatus$.next(null);
59
+ this.heartbeat$.next(null);
60
+ this.status$.next(null);
66
61
  }
67
62
  });
68
63
  }
69
- setupHamlibBehaviors() {
64
+ handleMessage(msg) {
65
+ if (!msg.wsjtx) {
66
+ return;
67
+ }
68
+ this.connected$.next(true);
69
+ this.wsjtxId = msg.wsjtx.payload.id;
70
+ switch (msg.wsjtx.type) {
71
+ case 'HeartbeatMessage':
72
+ this.heartbeat$.next(msg.wsjtx.payload);
73
+ return;
74
+ case 'StatusMessage':
75
+ this.status$.next(msg.wsjtx.payload);
76
+ return;
77
+ case 'DecodeMessage':
78
+ this.decode$.next(msg.wsjtx.payload);
79
+ return;
80
+ case 'ClearMessage':
81
+ this.clear$.next(msg.wsjtx.payload);
82
+ return;
83
+ case 'QsoLoggedMessage':
84
+ this.qsoLogged$.next(msg.wsjtx.payload);
85
+ return;
86
+ case 'CloseMessage':
87
+ this.close$.next(msg.wsjtx.payload);
88
+ return;
89
+ case 'WSPRDecodeMessage':
90
+ this.wsprDecode$.next(msg.wsjtx.payload);
91
+ return;
92
+ case 'LoggedAdifMessage':
93
+ this.loggedAdif$.next(msg.wsjtx.payload);
94
+ return;
95
+ }
96
+ }
97
+ /** Send a command to WSJT-X to clear the Band Activity window. */
98
+ clearBandActivity() {
99
+ const wsMsg = {
100
+ wsjtx: {
101
+ type: 'ClearMessage',
102
+ payload: { id: this.wsjtxId, window: 0 },
103
+ },
104
+ };
105
+ this.messages.txMessage$.next(wsMsg);
106
+ }
107
+ /** Send a command to WSJT-X to clear the Rx Frequency window. */
108
+ clearRxFreqWindow() {
109
+ const wsMsg = {
110
+ wsjtx: {
111
+ type: 'ClearMessage',
112
+ payload: { id: this.wsjtxId, window: 1 },
113
+ },
114
+ };
115
+ this.messages.txMessage$.next(wsMsg);
116
+ }
117
+ /** Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows. */
118
+ clearAll() {
119
+ const wsMsg = {
120
+ wsjtx: {
121
+ type: 'ClearMessage',
122
+ payload: { id: this.wsjtxId, window: 2 },
123
+ },
124
+ };
125
+ this.messages.txMessage$.next(wsMsg);
126
+ }
127
+ /** Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear
128
+ * previous WSJT-X decodes. */
129
+ replay() {
130
+ const wsMsg = {
131
+ wsjtx: {
132
+ type: 'ReplayMessage',
133
+ payload: { id: this.wsjtxId },
134
+ },
135
+ };
136
+ this.messages.txMessage$.next(wsMsg);
137
+ }
138
+ /** Send a command to WSJT-X to halt any transmissions immediately. */
139
+ haltTxNow() {
140
+ const wsMsg = {
141
+ wsjtx: {
142
+ type: 'HaltTxMessage',
143
+ payload: { id: this.wsjtxId, autoTxOnly: false },
144
+ },
145
+ };
146
+ this.messages.txMessage$.next(wsMsg);
147
+ }
148
+ /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round. */
149
+ haltTxAfterCurrent() {
150
+ const wsMsg = {
151
+ wsjtx: {
152
+ type: 'HaltTxMessage',
153
+ payload: { id: this.wsjtxId, autoTxOnly: true },
154
+ },
155
+ };
156
+ this.messages.txMessage$.next(wsMsg);
157
+ }
158
+ /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */
159
+ reply(decode) {
160
+ const wsMsg = {
161
+ wsjtx: {
162
+ type: 'ReplyMessage',
163
+ payload: {
164
+ id: decode.id,
165
+ time: decode.time,
166
+ snr: decode.snr,
167
+ deltaTime: decode.deltaTime,
168
+ deltaFrequency: decode.deltaFrequency,
169
+ mode: decode.mode,
170
+ message: decode.message,
171
+ lowConfidence: decode.lowConfidence,
172
+ },
173
+ },
174
+ };
175
+ this.messages.txMessage$.next(wsMsg);
176
+ }
177
+ /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */
178
+ highlightCallsign(highlightMsg) {
179
+ highlightMsg.id = this.wsjtxId;
180
+ const wsMsg = {
181
+ wsjtx: {
182
+ type: 'HighlightCallsignMessage',
183
+ payload: highlightMsg,
184
+ },
185
+ };
186
+ this.messages.txMessage$.next(wsMsg);
187
+ }
188
+ /** Given a decode message, format a string the same way as displayed in the WSJT-X Band
189
+ * Activity/Rx Frequency windows. */
190
+ static formatDecode(msg) {
191
+ const secondsSinceMidnight = Math.floor(msg.time / 1000);
192
+ const hours = Math.floor(secondsSinceMidnight / 3600);
193
+ const secondsSinceHour = secondsSinceMidnight - hours * 3600;
194
+ const minutes = Math.floor(secondsSinceHour / 60);
195
+ const seconds = secondsSinceHour - minutes * 60;
196
+ const timeStr = `${hours.toString().padStart(2, '0')}${minutes
197
+ .toString()
198
+ .padStart(2, '0')}${seconds.toString().padStart(2, '0')}`;
199
+ return `${timeStr} ${msg.snr.toString().padStart(3)} ${msg.deltaTime
200
+ .toFixed(1)
201
+ .padStart(4)} ${msg.deltaFrequency.toString().padStart(4)} ~ ${msg.message}`;
202
+ }
203
+ }
204
+ WsjtxService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: WsjtxService, deps: [{ token: AgentMessageService }], target: i0.ɵɵFactoryTarget.Injectable });
205
+ WsjtxService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: WsjtxService, providedIn: 'root' });
206
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: WsjtxService, decorators: [{
207
+ type: Injectable,
208
+ args: [{
209
+ providedIn: 'root',
210
+ }]
211
+ }], ctorParameters: function () { return [{ type: AgentMessageService }]; } });
212
+
213
+ class HamlibService {
214
+ constructor(messages) {
215
+ this.messages = messages;
216
+ /** Whether we're getting any messages from Hamlib. */
217
+ this.connected$ = new BehaviorSubject(false);
218
+ /** Subject for listening to Hamlib "RigState" messages. */
219
+ this.rigState$ = new BehaviorSubject(null);
220
+ this.setupBehaviors();
221
+ }
222
+ setupBehaviors() {
223
+ this.messages.rxMessage$.subscribe((msg) => this.handleMessage(msg));
70
224
  // if we haven't heard from Hamlib in 15 seconds, consider it down
71
- this.hamlibState$.pipe(debounceTime(15000)).subscribe(() => {
72
- this.hamlibState$.next(false);
225
+ this.connected$.pipe(debounceTime(15000)).subscribe(() => {
226
+ this.connected$.next(false);
73
227
  });
74
228
  // When Hamlib goes down, clear its persistent message subjects
75
- this.hamlibState$.subscribe((isUp) => {
229
+ this.connected$.subscribe((isUp) => {
76
230
  if (!isUp) {
77
- this.hamlibRigState$.next(null);
231
+ this.rigState$.next(null);
78
232
  }
79
233
  });
80
234
  }
235
+ handleMessage(msg) {
236
+ if (!msg.hamlib) {
237
+ return;
238
+ }
239
+ this.connected$.next(true);
240
+ switch (msg.hamlib.type) {
241
+ case 'RigState':
242
+ this.rigState$.next(msg.hamlib.payload);
243
+ return;
244
+ }
245
+ }
246
+ }
247
+ HamlibService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: HamlibService, deps: [{ token: AgentMessageService }], target: i0.ɵɵFactoryTarget.Injectable });
248
+ HamlibService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: HamlibService, providedIn: 'root' });
249
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: HamlibService, decorators: [{
250
+ type: Injectable,
251
+ args: [{
252
+ providedIn: 'root',
253
+ }]
254
+ }], ctorParameters: function () { return [{ type: AgentMessageService }]; } });
255
+
256
+ class AgentService {
257
+ constructor(messages, hamlibService, wsjtxService) {
258
+ this.messages = messages;
259
+ this.hamlibService = hamlibService;
260
+ this.wsjtxService = wsjtxService;
261
+ /** Whether we're connected to the agent. */
262
+ this.connectedState$ = new BehaviorSubject(false);
263
+ this.defaultAgentHost = 'localhost';
264
+ this.defaultAgentPort = 8081;
265
+ this.localStorageHostKey = 'agent-host';
266
+ this.localStoragePortKey = 'agent-port';
267
+ this.agentHost = this.defaultAgentHost;
268
+ this.agentPort = this.defaultAgentPort;
269
+ this.agentWebSocketSubject = null;
270
+ this.agentWebsocketSubscription = null;
271
+ this.hamlibState$ = this.hamlibService.connected$;
272
+ this.hamlibRigState$ = this.hamlibService.rigState$;
273
+ this.wsjtxState$ = this.wsjtxService.connected$;
274
+ this.wsjtxHeartbeat$ = this.wsjtxService.heartbeat$;
275
+ this.wsjtxStatus$ = this.wsjtxService.status$;
276
+ this.wsjtxDecode$ = this.wsjtxService.decode$;
277
+ this.wsjtxClear$ = this.wsjtxService.clear$;
278
+ this.wsjtxQsoLogged$ = this.wsjtxService.qsoLogged$;
279
+ this.wsjtxClose$ = this.wsjtxService.close$;
280
+ this.wsjtxWsprDecode$ = this.wsjtxService.wsprDecode$;
281
+ this.wsjtxLoggedAdif$ = this.wsjtxService.loggedAdif$;
282
+ }
283
+ init() {
284
+ this.messages.txMessage$.subscribe((msg) => this.send(msg));
285
+ this.agentHost = this.getHost();
286
+ this.agentPort = this.getPort();
287
+ this.connect();
288
+ }
81
289
  /** Connect (or reconnect) the websocket to the kel-agent server. */
82
290
  connect() {
83
291
  if (this.agentWebsocketSubscription) {
@@ -97,55 +305,15 @@ class AgentService {
97
305
  .subscribe({
98
306
  next: (msg) => {
99
307
  this.connectedState$.next(true);
100
- this.handleMessage(msg);
308
+ this.messages.rxMessage$.next(msg);
101
309
  },
102
310
  error: () => this.connectedState$.next(false),
103
311
  complete: () => this.connectedState$.next(false),
104
312
  });
105
313
  }
106
- handleMessage(msg) {
107
- if (msg.wsjtx != null && msg.wsjtx.type != null) {
108
- this.wsjtxState$.next(true);
109
- this.wsjtxId = msg.wsjtx.payload.id;
110
- switch (msg.wsjtx.type) {
111
- case 'HeartbeatMessage':
112
- this.wsjtxHeartbeat$.next(msg.wsjtx.payload);
113
- return;
114
- case 'StatusMessage':
115
- this.wsjtxStatus$.next(msg.wsjtx.payload);
116
- return;
117
- case 'DecodeMessage':
118
- this.wsjtxDecode$.next(msg.wsjtx.payload);
119
- return;
120
- case 'ClearMessage':
121
- this.wsjtxClear$.next(msg.wsjtx.payload);
122
- return;
123
- case 'QsoLoggedMessage':
124
- this.wsjtxQsoLogged$.next(msg.wsjtx.payload);
125
- return;
126
- case 'CloseMessage':
127
- this.wsjtxClose$.next(msg.wsjtx.payload);
128
- return;
129
- case 'WSPRDecodeMessage':
130
- this.wsjtxWsprDecode$.next(msg.wsjtx.payload);
131
- return;
132
- case 'LoggedAdifMessage':
133
- this.wsjtxLoggedAdif$.next(msg.wsjtx.payload);
134
- return;
135
- }
136
- }
137
- if (msg.hamlib !== null) {
138
- this.hamlibState$.next(true);
139
- switch (msg.hamlib.type) {
140
- case 'RigState':
141
- this.hamlibRigState$.next(msg.hamlib.payload);
142
- return;
143
- }
144
- }
145
- }
146
314
  /** Get the currently configured kel-agent host. */
147
315
  getHost() {
148
- return localStorage.getItem(this.localStorageHostKey) || this.defaultAgentHost;
316
+ return (localStorage.getItem(this.localStorageHostKey) || this.defaultAgentHost);
149
317
  }
150
318
  /** Get the currently configured kel-agent port. */
151
319
  getPort() {
@@ -169,104 +337,102 @@ class AgentService {
169
337
  localStorage.setItem(this.localStoragePortKey, String(port));
170
338
  this.connect();
171
339
  }
172
- /** Send a command to WSJT-X to clear the Band Activity window. */
173
- sendWsjtxClearBandActivity() {
340
+ send(wsMsg) {
174
341
  var _a;
175
- const wsMsg = {
176
- wsjtx: {
177
- type: 'ClearMessage',
178
- payload: { id: this.wsjtxId, window: 0 },
179
- },
180
- };
181
342
  (_a = this.agentWebSocketSubject) === null || _a === void 0 ? void 0 : _a.next(wsMsg);
182
343
  }
183
- /** Send a command to WSJT-X to clear the Rx Frequency window. */
344
+ /**
345
+ * Send a command to WSJT-X to clear the Band Activity window.
346
+ *
347
+ * @deprecated Use {@link WsjtxService.clearBandActivity} instead.
348
+ */
349
+ sendWsjtxClearBandActivity() {
350
+ this.wsjtxService.clearBandActivity();
351
+ }
352
+ /**
353
+ * Send a command to WSJT-X to clear the Rx Frequency window.
354
+ *
355
+ * @deprecated Use {@link WsjtxService.clearRxFreqWindow} instead.
356
+ */
184
357
  sendWsjtxClearRxFreqWindow() {
185
- var _a;
186
- const wsMsg = {
187
- wsjtx: {
188
- type: 'ClearMessage',
189
- payload: { id: this.wsjtxId, window: 1 },
190
- },
191
- };
192
- (_a = this.agentWebSocketSubject) === null || _a === void 0 ? void 0 : _a.next(wsMsg);
358
+ this.wsjtxService.clearRxFreqWindow();
193
359
  }
194
- /** Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows. */
360
+ /**
361
+ * Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows.
362
+ *
363
+ * @deprecated Use {@link WsjtxService.clearAll} instead.
364
+ */
195
365
  sendWsjtxClearAll() {
196
- var _a;
197
- const wsMsg = {
198
- wsjtx: {
199
- type: 'ClearMessage',
200
- payload: { id: this.wsjtxId, window: 2 },
201
- },
202
- };
203
- (_a = this.agentWebSocketSubject) === null || _a === void 0 ? void 0 : _a.next(wsMsg);
366
+ this.wsjtxService.clearAll();
204
367
  }
205
- /** Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear
206
- * previous WSJT-X decodes. */
368
+ /**
369
+ * Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear
370
+ * previous WSJT-X decodes.
371
+ *
372
+ * @deprecated Use {@link WsjtxService.replay} instead.
373
+ */
207
374
  sendWsjtxReplay() {
208
- var _a;
209
- const wsMsg = {
210
- wsjtx: {
211
- type: 'ReplayMessage',
212
- payload: { id: this.wsjtxId },
213
- },
214
- };
215
- (_a = this.agentWebSocketSubject) === null || _a === void 0 ? void 0 : _a.next(wsMsg);
375
+ this.wsjtxService.replay();
216
376
  }
217
- /** Send a command to WSJT-X to halt any transmissions immediately. */
377
+ /**
378
+ * Send a command to WSJT-X to halt any transmissions immediately.
379
+ *
380
+ * @deprecated Use {@link WsjtxService.haltTxNow} instead.
381
+ */
218
382
  sendWsjtxHaltTxNow() {
219
- var _a;
220
- const wsMsg = {
221
- wsjtx: {
222
- type: 'HaltTxMessage',
223
- payload: { id: this.wsjtxId, autoTxOnly: false },
224
- },
225
- };
226
- (_a = this.agentWebSocketSubject) === null || _a === void 0 ? void 0 : _a.next(wsMsg);
383
+ this.wsjtxService.haltTxNow();
227
384
  }
228
- /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round. */
385
+ /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round.
386
+ *
387
+ * @deprecated Use {@link WsjtxService.haltTxAfterCurrent} instead.
388
+ */
229
389
  sendWsjtxHaltTxAfterCurrent() {
230
- var _a;
231
- const wsMsg = {
232
- wsjtx: {
233
- type: 'HaltTxMessage',
234
- payload: { id: this.wsjtxId, autoTxOnly: true },
235
- },
236
- };
237
- (_a = this.agentWebSocketSubject) === null || _a === void 0 ? void 0 : _a.next(wsMsg);
390
+ this.wsjtxService.haltTxAfterCurrent();
238
391
  }
239
- /** Given a decode message, format a string the same way as displayed in the WSJT-X Band
240
- * Activity/Rx Frequency windows. */
392
+ /**
393
+ * Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ.
394
+ *
395
+ * @deprecated Use {@link WsjtxService.reply} instead.
396
+ */
397
+ sendWsjtxReply(decode) {
398
+ this.wsjtxService.reply(decode);
399
+ }
400
+ /**
401
+ * Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ.
402
+ *
403
+ * @deprecated Use {@link WsjtxService.highlightCallsign} instead.
404
+ */
405
+ sendWsjtxHighlightCallsign(highlightMsg) {
406
+ this.wsjtxService.highlightCallsign(highlightMsg);
407
+ }
408
+ /**
409
+ * Given a decode message, format a string the same way as displayed in the WSJT-X Band
410
+ * Activity/Rx Frequency windows.
411
+ *
412
+ * @deprecated Use {@link WsjtxService.formatDecode} instead.
413
+ */
241
414
  static formatDecode(msg) {
242
- const secondsSinceMidnight = Math.floor(msg.time / 1000);
243
- const hours = Math.floor(secondsSinceMidnight / 3600);
244
- const secondsSinceHour = secondsSinceMidnight - hours * 3600;
245
- const minutes = Math.floor(secondsSinceHour / 60);
246
- const seconds = secondsSinceHour - minutes * 60;
247
- const timeStr = `${hours.toString().padStart(2, '0')}${minutes
248
- .toString()
249
- .padStart(2, '0')}${seconds.toString().padStart(2, '0')}`;
250
- return `${timeStr} ${msg.snr.toString().padStart(3)} ${msg.deltaTime
251
- .toFixed(1)
252
- .padStart(4)} ${msg.deltaFrequency.toString().padStart(4)} ~ ${msg.message}`;
415
+ return WsjtxService.formatDecode(msg);
253
416
  }
254
417
  }
255
- AgentService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
418
+ AgentService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentService, deps: [{ token: AgentMessageService }, { token: HamlibService }, { token: WsjtxService }], target: i0.ɵɵFactoryTarget.Injectable });
256
419
  AgentService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentService, providedIn: 'root' });
257
420
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentService, decorators: [{
258
421
  type: Injectable,
259
422
  args: [{
260
- providedIn: 'root'
423
+ providedIn: 'root',
261
424
  }]
262
- }], ctorParameters: function () { return []; } });
425
+ }], ctorParameters: function () { return [{ type: AgentMessageService }, { type: HamlibService }, { type: WsjtxService }]; } });
263
426
 
264
427
  /*
265
428
  * Public API Surface of ngx-kel-agent
266
429
  */
430
+ // export * from './lib/ngx-kel-agent.component';
431
+ // export * from './lib/ngx-kel-agent.module';
267
432
 
268
433
  /**
269
434
  * Generated bundle index. Do not edit.
270
435
  */
271
436
 
272
- export { AgentService };
437
+ export { AgentMessageService, AgentService, HamlibService, WsjtxService };
438
+ //# sourceMappingURL=ngx-kel-agent.mjs.map