@springfield/ham-radio-api 17.3.0 → 17.4.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.
- package/dist/radio/memory-map.d.ts +31 -2
- package/dist/radio/memory-map.d.ts.map +1 -1
- package/dist/radio/protocol.d.ts +11 -11
- package/dist/radio/protocol.d.ts.map +1 -1
- package/dist/radio/serial-config.d.ts +4 -0
- package/dist/radio/serial-config.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/radio/memory-map.ts +37 -3
- package/src/radio/protocol.ts +14 -16
- package/src/radio/serial-config.ts +4 -0
|
@@ -38,6 +38,8 @@ export type RadioMemoryMapValueKind = {
|
|
|
38
38
|
} | {
|
|
39
39
|
kind: "ascii";
|
|
40
40
|
length: number;
|
|
41
|
+
/** Fill byte for unused character slots (default 0xFF). Kenwood names use 0. */
|
|
42
|
+
pad?: number;
|
|
41
43
|
} | {
|
|
42
44
|
kind: "digits";
|
|
43
45
|
/** Number of decimal digit bytes. */
|
|
@@ -80,6 +82,20 @@ export type RadioMemoryMapValueKind = {
|
|
|
80
82
|
ctcssMin?: number;
|
|
81
83
|
/** Added to DCS index for reverse polarity (Chirp uses 0x69). */
|
|
82
84
|
reverseOffset?: number;
|
|
85
|
+
} | {
|
|
86
|
+
/**
|
|
87
|
+
* CTCSS tone stored as an index into `values` (Hz * 10, Springfield tenths).
|
|
88
|
+
* Kenwood TH-D74 `rtone` / `ctone` use Chirp TONES order.
|
|
89
|
+
*/
|
|
90
|
+
kind: "ctcss-index";
|
|
91
|
+
values: number[];
|
|
92
|
+
} | {
|
|
93
|
+
/**
|
|
94
|
+
* DCS code stored as an index into `values`.
|
|
95
|
+
* Kenwood TH-D74 `dtcs_code` uses Chirp DTCS_CODES order.
|
|
96
|
+
*/
|
|
97
|
+
kind: "dcs-index";
|
|
98
|
+
values: number[];
|
|
83
99
|
};
|
|
84
100
|
/** UI metadata for a non-reserved field. */
|
|
85
101
|
export interface RadioMemoryMapFieldUi {
|
|
@@ -98,11 +114,11 @@ export interface RadioMemoryMapField {
|
|
|
98
114
|
id: string;
|
|
99
115
|
/**
|
|
100
116
|
* Storage type:
|
|
101
|
-
* - u8 / u16: whole bytes (u16
|
|
117
|
+
* - u8 / u16 / u32: whole bytes (u16/u32 are little-endian, Chirp ul16/ul32)
|
|
102
118
|
* - bits: bitfield of `width` bits within the current byte (MSB-first)
|
|
103
119
|
* - char: ASCII byte (length via value.kind ascii or count)
|
|
104
120
|
*/
|
|
105
|
-
type: "u8" | "u16" | "bits" | "char";
|
|
121
|
+
type: "u8" | "u16" | "u32" | "bits" | "char";
|
|
106
122
|
/** Bit width when type is bits. */
|
|
107
123
|
width?: number;
|
|
108
124
|
/** When true, skip decode/encode for this padding field. */
|
|
@@ -132,6 +148,13 @@ export interface RadioMemoryMapStruct {
|
|
|
132
148
|
*/
|
|
133
149
|
count?: number;
|
|
134
150
|
stride?: number;
|
|
151
|
+
/**
|
|
152
|
+
* When set with `groupPad`, instances are packed into groups of `groupSize`
|
|
153
|
+
* records followed by `groupPad` padding bytes (Kenwood TH-D74: 6 × 40 + 16).
|
|
154
|
+
*/
|
|
155
|
+
groupSize?: number;
|
|
156
|
+
/** Padding bytes after each group of `groupSize` records. */
|
|
157
|
+
groupPad?: number;
|
|
135
158
|
/** Occupancy rule for repeated structs (e.g. empty channel slots). */
|
|
136
159
|
emptyWhen?: RadioMemoryMapEmptyWhen;
|
|
137
160
|
/**
|
|
@@ -155,6 +178,12 @@ export interface RadioMemoryMapChannelBindings {
|
|
|
155
178
|
transmitFrequency: string;
|
|
156
179
|
receiveTone: string;
|
|
157
180
|
transmitTone: string;
|
|
181
|
+
/**
|
|
182
|
+
* Optional parallel struct whose fields merge into each channel's settings
|
|
183
|
+
* (Kenwood TH-D74 flags: used, lockout, group). Occupancy `emptyWhen` on
|
|
184
|
+
* this struct, when present, also skips the channel.
|
|
185
|
+
*/
|
|
186
|
+
extras?: string;
|
|
158
187
|
}
|
|
159
188
|
/**
|
|
160
189
|
* Complete memory-map definition for a radio model's settings and channels.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-map.d.ts","sourceRoot":"","sources":["../../src/radio/memory-map.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qDAAqD;AACrD,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAElE,sEAAsE;AACtE,MAAM,MAAM,iBAAiB,GAAG,kBAAkB,GAAG,iBAAiB,EAAE,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAAA;CAAE,CAAC;AAEhH,8CAA8C;AAC9C,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvF;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAC/B;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,CAAA;CAAE,CAAC;AAEvD,2DAA2D;AAC3D,MAAM,MAAM,uBAAuB,GAC/B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,GAClC;
|
|
1
|
+
{"version":3,"file":"memory-map.d.ts","sourceRoot":"","sources":["../../src/radio/memory-map.ts"],"names":[],"mappings":"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"}
|
package/dist/radio/protocol.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import type { RadioMemorySegment } from "./memory-segment.js";
|
|
|
5
5
|
* - number 0–255: literal byte
|
|
6
6
|
* - hex string such as `"0x50"`: literal byte
|
|
7
7
|
* - single-character string such as `"S"`: ASCII opcode
|
|
8
|
-
* - placeholder: `"$address"`, `"$chunkSize"`, `"$length"`, `"$data"`
|
|
8
|
+
* - placeholder: `"$address"`, `"$block"`, `"$chunkSize"`, `"$length"`, `"$data"`
|
|
9
9
|
*/
|
|
10
10
|
export type RadioByteToken = number | string;
|
|
11
11
|
/**
|
|
@@ -23,20 +23,20 @@ export interface RadioExpectBytes {
|
|
|
23
23
|
*/
|
|
24
24
|
export type RadioExpect = RadioByteToken | RadioByteToken[] | RadioExpectBytes;
|
|
25
25
|
/**
|
|
26
|
-
* One serial exchange: send bytes and/or wait for a reply.
|
|
27
|
-
* At least one of `send` or `
|
|
26
|
+
* One serial exchange: send bytes and/or wait for a reply, and/or change baud.
|
|
27
|
+
* At least one of `send`, `expect`, or `setBaudRate` must be present.
|
|
28
28
|
*/
|
|
29
|
-
export
|
|
30
|
-
description?: string;
|
|
31
|
-
send: RadioByteToken[];
|
|
32
|
-
expect?: RadioExpect;
|
|
33
|
-
timeout?: number;
|
|
34
|
-
} | {
|
|
29
|
+
export interface RadioExchange {
|
|
35
30
|
description?: string;
|
|
36
31
|
send?: RadioByteToken[];
|
|
37
|
-
expect
|
|
32
|
+
expect?: RadioExpect;
|
|
38
33
|
timeout?: number;
|
|
39
|
-
|
|
34
|
+
/**
|
|
35
|
+
* Switch the serial baud rate before send/expect. TH-D74 clone mode
|
|
36
|
+
* enters programming at 9600 then transfers at 57600.
|
|
37
|
+
*/
|
|
38
|
+
setBaudRate?: number;
|
|
39
|
+
}
|
|
40
40
|
/**
|
|
41
41
|
* Chunked memory read: repeat an exchange across named segments.
|
|
42
42
|
* `$data` in `expect` is captured into the memory buffer.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/radio/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC;AAE7C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,cAAc,EAAE,GAAG,gBAAgB,CAAC;AAE/E;;;GAGG;AACH,MAAM,
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/radio/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC;AAE7C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,cAAc,EAAE,GAAG,gBAAgB,CAAC;AAE/E;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,cAAc,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,IAAI,EAAE,cAAc,EAAE,CAAC;QACvB,MAAM,EAAE,WAAW,CAAC;QACpB,GAAG,CAAC,EAAE,aAAa,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,IAAI,EAAE,cAAc,EAAE,CAAC;QACvB,MAAM,EAAE,WAAW,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,kBAAkB,EAAE,CAAC;KAC7B,CAAC;CACH;AAED,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,aAAa,GAAG,cAAc,CAAC"}
|
|
@@ -3,5 +3,9 @@ export interface RadioSerialConfig {
|
|
|
3
3
|
dataBits?: 8 | 5 | 6 | 7;
|
|
4
4
|
stopBits?: 1 | 1.5 | 2;
|
|
5
5
|
parity?: "none" | "even" | "odd";
|
|
6
|
+
/**
|
|
7
|
+
* Hardware RTS/CTS flow control. Kenwood TH-D74 clone mode needs this on macOS.
|
|
8
|
+
*/
|
|
9
|
+
rtscts?: boolean;
|
|
6
10
|
}
|
|
7
11
|
//# sourceMappingURL=serial-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serial-config.d.ts","sourceRoot":"","sources":["../../src/radio/serial-config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"serial-config.d.ts","sourceRoot":"","sources":["../../src/radio/serial-config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;IACjC;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB"}
|
package/package.json
CHANGED
package/src/radio/memory-map.ts
CHANGED
|
@@ -27,7 +27,12 @@ export type RadioMemoryMapValueKind =
|
|
|
27
27
|
| { kind: "integer"; min?: number; max?: number }
|
|
28
28
|
| { kind: "boolean" }
|
|
29
29
|
| { kind: "enum"; values: string[] }
|
|
30
|
-
| {
|
|
30
|
+
| {
|
|
31
|
+
kind: "ascii";
|
|
32
|
+
length: number;
|
|
33
|
+
/** Fill byte for unused character slots (default 0xFF). Kenwood names use 0. */
|
|
34
|
+
pad?: number;
|
|
35
|
+
}
|
|
31
36
|
| {
|
|
32
37
|
kind: "digits";
|
|
33
38
|
/** Number of decimal digit bytes. */
|
|
@@ -74,6 +79,22 @@ export type RadioMemoryMapValueKind =
|
|
|
74
79
|
ctcssMin?: number;
|
|
75
80
|
/** Added to DCS index for reverse polarity (Chirp uses 0x69). */
|
|
76
81
|
reverseOffset?: number;
|
|
82
|
+
}
|
|
83
|
+
| {
|
|
84
|
+
/**
|
|
85
|
+
* CTCSS tone stored as an index into `values` (Hz * 10, Springfield tenths).
|
|
86
|
+
* Kenwood TH-D74 `rtone` / `ctone` use Chirp TONES order.
|
|
87
|
+
*/
|
|
88
|
+
kind: "ctcss-index";
|
|
89
|
+
values: number[];
|
|
90
|
+
}
|
|
91
|
+
| {
|
|
92
|
+
/**
|
|
93
|
+
* DCS code stored as an index into `values`.
|
|
94
|
+
* Kenwood TH-D74 `dtcs_code` uses Chirp DTCS_CODES order.
|
|
95
|
+
*/
|
|
96
|
+
kind: "dcs-index";
|
|
97
|
+
values: number[];
|
|
77
98
|
};
|
|
78
99
|
|
|
79
100
|
/** UI metadata for a non-reserved field. */
|
|
@@ -94,11 +115,11 @@ export interface RadioMemoryMapField {
|
|
|
94
115
|
id: string;
|
|
95
116
|
/**
|
|
96
117
|
* Storage type:
|
|
97
|
-
* - u8 / u16: whole bytes (u16
|
|
118
|
+
* - u8 / u16 / u32: whole bytes (u16/u32 are little-endian, Chirp ul16/ul32)
|
|
98
119
|
* - bits: bitfield of `width` bits within the current byte (MSB-first)
|
|
99
120
|
* - char: ASCII byte (length via value.kind ascii or count)
|
|
100
121
|
*/
|
|
101
|
-
type: "u8" | "u16" | "bits" | "char";
|
|
122
|
+
type: "u8" | "u16" | "u32" | "bits" | "char";
|
|
102
123
|
/** Bit width when type is bits. */
|
|
103
124
|
width?: number;
|
|
104
125
|
/** When true, skip decode/encode for this padding field. */
|
|
@@ -130,6 +151,13 @@ export interface RadioMemoryMapStruct {
|
|
|
130
151
|
*/
|
|
131
152
|
count?: number;
|
|
132
153
|
stride?: number;
|
|
154
|
+
/**
|
|
155
|
+
* When set with `groupPad`, instances are packed into groups of `groupSize`
|
|
156
|
+
* records followed by `groupPad` padding bytes (Kenwood TH-D74: 6 × 40 + 16).
|
|
157
|
+
*/
|
|
158
|
+
groupSize?: number;
|
|
159
|
+
/** Padding bytes after each group of `groupSize` records. */
|
|
160
|
+
groupPad?: number;
|
|
133
161
|
/** Occupancy rule for repeated structs (e.g. empty channel slots). */
|
|
134
162
|
emptyWhen?: RadioMemoryMapEmptyWhen;
|
|
135
163
|
/**
|
|
@@ -154,6 +182,12 @@ export interface RadioMemoryMapChannelBindings {
|
|
|
154
182
|
transmitFrequency: string;
|
|
155
183
|
receiveTone: string;
|
|
156
184
|
transmitTone: string;
|
|
185
|
+
/**
|
|
186
|
+
* Optional parallel struct whose fields merge into each channel's settings
|
|
187
|
+
* (Kenwood TH-D74 flags: used, lockout, group). Occupancy `emptyWhen` on
|
|
188
|
+
* this struct, when present, also skips the channel.
|
|
189
|
+
*/
|
|
190
|
+
extras?: string;
|
|
157
191
|
}
|
|
158
192
|
|
|
159
193
|
/**
|
package/src/radio/protocol.ts
CHANGED
|
@@ -6,7 +6,7 @@ import type { RadioMemorySegment } from "./memory-segment.js";
|
|
|
6
6
|
* - number 0–255: literal byte
|
|
7
7
|
* - hex string such as `"0x50"`: literal byte
|
|
8
8
|
* - single-character string such as `"S"`: ASCII opcode
|
|
9
|
-
* - placeholder: `"$address"`, `"$chunkSize"`, `"$length"`, `"$data"`
|
|
9
|
+
* - placeholder: `"$address"`, `"$block"`, `"$chunkSize"`, `"$length"`, `"$data"`
|
|
10
10
|
*/
|
|
11
11
|
export type RadioByteToken = number | string;
|
|
12
12
|
|
|
@@ -27,22 +27,20 @@ export interface RadioExpectBytes {
|
|
|
27
27
|
export type RadioExpect = RadioByteToken | RadioByteToken[] | RadioExpectBytes;
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
|
-
* One serial exchange: send bytes and/or wait for a reply.
|
|
31
|
-
* At least one of `send` or `
|
|
30
|
+
* One serial exchange: send bytes and/or wait for a reply, and/or change baud.
|
|
31
|
+
* At least one of `send`, `expect`, or `setBaudRate` must be present.
|
|
32
32
|
*/
|
|
33
|
-
export
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
timeout?: number;
|
|
45
|
-
};
|
|
33
|
+
export interface RadioExchange {
|
|
34
|
+
description?: string;
|
|
35
|
+
send?: RadioByteToken[];
|
|
36
|
+
expect?: RadioExpect;
|
|
37
|
+
timeout?: number;
|
|
38
|
+
/**
|
|
39
|
+
* Switch the serial baud rate before send/expect. TH-D74 clone mode
|
|
40
|
+
* enters programming at 9600 then transfers at 57600.
|
|
41
|
+
*/
|
|
42
|
+
setBaudRate?: number;
|
|
43
|
+
}
|
|
46
44
|
|
|
47
45
|
/**
|
|
48
46
|
* Chunked memory read: repeat an exchange across named segments.
|