ngx-kel-agent 0.4.10 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,251 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject, ReplaySubject, Subject } from 'rxjs';
3
+ import { debounceTime } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "./agent-message.service";
6
+ export class WsjtxService {
7
+ constructor(messages) {
8
+ this.messages = messages;
9
+ /** Whether we're getting any messages from WSJT-X. */
10
+ this.connected$ = new BehaviorSubject(false);
11
+ /** Subject for listening to WSJT-X "Heartbeat" messages. */
12
+ this.heartbeat$ = new ReplaySubject(1);
13
+ /** Subject for listening to WSJT-X "Status" messages. */
14
+ this.status$ = new ReplaySubject(1);
15
+ /** Subject for listening to WSJT-X "Decode" messages. */
16
+ this.decode$ = new Subject();
17
+ /** Subject for listening to WSJT-X "Clear" messages. */
18
+ this.clear$ = new Subject();
19
+ /** Subject for listening to WSJT-X "QsoLogged" messages. */
20
+ this.qsoLogged$ = new Subject();
21
+ /** Subject for listening to WSJT-X "Close" messages. */
22
+ this.close$ = new Subject();
23
+ /** Subject for listening to WSJT-X "WsprDecode" messages. */
24
+ this.wsprDecode$ = new Subject();
25
+ /** Subject for listening to WSJT-X "LoggedAdif" messages. */
26
+ this.loggedAdif$ = new Subject();
27
+ this.wsjtxId = 'WSJT-X';
28
+ this.setupBehaviors();
29
+ }
30
+ setupBehaviors() {
31
+ this.messages.rxMessage$.subscribe((msg) => this.handleMessage(msg));
32
+ // if we haven't heard from WSJT-X in 15 seconds, consider it "down"
33
+ this.connected$
34
+ .pipe(debounceTime(15000))
35
+ .subscribe(() => this.connected$.next(false));
36
+ // When WSJT-X announces it's closing, set it to "down" immediately
37
+ this.close$.subscribe(() => {
38
+ this.connected$.next(false);
39
+ });
40
+ // When WSJT-X goes down, clear its persistent message subjects
41
+ this.connected$.subscribe((isUp) => {
42
+ if (!isUp) {
43
+ this.heartbeat$.next(null);
44
+ this.status$.next(null);
45
+ }
46
+ });
47
+ }
48
+ handleMessage(msg) {
49
+ if (!msg.wsjtx) {
50
+ return;
51
+ }
52
+ this.connected$.next(true);
53
+ this.wsjtxId = msg.wsjtx.payload.id;
54
+ switch (msg.wsjtx.type) {
55
+ case 'HeartbeatMessage':
56
+ this.heartbeat$.next(msg.wsjtx.payload);
57
+ return;
58
+ case 'StatusMessage':
59
+ this.status$.next(msg.wsjtx.payload);
60
+ return;
61
+ case 'DecodeMessage':
62
+ this.decode$.next(msg.wsjtx.payload);
63
+ return;
64
+ case 'ClearMessage':
65
+ this.clear$.next(msg.wsjtx.payload);
66
+ return;
67
+ case 'QsoLoggedMessage':
68
+ this.qsoLogged$.next(msg.wsjtx.payload);
69
+ return;
70
+ case 'CloseMessage':
71
+ this.close$.next(msg.wsjtx.payload);
72
+ return;
73
+ case 'WSPRDecodeMessage':
74
+ this.wsprDecode$.next(msg.wsjtx.payload);
75
+ return;
76
+ case 'LoggedAdifMessage':
77
+ this.loggedAdif$.next(msg.wsjtx.payload);
78
+ return;
79
+ }
80
+ }
81
+ /** Send a command to WSJT-X to clear the Band Activity window. */
82
+ clearBandActivity() {
83
+ const wsMsg = {
84
+ wsjtx: {
85
+ type: 'ClearMessage',
86
+ payload: { id: this.wsjtxId, window: 0 },
87
+ },
88
+ };
89
+ this.messages.txMessage$.next(wsMsg);
90
+ }
91
+ /** Send a command to WSJT-X to clear the Rx Frequency window. */
92
+ clearRxFreqWindow() {
93
+ const wsMsg = {
94
+ wsjtx: {
95
+ type: 'ClearMessage',
96
+ payload: { id: this.wsjtxId, window: 1 },
97
+ },
98
+ };
99
+ this.messages.txMessage$.next(wsMsg);
100
+ }
101
+ /** Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows. */
102
+ clearAll() {
103
+ const wsMsg = {
104
+ wsjtx: {
105
+ type: 'ClearMessage',
106
+ payload: { id: this.wsjtxId, window: 2 },
107
+ },
108
+ };
109
+ this.messages.txMessage$.next(wsMsg);
110
+ }
111
+ /** Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear
112
+ * previous WSJT-X decodes. */
113
+ replay() {
114
+ const wsMsg = {
115
+ wsjtx: {
116
+ type: 'ReplayMessage',
117
+ payload: { id: this.wsjtxId },
118
+ },
119
+ };
120
+ this.messages.txMessage$.next(wsMsg);
121
+ }
122
+ /** Send a command to WSJT-X to halt any transmissions immediately. */
123
+ haltTxNow() {
124
+ const wsMsg = {
125
+ wsjtx: {
126
+ type: 'HaltTxMessage',
127
+ payload: { id: this.wsjtxId, autoTxOnly: false },
128
+ },
129
+ };
130
+ this.messages.txMessage$.next(wsMsg);
131
+ }
132
+ /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round. */
133
+ haltTxAfterCurrent() {
134
+ const wsMsg = {
135
+ wsjtx: {
136
+ type: 'HaltTxMessage',
137
+ payload: { id: this.wsjtxId, autoTxOnly: true },
138
+ },
139
+ };
140
+ this.messages.txMessage$.next(wsMsg);
141
+ }
142
+ /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */
143
+ reply(decode) {
144
+ const wsMsg = {
145
+ wsjtx: {
146
+ type: 'ReplyMessage',
147
+ payload: {
148
+ id: decode.id,
149
+ time: decode.time,
150
+ snr: decode.snr,
151
+ deltaTime: decode.deltaTime,
152
+ deltaFrequency: decode.deltaFrequency,
153
+ mode: decode.mode,
154
+ message: decode.message,
155
+ lowConfidence: decode.lowConfidence,
156
+ },
157
+ },
158
+ };
159
+ this.messages.txMessage$.next(wsMsg);
160
+ }
161
+ /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */
162
+ highlightCallsign(highlightMsg) {
163
+ highlightMsg.id = this.wsjtxId;
164
+ const wsMsg = {
165
+ wsjtx: {
166
+ type: 'HighlightCallsignMessage',
167
+ payload: highlightMsg,
168
+ },
169
+ };
170
+ this.messages.txMessage$.next(wsMsg);
171
+ }
172
+ /**
173
+ * Send a command to WSJT-X to transmit the given free text. If the text is too long to be
174
+ * encoded in a single message, it may be silently truncated. */
175
+ sendFreeText(freeText) {
176
+ freeText.id = this.wsjtxId;
177
+ const wsMsg = {
178
+ wsjtx: {
179
+ type: 'FreeTextMessage',
180
+ payload: freeText,
181
+ },
182
+ };
183
+ this.messages.txMessage$.next(wsMsg);
184
+ }
185
+ /** Send a command to WSJT-X to set the local station's Maidenhead grid. This is temporary,
186
+ * lasting only as long as WSJT-X is running. */
187
+ setLocation(grid) {
188
+ const wsMsg = {
189
+ wsjtx: {
190
+ type: 'LocationMessage',
191
+ payload: {
192
+ id: this.wsjtxId,
193
+ location: grid,
194
+ },
195
+ },
196
+ };
197
+ this.messages.txMessage$.next(wsMsg);
198
+ }
199
+ /** Send a command to WSJT-X to switch to the named configuration. */
200
+ switchConfiguration(configName) {
201
+ const wsMsg = {
202
+ wsjtx: {
203
+ type: 'SwitchConfigurationMessage',
204
+ payload: {
205
+ id: this.wsjtxId,
206
+ configurationName: configName,
207
+ },
208
+ },
209
+ };
210
+ this.messages.txMessage$.next(wsMsg);
211
+ }
212
+ /** Send a command to WSJT-X to set the given configuration parameters. */
213
+ configure(config) {
214
+ config.id = this.wsjtxId;
215
+ const wsMsg = {
216
+ wsjtx: {
217
+ type: 'ConfigureMessage',
218
+ payload: config,
219
+ },
220
+ };
221
+ this.messages.txMessage$.next(wsMsg);
222
+ }
223
+ /** Given a decode message, format a string the same way as displayed in the WSJT-X Band
224
+ * Activity/Rx Frequency windows. */
225
+ static formatDecode(msg) {
226
+ const timeStr = this.formatTime(msg.time);
227
+ return `${timeStr} ${msg.snr.toString().padStart(3)} ${msg.deltaTime
228
+ .toFixed(1)
229
+ .padStart(4)} ${msg.deltaFrequency.toString().padStart(4)} ~ ${msg.message}`;
230
+ }
231
+ /** Given a time in milliseconds since midnight UTC, format as HHMMSS. */
232
+ static formatTime(time) {
233
+ const secondsSinceMidnight = Math.floor(time / 1000);
234
+ const hours = Math.floor(secondsSinceMidnight / 3600);
235
+ const secondsSinceHour = secondsSinceMidnight - hours * 3600;
236
+ const minutes = Math.floor(secondsSinceHour / 60);
237
+ const seconds = secondsSinceHour - minutes * 60;
238
+ return `${hours.toString().padStart(2, '0')}${minutes
239
+ .toString()
240
+ .padStart(2, '0')}${seconds.toString().padStart(2, '0')}`;
241
+ }
242
+ }
243
+ WsjtxService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: WsjtxService, deps: [{ token: i1.AgentMessageService }], target: i0.ɵɵFactoryTarget.Injectable });
244
+ WsjtxService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: WsjtxService, providedIn: 'root' });
245
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: WsjtxService, decorators: [{
246
+ type: Injectable,
247
+ args: [{
248
+ providedIn: 'root',
249
+ }]
250
+ }], ctorParameters: function () { return [{ type: i1.AgentMessageService }]; } });
251
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3NqdHguc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1rZWwtYWdlbnQvc3JjL2xpYi93c2p0eC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBbUIvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQU05QyxNQUFNLE9BQU8sWUFBWTtJQXNCdkIsWUFBb0IsUUFBNkI7UUFBN0IsYUFBUSxHQUFSLFFBQVEsQ0FBcUI7UUFyQmpELHNEQUFzRDtRQUN0QyxlQUFVLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDakUsNERBQTREO1FBQzVDLGVBQVUsR0FBRyxJQUFJLGFBQWEsQ0FBd0IsQ0FBQyxDQUFDLENBQUM7UUFDekUseURBQXlEO1FBQ3pDLFlBQU8sR0FBRyxJQUFJLGFBQWEsQ0FBcUIsQ0FBQyxDQUFDLENBQUM7UUFDbkUseURBQXlEO1FBQ3pDLFlBQU8sR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO1FBQ3JELHdEQUF3RDtRQUN4QyxXQUFNLEdBQUcsSUFBSSxPQUFPLEVBQWMsQ0FBQztRQUNuRCw0REFBNEQ7UUFDNUMsZUFBVSxHQUFHLElBQUksT0FBTyxFQUFrQixDQUFDO1FBQzNELHdEQUF3RDtRQUN4QyxXQUFNLEdBQUcsSUFBSSxPQUFPLEVBQWMsQ0FBQztRQUNuRCw2REFBNkQ7UUFDN0MsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBbUIsQ0FBQztRQUM3RCw2REFBNkQ7UUFDN0MsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBbUIsQ0FBQztRQUVyRCxZQUFPLEdBQVcsUUFBUSxDQUFDO1FBR2pDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FB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QixHQUFHLG9CQUFvQixHQUFHLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDN0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNsRCxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsR0FBRyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2hELE9BQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxPQUFPO2FBQ2xELFFBQVEsRUFBRTthQUNWLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUM5RCxDQUFDOzt5R0E5UFUsWUFBWTs2R0FBWixZQUFZLGNBRlgsTUFBTTsyRkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgV3NqdHhDbGVhcixcbiAgV3NqdHhDbG9zZSxcbiAgV3NqdHhDb25maWd1cmUsXG4gIFdzanR4RGVjb2RlLFxuICBXc2p0eEZyZWVUZXh0LFxuICBXc2p0eEhhbHRUeCxcbiAgV3NqdHhIZWFydGJlYXQsXG4gIFdzanR4SGlnaGxpZ2h0Q2FsbHNpZ24sXG4gIFdzanR4TG9jYXRpb24sXG4gIFdzanR4TG9nZ2VkQWRpZixcbiAgV3NqdHhRc29Mb2dnZWQsXG4gIFdzanR4UmVwbGF5LFxuICBXc2p0eFJlcGx5LFxuICBXc2p0eFN0YXR1cyxcbiAgV3NqdHhTd2l0Y2hDb25maWd1cmF0aW9uLFxuICBXc2p0eFdzcHJEZWNvZGUsXG59IGZyb20gJy4vd3NqdHgtbWVzc2FnZXMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWdlbnRNZXNzYWdlU2VydmljZSB9IGZyb20gJy4vYWdlbnQtbWVzc2FnZS5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFdzanR4U2VydmljZSB7XG4gIC8qKiBXaGV0aGVyIHdlJ3JlIGdldHRpbmcgYW55IG1lc3NhZ2VzIGZyb20gV1NKVC1YLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGVkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogU3ViamVjdCBmb3IgbGlzdGVuaW5nIHRvIFdTSlQtWCBcIkhlYXJ0YmVhdFwiIG1lc3NhZ2VzLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaGVhcnRiZWF0JCA9IG5ldyBSZXBsYXlTdWJqZWN0PFdzanR4SGVhcnRiZWF0IHwgbnVsbD4oMSk7XG4gIC8qKiBTdWJqZWN0IGZvciBsaXN0ZW5pbmcgdG8gV1NKVC1YIFwiU3RhdHVzXCIgbWVzc2FnZXMuICovXG4gIHB1YmxpYyByZWFkb25seSBzdGF0dXMkID0gbmV3IFJlcGxheVN1YmplY3Q8V3NqdHhTdGF0dXMgfCBudWxsPigxKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBXU0pULVggXCJEZWNvZGVcIiBtZXNzYWdlcy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlY29kZSQgPSBuZXcgU3ViamVjdDxXc2p0eERlY29kZT4oKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBXU0pULVggXCJDbGVhclwiIG1lc3NhZ2VzLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2xlYXIkID0gbmV3IFN1YmplY3Q8V3NqdHhDbGVhcj4oKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBXU0pULVggXCJRc29Mb2dnZWRcIiBtZXNzYWdlcy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHFzb0xvZ2dlZCQgPSBuZXcgU3ViamVjdDxXc2p0eFFzb0xvZ2dlZD4oKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBXU0pULVggXCJDbG9zZVwiIG1lc3NhZ2VzLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2xvc2UkID0gbmV3IFN1YmplY3Q8V3NqdHhDbG9zZT4oKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBXU0pULVggXCJXc3ByRGVjb2RlXCIgbWVzc2FnZXMuICovXG4gIHB1YmxpYyByZWFkb25seSB3c3ByRGVjb2RlJCA9IG5ldyBTdWJqZWN0PFdzanR4V3NwckRlY29kZT4oKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBXU0pULVggXCJMb2dnZWRBZGlmXCIgbWVzc2FnZXMuICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZWRBZGlmJCA9IG5ldyBTdWJqZWN0PFdzanR4TG9nZ2VkQWRpZj4oKTtcblxuICBwcml2YXRlIHdzanR4SWQ6IHN0cmluZyA9ICdXU0pULVgnO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbWVzc2FnZXM6IEFnZW50TWVzc2FnZVNlcnZpY2UpIHtcbiAgICB0aGlzLnNldHVwQmVoYXZpb3JzKCk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwQmVoYXZpb3JzKCk6IHZvaWQge1xuICAgIHRoaXMubWVzc2FnZXMucnhNZXNzYWdlJC5zdWJzY3JpYmUoKG1zZykgPT4gdGhpcy5oYW5kbGVNZXNzYWdlKG1zZykpO1xuICAgIC8vIGlmIHdlIGhhdmVuJ3QgaGVhcmQgZnJvbSBXU0pULVggaW4gMTUgc2Vjb25kcywgY29uc2lkZXIgaXQgXCJkb3duXCJcbiAgICB0aGlzLmNvbm5lY3RlZCRcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSgxNTAwMCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuY29ubmVjdGVkJC5uZXh0KGZhbHNlKSk7XG4gICAgLy8gV2hlbiBXU0pULVggYW5ub3VuY2VzIGl0J3MgY2xvc2luZywgc2V0IGl0IHRvIFwiZG93blwiIGltbWVkaWF0ZWx5XG4gICAgdGhpcy5jbG9zZSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdGVkJC5uZXh0KGZhbHNlKTtcbiAgICB9KTtcbiAgICAvLyBXaGVuIFdTSlQtWCBnb2VzIGRvd24sIGNsZWFyIGl0cyBwZXJzaXN0ZW50IG1lc3NhZ2Ugc3ViamVjdHNcbiAgICB0aGlzLmNvbm5lY3RlZCQuc3Vic2NyaWJlKChpc1VwKSA9PiB7XG4gICAgICBpZiAoIWlzVXApIHtcbiAgICAgICAgdGhpcy5oZWFydGJlYXQkLm5leHQobnVsbCk7XG4gICAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KG51bGwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVNZXNzYWdlKG1zZzogYW55KTogdm9pZCB7XG4gICAgaWYgKCFtc2cud3NqdHgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb25uZWN0ZWQkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy53c2p0eElkID0gbXNnLndzanR4LnBheWxvYWQuaWQ7XG4gICAgc3dpdGNoIChtc2cud3NqdHgudHlwZSkge1xuICAgICAgY2FzZSAnSGVhcnRiZWF0TWVzc2FnZSc6XG4gICAgICAgIHRoaXMuaGVhcnRiZWF0JC5uZXh0KG1zZy53c2p0eC5wYXlsb2FkIGFzIFdzanR4SGVhcnRiZWF0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnU3RhdHVzTWVzc2FnZSc6XG4gICAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KG1zZy53c2p0eC5wYXlsb2FkIGFzIFdzanR4U3RhdHVzKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnRGVjb2RlTWVzc2FnZSc6XG4gICAgICAgIHRoaXMuZGVjb2RlJC5uZXh0KG1zZy53c2p0eC5wYXlsb2FkIGFzIFdzanR4RGVjb2RlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnQ2xlYXJNZXNzYWdlJzpcbiAgICAgICAgdGhpcy5jbGVhciQubmV4dChtc2cud3NqdHgucGF5bG9hZCBhcyBXc2p0eENsZWFyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnUXNvTG9nZ2VkTWVzc2FnZSc6XG4gICAgICAgIHRoaXMucXNvTG9nZ2VkJC5uZXh0KG1zZy53c2p0eC5wYXlsb2FkIGFzIFdzanR4UXNvTG9nZ2VkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnQ2xvc2VNZXNzYWdlJzpcbiAgICAgICAgdGhpcy5jbG9zZSQubmV4dChtc2cud3NqdHgucGF5bG9hZCBhcyBXc2p0eENsb3NlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnV1NQUkRlY29kZU1lc3NhZ2UnOlxuICAgICAgICB0aGlzLndzcHJEZWNvZGUkLm5leHQobXNnLndzanR4LnBheWxvYWQgYXMgV3NqdHhXc3ByRGVjb2RlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnTG9nZ2VkQWRpZk1lc3NhZ2UnOlxuICAgICAgICB0aGlzLmxvZ2dlZEFkaWYkLm5leHQobXNnLndzanR4LnBheWxvYWQgYXMgV3NqdHhMb2dnZWRBZGlmKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gY2xlYXIgdGhlIEJhbmQgQWN0aXZpdHkgd2luZG93LiAqL1xuICBwdWJsaWMgY2xlYXJCYW5kQWN0aXZpdHkoKSB7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnQ2xlYXJNZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4Q2xlYXI+eyBpZDogdGhpcy53c2p0eElkLCB3aW5kb3c6IDAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLm1lc3NhZ2VzLnR4TWVzc2FnZSQubmV4dCh3c01zZyk7XG4gIH1cblxuICAvKiogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIGNsZWFyIHRoZSBSeCBGcmVxdWVuY3kgd2luZG93LiAqL1xuICBwdWJsaWMgY2xlYXJSeEZyZXFXaW5kb3coKSB7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnQ2xlYXJNZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4Q2xlYXI+eyBpZDogdGhpcy53c2p0eElkLCB3aW5kb3c6IDEgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLm1lc3NhZ2VzLnR4TWVzc2FnZSQubmV4dCh3c01zZyk7XG4gIH1cblxuICAvKiogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIGNsZWFyIHRoZSBCYW5kIEFjdGl2aXR5IGFuZCBSeCBGcmVxdWVuY3kgd2luZG93cy4gKi9cbiAgcHVibGljIGNsZWFyQWxsKCkge1xuICAgIGNvbnN0IHdzTXNnID0ge1xuICAgICAgd3NqdHg6IHtcbiAgICAgICAgdHlwZTogJ0NsZWFyTWVzc2FnZScsXG4gICAgICAgIHBheWxvYWQ6IDxXc2p0eENsZWFyPnsgaWQ6IHRoaXMud3NqdHhJZCwgd2luZG93OiAyIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5tZXNzYWdlcy50eE1lc3NhZ2UkLm5leHQod3NNc2cpO1xuICB9XG5cbiAgLyoqIFNlbmQgYSBjb21tYW5kIHRvIFdTSlQtWCB0byByZXBsYXkgbWVzc2FnZXMuIFVzZWZ1bCBmb3IgYSBmcmVzaCBjbGllbnQgdGhhdCB3YW50cyB0byBoZWFyXG4gICAqIHByZXZpb3VzIFdTSlQtWCBkZWNvZGVzLiAqL1xuICBwdWJsaWMgcmVwbGF5KCkge1xuICAgIGNvbnN0IHdzTXNnID0ge1xuICAgICAgd3NqdHg6IHtcbiAgICAgICAgdHlwZTogJ1JlcGxheU1lc3NhZ2UnLFxuICAgICAgICBwYXlsb2FkOiA8V3NqdHhSZXBsYXk+eyBpZDogdGhpcy53c2p0eElkIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5tZXNzYWdlcy50eE1lc3NhZ2UkLm5leHQod3NNc2cpO1xuICB9XG5cbiAgLyoqIFNlbmQgYSBjb21tYW5kIHRvIFdTSlQtWCB0byBoYWx0IGFueSB0cmFuc21pc3Npb25zIGltbWVkaWF0ZWx5LiAqL1xuICBwdWJsaWMgaGFsdFR4Tm93KCkge1xuICAgIGNvbnN0IHdzTXNnID0ge1xuICAgICAgd3NqdHg6IHtcbiAgICAgICAgdHlwZTogJ0hhbHRUeE1lc3NhZ2UnLFxuICAgICAgICBwYXlsb2FkOiA8V3NqdHhIYWx0VHg+eyBpZDogdGhpcy53c2p0eElkLCBhdXRvVHhPbmx5OiBmYWxzZSB9LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMubWVzc2FnZXMudHhNZXNzYWdlJC5uZXh0KHdzTXNnKTtcbiAgfVxuXG4gIC8qKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gc3RvcCBhdXRvLXRyYW5zbWl0dGluZyBhZnRlciBmaW5pc2hpbmcgdGhlIGN1cnJlbnQgcm91bmQuICovXG4gIHB1YmxpYyBoYWx0VHhBZnRlckN1cnJlbnQoKSB7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnSGFsdFR4TWVzc2FnZScsXG4gICAgICAgIHBheWxvYWQ6IDxXc2p0eEhhbHRUeD57IGlkOiB0aGlzLndzanR4SWQsIGF1dG9UeE9ubHk6IHRydWUgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLm1lc3NhZ2VzLnR4TWVzc2FnZSQubmV4dCh3c01zZyk7XG4gIH1cblxuICAvKiogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIHJlcGx5IHRvIHRoZSBnaXZlbiBkZWNvZGUuIFRoZSBtZXNzYWdlIG11c3QgaW5jbHVkZSBDUSBvciBRUlouICovXG4gIHB1YmxpYyByZXBseShkZWNvZGU6IFdzanR4RGVjb2RlKSB7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnUmVwbHlNZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4UmVwbHk+e1xuICAgICAgICAgIGlkOiBkZWNvZGUuaWQsXG4gICAgICAgICAgdGltZTogZGVjb2RlLnRpbWUsXG4gICAgICAgICAgc25yOiBkZWNvZGUuc25yLFxuICAgICAgICAgIGRlbHRhVGltZTogZGVjb2RlLmRlbHRhVGltZSxcbiAgICAgICAgICBkZWx0YUZyZXF1ZW5jeTogZGVjb2RlLmRlbHRhRnJlcXVlbmN5LFxuICAgICAgICAgIG1vZGU6IGRlY29kZS5tb2RlLFxuICAgICAgICAgIG1lc3NhZ2U6IGRlY29kZS5tZXNzYWdlLFxuICAgICAgICAgIGxvd0NvbmZpZGVuY2U6IGRlY29kZS5sb3dDb25maWRlbmNlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMubWVzc2FnZXMudHhNZXNzYWdlJC5uZXh0KHdzTXNnKTtcbiAgfVxuXG4gIC8qKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gcmVwbHkgdG8gdGhlIGdpdmVuIGRlY29kZS4gVGhlIG1lc3NhZ2UgbXVzdCBpbmNsdWRlIENRIG9yIFFSWi4gKi9cbiAgcHVibGljIGhpZ2hsaWdodENhbGxzaWduKGhpZ2hsaWdodE1zZzogV3NqdHhIaWdobGlnaHRDYWxsc2lnbikge1xuICAgIGhpZ2hsaWdodE1zZy5pZCA9IHRoaXMud3NqdHhJZDtcbiAgICBjb25zdCB3c01zZyA9IHtcbiAgICAgIHdzanR4OiB7XG4gICAgICAgIHR5cGU6ICdIaWdobGlnaHRDYWxsc2lnbk1lc3NhZ2UnLFxuICAgICAgICBwYXlsb2FkOiBoaWdobGlnaHRNc2csXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5tZXNzYWdlcy50eE1lc3NhZ2UkLm5leHQod3NNc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBjb21tYW5kIHRvIFdTSlQtWCB0byB0cmFuc21pdCB0aGUgZ2l2ZW4gZnJlZSB0ZXh0LiBJZiB0aGUgdGV4dCBpcyB0b28gbG9uZyB0byBiZVxuICAgKiBlbmNvZGVkIGluIGEgc2luZ2xlIG1lc3NhZ2UsIGl0IG1heSBiZSBzaWxlbnRseSB0cnVuY2F0ZWQuICovXG4gIHB1YmxpYyBzZW5kRnJlZVRleHQoZnJlZVRleHQ6IFdzanR4RnJlZVRleHQpIHtcbiAgICBmcmVlVGV4dC5pZCA9IHRoaXMud3NqdHhJZDtcbiAgICBjb25zdCB3c01zZyA9IHtcbiAgICAgIHdzanR4OiB7XG4gICAgICAgIHR5cGU6ICdGcmVlVGV4dE1lc3NhZ2UnLFxuICAgICAgICBwYXlsb2FkOiBmcmVlVGV4dCxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLm1lc3NhZ2VzLnR4TWVzc2FnZSQubmV4dCh3c01zZyk7XG4gIH1cblxuICAvKiogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIHNldCB0aGUgbG9jYWwgc3RhdGlvbidzIE1haWRlbmhlYWQgZ3JpZC4gVGhpcyBpcyB0ZW1wb3JhcnksXG4gICAqIGxhc3Rpbmcgb25seSBhcyBsb25nIGFzIFdTSlQtWCBpcyBydW5uaW5nLiAqL1xuICBwdWJsaWMgc2V0TG9jYXRpb24oZ3JpZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnTG9jYXRpb25NZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4TG9jYXRpb24+e1xuICAgICAgICAgIGlkOiB0aGlzLndzanR4SWQsXG4gICAgICAgICAgbG9jYXRpb246IGdyaWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5tZXNzYWdlcy50eE1lc3NhZ2UkLm5leHQod3NNc2cpO1xuICB9XG5cbiAgLyoqIFNlbmQgYSBjb21tYW5kIHRvIFdTSlQtWCB0byBzd2l0Y2ggdG8gdGhlIG5hbWVkIGNvbmZpZ3VyYXRpb24uICovXG4gIHB1YmxpYyBzd2l0Y2hDb25maWd1cmF0aW9uKGNvbmZpZ05hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHdzTXNnID0ge1xuICAgICAgd3NqdHg6IHtcbiAgICAgICAgdHlwZTogJ1N3aXRjaENvbmZpZ3VyYXRpb25NZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4U3dpdGNoQ29uZmlndXJhdGlvbj57XG4gICAgICAgICAgaWQ6IHRoaXMud3NqdHhJZCxcbiAgICAgICAgICBjb25maWd1cmF0aW9uTmFtZTogY29uZmlnTmFtZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLm1lc3NhZ2VzLnR4TWVzc2FnZSQubmV4dCh3c01zZyk7XG4gIH1cblxuICAvKiogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIHNldCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLiAqL1xuICBwdWJsaWMgY29uZmlndXJlKGNvbmZpZzogV3NqdHhDb25maWd1cmUpIHtcbiAgICBjb25maWcuaWQgPSB0aGlzLndzanR4SWQ7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnQ29uZmlndXJlTWVzc2FnZScsXG4gICAgICAgIHBheWxvYWQ6IGNvbmZpZyxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLm1lc3NhZ2VzLnR4TWVzc2FnZSQubmV4dCh3c01zZyk7XG4gIH1cblxuICAvKiogR2l2ZW4gYSBkZWNvZGUgbWVzc2FnZSwgZm9ybWF0IGEgc3RyaW5nIHRoZSBzYW1lIHdheSBhcyBkaXNwbGF5ZWQgaW4gdGhlIFdTSlQtWCBCYW5kXG4gICAqIEFjdGl2aXR5L1J4IEZyZXF1ZW5jeSB3aW5kb3dzLiAqL1xuICBwdWJsaWMgc3RhdGljIGZvcm1hdERlY29kZShtc2c6IFdzanR4RGVjb2RlKTogc3RyaW5nIHtcbiAgICBjb25zdCB0aW1lU3RyID0gdGhpcy5mb3JtYXRUaW1lKG1zZy50aW1lKTtcbiAgICByZXR1cm4gYCR7dGltZVN0cn0gJHttc2cuc25yLnRvU3RyaW5nKCkucGFkU3RhcnQoMyl9ICR7bXNnLmRlbHRhVGltZVxuICAgICAgLnRvRml4ZWQoMSlcbiAgICAgIC5wYWRTdGFydCg0KX0gJHttc2cuZGVsdGFGcmVxdWVuY3kudG9TdHJpbmcoKS5wYWRTdGFydCg0KX0gfiAgJHtcbiAgICAgIG1zZy5tZXNzYWdlXG4gICAgfWA7XG4gIH1cblxuICAvKiogR2l2ZW4gYSB0aW1lIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBtaWRuaWdodCBVVEMsIGZvcm1hdCBhcyBISE1NU1MuICovXG4gIHB1YmxpYyBzdGF0aWMgZm9ybWF0VGltZSh0aW1lOiBudW1iZXIpIHtcbiAgICBjb25zdCBzZWNvbmRzU2luY2VNaWRuaWdodCA9IE1hdGguZmxvb3IodGltZSAvIDEwMDApO1xuICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcihzZWNvbmRzU2luY2VNaWRuaWdodCAvIDM2MDApO1xuICAgIGNvbnN0IHNlY29uZHNTaW5jZUhvdXIgPSBzZWNvbmRzU2luY2VNaWRuaWdodCAtIGhvdXJzICogMzYwMDtcbiAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzU2luY2VIb3VyIC8gNjApO1xuICAgIGNvbnN0IHNlY29uZHMgPSBzZWNvbmRzU2luY2VIb3VyIC0gbWludXRlcyAqIDYwO1xuICAgIHJldHVybiBgJHtob3Vycy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9JHttaW51dGVzXG4gICAgICAudG9TdHJpbmcoKVxuICAgICAgLnBhZFN0YXJ0KDIsICcwJyl9JHtzZWNvbmRzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX1gO1xuICB9XG59XG4iXX0=
@@ -2,7 +2,11 @@
2
2
  * Public API Surface of ngx-kel-agent
