icom-wlan-node 0.6.1 → 0.6.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.
@@ -1,4 +1,4 @@
1
- import type { IcomModelId } from '../types';
1
+ import type { IcomAudioIfSource, IcomFunctionName, IcomLevelName, IcomModelId, IcomParameterName, IcomVfoName, IcomVfoOperation } from '../types';
2
2
  export interface CalibrationPoint {
3
3
  raw: number;
4
4
  value: number;
@@ -8,8 +8,9 @@ export interface IcomExtParam {
8
8
  subcmd: number;
9
9
  subext: number[];
10
10
  dataBytes: number;
11
- dataType: 'level' | 'bool' | 'int';
11
+ dataType: 'level' | 'bool' | 'int' | 'time';
12
12
  }
13
+ export type IcomExtParamTable = Partial<Record<IcomFunctionName | IcomLevelName | IcomParameterName, IcomExtParam>>;
13
14
  export interface IcomProfile {
14
15
  modelId: IcomModelId;
15
16
  profileName: string;
@@ -29,6 +30,23 @@ export interface IcomProfile {
29
30
  lowHz: number;
30
31
  highHz: number;
31
32
  }>;
33
+ functions: IcomFunctionName[];
34
+ levels: IcomLevelName[];
35
+ parameters: IcomParameterName[];
36
+ tuningSteps: Array<{
37
+ hz: number;
38
+ code: number;
39
+ }>;
40
+ vfoOps: IcomVfoOperation[];
41
+ vfos: IcomVfoName[];
42
+ repeater: boolean;
43
+ tone: boolean;
44
+ cw: {
45
+ sendMorse: boolean;
46
+ maxChunkLength: number;
47
+ };
48
+ spectrumAdvanced: Array<'dataOutput' | 'hold' | 'speed' | 'ref' | 'avg' | 'vbw' | 'rbw' | 'duringTx' | 'centerType'>;
49
+ audioIfSources: IcomAudioIfSource[];
32
50
  calibrations: {
33
51
  sMeterModel: string;
34
52
  swr: CalibrationPoint[];
@@ -42,6 +60,7 @@ export interface IcomProfile {
42
60
  usbAfLevel?: IcomExtParam;
43
61
  afIfWlan?: IcomExtParam;
44
62
  };
63
+ extParamSpecs: IcomExtParamTable;
45
64
  vendorExtensions: {
46
65
  connectorWlanLevel?: IcomExtParam;
47
66
  connectorDataMode?: {
@@ -97,6 +97,70 @@ const IC705_CURRENT = [
97
97
  { raw: 0, value: 0 },
98
98
  { raw: 241, value: 4 },
99
99
  ];
100
+ const COMMON_FUNCTIONS = [
101
+ 'NB', 'NR', 'COMP', 'VOX', 'TONE', 'TSQL', 'SBKIN', 'FBKIN',
102
+ 'MON', 'ANF', 'MN', 'LOCK', 'RIT', 'XIT', 'TUNER', 'SCOPE',
103
+ 'SPECTRUM', 'SPECTRUM_HOLD', 'TRANSCEIVE', 'OVF_STATUS',
104
+ ];
105
+ const COMMON_LEVELS = [
106
+ 'AF', 'RF', 'SQL', 'IF', 'NR', 'NB', 'PBT_IN', 'PBT_OUT',
107
+ 'CWPITCH', 'RFPOWER', 'MICGAIN', 'KEYSPD', 'NOTCHF_RAW', 'COMP',
108
+ 'BKINDL', 'VOXGAIN', 'ANTIVOX', 'MONITOR_GAIN', 'AGC', 'AGC_TIME',
109
+ ];
110
+ const COMMON_PARAMETERS = ['ANN', 'BEEP', 'BACKLIGHT', 'SCREENSAVER', 'TIME', 'KEYERTYPE', 'AFIF'];
111
+ const SAFE_FUNCTIONS = ['NB', 'NR', 'COMP', 'VOX', 'MON', 'ANF', 'MN', 'LOCK', 'RIT', 'XIT', 'TUNER', 'SCOPE', 'SPECTRUM', 'SPECTRUM_HOLD', 'OVF_STATUS'];
112
+ const SAFE_LEVELS = ['AF', 'RF', 'SQL', 'NR', 'NB', 'RFPOWER', 'MICGAIN', 'COMP', 'BKINDL', 'MONITOR_GAIN'];
113
+ const DEFAULT_VFOS = ['A', 'B', 'CURR', 'TX'];
114
+ const TARGETABLE_VFOS = ['A', 'B', 'MAIN', 'SUB', 'MAIN_A', 'MAIN_B', 'SUB_A', 'SUB_B', 'MEM', 'CURR', 'TX'];
115
+ const COMMON_VFO_OPS = ['copy', 'exchange', 'from-vfo', 'to-vfo', 'memory-clear', 'tune'];
116
+ const IC905_VFO_OPS = ['copy', 'from-vfo', 'to-vfo', 'memory-clear', 'tune'];
117
+ const SPECTRUM_ADVANCED = ['dataOutput', 'hold', 'speed', 'ref', 'avg', 'vbw', 'rbw', 'duringTx', 'centerType'];
118
+ const CW_TEXT_SUPPORTED = { sendMorse: true, maxChunkLength: 30 };
119
+ const TS_IC756PRO = [
120
+ { hz: 10, code: 0x00 },
121
+ { hz: 100, code: 0x01 },
122
+ { hz: 1000, code: 0x02 },
123
+ { hz: 5000, code: 0x03 },
124
+ { hz: 9000, code: 0x04 },
125
+ { hz: 10000, code: 0x05 },
126
+ { hz: 12500, code: 0x06 },
127
+ { hz: 20000, code: 0x07 },
128
+ { hz: 25000, code: 0x08 },
129
+ ];
130
+ const TS_IC7300 = [
131
+ { hz: 1, code: 0x00 },
132
+ ...TS_IC756PRO.slice(1),
133
+ ];
134
+ const TS_IC705 = [
135
+ { hz: 10, code: 0x00 },
136
+ { hz: 100, code: 0x01 },
137
+ { hz: 500, code: 0x02 },
138
+ { hz: 1000, code: 0x03 },
139
+ { hz: 5000, code: 0x04 },
140
+ { hz: 6250, code: 0x05 },
141
+ { hz: 8330, code: 0x06 },
142
+ { hz: 9000, code: 0x07 },
143
+ { hz: 10000, code: 0x08 },
144
+ { hz: 12500, code: 0x09 },
145
+ { hz: 20000, code: 0x10 },
146
+ { hz: 25000, code: 0x11 },
147
+ { hz: 50000, code: 0x12 },
148
+ { hz: 100000, code: 0x13 },
149
+ ];
150
+ const TS_IC9700 = [
151
+ { hz: 10, code: 0x00 },
152
+ { hz: 100, code: 0x01 },
153
+ { hz: 500, code: 0x02 },
154
+ { hz: 1000, code: 0x03 },
155
+ { hz: 5000, code: 0x04 },
156
+ { hz: 6250, code: 0x05 },
157
+ { hz: 10000, code: 0x06 },
158
+ { hz: 12500, code: 0x07 },
159
+ { hz: 20000, code: 0x08 },
160
+ { hz: 25000, code: 0x09 },
161
+ { hz: 50000, code: 0x10 },
162
+ { hz: 100000, code: 0x11 },
163
+ ];
100
164
  function baseProfile(overrides) {
101
165
  return {
102
166
  supportsX25X26: true,
@@ -109,6 +173,17 @@ function baseProfile(overrides) {
109
173
  scopeSingleFrameDataLength: 50,
110
174
  scopeEdgeSlots: [1, 2, 3, 4],
111
175
  scopeRanges: HF_SCOPE_RANGES_13,
176
+ functions: SAFE_FUNCTIONS,
177
+ levels: SAFE_LEVELS,
178
+ parameters: [],
179
+ tuningSteps: TS_IC705,
180
+ vfoOps: COMMON_VFO_OPS,
181
+ vfos: DEFAULT_VFOS,
182
+ repeater: false,
183
+ tone: false,
184
+ cw: { sendMorse: false, maxChunkLength: 30 },
185
+ spectrumAdvanced: ['dataOutput', 'hold', 'speed', 'ref', 'vbw', 'duringTx', 'centerType'],
186
+ audioIfSources: ['default'],
112
187
  calibrations: {
113
188
  sMeterModel: 'IC-705',
114
189
  swr: DEFAULT_SWR,
@@ -119,6 +194,7 @@ function baseProfile(overrides) {
119
194
  current: DEFAULT_CURRENT,
120
195
  },
121
196
  extParams: {},
197
+ extParamSpecs: {},
122
198
  vendorExtensions: {},
123
199
  ...overrides,
124
200
  };
@@ -127,6 +203,66 @@ const ic705Ext = {
127
203
  usbAfLevel: { command: 0x1a, subcmd: 0x05, subext: [0x01, 0x13], dataBytes: 2, dataType: 'level' },
128
204
  afIfWlan: { command: 0x1a, subcmd: 0x05, subext: [0x01, 0x14], dataBytes: 1, dataType: 'bool' },
129
205
  };
206
+ const ext = (subext, dataBytes, dataType) => ({
207
+ command: 0x1a,
208
+ subcmd: 0x05,
209
+ subext,
210
+ dataBytes,
211
+ dataType,
212
+ });
213
+ const IC7300_EXT_SPECS = {
214
+ BEEP: ext([0x00, 0x23], 1, 'bool'),
215
+ BACKLIGHT: ext([0x00, 0x81], 2, 'level'),
216
+ SCREENSAVER: ext([0x00, 0x89], 1, 'int'),
217
+ TIME: ext([0x00, 0x95], 2, 'time'),
218
+ AFIF: ext([0x00, 0x59], 1, 'bool'),
219
+ VOXDELAY: ext([0x01, 0x59], 1, 'int'),
220
+ TRANSCEIVE: ext([0x00, 0x71], 1, 'bool'),
221
+ SPECTRUM_AVG: ext([0x01, 0x02], 1, 'int'),
222
+ AGC_TIME: { command: 0x1a, subcmd: 0x04, subext: [], dataBytes: 1, dataType: 'int' },
223
+ KEYERTYPE: ext([0x01, 0x64], 1, 'int'),
224
+ };
225
+ const IC705_EXT_SPECS = {
226
+ BEEP: ext([0x00, 0x31], 1, 'bool'),
227
+ BACKLIGHT: ext([0x01, 0x36], 2, 'level'),
228
+ SCREENSAVER: ext([0x01, 0x38], 1, 'int'),
229
+ TIME: ext([0x01, 0x66], 2, 'time'),
230
+ AFIF: ext([0x01, 0x09], 1, 'bool'),
231
+ AFIF_WLAN: ext([0x01, 0x14], 1, 'bool'),
232
+ VOXDELAY: ext([0x03, 0x59], 1, 'int'),
233
+ TRANSCEIVE: ext([0x01, 0x31], 1, 'bool'),
234
+ SPECTRUM_AVG: ext([0x01, 0x78], 1, 'int'),
235
+ AGC_TIME: { command: 0x1a, subcmd: 0x04, subext: [], dataBytes: 1, dataType: 'int' },
236
+ KEYERTYPE: ext([0x02, 0x55], 1, 'int'),
237
+ };
238
+ const IC9700_EXT_SPECS = {
239
+ BEEP: ext([0x00, 0x29], 1, 'bool'),
240
+ BACKLIGHT: ext([0x01, 0x52], 2, 'level'),
241
+ SCREENSAVER: ext([0x01, 0x67], 1, 'int'),
242
+ TIME: ext([0x01, 0x80], 2, 'time'),
243
+ AFIF: ext([0x01, 0x05], 1, 'bool'),
244
+ AFIF_ACC: ext([0x01, 0x00], 1, 'bool'),
245
+ AFIF_LAN: ext([0x01, 0x10], 1, 'bool'),
246
+ VOXDELAY: ext([0x03, 0x30], 1, 'int'),
247
+ TRANSCEIVE: ext([0x01, 0x27], 1, 'bool'),
248
+ SPECTRUM_AVG: ext([0x01, 0x92], 1, 'int'),
249
+ AGC_TIME: { command: 0x1a, subcmd: 0x04, subext: [], dataBytes: 1, dataType: 'int' },
250
+ KEYERTYPE: ext([0x02, 0x27], 1, 'int'),
251
+ };
252
+ const IC7610_EXT_SPECS = {
253
+ BEEP: ext([0x00, 0x24], 1, 'bool'),
254
+ BACKLIGHT: ext([0x01, 0x41], 2, 'level'),
255
+ TIME: ext([0x01, 0x59], 2, 'time'),
256
+ VOXDELAY: ext([0x02, 0x92], 1, 'int'),
257
+ TRANSCEIVE: ext([0x01, 0x12], 1, 'bool'),
258
+ SPECTRUM_AVG: ext([0x01, 0x70], 1, 'int'),
259
+ AGC_TIME: { command: 0x1a, subcmd: 0x04, subext: [], dataBytes: 1, dataType: 'int' },
260
+ KEYERTYPE: ext([0x02, 0x31], 1, 'int'),
261
+ };
262
+ const IC7760_EXT_SPECS = {
263
+ VOXDELAY: ext([0x01, 0x82], 1, 'int'),
264
+ AGC_TIME: { command: 0x1a, subcmd: 0x04, subext: [], dataBytes: 1, dataType: 'int' },
265
+ };
130
266
  const ic705Vendor = {
131
267
  connectorWlanLevel: { command: 0x1a, subcmd: 0x05, subext: [0x01, 0x17], dataBytes: 2, dataType: 'level' },
132
268
  connectorDataMode: { command: 0x1a, subcmd: 0x05, subext: [0x01, 0x19] },
@@ -138,6 +274,8 @@ exports.ICOM_PROFILES = {
138
274
  defaultCivAddress: 0xa4,
139
275
  aliases: ['generic', 'icom'],
140
276
  scopeRanges: HF_VHF_UHF_SCOPE_RANGES_17,
277
+ functions: SAFE_FUNCTIONS,
278
+ levels: SAFE_LEVELS,
141
279
  }),
142
280
  'IC-705': baseProfile({
143
281
  modelId: 'IC-705',
@@ -145,6 +283,17 @@ exports.ICOM_PROFILES = {
145
283
  defaultCivAddress: 0xa4,
146
284
  aliases: ['IC-705', 'IC705'],
147
285
  scopeRanges: HF_VHF_UHF_SCOPE_RANGES_17,
286
+ functions: COMMON_FUNCTIONS,
287
+ levels: [...COMMON_LEVELS, 'SPECTRUM_AVG'],
288
+ parameters: [...COMMON_PARAMETERS, 'AFIF_WLAN'],
289
+ tuningSteps: TS_IC705,
290
+ vfoOps: COMMON_VFO_OPS,
291
+ vfos: DEFAULT_VFOS,
292
+ repeater: true,
293
+ tone: true,
294
+ cw: CW_TEXT_SUPPORTED,
295
+ spectrumAdvanced: ['dataOutput', 'hold', 'speed', 'ref', 'avg', 'vbw', 'duringTx', 'centerType'],
296
+ audioIfSources: ['default', 'wlan'],
148
297
  calibrations: {
149
298
  sMeterModel: 'IC-705',
150
299
  swr: DEFAULT_SWR,
@@ -155,6 +304,7 @@ exports.ICOM_PROFILES = {
155
304
  current: IC705_CURRENT,
156
305
  },
157
306
  extParams: ic705Ext,
307
+ extParamSpecs: IC705_EXT_SPECS,
158
308
  vendorExtensions: ic705Vendor,
159
309
  }),
160
310
  'IC-905': baseProfile({
@@ -164,6 +314,17 @@ exports.ICOM_PROFILES = {
164
314
  aliases: ['IC-905', 'IC905'],
165
315
  frequencyBcdBytes: (freqHz) => freqHz > 5.85e9 ? 6 : 5,
166
316
  scopeRanges: HF_VHF_UHF_SCOPE_RANGES_17,
317
+ functions: COMMON_FUNCTIONS,
318
+ levels: [...COMMON_LEVELS, 'SPECTRUM_AVG'],
319
+ parameters: [...COMMON_PARAMETERS, 'AFIF_WLAN'],
320
+ tuningSteps: TS_IC705,
321
+ vfoOps: IC905_VFO_OPS,
322
+ vfos: DEFAULT_VFOS,
323
+ repeater: true,
324
+ tone: true,
325
+ cw: CW_TEXT_SUPPORTED,
326
+ spectrumAdvanced: ['dataOutput', 'hold', 'speed', 'ref', 'avg', 'vbw', 'duringTx', 'centerType'],
327
+ audioIfSources: ['default', 'wlan'],
167
328
  calibrations: {
168
329
  sMeterModel: 'IC-705',
169
330
  swr: DEFAULT_SWR,
@@ -174,6 +335,7 @@ exports.ICOM_PROFILES = {
174
335
  current: DEFAULT_CURRENT,
175
336
  },
176
337
  extParams: ic705Ext,
338
+ extParamSpecs: IC705_EXT_SPECS,
177
339
  vendorExtensions: ic705Vendor,
178
340
  }),
179
341
  'IC-7300': baseProfile({
@@ -182,9 +344,26 @@ exports.ICOM_PROFILES = {
182
344
  defaultCivAddress: 0x94,
183
345
  aliases: ['IC-7300', 'IC7300'],
184
346
  scopeRanges: HF_SCOPE_RANGES_13,
347
+ functions: COMMON_FUNCTIONS,
348
+ levels: [...COMMON_LEVELS, 'DRIVE_GAIN', 'DIGI_SEL_LEVEL', 'SPECTRUM_AVG'],
349
+ parameters: COMMON_PARAMETERS,
350
+ tuningSteps: TS_IC7300,
351
+ vfoOps: COMMON_VFO_OPS,
352
+ vfos: DEFAULT_VFOS,
353
+ repeater: false,
354
+ tone: true,
355
+ cw: CW_TEXT_SUPPORTED,
356
+ spectrumAdvanced: ['dataOutput', 'hold', 'speed', 'ref', 'avg', 'vbw', 'duringTx', 'centerType'],
357
+ audioIfSources: ['default'],
185
358
  extParams: {
186
359
  usbAfLevel: { command: 0x1a, subcmd: 0x05, subext: [0x00, 0x60], dataBytes: 2, dataType: 'level' },
187
360
  },
361
+ extParamSpecs: {
362
+ ...IC7300_EXT_SPECS,
363
+ DRIVE_GAIN: { command: 0x14, subcmd: 0x14, subext: [], dataBytes: 2, dataType: 'level' },
364
+ DIGI_SEL: { command: 0x16, subcmd: 0x4e, subext: [], dataBytes: 1, dataType: 'bool' },
365
+ DIGI_SEL_LEVEL: { command: 0x14, subcmd: 0x13, subext: [], dataBytes: 2, dataType: 'level' },
366
+ },
188
367
  }),
189
368
  'IC-9700': baseProfile({
190
369
  modelId: 'IC-9700',
@@ -192,9 +371,21 @@ exports.ICOM_PROFILES = {
192
371
  defaultCivAddress: 0xa2,
193
372
  aliases: ['IC-9700', 'IC9700'],
194
373
  scopeRanges: IC9700_SCOPE_RANGES,
374
+ functions: [...COMMON_FUNCTIONS, 'SATMODE', 'DUAL_WATCH', 'AFC'],
375
+ levels: [...COMMON_LEVELS, 'SPECTRUM_AVG'],
376
+ parameters: [...COMMON_PARAMETERS, 'AFIF_LAN', 'AFIF_ACC'],
377
+ tuningSteps: TS_IC9700,
378
+ vfoOps: ['copy', 'exchange', 'from-vfo', 'to-vfo', 'memory-clear'],
379
+ vfos: TARGETABLE_VFOS,
380
+ repeater: true,
381
+ tone: true,
382
+ cw: CW_TEXT_SUPPORTED,
383
+ spectrumAdvanced: ['dataOutput', 'hold', 'speed', 'ref', 'avg', 'vbw', 'duringTx', 'centerType'],
384
+ audioIfSources: ['default', 'lan', 'acc'],
195
385
  extParams: {
196
386
  usbAfLevel: { command: 0x1a, subcmd: 0x05, subext: [0x01, 0x06], dataBytes: 2, dataType: 'level' },
197
387
  },
388
+ extParamSpecs: IC9700_EXT_SPECS,
198
389
  }),
199
390
  'IC-7610': baseProfile({
200
391
  modelId: 'IC-7610',
@@ -203,9 +394,30 @@ exports.ICOM_PROFILES = {
203
394
  aliases: ['IC-7610', 'IC7610'],
204
395
  scopeLineLength: 689,
205
396
  scopeRanges: IC7610_SCOPE_RANGES,
397
+ functions: [...COMMON_FUNCTIONS, 'APF', 'DUAL_WATCH', 'DIGI_SEL', 'IPP', 'TX_INHIBIT', 'DPP', 'ICPW2'],
398
+ levels: [...COMMON_LEVELS, 'APF', 'BALANCE', 'DRIVE_GAIN', 'DIGI_SEL_LEVEL', 'SPECTRUM_AVG'],
399
+ parameters: ['BEEP', 'BACKLIGHT', 'TIME', 'KEYERTYPE'],
400
+ tuningSteps: TS_IC756PRO,
401
+ vfoOps: COMMON_VFO_OPS,
402
+ vfos: TARGETABLE_VFOS,
403
+ repeater: false,
404
+ tone: true,
405
+ cw: CW_TEXT_SUPPORTED,
406
+ spectrumAdvanced: SPECTRUM_ADVANCED,
407
+ audioIfSources: ['default'],
206
408
  extParams: {
207
409
  usbAfLevel: { command: 0x1a, subcmd: 0x05, subext: [0x00, 0x82], dataBytes: 2, dataType: 'level' },
208
410
  },
411
+ extParamSpecs: {
412
+ ...IC7610_EXT_SPECS,
413
+ DRIVE_GAIN: { command: 0x14, subcmd: 0x14, subext: [], dataBytes: 2, dataType: 'level' },
414
+ DIGI_SEL: { command: 0x16, subcmd: 0x4e, subext: [], dataBytes: 1, dataType: 'bool' },
415
+ DIGI_SEL_LEVEL: { command: 0x14, subcmd: 0x13, subext: [], dataBytes: 2, dataType: 'level' },
416
+ IPP: { command: 0x16, subcmd: 0x65, subext: [], dataBytes: 1, dataType: 'bool' },
417
+ TX_INHIBIT: { command: 0x16, subcmd: 0x66, subext: [], dataBytes: 1, dataType: 'bool' },
418
+ DPP: { command: 0x16, subcmd: 0x67, subext: [], dataBytes: 1, dataType: 'bool' },
419
+ ICPW2: ext([0x03, 0x10], 1, 'bool'),
420
+ },
209
421
  }),
210
422
  'IC-7760': baseProfile({
211
423
  modelId: 'IC-7760',
@@ -213,6 +425,22 @@ exports.ICOM_PROFILES = {
213
425
  defaultCivAddress: 0xb2,
214
426
  aliases: ['IC-7760', 'IC7760'],
215
427
  scopeRanges: HF_SCOPE_RANGES_13,
428
+ functions: ['NB', 'NR', 'COMP', 'VOX', 'TONE', 'TSQL', 'SBKIN', 'FBKIN', 'MON', 'ANF', 'MN', 'VSC', 'LOCK', 'RIT', 'XIT', 'TUNER', 'APF', 'DIGI_SEL'],
429
+ levels: [...COMMON_LEVELS, 'APF', 'BALANCE', 'DRIVE_GAIN', 'DIGI_SEL_LEVEL'],
430
+ parameters: ['ANN', 'BACKLIGHT'],
431
+ tuningSteps: TS_IC756PRO,
432
+ vfoOps: COMMON_VFO_OPS,
433
+ vfos: DEFAULT_VFOS,
434
+ repeater: false,
435
+ tone: true,
436
+ cw: CW_TEXT_SUPPORTED,
437
+ spectrumAdvanced: [],
438
+ extParamSpecs: {
439
+ ...IC7760_EXT_SPECS,
440
+ DRIVE_GAIN: { command: 0x14, subcmd: 0x14, subext: [], dataBytes: 2, dataType: 'level' },
441
+ DIGI_SEL: { command: 0x16, subcmd: 0x4e, subext: [], dataBytes: 1, dataType: 'bool' },
442
+ DIGI_SEL_LEVEL: { command: 0x14, subcmd: 0x13, subext: [], dataBytes: 2, dataType: 'level' },
443
+ },
216
444
  }),
217
445
  };
218
446
  function interpolateCalibration(raw, points) {
@@ -30,6 +30,28 @@ export declare const IcomRigCommands: {
30
30
  getCurrent(ctrAddr: number, rigAddr: number): Buffer;
31
31
  get0x14Level(ctrAddr: number, rigAddr: number, subcmd: number): Buffer;
32
32
  set0x14Level(ctrAddr: number, rigAddr: number, subcmd: number, bcdHi: number, bcdLo: number): Buffer;
33
+ readCommand(ctrAddr: number, rigAddr: number, cmd: number, subcmd?: number | number[], payload?: number[] | Buffer): Buffer;
34
+ writeCommand(ctrAddr: number, rigAddr: number, cmd: number, subcmd: number | number[] | undefined, payload?: number[] | Buffer): Buffer;
35
+ readFunction(ctrAddr: number, rigAddr: number, subcmd: number, payload?: number[] | Buffer): Buffer;
36
+ setFunction(ctrAddr: number, rigAddr: number, subcmd: number, value: number, payloadPrefix?: number[]): Buffer;
37
+ sendMorseText(ctrAddr: number, rigAddr: number, textBytes: Buffer | number[] | string): Buffer;
38
+ stopMorse(ctrAddr: number, rigAddr: number): Buffer;
39
+ readExtParam(ctrAddr: number, rigAddr: number, command: number, subcmd: number, subext?: number[]): Buffer;
40
+ writeExtParam(ctrAddr: number, rigAddr: number, command: number, subcmd: number, subext?: number[], payload?: number[] | Buffer): Buffer;
41
+ readRitOffset(ctrAddr: number, rigAddr: number): Buffer;
42
+ setRitOffset(ctrAddr: number, rigAddr: number, payload: number[] | Buffer): Buffer;
43
+ readRitEnabled(ctrAddr: number, rigAddr: number): Buffer;
44
+ setRitEnabled(ctrAddr: number, rigAddr: number, enabled: boolean): Buffer;
45
+ readXitEnabled(ctrAddr: number, rigAddr: number): Buffer;
46
+ setXitEnabled(ctrAddr: number, rigAddr: number, enabled: boolean): Buffer;
47
+ readSplit(ctrAddr: number, rigAddr: number): Buffer;
48
+ setSplit(ctrAddr: number, rigAddr: number, enabled: boolean): Buffer;
49
+ readTuningStep(ctrAddr: number, rigAddr: number): Buffer;
50
+ setTuningStep(ctrAddr: number, rigAddr: number, code: number): Buffer;
51
+ readRepeaterShift(ctrAddr: number, rigAddr: number): Buffer;
52
+ setRepeaterShift(ctrAddr: number, rigAddr: number, code: number): Buffer;
53
+ readTone(ctrAddr: number, rigAddr: number, subcmd: number): Buffer;
54
+ setTone(ctrAddr: number, rigAddr: number, subcmd: number, toneTenthHz: number): Buffer;
33
55
  getTunerStatus(ctrAddr: number, rigAddr: number): Buffer;
34
56
  setTunerEnabled(ctrAddr: number, rigAddr: number, on: boolean): Buffer;
35
57
  startManualTune(ctrAddr: number, rigAddr: number): Buffer;
@@ -104,6 +104,73 @@ exports.IcomRigCommands = {
104
104
  set0x14Level(ctrAddr, rigAddr, subcmd, bcdHi, bcdLo) {
105
105
  return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd: IcomCivSpec_1.CIV.C_CTL_LVL, subcmd, payload: [bcdHi, bcdLo] });
106
106
  },
107
+ readCommand(ctrAddr, rigAddr, cmd, subcmd, payload) {
108
+ return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd, subcmd, payload });
109
+ },
110
+ writeCommand(ctrAddr, rigAddr, cmd, subcmd, payload) {
111
+ return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd, subcmd, payload });
112
+ },
113
+ readFunction(ctrAddr, rigAddr, subcmd, payload) {
114
+ return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd: IcomCivSpec_1.CIV.C_CTL_FUNC, subcmd, payload });
115
+ },
116
+ setFunction(ctrAddr, rigAddr, subcmd, value, payloadPrefix = []) {
117
+ return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd: IcomCivSpec_1.CIV.C_CTL_FUNC, subcmd, payload: [...payloadPrefix, value & 0xff] });
118
+ },
119
+ sendMorseText(ctrAddr, rigAddr, textBytes) {
120
+ const payload = typeof textBytes === 'string' ? Buffer.from(textBytes, 'ascii') : textBytes;
121
+ return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd: IcomCivSpec_1.CIV.C_SND_CW, payload });
122
+ },
123
+ stopMorse(ctrAddr, rigAddr) {
124
+ return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd: IcomCivSpec_1.CIV.C_SND_CW, payload: [0xff] });
125
+ },
126
+ readExtParam(ctrAddr, rigAddr, command, subcmd, subext = []) {
127
+ return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd: command, subcmd, payload: subext });
128
+ },
129
+ writeExtParam(ctrAddr, rigAddr, command, subcmd, subext = [], payload = []) {
130
+ return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd: command, subcmd, payload: [...subext, ...Array.from(payload)] });
131
+ },
132
+ readRitOffset(ctrAddr, rigAddr) {
133
+ return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd: IcomCivSpec_1.CIV.C_CTL_RIT, subcmd: IcomCivSpec_1.CIV.S_RIT_FREQ });
134
+ },
135
+ setRitOffset(ctrAddr, rigAddr, payload) {
136
+ return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd: IcomCivSpec_1.CIV.C_CTL_RIT, subcmd: IcomCivSpec_1.CIV.S_RIT_FREQ, payload });
137
+ },
138
+ readRitEnabled(ctrAddr, rigAddr) {
139
+ return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd: IcomCivSpec_1.CIV.C_CTL_RIT, subcmd: IcomCivSpec_1.CIV.S_RIT });
140
+ },
141
+ setRitEnabled(ctrAddr, rigAddr, enabled) {
142
+ return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd: IcomCivSpec_1.CIV.C_CTL_RIT, subcmd: IcomCivSpec_1.CIV.S_RIT, payload: [enabled ? 1 : 0] });
143
+ },
144
+ readXitEnabled(ctrAddr, rigAddr) {
145
+ return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd: IcomCivSpec_1.CIV.C_CTL_RIT, subcmd: IcomCivSpec_1.CIV.S_XIT });
146
+ },
147
+ setXitEnabled(ctrAddr, rigAddr, enabled) {
148
+ return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd: IcomCivSpec_1.CIV.C_CTL_RIT, subcmd: IcomCivSpec_1.CIV.S_XIT, payload: [enabled ? 1 : 0] });
149
+ },
150
+ readSplit(ctrAddr, rigAddr) {
151
+ return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd: IcomCivSpec_1.CIV.C_CTL_SPLT });
152
+ },
153
+ setSplit(ctrAddr, rigAddr, enabled) {
154
+ return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd: IcomCivSpec_1.CIV.C_CTL_SPLT, subcmd: enabled ? IcomCivSpec_1.CIV.S_SPLT_ON : IcomCivSpec_1.CIV.S_SPLT_OFF });
155
+ },
156
+ readTuningStep(ctrAddr, rigAddr) {
157
+ return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd: IcomCivSpec_1.CIV.C_SET_TS });
158
+ },
159
+ setTuningStep(ctrAddr, rigAddr, code) {
160
+ return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd: IcomCivSpec_1.CIV.C_SET_TS, subcmd: code });
161
+ },
162
+ readRepeaterShift(ctrAddr, rigAddr) {
163
+ return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd: IcomCivSpec_1.CIV.C_CTL_SPLT });
164
+ },
165
+ setRepeaterShift(ctrAddr, rigAddr, code) {
166
+ return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd: IcomCivSpec_1.CIV.C_CTL_SPLT, subcmd: code });
167
+ },
168
+ readTone(ctrAddr, rigAddr, subcmd) {
169
+ return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd: IcomCivSpec_1.CIV.C_SET_TONE, subcmd });
170
+ },
171
+ setTone(ctrAddr, rigAddr, subcmd, toneTenthHz) {
172
+ return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd: IcomCivSpec_1.CIV.C_SET_TONE, subcmd, payload: (0, IcomCivFrame_1.encodeBcdBE)(toneTenthHz, 3) });
173
+ },
107
174
  getTunerStatus(ctrAddr, rigAddr) {
108
175
  return (0, IcomCivFrame_1.buildCivFrame)({ rigAddr, ctrlAddr: ctrAddr, cmd: IcomCivSpec_1.CIV.C_CTL_PTT, subcmd: IcomCivSpec_1.CIV.S_ANT_TUN });
109
176
  },
