diff --git a/docs/_javascript/firmware_picker.js b/docs/_javascript/firmware_picker.js index 21183edd6..25722d549 100644 --- a/docs/_javascript/firmware_picker.js +++ b/docs/_javascript/firmware_picker.js @@ -80,6 +80,12 @@ "hex", ]); + const HARDWARE_ALIASES = Object.freeze({ + // Generated Full Companion artifact name. It uses the standard Heltec V4 + // board definition and auto-detects the V4.2 and V4.3 FEM hardware. + "heltec_v4_2_v4_3": "heltec_v4", + }); + let pickerInstanceCount = 0; function isSafeGithubUrl(value) { @@ -299,7 +305,7 @@ return { target: target, - hardware: parts.hardware || target, + hardware: canonicalHardware(parts.hardware || target), role: parts.role, logging: logging, mode: mode, @@ -309,6 +315,11 @@ }; } + function canonicalHardware(hardware) { + const value = String(hardware || ""); + return HARDWARE_ALIASES[value] || value; + } + function hardwareFamilyFor(hardware, hardwareNames) { const value = String(hardware || ""); const lowerValue = value.toLowerCase(); @@ -327,10 +338,14 @@ function humanizeHardwareVariant(hardware, family) { const value = String(hardware || ""); const parent = String(family || ""); - if (!parent || value === parent) return "Base / standard"; + if (!parent || value === parent) { + if (value === "heltec_v4") { + return "Base / standard (V4.2 / V4.3 auto-detect)"; + } + return "Base / standard"; + } const knownLabels = { - "heltec_v4_2_v4_3": "V4.2 / V4.3", "heltec_v4_3": "V4.3", "heltec_v4_3_expansionkit_tft": "V4.3 + expansion kit + TFT", "heltec_v4_3_tft": "V4.3 + TFT", @@ -943,6 +958,7 @@ flattenReleaseAssets: flattenReleaseAssets, parseFirmwareAsset: parseFirmwareAsset, parseTargetProfile: parseTargetProfile, + canonicalHardware: canonicalHardware, hardwareFamilyFor: hardwareFamilyFor, humanizeHardwareVariant: humanizeHardwareVariant, buildCatalog: buildCatalog, diff --git a/test/test_firmware_picker.js b/test/test_firmware_picker.js index fab4da6da..9cb4710ef 100644 --- a/test/test_firmware_picker.js +++ b/test/test_firmware_picker.js @@ -133,6 +133,19 @@ const fullUsbLogging = picker.parseTargetProfile( assert.strictEqual(fullUsbLogging.mode, "usb"); assert.strictEqual(fullUsbLogging.variant, "default"); +const heltecV4Full = picker.parseTargetProfile( + "heltec_v4_2_v4_3_companion_radio_full_femon" +); +assert.strictEqual(heltecV4Full.target, + "heltec_v4_2_v4_3_companion_radio_full_femon"); +assert.strictEqual(heltecV4Full.hardware, "heltec_v4"); +assert.strictEqual(heltecV4Full.mode, "full"); +assert.strictEqual(heltecV4Full.variant, "femon"); +assert.strictEqual( + picker.canonicalHardware("heltec_v4_2_v4_3"), + "heltec_v4" +); + const standardRepeater = profile("Station_G2_repeater"); assert.strictEqual(standardRepeater.hardwareFamily, "Station_G2"); assert.strictEqual(standardRepeater.role, "repeater"); @@ -209,7 +222,7 @@ assert.strictEqual( ); assert.strictEqual( picker.humanizeHardwareVariant("heltec_v4", "heltec_v4"), - "Base / standard" + "Base / standard (V4.2 / V4.3 auto-detect)" ); assert.strictEqual( picker.humanizeHardwareVariant("heltec_v4_3_tft", "heltec_v4"),