@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.
@@ -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 is little-endian, Chirp ul16)
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":"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"}
1
+ {"version":3,"file":"memory-map.d.ts","sourceRoot":"","sources":["../../src/radio/memory-map.ts"],"names":[],"mappings":"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"}
@@ -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 `expect` must be present.
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 type RadioExchange = {
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: RadioExpect;
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,MAAM,aAAa,GACrB;IACE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACD;IACE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,cAAc,EAAE,CAAC;IACxB,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEN;;;;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"}
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;CAClC"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@springfield/ham-radio-api",
3
- "version": "17.3.0",
3
+ "version": "17.4.0",
4
4
  "author": "Bryan Hunt",
5
5
  "files": [
6
6
  "dist/",
@@ -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
- | { kind: "ascii"; length: number }
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 is little-endian, Chirp ul16)
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
  /**
@@ -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 `expect` must be present.
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 type RadioExchange =
34
- | {
35
- description?: string;
36
- send: RadioByteToken[];
37
- expect?: RadioExpect;
38
- timeout?: number;
39
- }
40
- | {
41
- description?: string;
42
- send?: RadioByteToken[];
43
- expect: RadioExpect;
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.
@@ -3,4 +3,8 @@ 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
  }