package/dist/types.d.ts CHANGED
@@ -9,6 +9,15 @@ export interface IcomCredentials {
9
9
  password: string;
10
10
  }
11
11
  export type IcomModelId = 'IC-705' | 'IC-905' | 'IC-7300' | 'IC-9700' | 'IC-7610' | 'IC-7760' | 'generic-modern-icom';
12
+ export type IcomFunctionName = 'NB' | 'NR' | 'COMP' | 'VOX' | 'TONE' | 'TSQL' | 'SBKIN' | 'FBKIN' | 'MON' | 'ANF' | 'MN' | 'LOCK' | 'RIT' | 'XIT' | 'TUNER' | 'APF' | 'AFC' | 'VSC' | 'DUAL_WATCH' | 'SATMODE' | 'SCOPE' | 'SPECTRUM' | 'SPECTRUM_HOLD' | 'TRANSCEIVE' | 'OVF_STATUS' | 'DIGI_SEL' | 'IPP' | 'TX_INHIBIT' | 'DPP' | 'ICPW2';
13
+ export type IcomLevelName = 'AF' | 'RF' | 'SQL' | 'IF' | 'APF' | 'NR' | 'NB' | 'PBT_IN' | 'PBT_OUT' | 'CWPITCH' | 'RFPOWER' | 'MICGAIN' | 'KEYSPD' | 'NOTCHF_RAW' | 'COMP' | 'BKINDL' | 'BALANCE' | 'VOXGAIN' | 'ANTIVOX' | 'VOXDELAY' | 'MONITOR_GAIN' | 'DRIVE_GAIN' | 'DIGI_SEL_LEVEL' | 'AGC' | 'AGC_TIME' | 'SPECTRUM_AVG';
14
+ export type IcomParameterName = 'ANN' | 'BEEP' | 'BACKLIGHT' | 'SCREENSAVER' | 'TIME' | 'KEYERTYPE' | 'AFIF' | 'AFIF_WLAN' | 'AFIF_LAN' | 'AFIF_ACC';
15
+ export type IcomVfoName = 'A' | 'B' | 'MAIN' | 'SUB' | 'MAIN_A' | 'MAIN_B' | 'SUB_A' | 'SUB_B' | 'MEM' | 'CURR' | 'TX';
16
+ export type IcomVfoOperation = 'copy' | 'exchange' | 'from-vfo' | 'to-vfo' | 'memory-clear' | 'tune';
17
+ export type IcomRepeaterShift = 'none' | 'minus' | 'plus';
18
+ export type IcomSpectrumSpeed = 'slow' | 'mid' | 'fast';
19
+ export type IcomSpectrumCenterType = 'filter-center' | 'carrier-point-center' | 'carrier-point-center-abs';
20
+ export type IcomAudioIfSource = 'default' | 'wlan' | 'lan' | 'acc';
12
21
  export interface IcomRigOptions extends IcomCredentials {
13
22
  control: UdpAddress;
14
23
  /** Radio model profile. Defaults to auto-detection from rig name or CI-V address. */
@@ -82,6 +91,16 @@ export interface SetModeOptions {
82
91
  /** Optional IF filter preset. Modern DSP rigs commonly support 1, 2, or 3. */
83
92
  filter?: 1 | 2 | 3;
84
93
  }
94
+ export interface SendMorseOptions {
95
+ /** ACK/NAK timeout per CI-V 0x17 chunk. Defaults to 3000 ms. */
96
+ timeout?: number;
97
+ /** Maximum text bytes per CI-V 0x17 chunk. Defaults to the active profile limit. */
98
+ chunkLength?: number;
99
+ /** Read and require CW/CW_R mode before sending. Defaults to true. */
100
+ checkMode?: boolean;
101
+ /** Optional delay between acknowledged chunks. Defaults to 0 ms. */
102
+ interChunkDelayMs?: number;
103
+ }
85
104
  /**
86
105
  * Options for query operations (frequency, meters, etc.)
87
106
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "icom-wlan-node",
3
- "version": "0.6.1",
3
+ "version": "0.6.3",
4
4
  "description": "Icom WLAN (CI‑V, audio) protocol implementation for Node.js/TypeScript.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",