ngx-kel-agent 0.4.8 → 0.5.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.
@@ -1,83 +1,342 @@
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
+ /**
189
+ * Send a command to WSJT-X to transmit the given free text. If the text is too long to be
190
+ * encoded in a single message, it may be silently truncated. */
191
+ sendFreeText(freeText) {
192
+ freeText.id = this.wsjtxId;
193
+ const wsMsg = {
194
+ wsjtx: {
195
+ type: 'FreeTextMessage',
196
+ payload: freeText,
197
+ },
198
+ };
199
+ this.messages.txMessage$.next(wsMsg);
200
+ }
201
+ /** Send a command to WSJT-X to set the local station's Maidenhead grid. This is temporary,
202
+ * lasting only as long as WSJT-X is running. */
203
+ setLocation(grid) {
204
+ const wsMsg = {
205
+ wsjtx: {
206
+ type: 'LocationMessage',
207
+ payload: {
208
+ id: this.wsjtxId,
209
+ location: grid,
210
+ },
211
+ },
212
+ };
213
+ this.messages.txMessage$.next(wsMsg);
214
+ }
215
+ /** Send a command to WSJT-X to switch to the named configuration. */
216
+ switchConfiguration(configName) {
217
+ const wsMsg = {
218
+ wsjtx: {
219
+ type: 'SwitchConfigurationMessage',
220
+ payload: {
221
+ id: this.wsjtxId,
222
+ configurationName: configName,
223
+ },
224
+ },
225
+ };
226
+ this.messages.txMessage$.next(wsMsg);
227
+ }
228
+ /** Send a command to WSJT-X to set the given configuration parameters. */
229
+ configure(config) {
230
+ config.id = this.wsjtxId;
231
+ const wsMsg = {
232
+ wsjtx: {
233
+ type: 'SwitchConfigurationMessage',
234
+ payload: config,
235
+ },
236
+ };
237
+ this.messages.txMessage$.next(wsMsg);
238
+ }
239
+ /** Given a decode message, format a string the same way as displayed in the WSJT-X Band
240
+ * Activity/Rx Frequency windows. */
241
+ 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}`;
253
+ }
254
+ }
255
+ WsjtxService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: WsjtxService, deps: [{ token: AgentMessageService }], target: i0.ɵɵFactoryTarget.Injectable });
256
+ WsjtxService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: WsjtxService, providedIn: 'root' });
257
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: WsjtxService, decorators: [{
258
+ type: Injectable,
259
+ args: [{
260
+ providedIn: 'root',
261
+ }]
262
+ }], ctorParameters: function () { return [{ type: AgentMessageService }]; } });
263
+
264
+ class HamlibService {
265
+ constructor(messages) {
266
+ this.messages = messages;
267
+ /** Whether we're getting any messages from Hamlib. */
268
+ this.connected$ = new BehaviorSubject(false);
269
+ /** Subject for listening to Hamlib "RigState" messages. */
270
+ this.rigState$ = new BehaviorSubject(null);
271
+ this.setupBehaviors();
272
+ }
273
+ setupBehaviors() {
274
+ this.messages.rxMessage$.subscribe((msg) => this.handleMessage(msg));
70
275
  // 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);
276
+ this.connected$.pipe(debounceTime(15000)).subscribe(() => {
277
+ this.connected$.next(false);
73
278
  });
74
279
  // When Hamlib goes down, clear its persistent message subjects
75
- this.hamlibState$.subscribe((isUp) => {
280
+ this.connected$.subscribe((isUp) => {
76
281
  if (!isUp) {
77
- this.hamlibRigState$.next(null);
282
+ this.rigState$.next(null);
78
283
  }
79
284
  });
80
285
  }
286
+ handleMessage(msg) {
287
+ if (!msg.hamlib) {
288
+ return;
289
+ }
290
+ this.connected$.next(true);
291
+ switch (msg.hamlib.type) {
292
+ case 'RigState':
293
+ this.rigState$.next(msg.hamlib.payload);
294
+ return;
295
+ }
296
+ }
297
+ }
298
+ HamlibService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: HamlibService, deps: [{ token: AgentMessageService }], target: i0.ɵɵFactoryTarget.Injectable });
299
+ HamlibService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: HamlibService, providedIn: 'root' });
300
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: HamlibService, decorators: [{
301
+ type: Injectable,
302
+ args: [{
303
+ providedIn: 'root',
304
+ }]
305
+ }], ctorParameters: function () { return [{ type: AgentMessageService }]; } });
306
+
307
+ class AgentService {
308
+ constructor(messages, hamlibService, wsjtxService) {
309
+ this.messages = messages;
310
+ this.hamlibService = hamlibService;
311
+ this.wsjtxService = wsjtxService;
312
+ /** Whether we're connected to the agent. */
313
+ this.connectedState$ = new BehaviorSubject(false);
314
+ this.defaultAgentHost = 'localhost';
315
+ this.defaultAgentPort = 8081;
316
+ this.localStorageHostKey = 'agent-host';
317
+ this.localStoragePortKey = 'agent-port';
318
+ this.agentHost = this.defaultAgentHost;
319
+ this.agentPort = this.defaultAgentPort;
320
+ this.agentWebSocketSubject = null;
321
+ this.agentWebsocketSubscription = null;
322
+ this.hamlibState$ = this.hamlibService.connected$;
323
+ this.hamlibRigState$ = this.hamlibService.rigState$;
324
+ this.wsjtxState$ = this.wsjtxService.connected$;
325
+ this.wsjtxHeartbeat$ = this.wsjtxService.heartbeat$;
326
+ this.wsjtxStatus$ = this.wsjtxService.status$;
327
+ this.wsjtxDecode$ = this.wsjtxService.decode$;
328
+ this.wsjtxClear$ = this.wsjtxService.clear$;
329
+ this.wsjtxQsoLogged$ = this.wsjtxService.qsoLogged$;
330
+ this.wsjtxClose$ = this.wsjtxService.close$;
331
+ this.wsjtxWsprDecode$ = this.wsjtxService.wsprDecode$;
332
+ this.wsjtxLoggedAdif$ = this.wsjtxService.loggedAdif$;
333
+ }
334
+ init() {
335
+ this.messages.txMessage$.subscribe((msg) => this.send(msg));
336
+ this.agentHost = this.getHost();
337
+ this.agentPort = this.getPort();
338
+ this.connect();
339
+ }
81
340
  /** Connect (or reconnect) the websocket to the kel-agent server. */
82
341
  connect() {
83
342
  if (this.agentWebsocketSubscription) {
@@ -97,55 +356,15 @@ class AgentService {
97
356
  .subscribe({
98
357
  next: (msg) => {
99
358
  this.connectedState$.next(true);
100
- this.handleMessage(msg);
359
+ this.messages.rxMessage$.next(msg);
101
360
  },
102
361
  error: () => this.connectedState$.next(false),
103
362
  complete: () => this.connectedState$.next(false),
104
363
  });
105
364
  }
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
365
  /** Get the currently configured kel-agent host. */
147
366
  getHost() {
148
- return localStorage.getItem(this.localStorageHostKey) || this.defaultAgentHost;
367
+ return (localStorage.getItem(this.localStorageHostKey) || this.defaultAgentHost);
149
368
  }
150
369
  /** Get the currently configured kel-agent port. */
151
370
  getPort() {
@@ -169,99 +388,101 @@ class AgentService {
169
388
  localStorage.setItem(this.localStoragePortKey, String(port));
170
389
  this.connect();
171
390
  }
172
- /** Send a command to WSJT-X to clear the Band Activity window. */
173
- sendWsjtxClearBandActivity() {
174
- const wsMsg = {
175
- wsjtx: {
176
- type: 'ClearMessage',
177
- payload: { id: this.wsjtxId, window: 0 },
178
- },
179
- };
391
+ send(wsMsg) {
180
392
  this.agentWebSocketSubject?.next(wsMsg);
181
393
  }
182
- /** Send a command to WSJT-X to clear the Rx Frequency window. */
394
+ /**
395
+ * Send a command to WSJT-X to clear the Band Activity window.
396
+ *
397
+ * @deprecated Use {@link WsjtxService.clearBandActivity} instead.
398
+ */
399
+ sendWsjtxClearBandActivity() {
400
+ this.wsjtxService.clearBandActivity();
401
+ }
402
+ /**
403
+ * Send a command to WSJT-X to clear the Rx Frequency window.
404
+ *
405
+ * @deprecated Use {@link WsjtxService.clearRxFreqWindow} instead.
406
+ */
183
407
  sendWsjtxClearRxFreqWindow() {
184
- const wsMsg = {
185
- wsjtx: {
186
- type: 'ClearMessage',
187
- payload: { id: this.wsjtxId, window: 1 },
188
- },
189
- };
190
- this.agentWebSocketSubject?.next(wsMsg);
408
+ this.wsjtxService.clearRxFreqWindow();
191
409
  }
192
- /** Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows. */
410
+ /**
411
+ * Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows.
412
+ *
413
+ * @deprecated Use {@link WsjtxService.clearAll} instead.
414
+ */
193
415
  sendWsjtxClearAll() {
194
- const wsMsg = {
195
- wsjtx: {
196
- type: 'ClearMessage',
197
- payload: { id: this.wsjtxId, window: 2 },
198
- },
199
- };
200
- this.agentWebSocketSubject?.next(wsMsg);
416
+ this.wsjtxService.clearAll();
201
417
  }
202
- /** Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear
203
- * previous WSJT-X decodes. */
418
+ /**
419
+ * Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear
420
+ * previous WSJT-X decodes.
421
+ *
422
+ * @deprecated Use {@link WsjtxService.replay} instead.
423
+ */
204
424
  sendWsjtxReplay() {
205
- const wsMsg = {
206
- wsjtx: {
207
- type: 'ReplayMessage',
208
- payload: { id: this.wsjtxId },
209
- },
210
- };
211
- this.agentWebSocketSubject?.next(wsMsg);
425
+ this.wsjtxService.replay();
212
426
  }
213
- /** Send a command to WSJT-X to halt any transmissions immediately. */
427
+ /**
428
+ * Send a command to WSJT-X to halt any transmissions immediately.
429
+ *
430
+ * @deprecated Use {@link WsjtxService.haltTxNow} instead.
431
+ */
214
432
  sendWsjtxHaltTxNow() {
215
- const wsMsg = {
216
- wsjtx: {
217
- type: 'HaltTxMessage',
218
- payload: { id: this.wsjtxId, autoTxOnly: false },
219
- },
220
- };
221
- this.agentWebSocketSubject?.next(wsMsg);
433
+ this.wsjtxService.haltTxNow();
222
434
  }
223
- /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round. */
435
+ /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round.
436
+ *
437
+ * @deprecated Use {@link WsjtxService.haltTxAfterCurrent} instead.
438
+ */
224
439
  sendWsjtxHaltTxAfterCurrent() {
225
- const wsMsg = {
226
- wsjtx: {
227
- type: 'HaltTxMessage',
228
- payload: { id: this.wsjtxId, autoTxOnly: true },
229
- },
230
- };
231
- this.agentWebSocketSubject?.next(wsMsg);
440
+ this.wsjtxService.haltTxAfterCurrent();
232
441
  }
233
- /** Given a decode message, format a string the same way as displayed in the WSJT-X Band
234
- * Activity/Rx Frequency windows. */
442
+ /**
443
+ * Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ.
444
+ *
445
+ * @deprecated Use {@link WsjtxService.reply} instead.
446
+ */
447
+ sendWsjtxReply(decode) {
448
+ this.wsjtxService.reply(decode);
449
+ }
450
+ /**
451
+ * Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ.
452
+ *
453
+ * @deprecated Use {@link WsjtxService.highlightCallsign} instead.
454
+ */
455
+ sendWsjtxHighlightCallsign(highlightMsg) {
456
+ this.wsjtxService.highlightCallsign(highlightMsg);
457
+ }
458
+ /**
459
+ * Given a decode message, format a string the same way as displayed in the WSJT-X Band
460
+ * Activity/Rx Frequency windows.
461
+ *
462
+ * @deprecated Use {@link WsjtxService.formatDecode} instead.
463
+ */
235
464
  static formatDecode(msg) {
236
- const secondsSinceMidnight = Math.floor(msg.time / 1000);
237
- const hours = Math.floor(secondsSinceMidnight / 3600);
238
- const secondsSinceHour = secondsSinceMidnight - hours * 3600;
239
- const minutes = Math.floor(secondsSinceHour / 60);
240
- const seconds = secondsSinceHour - minutes * 60;
241
- const timeStr = `${hours.toString().padStart(2, '0')}${minutes
242
- .toString()
243
- .padStart(2, '0')}${seconds.toString().padStart(2, '0')}`;
244
- return `${timeStr} ${msg.snr.toString().padStart(3)} ${msg.deltaTime
245
- .toFixed(1)
246
- .padStart(4)} ${msg.deltaFrequency.toString().padStart(4)} ~ ${msg.message}`;
465
+ return WsjtxService.formatDecode(msg);
247
466
  }
248
467
  }
249
- AgentService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
468
+ 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 });
250
469
  AgentService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentService, providedIn: 'root' });
251
470
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentService, decorators: [{
252
471
  type: Injectable,
253
472
  args: [{
254
- providedIn: 'root'
473
+ providedIn: 'root',
255
474
  }]
256
- }], ctorParameters: function () { return []; } });
475
+ }], ctorParameters: function () { return [{ type: AgentMessageService }, { type: HamlibService }, { type: WsjtxService }]; } });
257
476
 
258
477
  /*
259
478
  * Public API Surface of ngx-kel-agent
260
479
  */
480
+ // export * from './lib/ngx-kel-agent.component';
481
+ // export * from './lib/ngx-kel-agent.module';
261
482
 
262
483
  /**
263
484
  * Generated bundle index. Do not edit.
264
485
  */
265
486
 
266
- export { AgentService };
487
+ export { AgentMessageService, AgentService, HamlibService, WsjtxService };
267
488
  //# sourceMappingURL=ngx-kel-agent.mjs.map