3
3
  */
4
4
  export * from './lib/agent.service';
5
- export * from './lib/messages';
5
+ export * from './lib/agent-message.service';
6
+ export * from './lib/hamlib-messages';
7
+ export * from './lib/hamlib.service';
8
+ export * from './lib/wsjtx-messages';
9
+ export * from './lib/wsjtx.service';
6
10
  // export * from './lib/ngx-kel-agent.component';
7
11
  // export * from './lib/ngx-kel-agent.module';
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1rZWwtYWdlbnQvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsaURBQWlEO0FBQ2pELDhDQUE4QyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2Ygbmd4LWtlbC1hZ2VudFxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL2FnZW50LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbWVzc2FnZXMnO1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvbmd4LWtlbC1hZ2VudC5jb21wb25lbnQnO1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvbmd4LWtlbC1hZ2VudC5tb2R1bGUnO1xuIl19
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1rZWwtYWdlbnQvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxpREFBaUQ7QUFDakQsOENBQThDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBuZ3gta2VsLWFnZW50XG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9saWIvYWdlbnQuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9hZ2VudC1tZXNzYWdlLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvaGFtbGliLW1lc3NhZ2VzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2hhbWxpYi5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3dzanR4LW1lc3NhZ2VzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3dzanR4LnNlcnZpY2UnO1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvbmd4LWtlbC1hZ2VudC5jb21wb25lbnQnO1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvbmd4LWtlbC1hZ2VudC5tb2R1bGUnO1xuIl19