@springfield/ham-radio-utils 4.16.0 → 4.17.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/README.md CHANGED
@@ -2,7 +2,21 @@
2
2
 
3
3
  Shared utilities for HamBench: memory-map codec, band plan, Callook license-class mapping, schema validation, and test helpers.
4
4
 
5
- Docs: [HamBench developer docs](https://springfield-ham-radio.github.io/ham-radio-docs/developer/) · [License lookup](https://springfield-ham-radio.github.io/ham-radio-docs/developer/license-lookup.html)
5
+ Docs: [HamBench developer docs](https://springfield-ham-radio.github.io/ham-radio-docs/developer/) · [License lookup](https://springfield-ham-radio.github.io/ham-radio-docs/developer/license-lookup.html) · [Build a beta driver](https://springfield-ham-radio.github.io/ham-radio-docs/developer/beta-driver.html)
6
+
7
+ ## Beta driver zips
8
+
9
+ `ham-radio-pack-beta` builds one local beta zip from a radio module working tree ([ADR 0010](https://github.com/springfield-ham-radio/ham-radio-docs/blob/main/docs/developer/adr/0010-local-beta-driver-zips.md)). It does not publish a release or write a catalog entry.
10
+
11
+ From a manufacturer module repo, after this package is installed:
12
+
13
+ ```bash
14
+ yarn pack:beta <modelId> [n]
15
+ ```
16
+
17
+ `modelId` matches `configs/<modelId>.json`. `n` defaults to `1` (positive integer, no leading zero). The working-tree `version` and `minApiVersion` stay strict `major.minor.patch`. The zip is `dist-release/radio-module-<modelId>-<version>-beta.<n>.zip`, and the config inside the zip uses `<version>-beta.<n>`.
18
+
19
+ Stdout is the zip path, size in bytes, a `sha256:` digest, and `git rev-parse --short HEAD` when the module tree is a git checkout. A beta of the same `major.minor.patch` as the catalog is older than that catalog release (`compareToCatalogVersion`).
6
20
 
7
21
  ## License
8
22
 
package/dist/index.d.ts CHANGED
@@ -14,6 +14,8 @@ export * from './utils/schema-validator.js';
14
14
  export * from './utils/to-hex-words.js';
15
15
  export * from './utils/ui-logger.js';
16
16
  export * from './utils/ui-logger-factory.js';
17
+ export { BETA_COUNTER_PATTERN, BETA_VERSION_PATTERN, MAX_BETA_ZIP_BYTES, STRICT_SEMVER_PATTERN, assertStrictSemver, closurePathsForConfig, compareDriverVersions, compareToCatalogVersion, expectedBetaZipName, formatBetaPackOutput, listConfigDescriptors, packBetaZip, packedBetaVersion, parseBetaCounter, parseConfigDescriptor, runPackBetaCli, shortGitSha, stageClosureWithBetaVersion, validateBetaDescriptor, } from './pack/pack-beta.js';
18
+ export type { PackBetaCliIo, PackBetaOptions, PackBetaResult, RadioModuleConfigDescriptor } from './pack/pack-beta.js';
17
19
  export { default as radioProtocolSchema } from './schemas/radio-protocol-schema.json';
18
20
  export { default as radioMemoryMapSchema } from './schemas/radio-memory-map-schema.json';
19
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oCAAoC,CAAC;AAEnD,cAAc,uCAAuC,CAAC;AACtD,cAAc,kDAAkD,CAAC;AAEjE,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAG7C,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,sCAAsC,CAAuB;AAC5G,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wCAAwC,CAAuB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oCAAoC,CAAC;AAEnD,cAAc,uCAAuC,CAAC;AACtD,cAAc,kDAAkD,CAAC;AAEjE,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAE7C,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,WAAW,EACX,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAGvH,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,sCAAsC,CAAuB;AAC5G,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wCAAwC,CAAuB"}
package/dist/index.js CHANGED
@@ -14,6 +14,7 @@ export * from './utils/schema-validator.js';
14
14
  export * from './utils/to-hex-words.js';
15
15
  export * from './utils/ui-logger.js';
16
16
  export * from './utils/ui-logger-factory.js';
17
+ export { BETA_COUNTER_PATTERN, BETA_VERSION_PATTERN, MAX_BETA_ZIP_BYTES, STRICT_SEMVER_PATTERN, assertStrictSemver, closurePathsForConfig, compareDriverVersions, compareToCatalogVersion, expectedBetaZipName, formatBetaPackOutput, listConfigDescriptors, packBetaZip, packedBetaVersion, parseBetaCounter, parseConfigDescriptor, runPackBetaCli, shortGitSha, stageClosureWithBetaVersion, validateBetaDescriptor, } from './pack/pack-beta.js';
17
18
  // Export the radio protocol schema
18
19
  export { default as radioProtocolSchema } from './schemas/radio-protocol-schema.json' with { type: 'json' };
19
20
  export { default as radioMemoryMapSchema } from './schemas/radio-memory-map-schema.json' with { type: 'json' };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oCAAoC,CAAC;AAEnD,cAAc,uCAAuC,CAAC;AACtD,cAAc,kDAAkD,CAAC;AAEjE,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAE7C,mCAAmC;AACnC,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,sCAAsC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC5G,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wCAAwC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["export * from './memory/segmented-memory.js';\nexport * from './memory/memory-map-codec.js';\nexport * from './memory/memory-map-channels.js';\nexport * from './memory/memory-map-ui.js';\nexport * from './memory/memory-map-radio-codec.js';\n\nexport * from './test-utils/radio-channel-factory.js';\nexport * from './test-utils/radio-programmed-channel-factory.js';\n\nexport * from './utils/band-plan.js';\nexport * from './utils/frequency-display.js';\nexport * from './utils/memory-channel-utils.js';\nexport * from './utils/memory-data-utils.js';\nexport * from './utils/operator-class-mapper.js';\nexport * from './utils/schema-validator.js';\nexport * from './utils/to-hex-words.js';\nexport * from './utils/ui-logger.js';\nexport * from './utils/ui-logger-factory.js';\n\n// Export the radio protocol schema\nexport { default as radioProtocolSchema } from './schemas/radio-protocol-schema.json' with { type: 'json' };\nexport { default as radioMemoryMapSchema } from './schemas/radio-memory-map-schema.json' with { type: 'json' };\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oCAAoC,CAAC;AAEnD,cAAc,uCAAuC,CAAC;AACtD,cAAc,kDAAkD,CAAC;AAEjE,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAE7C,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,WAAW,EACX,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAG7B,mCAAmC;AACnC,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,sCAAsC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC5G,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wCAAwC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["export * from './memory/segmented-memory.js';\nexport * from './memory/memory-map-codec.js';\nexport * from './memory/memory-map-channels.js';\nexport * from './memory/memory-map-ui.js';\nexport * from './memory/memory-map-radio-codec.js';\n\nexport * from './test-utils/radio-channel-factory.js';\nexport * from './test-utils/radio-programmed-channel-factory.js';\n\nexport * from './utils/band-plan.js';\nexport * from './utils/frequency-display.js';\nexport * from './utils/memory-channel-utils.js';\nexport * from './utils/memory-data-utils.js';\nexport * from './utils/operator-class-mapper.js';\nexport * from './utils/schema-validator.js';\nexport * from './utils/to-hex-words.js';\nexport * from './utils/ui-logger.js';\nexport * from './utils/ui-logger-factory.js';\n\nexport {\n BETA_COUNTER_PATTERN,\n BETA_VERSION_PATTERN,\n MAX_BETA_ZIP_BYTES,\n STRICT_SEMVER_PATTERN,\n assertStrictSemver,\n closurePathsForConfig,\n compareDriverVersions,\n compareToCatalogVersion,\n expectedBetaZipName,\n formatBetaPackOutput,\n listConfigDescriptors,\n packBetaZip,\n packedBetaVersion,\n parseBetaCounter,\n parseConfigDescriptor,\n runPackBetaCli,\n shortGitSha,\n stageClosureWithBetaVersion,\n validateBetaDescriptor,\n} from './pack/pack-beta.js';\nexport type { PackBetaCliIo, PackBetaOptions, PackBetaResult, RadioModuleConfigDescriptor } from './pack/pack-beta.js';\n\n// Export the radio protocol schema\nexport { default as radioProtocolSchema } from './schemas/radio-protocol-schema.json' with { type: 'json' };\nexport { default as radioMemoryMapSchema } from './schemas/radio-memory-map-schema.json' with { type: 'json' };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"memory-map-codec.d.ts","sourceRoot":"","sources":["../../src/memory/memory-map-codec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EAEd,oBAAoB,EAEpB,aAAa,EAEd,MAAM,4BAA4B,CAAC;AAIpC;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAY9D;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,iBAAiB,EAC/B,YAAY,EAAE,MAAM,GACnB,MAAM,CAmBR;AAgDD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAcjG;AA8gBD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,cAAc,EACzB,QAAQ,EAAE,UAAU,EACpB,YAAY,EAAE,iBAAiB,GAC9B,aAAa,CAwBf;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,cAAc,EACzB,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,UAAU,EACpB,YAAY,EAAE,iBAAiB,GAC9B,UAAU,CA+BZ"}
1
+ {"version":3,"file":"memory-map-codec.d.ts","sourceRoot":"","sources":["../../src/memory/memory-map-codec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EAEd,oBAAoB,EAEpB,aAAa,EAEd,MAAM,4BAA4B,CAAC;AAIpC;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAY9D;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,iBAAiB,EAC/B,YAAY,EAAE,MAAM,GACnB,MAAM,CAmBR;AAgDD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAcjG;AA4jBD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,cAAc,EACzB,QAAQ,EAAE,UAAU,EACpB,YAAY,EAAE,iBAAiB,GAC9B,aAAa,CAwBf;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,cAAc,EACzB,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,UAAU,EACpB,YAAY,EAAE,iBAAiB,GAC9B,UAAU,CA+BZ"}
@@ -83,6 +83,39 @@ export function structInstanceAddress(struct, instanceIndex) {
83
83
  const indexInGroup = instanceIndex % groupSize;
84
84
  return seek + groupIndex * (stride * groupSize + groupPad) + indexInGroup * stride;
85
85
  }
86
+ /**
87
+ * ASCII fields stop at NUL or 0xFF, then drop trailing spaces. The bytes after
88
+ * the visible text are not part of the setting value.
89
+ */
90
+ function decodeAscii(bytes) {
91
+ let text = '';
92
+ for (const byte of bytes) {
93
+ if (byte === 0xff || byte === 0x00) {
94
+ break;
95
+ }
96
+ text += String.fromCodePoint(byte);
97
+ }
98
+ return text.trimEnd();
99
+ }
100
+ /**
101
+ * Clone images mix space, NUL, and 0xFF padding in one ASCII field. Re-encoding
102
+ * an unchanged value with the single declared pad rewrites those bytes (a
103
+ * TH-D74 power-on message ending in spaces came back NUL-padded; a D-STAR memo
104
+ * ending in NUL came back space-padded). When the text still matches what
105
+ * decode would return, keep the stored bytes. Edited text uses `kind.pad`.
106
+ */
107
+ function encodeAscii(kind, value, byteLength, originalBytes) {
108
+ const text = typeof value === 'string' ? value : '';
109
+ if (originalBytes && originalBytes.length === byteLength && decodeAscii(originalBytes) === text) {
110
+ return [...originalBytes];
111
+ }
112
+ const pad = kind.pad ?? 0xff;
113
+ const bytes = [];
114
+ for (let index = 0; index < byteLength; index += 1) {
115
+ bytes[index] = index < text.length ? (text.codePointAt(index) ?? pad) : pad;
116
+ }
117
+ return bytes;
118
+ }
86
119
  function decodeRawValue(kind, raw) {
87
120
  if (!kind) {
88
121
  return typeof raw === 'number' ? raw : raw;
@@ -98,14 +131,7 @@ function decodeRawValue(kind, raw) {
98
131
  }
99
132
  case 'ascii': {
100
133
  const bytes = typeof raw === 'number' ? [raw] : raw;
101
- let text = '';
102
- for (const byte of bytes) {
103
- if (byte === 0xff || byte === 0x00) {
104
- break;
105
- }
106
- text += String.fromCodePoint(byte);
107
- }
108
- return text.trimEnd();
134
+ return decodeAscii(bytes);
109
135
  }
110
136
  case 'digits': {
111
137
  const bytes = typeof raw === 'number' ? [raw] : raw;
@@ -186,7 +212,7 @@ function decodeRawValue(kind, raw) {
186
212
  }
187
213
  }
188
214
  }
189
- function encodeRawValue(kind, value, byteLength) {
215
+ function encodeRawValue(kind, value, byteLength, originalBytes) {
190
216
  const bytes = Array.from({ length: byteLength }, () => 0xff);
191
217
  if (!kind) {
192
218
  if (typeof value === 'number') {
@@ -207,14 +233,8 @@ function encodeRawValue(kind, value, byteLength) {
207
233
  bytes[0] = index >= 0 ? index : 0;
208
234
  return bytes;
209
235
  }
210
- case 'ascii': {
211
- const text = typeof value === 'string' ? value : '';
212
- const pad = kind.pad ?? 0xff;
213
- for (let index = 0; index < byteLength; index += 1) {
214
- bytes[index] = index < text.length ? (text.codePointAt(index) ?? pad) : pad;
215
- }
216
- return bytes;
217
- }
236
+ case 'ascii':
237
+ return encodeAscii(kind, value, byteLength, originalBytes);
218
238
  case 'digits': {
219
239
  const scale = kind.scale ?? 1;
220
240
  let numeric = typeof value === 'number' ? Math.round(value / scale) : 0;
@@ -466,14 +486,20 @@ function encodeStruct(struct, values, contents, memoryConfig, instanceIndex) {
466
486
  continue;
467
487
  }
468
488
  const settingValue = values[field.id];
489
+ const originalBytes = field.value?.kind === 'ascii' ? [] : undefined;
490
+ if (originalBytes) {
491
+ for (let index = 0; index < length; index += 1) {
492
+ originalBytes.push(readByte(contents, bufferOffsetFor(radioAddress + index, memoryConfig, contents)));
493
+ }
494
+ }
469
495
  if (field.type === 'u16' || field.type === 'u32') {
470
- const encoded = encodeRawValue(field.value ?? { kind: 'integer' }, settingValue ?? 0, length);
496
+ const encoded = encodeRawValue(field.value ?? { kind: 'integer' }, settingValue ?? 0, length, originalBytes);
471
497
  for (let index = 0; index < length; index += 1) {
472
498
  writeByte(contents, bufferOffsetFor(radioAddress + index, memoryConfig, contents), encoded[index] ?? 0);
473
499
  }
474
500
  }
475
501
  else {
476
- const encoded = encodeRawValue(field.value, settingValue ?? (field.value?.kind === 'ascii' ? '' : 0), length);
502
+ const encoded = encodeRawValue(field.value, settingValue ?? (field.value?.kind === 'ascii' ? '' : 0), length, originalBytes);
477
503
  for (let index = 0; index < length; index += 1) {
478
504
  writeByte(contents, bufferOffsetFor(radioAddress + index, memoryConfig, contents), encoded[index]);
479
505
  }
@@ -1 +1 @@
1
- {"version":3,"file":"memory-map-codec.js","sourceRoot":"","sources":["../../src/memory/memory-map-codec.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n RadioMemoryConfig,\n RadioMemoryMap,\n RadioMemoryMapField,\n RadioMemoryMapStruct,\n RadioMemoryMapValueKind,\n RadioSettings,\n RadioSettingValue,\n} from '@springfield/ham-radio-api';\n\nconst DEFAULT_DTMF_CHARSET = '0123456789 *#ABCD';\n\n/**\n * Parse a seek address from a number or hex/decimal string.\n */\nexport function parseSeekAddress(seek: number | string): number {\n if (typeof seek === 'number') {\n return seek;\n }\n\n const trimmed = seek.trim();\n\n if (/^0x/i.test(trimmed)) {\n return Number.parseInt(trimmed, 16);\n }\n\n return Number.parseInt(trimmed, 10);\n}\n\n/**\n * Map a radio EEPROM address to an offset in the memory buffer.\n *\n * Packed buffers (driver read) concatenate segments in config order.\n * Sparse buffers that cover the highest segment end address use absolute offsets.\n */\nexport function radioAddressToBufferOffset(\n radioAddress: number,\n memoryConfig: RadioMemoryConfig,\n bufferLength: number,\n): number {\n const segments = Object.values(memoryConfig.segments);\n const maxEndAddress = Math.max(...segments.map((segment) => segment.endAddress));\n\n if (bufferLength >= maxEndAddress + 1) {\n return radioAddress;\n }\n\n let offset = 0;\n\n for (const segment of segments) {\n if (radioAddress >= segment.startAddress && radioAddress <= segment.endAddress) {\n return offset + (radioAddress - segment.startAddress);\n }\n\n offset += segment.endAddress - segment.startAddress + 1;\n }\n\n throw new Error(`Radio address 0x${radioAddress.toString(16)} is not in any memory segment`);\n}\n\nfunction bufferOffsetFor(radioAddress: number, memoryConfig: RadioMemoryConfig, contents: Uint8Array): number {\n return radioAddressToBufferOffset(radioAddress, memoryConfig, contents.length);\n}\n\nfunction readByte(contents: Uint8Array, offset: number): number {\n if (offset < 0 || offset >= contents.length) {\n throw new RangeError(`Memory-map read out of bounds at offset ${offset}`);\n }\n\n return contents[offset];\n}\n\nfunction writeByte(contents: Uint8Array, offset: number, value: number): void {\n if (offset < 0 || offset >= contents.length) {\n throw new RangeError(`Memory-map write out of bounds at offset ${offset}`);\n }\n\n contents[offset] = value & 0xff;\n}\n\nfunction decodeInteger(raw: number | number[]): number {\n if (typeof raw === 'number') {\n return raw;\n }\n\n let value = 0;\n\n for (let index = 0; index < raw.length; index += 1) {\n value += raw[index] * 256 ** index;\n }\n\n return value;\n}\n\nfunction encodeInteger(value: RadioSettingValue, byteLength: number): number[] {\n let numeric = typeof value === 'number' ? value : 0;\n const bytes: number[] = [];\n\n for (let index = 0; index < byteLength; index += 1) {\n bytes.push(numeric & 0xff);\n numeric = Math.floor(numeric / 256);\n }\n\n return bytes;\n}\n\n/**\n * Radio address of repeated-struct instance `index`, including Kenwood-style\n * grouped stride (N records + pad bytes per clone block).\n */\nexport function structInstanceAddress(struct: RadioMemoryMapStruct, instanceIndex: number): number {\n const seek = parseSeekAddress(struct.seek);\n const stride = struct.stride ?? 0;\n const groupSize = struct.groupSize;\n\n if (!groupSize) {\n return seek + instanceIndex * stride;\n }\n\n const groupPad = struct.groupPad ?? 0;\n const groupIndex = Math.floor(instanceIndex / groupSize);\n const indexInGroup = instanceIndex % groupSize;\n\n return seek + groupIndex * (stride * groupSize + groupPad) + indexInGroup * stride;\n}\n\nfunction decodeRawValue(kind: RadioMemoryMapValueKind | undefined, raw: number | number[]): RadioSettingValue {\n if (!kind) {\n return typeof raw === 'number' ? raw : raw;\n }\n\n switch (kind.kind) {\n case 'integer':\n return decodeInteger(raw);\n case 'boolean':\n return (typeof raw === 'number' ? raw : raw[0]) !== 0;\n case 'enum': {\n const index = typeof raw === 'number' ? raw : raw[0];\n return kind.values[index] ?? kind.values[0] ?? '';\n }\n case 'ascii': {\n const bytes = typeof raw === 'number' ? [raw] : raw;\n let text = '';\n\n for (const byte of bytes) {\n if (byte === 0xff || byte === 0x00) {\n break;\n }\n\n text += String.fromCodePoint(byte);\n }\n\n return text.trimEnd();\n }\n case 'digits': {\n const bytes = typeof raw === 'number' ? [raw] : raw;\n let value = 0;\n\n for (const digit of bytes) {\n value = value * 10 + (digit & 0x0f);\n }\n\n return value * (kind.scale ?? 1);\n }\n case 'dtmf': {\n const bytes = typeof raw === 'number' ? [raw] : raw;\n const charset = kind.charset ?? DEFAULT_DTMF_CHARSET;\n let text = '';\n\n for (const byte of bytes) {\n if (byte >= 0x1f) {\n break;\n }\n\n if (byte < charset.length) {\n text += charset[byte];\n }\n }\n\n return text;\n }\n case 'bbcd': {\n const bytes = typeof raw === 'number' ? [raw] : raw;\n let value = 0;\n\n for (const byte of bytes) {\n value = value * 100 + ((byte >> 4) & 0x0f) * 10 + (byte & 0x0f);\n }\n\n return value;\n }\n case 'lbcd': {\n const bytes = typeof raw === 'number' ? [raw] : raw;\n let word = 0;\n\n for (let index = 0; index < bytes.length; index += 1) {\n word |= bytes[index] << (8 * index);\n }\n\n if (word === 0xff_ff_ff_ff || bytes.every((byte) => byte === 0xff)) {\n return null;\n }\n\n return Number.parseInt(word.toString(16), 10) * (kind.scale ?? 10);\n }\n case 'tone': {\n const rawValue = typeof raw === 'number' ? raw : raw[0] | (raw[1] << 8);\n const ctcssMin = kind.ctcssMin ?? 0x0258;\n const reverseOffset = kind.reverseOffset ?? 0x69;\n\n if (rawValue === 0 || rawValue === 0xffff) {\n return { mode: 'none' };\n }\n\n if (rawValue >= ctcssMin) {\n return { mode: 'ctcss', value: rawValue };\n }\n\n let index = rawValue;\n let polarity: 'N' | 'R' = 'N';\n\n if (rawValue > reverseOffset) {\n index = rawValue - reverseOffset;\n polarity = 'R';\n } else {\n index = rawValue - 1;\n }\n\n const code = kind.values[index] ?? 0;\n return { mode: 'dcs', code, polarity };\n }\n case 'ctcss-index': {\n const index = decodeInteger(raw);\n const tenths = kind.values[index] ?? kind.values[0] ?? 0;\n return { mode: 'ctcss', value: tenths };\n }\n case 'dcs-index': {\n const index = decodeInteger(raw);\n const code = kind.values[index] ?? 0;\n return { mode: 'dcs', code, polarity: 'N' };\n }\n default: {\n const exhaustive: never = kind;\n return exhaustive;\n }\n }\n}\n\nfunction encodeRawValue(kind: RadioMemoryMapValueKind | undefined, value: RadioSettingValue, byteLength: number): number[] {\n const bytes = Array.from({ length: byteLength }, () => 0xff);\n\n if (!kind) {\n if (typeof value === 'number') {\n bytes[0] = value & 0xff;\n }\n\n return bytes;\n }\n\n switch (kind.kind) {\n case 'integer': {\n return encodeInteger(value, byteLength);\n }\n case 'boolean': {\n bytes[0] = value ? 1 : 0;\n return bytes;\n }\n case 'enum': {\n const index = typeof value === 'string' ? kind.values.indexOf(value) : -1;\n bytes[0] = index >= 0 ? index : 0;\n return bytes;\n }\n case 'ascii': {\n const text = typeof value === 'string' ? value : '';\n const pad = kind.pad ?? 0xff;\n\n for (let index = 0; index < byteLength; index += 1) {\n bytes[index] = index < text.length ? (text.codePointAt(index) ?? pad) : pad;\n }\n\n return bytes;\n }\n case 'digits': {\n const scale = kind.scale ?? 1;\n let numeric = typeof value === 'number' ? Math.round(value / scale) : 0;\n\n for (let index = byteLength - 1; index >= 0; index -= 1) {\n bytes[index] = numeric % 10;\n numeric = Math.floor(numeric / 10);\n }\n\n return bytes;\n }\n case 'dtmf': {\n const text = typeof value === 'string' ? value : '';\n const charset = kind.charset ?? DEFAULT_DTMF_CHARSET;\n\n for (let index = 0; index < byteLength; index += 1) {\n if (index < text.length) {\n const charIndex = charset.indexOf(text[index]);\n bytes[index] = charIndex >= 0 ? charIndex : 0xff;\n } else {\n bytes[index] = 0xff;\n }\n }\n\n return bytes;\n }\n case 'bbcd': {\n let numeric = typeof value === 'number' ? value : 0;\n const digits: number[] = [];\n\n for (let index = 0; index < byteLength * 2; index += 1) {\n digits.unshift(numeric % 10);\n numeric = Math.floor(numeric / 10);\n }\n\n for (let index = 0; index < byteLength; index += 1) {\n bytes[index] = ((digits[index * 2] & 0x0f) << 4) | (digits[index * 2 + 1] & 0x0f);\n }\n\n return bytes;\n }\n case 'lbcd': {\n if (value === null || value === undefined) {\n return Array.from({ length: byteLength }, () => 0xff);\n }\n\n const scale = kind.scale ?? 10;\n const hz = typeof value === 'number' ? value : 0;\n let word = Number.parseInt(Math.round(hz / scale).toString(10), 16);\n\n for (let index = 0; index < byteLength; index += 1) {\n bytes[index] = word & 0xff;\n word >>= 8;\n }\n\n return bytes;\n }\n case 'tone': {\n const ctcssMin = kind.ctcssMin ?? 0x0258;\n const reverseOffset = kind.reverseOffset ?? 0x69;\n let rawValue = 0;\n\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const tone = value as { mode?: string; value?: number; code?: number; polarity?: string };\n\n if (tone.mode === 'ctcss' && typeof tone.value === 'number') {\n rawValue = tone.value;\n } else if (tone.mode === 'dcs' && typeof tone.code === 'number') {\n const index = kind.values.indexOf(tone.code);\n rawValue = index >= 0 ? index + 1 : 0;\n\n if (tone.polarity === 'R') {\n rawValue += reverseOffset;\n }\n }\n }\n\n if (rawValue >= ctcssMin || rawValue === 0) {\n // CTCSS or none: write LE u16\n }\n\n bytes[0] = rawValue & 0xff;\n bytes[1] = (rawValue >> 8) & 0xff;\n return bytes;\n }\n case 'ctcss-index': {\n const tone = value && typeof value === 'object' && !Array.isArray(value) ? (value as { mode?: string; value?: number }) : undefined;\n const tenths = tone?.mode === 'ctcss' && typeof tone.value === 'number' ? tone.value : 0;\n const index = kind.values.indexOf(tenths);\n return encodeInteger(index >= 0 ? index : 0, byteLength);\n }\n case 'dcs-index': {\n const tone = value && typeof value === 'object' && !Array.isArray(value) ? (value as { mode?: string; code?: number }) : undefined;\n const code = tone?.mode === 'dcs' && typeof tone.code === 'number' ? tone.code : 0;\n const index = kind.values.indexOf(code);\n return encodeInteger(index >= 0 ? index : 0, byteLength);\n }\n default: {\n const exhaustive: never = kind;\n return exhaustive;\n }\n }\n}\n\nfunction fieldByteLength(field: RadioMemoryMapField): number {\n if (field.type === 'u32') {\n return 4;\n }\n\n if (field.type === 'u16') {\n return 2;\n }\n\n if (field.type === 'bits') {\n return 0;\n }\n\n if (\n field.value?.kind === 'ascii' ||\n field.value?.kind === 'digits' ||\n field.value?.kind === 'dtmf' ||\n field.value?.kind === 'bbcd' ||\n field.value?.kind === 'lbcd'\n ) {\n return field.value.length;\n }\n\n if (field.value?.kind === 'tone') {\n return 2;\n }\n\n return 1;\n}\n\n/**\n * Chirp-style bitfields: declaration order is MSB → LSB within each byte.\n */\nclass BitfieldCursor {\n private radioAddress: number;\n private bitIndex = -1;\n private currentByte = 0;\n private dirty = false;\n\n constructor(\n private readonly contents: Uint8Array,\n private readonly memoryConfig: RadioMemoryConfig,\n startRadioAddress: number,\n ) {\n this.radioAddress = startRadioAddress;\n }\n\n private load(): void {\n if (this.bitIndex >= 0) {\n return;\n }\n\n this.currentByte = readByte(this.contents, bufferOffsetFor(this.radioAddress, this.memoryConfig, this.contents));\n this.bitIndex = 7;\n this.dirty = false;\n }\n\n private flushByte(): void {\n if (this.dirty) {\n writeByte(this.contents, bufferOffsetFor(this.radioAddress, this.memoryConfig, this.contents), this.currentByte);\n this.dirty = false;\n }\n }\n\n read(width: number): number {\n let result = 0;\n\n for (let bit = 0; bit < width; bit += 1) {\n this.load();\n result = (result << 1) | ((this.currentByte >> this.bitIndex) & 1);\n this.bitIndex -= 1;\n\n if (this.bitIndex < 0) {\n this.radioAddress += 1;\n }\n }\n\n return result;\n }\n\n write(width: number, value: number): void {\n for (let bit = width - 1; bit >= 0; bit -= 1) {\n this.load();\n const mask = 1 << this.bitIndex;\n\n if ((value >> bit) & 1) {\n this.currentByte |= mask;\n } else {\n this.currentByte &= ~mask;\n }\n\n this.dirty = true;\n this.bitIndex -= 1;\n\n if (this.bitIndex < 0) {\n this.flushByte();\n this.radioAddress += 1;\n }\n }\n }\n\n /**\n * Absolute radio address of the next unused byte after this bitfield group.\n */\n nextRadioAddress(): number {\n this.flushByte();\n\n if (this.bitIndex >= 0) {\n return this.radioAddress + 1;\n }\n\n return this.radioAddress;\n }\n}\n\nfunction decodeStruct(\n struct: RadioMemoryMapStruct,\n contents: Uint8Array,\n memoryConfig: RadioMemoryConfig,\n instanceIndex: number,\n): Record<string, RadioSettingValue> {\n const base = structInstanceAddress(struct, instanceIndex);\n const result: Record<string, RadioSettingValue> = {};\n let radioAddress = base;\n let bitCursor: BitfieldCursor | undefined;\n\n for (const field of struct.fields) {\n if (field.type === 'bits') {\n if (!bitCursor) {\n bitCursor = new BitfieldCursor(contents, memoryConfig, radioAddress);\n }\n\n const raw = bitCursor.read(field.width ?? 1);\n\n if (!field.reserved) {\n result[field.id] = decodeRawValue(field.value ?? { kind: 'integer' }, raw);\n }\n\n continue;\n }\n\n if (bitCursor) {\n radioAddress = bitCursor.nextRadioAddress();\n bitCursor = undefined;\n }\n\n const length = fieldByteLength(field);\n const bytes: number[] = [];\n\n for (let index = 0; index < length; index += 1) {\n bytes.push(readByte(contents, bufferOffsetFor(radioAddress + index, memoryConfig, contents)));\n }\n\n if (field.type === 'u16' || field.type === 'u32') {\n if (!field.reserved) {\n result[field.id] = decodeRawValue(field.value ?? { kind: 'integer' }, bytes);\n }\n } else if (!field.reserved) {\n result[field.id] = decodeRawValue(field.value, length === 1 ? bytes[0] : bytes);\n }\n\n radioAddress += length;\n }\n\n return result;\n}\n\nfunction encodeStruct(\n struct: RadioMemoryMapStruct,\n values: Record<string, RadioSettingValue>,\n contents: Uint8Array,\n memoryConfig: RadioMemoryConfig,\n instanceIndex: number,\n): void {\n const base = structInstanceAddress(struct, instanceIndex);\n let radioAddress = base;\n let bitCursor: BitfieldCursor | undefined;\n let bitStartAddress = base;\n\n for (const field of struct.fields) {\n if (field.type === 'bits') {\n if (!bitCursor) {\n bitStartAddress = radioAddress;\n bitCursor = new BitfieldCursor(contents, memoryConfig, bitStartAddress);\n }\n\n const width = field.width ?? 1;\n\n if (field.reserved) {\n // Advance by reading existing bits (preserves memory)\n bitCursor.read(width);\n } else {\n const encoded = encodeRawValue(field.value ?? { kind: 'integer' }, values[field.id] ?? 0, 1);\n bitCursor.write(width, encoded[0]);\n }\n\n continue;\n }\n\n if (bitCursor) {\n radioAddress = bitCursor.nextRadioAddress();\n bitCursor = undefined;\n }\n\n const length = fieldByteLength(field);\n\n if (field.reserved) {\n radioAddress += length;\n continue;\n }\n\n const settingValue = values[field.id];\n\n if (field.type === 'u16' || field.type === 'u32') {\n const encoded = encodeRawValue(field.value ?? { kind: 'integer' }, settingValue ?? 0, length);\n\n for (let index = 0; index < length; index += 1) {\n writeByte(contents, bufferOffsetFor(radioAddress + index, memoryConfig, contents), encoded[index] ?? 0);\n }\n } else {\n const encoded = encodeRawValue(field.value, settingValue ?? (field.value?.kind === 'ascii' ? '' : 0), length);\n\n for (let index = 0; index < length; index += 1) {\n writeByte(contents, bufferOffsetFor(radioAddress + index, memoryConfig, contents), encoded[index]);\n }\n }\n\n radioAddress += length;\n }\n\n if (bitCursor) {\n bitCursor.nextRadioAddress();\n }\n}\n\nfunction isStructInstanceEmpty(\n struct: RadioMemoryMapStruct,\n contents: Uint8Array,\n memoryConfig: RadioMemoryConfig,\n instanceIndex: number,\n): boolean {\n if (!struct.emptyWhen) {\n return false;\n }\n\n const base = structInstanceAddress(struct, instanceIndex);\n const firstByte = readByte(contents, bufferOffsetFor(base, memoryConfig, contents));\n return firstByte === struct.emptyWhen.equals;\n}\n\nfunction clearStructInstance(\n struct: RadioMemoryMapStruct,\n contents: Uint8Array,\n memoryConfig: RadioMemoryConfig,\n instanceIndex: number,\n): void {\n const base = structInstanceAddress(struct, instanceIndex);\n const length = struct.stride ?? 16;\n\n for (let index = 0; index < length; index += 1) {\n writeByte(contents, bufferOffsetFor(base + index, memoryConfig, contents), 0xff);\n }\n}\n\n/**\n * Decode radio-wide settings from a memory image using a JSON memory map.\n */\nexport function decodeMemoryMap(\n memoryMap: RadioMemoryMap,\n contents: Uint8Array,\n memoryConfig: RadioMemoryConfig,\n): RadioSettings {\n const settings: RadioSettings = {};\n\n for (const struct of memoryMap.structs) {\n const count = struct.count ?? 1;\n\n if (count > 1) {\n const items: RadioSettingValue[] = [];\n\n for (let index = 0; index < count; index += 1) {\n if (isStructInstanceEmpty(struct, contents, memoryConfig, index)) {\n items.push(null);\n } else {\n items.push(decodeStruct(struct, contents, memoryConfig, index));\n }\n }\n\n settings[struct.id] = items;\n } else {\n settings[struct.id] = decodeStruct(struct, contents, memoryConfig, 0);\n }\n }\n\n return settings;\n}\n\n/**\n * Encode radio-wide settings into an existing memory image in place.\n * Returns the same buffer for convenience.\n */\nexport function encodeMemoryMap(\n memoryMap: RadioMemoryMap,\n settings: RadioSettings,\n contents: Uint8Array,\n memoryConfig: RadioMemoryConfig,\n): Uint8Array {\n for (const struct of memoryMap.structs) {\n const count = struct.count ?? 1;\n const value = settings[struct.id];\n\n if (count > 1) {\n const items = Array.isArray(value) ? value : [];\n\n for (let index = 0; index < count; index += 1) {\n const item = items[index];\n\n if (item === null || item === undefined) {\n if (struct.clearEmpty) {\n clearStructInstance(struct, contents, memoryConfig, index);\n }\n\n continue;\n }\n\n const record =\n item && typeof item === 'object' && !Array.isArray(item) ? (item as Record<string, RadioSettingValue>) : {};\n encodeStruct(struct, record, contents, memoryConfig, index);\n }\n } else {\n const record =\n value && typeof value === 'object' && !Array.isArray(value) ? (value as Record<string, RadioSettingValue>) : {};\n encodeStruct(struct, record, contents, memoryConfig, 0);\n }\n }\n\n return contents;\n}\n"]}
1
+ {"version":3,"file":"memory-map-codec.js","sourceRoot":"","sources":["../../src/memory/memory-map-codec.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n RadioMemoryConfig,\n RadioMemoryMap,\n RadioMemoryMapField,\n RadioMemoryMapStruct,\n RadioMemoryMapValueKind,\n RadioSettings,\n RadioSettingValue,\n} from '@springfield/ham-radio-api';\n\nconst DEFAULT_DTMF_CHARSET = '0123456789 *#ABCD';\n\n/**\n * Parse a seek address from a number or hex/decimal string.\n */\nexport function parseSeekAddress(seek: number | string): number {\n if (typeof seek === 'number') {\n return seek;\n }\n\n const trimmed = seek.trim();\n\n if (/^0x/i.test(trimmed)) {\n return Number.parseInt(trimmed, 16);\n }\n\n return Number.parseInt(trimmed, 10);\n}\n\n/**\n * Map a radio EEPROM address to an offset in the memory buffer.\n *\n * Packed buffers (driver read) concatenate segments in config order.\n * Sparse buffers that cover the highest segment end address use absolute offsets.\n */\nexport function radioAddressToBufferOffset(\n radioAddress: number,\n memoryConfig: RadioMemoryConfig,\n bufferLength: number,\n): number {\n const segments = Object.values(memoryConfig.segments);\n const maxEndAddress = Math.max(...segments.map((segment) => segment.endAddress));\n\n if (bufferLength >= maxEndAddress + 1) {\n return radioAddress;\n }\n\n let offset = 0;\n\n for (const segment of segments) {\n if (radioAddress >= segment.startAddress && radioAddress <= segment.endAddress) {\n return offset + (radioAddress - segment.startAddress);\n }\n\n offset += segment.endAddress - segment.startAddress + 1;\n }\n\n throw new Error(`Radio address 0x${radioAddress.toString(16)} is not in any memory segment`);\n}\n\nfunction bufferOffsetFor(radioAddress: number, memoryConfig: RadioMemoryConfig, contents: Uint8Array): number {\n return radioAddressToBufferOffset(radioAddress, memoryConfig, contents.length);\n}\n\nfunction readByte(contents: Uint8Array, offset: number): number {\n if (offset < 0 || offset >= contents.length) {\n throw new RangeError(`Memory-map read out of bounds at offset ${offset}`);\n }\n\n return contents[offset];\n}\n\nfunction writeByte(contents: Uint8Array, offset: number, value: number): void {\n if (offset < 0 || offset >= contents.length) {\n throw new RangeError(`Memory-map write out of bounds at offset ${offset}`);\n }\n\n contents[offset] = value & 0xff;\n}\n\nfunction decodeInteger(raw: number | number[]): number {\n if (typeof raw === 'number') {\n return raw;\n }\n\n let value = 0;\n\n for (let index = 0; index < raw.length; index += 1) {\n value += raw[index] * 256 ** index;\n }\n\n return value;\n}\n\nfunction encodeInteger(value: RadioSettingValue, byteLength: number): number[] {\n let numeric = typeof value === 'number' ? value : 0;\n const bytes: number[] = [];\n\n for (let index = 0; index < byteLength; index += 1) {\n bytes.push(numeric & 0xff);\n numeric = Math.floor(numeric / 256);\n }\n\n return bytes;\n}\n\n/**\n * Radio address of repeated-struct instance `index`, including Kenwood-style\n * grouped stride (N records + pad bytes per clone block).\n */\nexport function structInstanceAddress(struct: RadioMemoryMapStruct, instanceIndex: number): number {\n const seek = parseSeekAddress(struct.seek);\n const stride = struct.stride ?? 0;\n const groupSize = struct.groupSize;\n\n if (!groupSize) {\n return seek + instanceIndex * stride;\n }\n\n const groupPad = struct.groupPad ?? 0;\n const groupIndex = Math.floor(instanceIndex / groupSize);\n const indexInGroup = instanceIndex % groupSize;\n\n return seek + groupIndex * (stride * groupSize + groupPad) + indexInGroup * stride;\n}\n\n/**\n * ASCII fields stop at NUL or 0xFF, then drop trailing spaces. The bytes after\n * the visible text are not part of the setting value.\n */\nfunction decodeAscii(bytes: readonly number[]): string {\n let text = '';\n\n for (const byte of bytes) {\n if (byte === 0xff || byte === 0x00) {\n break;\n }\n\n text += String.fromCodePoint(byte);\n }\n\n return text.trimEnd();\n}\n\n/**\n * Clone images mix space, NUL, and 0xFF padding in one ASCII field. Re-encoding\n * an unchanged value with the single declared pad rewrites those bytes (a\n * TH-D74 power-on message ending in spaces came back NUL-padded; a D-STAR memo\n * ending in NUL came back space-padded). When the text still matches what\n * decode would return, keep the stored bytes. Edited text uses `kind.pad`.\n */\nfunction encodeAscii(\n kind: Extract<RadioMemoryMapValueKind, { kind: 'ascii' }>,\n value: RadioSettingValue,\n byteLength: number,\n originalBytes: readonly number[] | undefined,\n): number[] {\n const text = typeof value === 'string' ? value : '';\n\n if (originalBytes && originalBytes.length === byteLength && decodeAscii(originalBytes) === text) {\n return [...originalBytes];\n }\n\n const pad = kind.pad ?? 0xff;\n const bytes: number[] = [];\n\n for (let index = 0; index < byteLength; index += 1) {\n bytes[index] = index < text.length ? (text.codePointAt(index) ?? pad) : pad;\n }\n\n return bytes;\n}\n\nfunction decodeRawValue(kind: RadioMemoryMapValueKind | undefined, raw: number | number[]): RadioSettingValue {\n if (!kind) {\n return typeof raw === 'number' ? raw : raw;\n }\n\n switch (kind.kind) {\n case 'integer':\n return decodeInteger(raw);\n case 'boolean':\n return (typeof raw === 'number' ? raw : raw[0]) !== 0;\n case 'enum': {\n const index = typeof raw === 'number' ? raw : raw[0];\n return kind.values[index] ?? kind.values[0] ?? '';\n }\n case 'ascii': {\n const bytes = typeof raw === 'number' ? [raw] : raw;\n return decodeAscii(bytes);\n }\n case 'digits': {\n const bytes = typeof raw === 'number' ? [raw] : raw;\n let value = 0;\n\n for (const digit of bytes) {\n value = value * 10 + (digit & 0x0f);\n }\n\n return value * (kind.scale ?? 1);\n }\n case 'dtmf': {\n const bytes = typeof raw === 'number' ? [raw] : raw;\n const charset = kind.charset ?? DEFAULT_DTMF_CHARSET;\n let text = '';\n\n for (const byte of bytes) {\n if (byte >= 0x1f) {\n break;\n }\n\n if (byte < charset.length) {\n text += charset[byte];\n }\n }\n\n return text;\n }\n case 'bbcd': {\n const bytes = typeof raw === 'number' ? [raw] : raw;\n let value = 0;\n\n for (const byte of bytes) {\n value = value * 100 + ((byte >> 4) & 0x0f) * 10 + (byte & 0x0f);\n }\n\n return value;\n }\n case 'lbcd': {\n const bytes = typeof raw === 'number' ? [raw] : raw;\n let word = 0;\n\n for (let index = 0; index < bytes.length; index += 1) {\n word |= bytes[index] << (8 * index);\n }\n\n if (word === 0xff_ff_ff_ff || bytes.every((byte) => byte === 0xff)) {\n return null;\n }\n\n return Number.parseInt(word.toString(16), 10) * (kind.scale ?? 10);\n }\n case 'tone': {\n const rawValue = typeof raw === 'number' ? raw : raw[0] | (raw[1] << 8);\n const ctcssMin = kind.ctcssMin ?? 0x0258;\n const reverseOffset = kind.reverseOffset ?? 0x69;\n\n if (rawValue === 0 || rawValue === 0xffff) {\n return { mode: 'none' };\n }\n\n if (rawValue >= ctcssMin) {\n return { mode: 'ctcss', value: rawValue };\n }\n\n let index = rawValue;\n let polarity: 'N' | 'R' = 'N';\n\n if (rawValue > reverseOffset) {\n index = rawValue - reverseOffset;\n polarity = 'R';\n } else {\n index = rawValue - 1;\n }\n\n const code = kind.values[index] ?? 0;\n return { mode: 'dcs', code, polarity };\n }\n case 'ctcss-index': {\n const index = decodeInteger(raw);\n const tenths = kind.values[index] ?? kind.values[0] ?? 0;\n return { mode: 'ctcss', value: tenths };\n }\n case 'dcs-index': {\n const index = decodeInteger(raw);\n const code = kind.values[index] ?? 0;\n return { mode: 'dcs', code, polarity: 'N' };\n }\n default: {\n const exhaustive: never = kind;\n return exhaustive;\n }\n }\n}\n\nfunction encodeRawValue(\n kind: RadioMemoryMapValueKind | undefined,\n value: RadioSettingValue,\n byteLength: number,\n originalBytes?: readonly number[],\n): number[] {\n const bytes = Array.from({ length: byteLength }, () => 0xff);\n\n if (!kind) {\n if (typeof value === 'number') {\n bytes[0] = value & 0xff;\n }\n\n return bytes;\n }\n\n switch (kind.kind) {\n case 'integer': {\n return encodeInteger(value, byteLength);\n }\n case 'boolean': {\n bytes[0] = value ? 1 : 0;\n return bytes;\n }\n case 'enum': {\n const index = typeof value === 'string' ? kind.values.indexOf(value) : -1;\n bytes[0] = index >= 0 ? index : 0;\n return bytes;\n }\n case 'ascii':\n return encodeAscii(kind, value, byteLength, originalBytes);\n case 'digits': {\n const scale = kind.scale ?? 1;\n let numeric = typeof value === 'number' ? Math.round(value / scale) : 0;\n\n for (let index = byteLength - 1; index >= 0; index -= 1) {\n bytes[index] = numeric % 10;\n numeric = Math.floor(numeric / 10);\n }\n\n return bytes;\n }\n case 'dtmf': {\n const text = typeof value === 'string' ? value : '';\n const charset = kind.charset ?? DEFAULT_DTMF_CHARSET;\n\n for (let index = 0; index < byteLength; index += 1) {\n if (index < text.length) {\n const charIndex = charset.indexOf(text[index]);\n bytes[index] = charIndex >= 0 ? charIndex : 0xff;\n } else {\n bytes[index] = 0xff;\n }\n }\n\n return bytes;\n }\n case 'bbcd': {\n let numeric = typeof value === 'number' ? value : 0;\n const digits: number[] = [];\n\n for (let index = 0; index < byteLength * 2; index += 1) {\n digits.unshift(numeric % 10);\n numeric = Math.floor(numeric / 10);\n }\n\n for (let index = 0; index < byteLength; index += 1) {\n bytes[index] = ((digits[index * 2] & 0x0f) << 4) | (digits[index * 2 + 1] & 0x0f);\n }\n\n return bytes;\n }\n case 'lbcd': {\n if (value === null || value === undefined) {\n return Array.from({ length: byteLength }, () => 0xff);\n }\n\n const scale = kind.scale ?? 10;\n const hz = typeof value === 'number' ? value : 0;\n let word = Number.parseInt(Math.round(hz / scale).toString(10), 16);\n\n for (let index = 0; index < byteLength; index += 1) {\n bytes[index] = word & 0xff;\n word >>= 8;\n }\n\n return bytes;\n }\n case 'tone': {\n const ctcssMin = kind.ctcssMin ?? 0x0258;\n const reverseOffset = kind.reverseOffset ?? 0x69;\n let rawValue = 0;\n\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const tone = value as { mode?: string; value?: number; code?: number; polarity?: string };\n\n if (tone.mode === 'ctcss' && typeof tone.value === 'number') {\n rawValue = tone.value;\n } else if (tone.mode === 'dcs' && typeof tone.code === 'number') {\n const index = kind.values.indexOf(tone.code);\n rawValue = index >= 0 ? index + 1 : 0;\n\n if (tone.polarity === 'R') {\n rawValue += reverseOffset;\n }\n }\n }\n\n if (rawValue >= ctcssMin || rawValue === 0) {\n // CTCSS or none: write LE u16\n }\n\n bytes[0] = rawValue & 0xff;\n bytes[1] = (rawValue >> 8) & 0xff;\n return bytes;\n }\n case 'ctcss-index': {\n const tone = value && typeof value === 'object' && !Array.isArray(value) ? (value as { mode?: string; value?: number }) : undefined;\n const tenths = tone?.mode === 'ctcss' && typeof tone.value === 'number' ? tone.value : 0;\n const index = kind.values.indexOf(tenths);\n return encodeInteger(index >= 0 ? index : 0, byteLength);\n }\n case 'dcs-index': {\n const tone = value && typeof value === 'object' && !Array.isArray(value) ? (value as { mode?: string; code?: number }) : undefined;\n const code = tone?.mode === 'dcs' && typeof tone.code === 'number' ? tone.code : 0;\n const index = kind.values.indexOf(code);\n return encodeInteger(index >= 0 ? index : 0, byteLength);\n }\n default: {\n const exhaustive: never = kind;\n return exhaustive;\n }\n }\n}\n\nfunction fieldByteLength(field: RadioMemoryMapField): number {\n if (field.type === 'u32') {\n return 4;\n }\n\n if (field.type === 'u16') {\n return 2;\n }\n\n if (field.type === 'bits') {\n return 0;\n }\n\n if (\n field.value?.kind === 'ascii' ||\n field.value?.kind === 'digits' ||\n field.value?.kind === 'dtmf' ||\n field.value?.kind === 'bbcd' ||\n field.value?.kind === 'lbcd'\n ) {\n return field.value.length;\n }\n\n if (field.value?.kind === 'tone') {\n return 2;\n }\n\n return 1;\n}\n\n/**\n * Chirp-style bitfields: declaration order is MSB → LSB within each byte.\n */\nclass BitfieldCursor {\n private radioAddress: number;\n private bitIndex = -1;\n private currentByte = 0;\n private dirty = false;\n\n constructor(\n private readonly contents: Uint8Array,\n private readonly memoryConfig: RadioMemoryConfig,\n startRadioAddress: number,\n ) {\n this.radioAddress = startRadioAddress;\n }\n\n private load(): void {\n if (this.bitIndex >= 0) {\n return;\n }\n\n this.currentByte = readByte(this.contents, bufferOffsetFor(this.radioAddress, this.memoryConfig, this.contents));\n this.bitIndex = 7;\n this.dirty = false;\n }\n\n private flushByte(): void {\n if (this.dirty) {\n writeByte(this.contents, bufferOffsetFor(this.radioAddress, this.memoryConfig, this.contents), this.currentByte);\n this.dirty = false;\n }\n }\n\n read(width: number): number {\n let result = 0;\n\n for (let bit = 0; bit < width; bit += 1) {\n this.load();\n result = (result << 1) | ((this.currentByte >> this.bitIndex) & 1);\n this.bitIndex -= 1;\n\n if (this.bitIndex < 0) {\n this.radioAddress += 1;\n }\n }\n\n return result;\n }\n\n write(width: number, value: number): void {\n for (let bit = width - 1; bit >= 0; bit -= 1) {\n this.load();\n const mask = 1 << this.bitIndex;\n\n if ((value >> bit) & 1) {\n this.currentByte |= mask;\n } else {\n this.currentByte &= ~mask;\n }\n\n this.dirty = true;\n this.bitIndex -= 1;\n\n if (this.bitIndex < 0) {\n this.flushByte();\n this.radioAddress += 1;\n }\n }\n }\n\n /**\n * Absolute radio address of the next unused byte after this bitfield group.\n */\n nextRadioAddress(): number {\n this.flushByte();\n\n if (this.bitIndex >= 0) {\n return this.radioAddress + 1;\n }\n\n return this.radioAddress;\n }\n}\n\nfunction decodeStruct(\n struct: RadioMemoryMapStruct,\n contents: Uint8Array,\n memoryConfig: RadioMemoryConfig,\n instanceIndex: number,\n): Record<string, RadioSettingValue> {\n const base = structInstanceAddress(struct, instanceIndex);\n const result: Record<string, RadioSettingValue> = {};\n let radioAddress = base;\n let bitCursor: BitfieldCursor | undefined;\n\n for (const field of struct.fields) {\n if (field.type === 'bits') {\n if (!bitCursor) {\n bitCursor = new BitfieldCursor(contents, memoryConfig, radioAddress);\n }\n\n const raw = bitCursor.read(field.width ?? 1);\n\n if (!field.reserved) {\n result[field.id] = decodeRawValue(field.value ?? { kind: 'integer' }, raw);\n }\n\n continue;\n }\n\n if (bitCursor) {\n radioAddress = bitCursor.nextRadioAddress();\n bitCursor = undefined;\n }\n\n const length = fieldByteLength(field);\n const bytes: number[] = [];\n\n for (let index = 0; index < length; index += 1) {\n bytes.push(readByte(contents, bufferOffsetFor(radioAddress + index, memoryConfig, contents)));\n }\n\n if (field.type === 'u16' || field.type === 'u32') {\n if (!field.reserved) {\n result[field.id] = decodeRawValue(field.value ?? { kind: 'integer' }, bytes);\n }\n } else if (!field.reserved) {\n result[field.id] = decodeRawValue(field.value, length === 1 ? bytes[0] : bytes);\n }\n\n radioAddress += length;\n }\n\n return result;\n}\n\nfunction encodeStruct(\n struct: RadioMemoryMapStruct,\n values: Record<string, RadioSettingValue>,\n contents: Uint8Array,\n memoryConfig: RadioMemoryConfig,\n instanceIndex: number,\n): void {\n const base = structInstanceAddress(struct, instanceIndex);\n let radioAddress = base;\n let bitCursor: BitfieldCursor | undefined;\n let bitStartAddress = base;\n\n for (const field of struct.fields) {\n if (field.type === 'bits') {\n if (!bitCursor) {\n bitStartAddress = radioAddress;\n bitCursor = new BitfieldCursor(contents, memoryConfig, bitStartAddress);\n }\n\n const width = field.width ?? 1;\n\n if (field.reserved) {\n // Advance by reading existing bits (preserves memory)\n bitCursor.read(width);\n } else {\n const encoded = encodeRawValue(field.value ?? { kind: 'integer' }, values[field.id] ?? 0, 1);\n bitCursor.write(width, encoded[0]);\n }\n\n continue;\n }\n\n if (bitCursor) {\n radioAddress = bitCursor.nextRadioAddress();\n bitCursor = undefined;\n }\n\n const length = fieldByteLength(field);\n\n if (field.reserved) {\n radioAddress += length;\n continue;\n }\n\n const settingValue = values[field.id];\n const originalBytes: number[] | undefined = field.value?.kind === 'ascii' ? [] : undefined;\n\n if (originalBytes) {\n for (let index = 0; index < length; index += 1) {\n originalBytes.push(readByte(contents, bufferOffsetFor(radioAddress + index, memoryConfig, contents)));\n }\n }\n\n if (field.type === 'u16' || field.type === 'u32') {\n const encoded = encodeRawValue(field.value ?? { kind: 'integer' }, settingValue ?? 0, length, originalBytes);\n\n for (let index = 0; index < length; index += 1) {\n writeByte(contents, bufferOffsetFor(radioAddress + index, memoryConfig, contents), encoded[index] ?? 0);\n }\n } else {\n const encoded = encodeRawValue(\n field.value,\n settingValue ?? (field.value?.kind === 'ascii' ? '' : 0),\n length,\n originalBytes,\n );\n\n for (let index = 0; index < length; index += 1) {\n writeByte(contents, bufferOffsetFor(radioAddress + index, memoryConfig, contents), encoded[index]);\n }\n }\n\n radioAddress += length;\n }\n\n if (bitCursor) {\n bitCursor.nextRadioAddress();\n }\n}\n\nfunction isStructInstanceEmpty(\n struct: RadioMemoryMapStruct,\n contents: Uint8Array,\n memoryConfig: RadioMemoryConfig,\n instanceIndex: number,\n): boolean {\n if (!struct.emptyWhen) {\n return false;\n }\n\n const base = structInstanceAddress(struct, instanceIndex);\n const firstByte = readByte(contents, bufferOffsetFor(base, memoryConfig, contents));\n return firstByte === struct.emptyWhen.equals;\n}\n\nfunction clearStructInstance(\n struct: RadioMemoryMapStruct,\n contents: Uint8Array,\n memoryConfig: RadioMemoryConfig,\n instanceIndex: number,\n): void {\n const base = structInstanceAddress(struct, instanceIndex);\n const length = struct.stride ?? 16;\n\n for (let index = 0; index < length; index += 1) {\n writeByte(contents, bufferOffsetFor(base + index, memoryConfig, contents), 0xff);\n }\n}\n\n/**\n * Decode radio-wide settings from a memory image using a JSON memory map.\n */\nexport function decodeMemoryMap(\n memoryMap: RadioMemoryMap,\n contents: Uint8Array,\n memoryConfig: RadioMemoryConfig,\n): RadioSettings {\n const settings: RadioSettings = {};\n\n for (const struct of memoryMap.structs) {\n const count = struct.count ?? 1;\n\n if (count > 1) {\n const items: RadioSettingValue[] = [];\n\n for (let index = 0; index < count; index += 1) {\n if (isStructInstanceEmpty(struct, contents, memoryConfig, index)) {\n items.push(null);\n } else {\n items.push(decodeStruct(struct, contents, memoryConfig, index));\n }\n }\n\n settings[struct.id] = items;\n } else {\n settings[struct.id] = decodeStruct(struct, contents, memoryConfig, 0);\n }\n }\n\n return settings;\n}\n\n/**\n * Encode radio-wide settings into an existing memory image in place.\n * Returns the same buffer for convenience.\n */\nexport function encodeMemoryMap(\n memoryMap: RadioMemoryMap,\n settings: RadioSettings,\n contents: Uint8Array,\n memoryConfig: RadioMemoryConfig,\n): Uint8Array {\n for (const struct of memoryMap.structs) {\n const count = struct.count ?? 1;\n const value = settings[struct.id];\n\n if (count > 1) {\n const items = Array.isArray(value) ? value : [];\n\n for (let index = 0; index < count; index += 1) {\n const item = items[index];\n\n if (item === null || item === undefined) {\n if (struct.clearEmpty) {\n clearStructInstance(struct, contents, memoryConfig, index);\n }\n\n continue;\n }\n\n const record =\n item && typeof item === 'object' && !Array.isArray(item) ? (item as Record<string, RadioSettingValue>) : {};\n encodeStruct(struct, record, contents, memoryConfig, index);\n }\n } else {\n const record =\n value && typeof value === 'object' && !Array.isArray(value) ? (value as Record<string, RadioSettingValue>) : {};\n encodeStruct(struct, record, contents, memoryConfig, 0);\n }\n }\n\n return contents;\n}\n"]}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Driver version precedence for local beta zips against a strict catalog version.
3
+ * ADR 0010: registry `compareSemver` stays numeric-only. This helper is the
4
+ * prerelease rule HamBench applies to install directories.
5
+ *
6
+ * - `1.11.1-beta.1` is older than catalog `1.11.1`
7
+ * - `1.11.2-beta.1` is newer than catalog `1.11.1`
8
+ * - among betas, `n` is numeric (`2` is less than `10`)
9
+ */
10
+ export declare const STRICT_SEMVER_PATTERN: RegExp;
11
+ export declare const BETA_COUNTER_PATTERN: RegExp;
12
+ export declare const BETA_VERSION_PATTERN: RegExp;
13
+ export interface ParsedDriverVersion {
14
+ major: number;
15
+ minor: number;
16
+ patch: number;
17
+ beta?: number;
18
+ }
19
+ export declare function assertStrictSemver(value: string, fieldLabel: string): void;
20
+ export declare function parseBetaCounter(raw: string | undefined): number;
21
+ export declare function packedBetaVersion(baseVersion: string, n: number): string;
22
+ export declare function parseDriverVersion(version: string): ParsedDriverVersion;
23
+ /**
24
+ * Positive when `left` is newer than `right`.
25
+ * A release is newer than a beta of the same major.minor.patch.
26
+ */
27
+ export declare function compareDriverVersions(left: string, right: string): number;
28
+ /**
29
+ * Compare an installed driver version to a catalog `major.minor.patch`.
30
+ * Catalog strings are strict; prerelease catalog versions are rejected.
31
+ * Negative means the install is older than the catalog entry (HamBench offers Update).
32
+ */
33
+ export declare function compareToCatalogVersion(installedVersion: string, catalogVersion: string): number;
34
+ //# sourceMappingURL=driver-semver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver-semver.d.ts","sourceRoot":"","sources":["../../src/pack/driver-semver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,eAAO,MAAM,qBAAqB,QAAoB,CAAC;AACvD,eAAO,MAAM,oBAAoB,QAAe,CAAC;AACjD,eAAO,MAAM,oBAAoB,QAA2C,CAAC;AAE7E,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAI1E;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAUhE;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAoBvE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CA6BzE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,gBAAgB,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAMhG"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Driver version precedence for local beta zips against a strict catalog version.
3
+ * ADR 0010: registry `compareSemver` stays numeric-only. This helper is the
4
+ * prerelease rule HamBench applies to install directories.
5
+ *
6
+ * - `1.11.1-beta.1` is older than catalog `1.11.1`
7
+ * - `1.11.2-beta.1` is newer than catalog `1.11.1`
8
+ * - among betas, `n` is numeric (`2` is less than `10`)
9
+ */
10
+ export const STRICT_SEMVER_PATTERN = /^\d+\.\d+\.\d+$/;
11
+ export const BETA_COUNTER_PATTERN = /^[1-9]\d*$/;
12
+ export const BETA_VERSION_PATTERN = /^(\d+)\.(\d+)\.(\d+)-beta\.([1-9]\d*)$/;
13
+ export function assertStrictSemver(value, fieldLabel) {
14
+ if (!STRICT_SEMVER_PATTERN.test(value)) {
15
+ throw new Error(`${fieldLabel} must be strict major.minor.patch (no prerelease or build metadata)`);
16
+ }
17
+ }
18
+ export function parseBetaCounter(raw) {
19
+ if (raw === undefined) {
20
+ return 1;
21
+ }
22
+ if (!BETA_COUNTER_PATTERN.test(raw)) {
23
+ throw new Error('beta counter n must be a positive integer with no leading zero');
24
+ }
25
+ return Number(raw);
26
+ }
27
+ export function packedBetaVersion(baseVersion, n) {
28
+ return `${baseVersion}-beta.${n}`;
29
+ }
30
+ export function parseDriverVersion(version) {
31
+ const trimmed = version.trim();
32
+ const betaMatch = BETA_VERSION_PATTERN.exec(trimmed);
33
+ if (betaMatch) {
34
+ return {
35
+ major: Number(betaMatch[1]),
36
+ minor: Number(betaMatch[2]),
37
+ patch: Number(betaMatch[3]),
38
+ beta: Number(betaMatch[4]),
39
+ };
40
+ }
41
+ if (!STRICT_SEMVER_PATTERN.test(trimmed)) {
42
+ throw new Error(`driver version must be strict major.minor.patch or major.minor.patch-beta.n: ${version}`);
43
+ }
44
+ const [major, minor, patch] = trimmed.split('.').map((part) => Number(part));
45
+ return { major: major ?? 0, minor: minor ?? 0, patch: patch ?? 0 };
46
+ }
47
+ /**
48
+ * Positive when `left` is newer than `right`.
49
+ * A release is newer than a beta of the same major.minor.patch.
50
+ */
51
+ export function compareDriverVersions(left, right) {
52
+ const a = parseDriverVersion(left);
53
+ const b = parseDriverVersion(right);
54
+ if (a.major !== b.major) {
55
+ return a.major - b.major;
56
+ }
57
+ if (a.minor !== b.minor) {
58
+ return a.minor - b.minor;
59
+ }
60
+ if (a.patch !== b.patch) {
61
+ return a.patch - b.patch;
62
+ }
63
+ if (a.beta === undefined && b.beta === undefined) {
64
+ return 0;
65
+ }
66
+ if (a.beta === undefined) {
67
+ return 1;
68
+ }
69
+ if (b.beta === undefined) {
70
+ return -1;
71
+ }
72
+ return a.beta - b.beta;
73
+ }
74
+ /**
75
+ * Compare an installed driver version to a catalog `major.minor.patch`.
76
+ * Catalog strings are strict; prerelease catalog versions are rejected.
77
+ * Negative means the install is older than the catalog entry (HamBench offers Update).
78
+ */
79
+ export function compareToCatalogVersion(installedVersion, catalogVersion) {
80
+ if (!STRICT_SEMVER_PATTERN.test(catalogVersion)) {
81
+ throw new Error(`catalog version must be strict major.minor.patch: ${catalogVersion}`);
82
+ }
83
+ return compareDriverVersions(installedVersion, catalogVersion);
84
+ }
85
+ //# sourceMappingURL=driver-semver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver-semver.js","sourceRoot":"","sources":["../../src/pack/driver-semver.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Driver version precedence for local beta zips against a strict catalog version.\n * ADR 0010: registry `compareSemver` stays numeric-only. This helper is the\n * prerelease rule HamBench applies to install directories.\n *\n * - `1.11.1-beta.1` is older than catalog `1.11.1`\n * - `1.11.2-beta.1` is newer than catalog `1.11.1`\n * - among betas, `n` is numeric (`2` is less than `10`)\n */\n\nexport const STRICT_SEMVER_PATTERN = /^\\d+\\.\\d+\\.\\d+$/;\nexport const BETA_COUNTER_PATTERN = /^[1-9]\\d*$/;\nexport const BETA_VERSION_PATTERN = /^(\\d+)\\.(\\d+)\\.(\\d+)-beta\\.([1-9]\\d*)$/;\n\nexport interface ParsedDriverVersion {\n major: number;\n minor: number;\n patch: number;\n beta?: number;\n}\n\nexport function assertStrictSemver(value: string, fieldLabel: string): void {\n if (!STRICT_SEMVER_PATTERN.test(value)) {\n throw new Error(`${fieldLabel} must be strict major.minor.patch (no prerelease or build metadata)`);\n }\n}\n\nexport function parseBetaCounter(raw: string | undefined): number {\n if (raw === undefined) {\n return 1;\n }\n\n if (!BETA_COUNTER_PATTERN.test(raw)) {\n throw new Error('beta counter n must be a positive integer with no leading zero');\n }\n\n return Number(raw);\n}\n\nexport function packedBetaVersion(baseVersion: string, n: number): string {\n return `${baseVersion}-beta.${n}`;\n}\n\nexport function parseDriverVersion(version: string): ParsedDriverVersion {\n const trimmed = version.trim();\n const betaMatch = BETA_VERSION_PATTERN.exec(trimmed);\n\n if (betaMatch) {\n return {\n major: Number(betaMatch[1]),\n minor: Number(betaMatch[2]),\n patch: Number(betaMatch[3]),\n beta: Number(betaMatch[4]),\n };\n }\n\n if (!STRICT_SEMVER_PATTERN.test(trimmed)) {\n throw new Error(`driver version must be strict major.minor.patch or major.minor.patch-beta.n: ${version}`);\n }\n\n const [major, minor, patch] = trimmed.split('.').map((part) => Number(part));\n\n return { major: major ?? 0, minor: minor ?? 0, patch: patch ?? 0 };\n}\n\n/**\n * Positive when `left` is newer than `right`.\n * A release is newer than a beta of the same major.minor.patch.\n */\nexport function compareDriverVersions(left: string, right: string): number {\n const a = parseDriverVersion(left);\n const b = parseDriverVersion(right);\n\n if (a.major !== b.major) {\n return a.major - b.major;\n }\n\n if (a.minor !== b.minor) {\n return a.minor - b.minor;\n }\n\n if (a.patch !== b.patch) {\n return a.patch - b.patch;\n }\n\n if (a.beta === undefined && b.beta === undefined) {\n return 0;\n }\n\n if (a.beta === undefined) {\n return 1;\n }\n\n if (b.beta === undefined) {\n return -1;\n }\n\n return a.beta - b.beta;\n}\n\n/**\n * Compare an installed driver version to a catalog `major.minor.patch`.\n * Catalog strings are strict; prerelease catalog versions are rejected.\n * Negative means the install is older than the catalog entry (HamBench offers Update).\n */\nexport function compareToCatalogVersion(installedVersion: string, catalogVersion: string): number {\n if (!STRICT_SEMVER_PATTERN.test(catalogVersion)) {\n throw new Error(`catalog version must be strict major.minor.patch: ${catalogVersion}`);\n }\n\n return compareDriverVersions(installedVersion, catalogVersion);\n}\n"]}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=pack-beta-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-beta-cli.d.ts","sourceRoot":"","sources":["../../src/pack/pack-beta-cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { runPackBetaCli } from './pack-beta.js';
3
+ const exitCode = runPackBetaCli(process.argv.slice(2), process.cwd());
4
+ process.exit(exitCode);
5
+ //# sourceMappingURL=pack-beta-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-beta-cli.js","sourceRoot":"","sources":["../../src/pack/pack-beta-cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACtE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC","sourcesContent":["#!/usr/bin/env node\nimport { runPackBetaCli } from './pack-beta.js';\n\nconst exitCode = runPackBetaCli(process.argv.slice(2), process.cwd());\nprocess.exit(exitCode);\n"]}
@@ -0,0 +1,39 @@
1
+ export { assertStrictSemver, BETA_COUNTER_PATTERN, BETA_VERSION_PATTERN, compareDriverVersions, compareToCatalogVersion, packedBetaVersion, parseBetaCounter, STRICT_SEMVER_PATTERN, } from './driver-semver.js';
2
+ export declare const MAX_BETA_ZIP_BYTES: number;
3
+ export interface RadioModuleConfigDescriptor {
4
+ fileName: string;
5
+ relativeConfig: string;
6
+ modelId: string;
7
+ name: string;
8
+ configVersion: string;
9
+ minApiVersion: string;
10
+ manufacturer: string;
11
+ parsed: unknown;
12
+ }
13
+ export interface PackBetaOptions {
14
+ outputDirectory?: string;
15
+ }
16
+ export interface PackBetaResult {
17
+ zipPath: string;
18
+ zipName: string;
19
+ modelId: string;
20
+ baseVersion: string;
21
+ packedVersion: string;
22
+ size: number;
23
+ sha256: string;
24
+ gitSha?: string;
25
+ }
26
+ export declare function expectedBetaZipName(modelId: string, baseVersion: string, n: number): string;
27
+ export declare function packBetaZip(moduleRoot: string, modelId: string, n?: number, options?: PackBetaOptions): PackBetaResult;
28
+ export declare function validateBetaDescriptor(descriptor: Pick<RadioModuleConfigDescriptor, 'relativeConfig' | 'configVersion' | 'minApiVersion'>): void;
29
+ export declare function listConfigDescriptors(moduleRoot: string): RadioModuleConfigDescriptor[];
30
+ export declare function parseConfigDescriptor(moduleRoot: string, fileName: string, manufacturerDefault?: string): RadioModuleConfigDescriptor;
31
+ export declare function closurePathsForConfig(moduleRoot: string, descriptor: Pick<RadioModuleConfigDescriptor, 'relativeConfig'>): string[];
32
+ export declare function stageClosureWithBetaVersion(moduleRoot: string, stagingRoot: string, relativePaths: string[], configRelative: string, version: string): void;
33
+ export declare function shortGitSha(moduleRoot: string): string | undefined;
34
+ export declare function formatBetaPackOutput(result: Pick<PackBetaResult, 'zipPath' | 'size' | 'sha256' | 'gitSha'>): string;
35
+ export interface PackBetaCliIo {
36
+ write(chunk: string): void;
37
+ }
38
+ export declare function runPackBetaCli(args: readonly string[], moduleRoot: string, stdout?: PackBetaCliIo, stderr?: PackBetaCliIo): number;
39
+ //# sourceMappingURL=pack-beta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-beta.d.ts","sourceRoot":"","sources":["../../src/pack/pack-beta.ts"],"names":[],"mappings":"AAkBA,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,kBAAkB,QAAc,CAAC;AAE9C,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3F;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,SAAI,EAAE,OAAO,GAAE,eAAoB,GAAG,cAAc,CA6CrH;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,2BAA2B,EAAE,gBAAgB,GAAG,eAAe,GAAG,eAAe,CAAC,GAAG,IAAI,CAsBhJ;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,2BAA2B,EAAE,CAavF;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,2BAA2B,CAuDrI;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,2BAA2B,EAAE,gBAAgB,CAAC,GAAG,MAAM,EAAE,CAUnI;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAe3J;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAYlE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC,GAAG,MAAM,CAQnH;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,aAA8B,EAAE,MAAM,GAAE,aAA8B,GAAG,MAAM,CAiBlK"}