diff --git a/.claude/skills/new-radio/SKILL.md b/.claude/skills/new-radio/SKILL.md index fbedc35..2b332a4 100644 --- a/.claude/skills/new-radio/SKILL.md +++ b/.claude/skills/new-radio/SKILL.md @@ -214,6 +214,11 @@ Then wire *both* ends, and check each off explicitly: (`src/components/profiles/ProfileEditor.tsx`) for a card radio - [ ] **`apply_settings` called by the export path** - [ ] the table↔schema agreement test +- [ ] **every section names a `group`** — one of `SETTINGS_GROUPS` in + `src/lib/profiles.ts` (General, Display, Sounds, APRS…), so the radio's form + lands on the same tabs as every other radio's (#131). Keep the OEM's section + names as the labels; when an OEM section mixes subjects, give the odd field + its own `group`. `wiring.rs` refuses a missing or unknown one. - [ ] **the coverage check against step 1's menu census** — the schema's field count and groups reconciled against the menus the radio actually has, with diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 383fc4e..5fc5a9a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -180,7 +180,9 @@ working. 6. **Settings**, if the radio has them: put `SettingsReader`/`SettingsWriter` in `radios//settings.rs`, and describe the fields in the model's `non_channel_settings_schema` JSON. That schema drives both the generic settings form and the - schema-driven write path — the fields do not need bespoke UI or a bespoke command. + schema-driven write path — the fields do not need bespoke UI or a bespoke command. Open the + schema with a `"section"` entry and give every section a `group` from `SETTINGS_GROUPS` in + `src/lib/profiles.ts`; that is the tab it is drawn on, the same tabs for every radio. 7. **Frontend: usually nothing.** With `programming_ui: 'generic'`, the capability-driven dialog already offers identify, backup download, program, and verify. Only a radio needing genuinely diff --git a/src-tauri/src/anytone_settings_schema.json b/src-tauri/src/anytone_settings_schema.json index e0bcbb2..0c4804d 100644 --- a/src-tauri/src/anytone_settings_schema.json +++ b/src-tauri/src/anytone_settings_schema.json @@ -2,7 +2,8 @@ { "key": "__sec_radio_id", "label": "Radio ID", - "type": "section" + "type": "section", + "group": "General" }, { "key": "dmr-id", @@ -20,29 +21,8 @@ { "key": "__sec_1", "label": "Power-On & Boot", - "type": "section" - }, - { - "key": "boot-display", - "label": "Boot Display", - "type": "select", - "options": [ - "Default", - "Custom Text", - "Custom Image" - ] - }, - { - "key": "boot-text-line-1", - "label": "Boot text line 1", - "type": "text", - "max_length": 14 - }, - { - "key": "boot-text-line-2", - "label": "Boot text line 2", - "type": "text", - "max_length": 14 + "type": "section", + "group": "General" }, { "key": "enable-boot-password", @@ -90,6 +70,20 @@ "min": 0, "max": 255 }, + { + "key": "boot-zone-vfo-a", + "label": "Boot zone VFO A", + "type": "integer", + "min": 0, + "max": 255 + }, + { + "key": "boot-zoot-vfo-b", + "label": "Boot zoot VFO B", + "type": "integer", + "min": 0, + "max": 255 + }, { "key": "enable-default-boot-channel", "label": "Enable default boot channel", @@ -109,10 +103,146 @@ "min": 0, "max": 255 }, + { + "key": "section-power-and-locks", + "label": "Power & Locks", + "type": "section", + "group": "General" + }, + { + "key": "power-save-mode", + "label": "Power save mode", + "type": "select", + "options": [ + "Off", + "1:1 (50%)", + "1:2 (66%)" + ] + }, + { + "key": "auto-shutoff-delay", + "label": "Auto-shutoff delay", + "type": "select", + "options": [ + "Off", + "10 min", + "30 min", + "60 min", + "120 min" + ] + }, + { + "key": "enable-automatic-key-lock", + "label": "Enable automatic key lock", + "type": "boolean" + }, + { + "key": "folk", + "label": "Forced lock", + "type": "boolean" + }, + { + "key": "sklk", + "label": "Side key lock", + "type": "boolean" + }, + { + "key": "kblk", + "label": "Enable keyboard lock", + "type": "boolean" + }, + { + "key": "knlk", + "label": "Enable knob lock", + "type": "boolean" + }, + { + "key": "enable-mcu-reset", + "label": "Enable MCU reset", + "type": "boolean" + }, + { + "key": "section-fm-broadcast-and-noaa", + "label": "FM Broadcast & NOAA", + "type": "section", + "group": "General" + }, + { + "key": "enable-fm-broadcast-monitor", + "label": "Enable FM broadcast monitor", + "type": "boolean" + }, + { + "key": "fm-broadcast-mode", + "label": "FM broadcast mode", + "type": "select", + "options": [ + "Channel", + "VFO" + ] + }, + { + "key": "fm-broadcast-channel-index", + "label": "FM broadcast channel index", + "type": "integer", + "min": 0, + "max": 255 + }, + { + "key": "noaa-channel", + "label": "NOAA Channel", + "type": "integer", + "min": 0, + "max": 9 + }, + { + "key": "noaa-monitor", + "label": "NOAA Monitor", + "type": "integer", + "min": 0, + "max": 255 + }, + { + "key": "noaa-scan", + "label": "NOAA Scan", + "type": "integer", + "min": 0, + "max": 255 + }, + { + "key": "noaa-alert", + "label": "NOAA Alert", + "type": "integer", + "min": 0, + "max": 255 + }, { "key": "__sec_2", "label": "Display", - "type": "section" + "type": "section", + "group": "Display" + }, + { + "key": "boot-display", + "label": "Boot Display", + "type": "select", + "options": [ + "Default", + "Custom Text", + "Custom Image" + ] + }, + { + "key": "boot-text-line-1", + "label": "Boot text line 1", + "type": "text", + "max_length": 14 + }, + { + "key": "boot-text-line-2", + "label": "Boot text line 2", + "type": "text", + "max_length": 14 }, { "key": "language", @@ -175,2059 +305,2017 @@ ] }, { - "key": "display-brightness", - "label": "Display Brightness", + "key": "backlight-duration-tx", + "label": "Backlight duration TX", "type": "integer", "min": 0, "max": 255 }, { - "key": "main-vfo", - "label": "Main VFO", - "type": "select", - "options": [ - "A", - "B" - ] + "key": "backlight-duration-rx", + "label": "Backlight duration RX", + "type": "integer", + "min": 0, + "max": 255 }, { - "key": "channel-number-mode", - "label": "Channel number mode", - "type": "select", - "options": [ - "Total", - "Within Zone" - ] + "key": "display-brightness", + "label": "Display Brightness", + "type": "integer", + "min": 0, + "max": 255 }, { - "key": "work-mode-a", - "label": "Work Mode A", - "type": "select", - "options": [ - "Channel", - "VFO" - ] + "key": "menu-exit-time", + "label": "Menu exit time", + "type": "integer", + "min": 0, + "max": 255 }, { - "key": "work-mode-b", - "label": "Work Mode B", - "type": "select", - "options": [ - "Channel", - "VFO" - ] + "key": "show-menu-separator", + "label": "Show menu separator", + "type": "integer", + "min": 0, + "max": 255 }, { - "key": "menu-exit-time", - "label": "Menu exit time", + "key": "show-clock", + "label": "Show Clock", "type": "integer", "min": 0, "max": 255 }, { - "key": "show-last-caller", - "label": "Show last caller", + "key": "show-volume-bar", + "label": "Show volume bar", + "type": "integer", + "min": 0, + "max": 255 + }, + { + "key": "standby-text-color", + "label": "Standby text color", "type": "select", "options": [ - "Off", - "DMR ID", - "Callsign", - "Both" + "White", + "Black", + "Orange", + "Red", + "Yellow", + "Green", + "Turquoise", + "Blue" ] }, { - "key": "__sec_3", - "label": "Programmable Keys", - "type": "section" + "key": "standby-background-image", + "label": "Standby background image", + "type": "select", + "options": [ + "Default", + "Custom 1", + "Custom 2" + ] }, { - "key": "pf1-short-press-function", - "label": "PF1 Short Press Function", + "key": "channel-a-name-color", + "label": "Channel A name color", "type": "select", "options": [ - "Alarm", - "APRS Scan", - "APRS Settings", - "APRS Type Switch", - "Bluetooth", - "Call", - "CDT Scan", - "Channel Name", - "Channel Ranging", - "Channel Settings", - "Channel Type Switch", - "CTCSS/DCS Settings", - "Dial", - "Dim Shut", - "DMR Encryption", - "DMR Monitor", - "FM APRS Info", - "FM Broadcast", - "FM Squelch", - "Frequency Step", - "Frequency Sync", - "GPS", - "GPS Information", - "GPS Roaming", - "Hot Key 1", - "Hot Key 2", - "Hot Key 3", - "Hot Key 4", - "Hot Key 5", - "Hot Key 6", - "Last Call Reply", - "Main Channel Toggle", - "MaxVolume", - "Mic Sound Quality", - "Monitor", - "Mute timing", - "NOAA Monitor", - "Nuisance Delete", - "Off", - "Power", - "Priority Zone", - "Ranging", - "Record", - "Record Switch", - "Repeater", - "Reverse", - "Roaming", - "RX NR", - "Satellite Predicting", - "Scan", - "Send TBST", - "Set Timed Roaming", - "Slot Switch", - "SMS", - "Sub Channel PTT", - "Sub Channel Toggle", - "Talk Around", - "TX NR", - "VFO Scan", - "VFO/Channel", - "Voltage", - "VOX", - "Work Alone", - "Zone Select" + "Orange", + "Red", + "Yellow", + "Green", + "Turquoise", + "Blue", + "White" ] }, { - "key": "pf1-long-press-function", - "label": "PF1 Long Press Function", + "key": "call-sign-color", + "label": "Call sign color", "type": "select", "options": [ - "Alarm", - "APRS Scan", - "APRS Settings", - "APRS Type Switch", - "Bluetooth", - "Call", - "CDT Scan", - "Channel Name", - "Channel Ranging", - "Channel Type Switch", - "CTCSS/DCS Settings", - "Dial", - "Dim Shut", - "DMR Encryption", - "DMR Monitor", - "FM APRS Info", - "FM Broadcast", - "FM Squelch", - "GPS", - "GPS Information", - "GPS Roaming", - "Hot Key 1", - "Hot Key 2", - "Hot Key 3", - "Hot Key 4", - "Hot Key 5", - "Hot Key 6", - "Last Call Reply", - "Main Channel Toggle", - "MaxVolume", - "Mic Sound Quality", - "Monitor", - "Mute timing", - "Nuisance Delete", - "Off", - "Power", - "Priority Zone", - "Ranging", - "Record", - "Record Switch", - "Reverse", - "Roaming", - "Satellite Predicting", - "Scan", - "Set Timed Roaming", - "Slot Switch", - "SMS", - "Sub Channel PTT", - "Sub Channel Toggle", - "Talk Around", - "VFO Scan", - "VFO/Channel", - "Voltage", - "VOX", - "Work Alone", - "Zone Select" + "Orange", + "Red", + "Yellow", + "Green", + "Turquoise", + "Blue", + "White" ] }, { - "key": "pf2-short-press-function", - "label": "PF2 Short Press Function", + "key": "call-display-mode", + "label": "Call display mode", "type": "select", "options": [ - "Alarm", - "APRS Scan", - "APRS Settings", - "APRS Type Switch", - "Bluetooth", - "Call", - "CDT Scan", - "Channel Name", - "Channel Ranging", - "Channel Settings", - "Channel Type Switch", - "CTCSS/DCS Settings", - "Dial", - "Dim Shut", - "DMR Encryption", - "DMR Monitor", - "FM APRS Info", - "FM Broadcast", - "FM Squelch", - "Frequency Step", - "Frequency Sync", - "GPS", - "GPS Information", - "GPS Roaming", - "Hot Key 1", - "Hot Key 2", - "Hot Key 3", - "Hot Key 4", - "Hot Key 5", - "Hot Key 6", - "Last Call Reply", - "Main Channel Toggle", - "MaxVolume", - "Mic Sound Quality", - "Monitor", - "Mute timing", - "NOAA Monitor", - "Nuisance Delete", "Off", - "Power", - "Priority Zone", - "Ranging", - "Record", - "Record Switch", - "Repeater", - "Reverse", - "Roaming", - "RX NR", - "Satellite Predicting", - "Scan", - "Send TBST", - "Set Timed Roaming", - "Slot Switch", - "SMS", - "Sub Channel PTT", - "Sub Channel Toggle", - "Talk Around", - "TX NR", - "VFO Scan", - "VFO/Channel", - "Voltage", - "VOX", - "Work Alone", - "Zone Select" + "Call", + "Name" ] }, { - "key": "pf2-long-press-function", - "label": "PF2 Long Press Function", + "key": "show-last-caller", + "label": "Show last caller", "type": "select", "options": [ - "Alarm", - "APRS Scan", - "APRS Settings", - "APRS Type Switch", - "Bluetooth", - "Call", - "CDT Scan", - "Channel Name", - "Channel Ranging", - "Channel Type Switch", - "CTCSS/DCS Settings", - "Dial", - "Dim Shut", - "DMR Encryption", - "DMR Monitor", - "FM APRS Info", - "FM Broadcast", - "FM Squelch", - "GPS", - "GPS Information", - "GPS Roaming", - "Hot Key 1", - "Hot Key 2", - "Hot Key 3", - "Hot Key 4", - "Hot Key 5", - "Hot Key 6", - "Last Call Reply", - "Main Channel Toggle", - "MaxVolume", - "Mic Sound Quality", - "Monitor", - "Mute timing", - "Nuisance Delete", "Off", - "Power", - "Priority Zone", - "Ranging", - "Record", - "Record Switch", - "Reverse", - "Roaming", - "Satellite Predicting", - "Scan", - "Set Timed Roaming", - "Slot Switch", - "SMS", - "Sub Channel PTT", - "Sub Channel Toggle", - "Talk Around", - "VFO Scan", - "VFO/Channel", - "Voltage", - "VOX", - "Work Alone", - "Zone Select" + "DMR ID", + "Callsign", + "Both" ] }, { - "key": "pf3-short-press-function", - "label": "PF3 Short Press Function", + "key": "show-last-caller-on-boot", + "label": "Show last caller on boot", + "type": "integer", + "min": 0, + "max": 255 + }, + { + "key": "keep-last-caller", + "label": "Keep last caller", + "type": "integer", + "min": 0, + "max": 255 + }, + { + "key": "enable-show-current-contact", + "label": "Enable show current contact", + "type": "boolean" + }, + { + "key": "__sec_5", + "label": "Audio & Alerts", + "type": "section", + "group": "Sounds" + }, + { + "key": "max-speaker-volume", + "label": "Max speaker volume", + "type": "integer", + "min": 0, + "max": 255 + }, + { + "key": "max-head-phone-volume", + "label": "Max head-phone volume", + "type": "integer", + "min": 0, + "max": 255 + }, + { + "key": "speaker-on-tx", + "label": "Speaker On TX", + "type": "integer", + "min": 0, + "max": 255 + }, + { + "key": "enable-key-tone", + "label": "Enable key tone", + "type": "boolean" + }, + { + "key": "key-tone-volume", + "label": "Key tone volume", + "type": "integer", + "min": 0, + "max": 255 + }, + { + "key": "talk-permit-tone", + "label": "Talk permit tone", "type": "select", "options": [ - "Alarm", - "APRS Scan", - "APRS Settings", - "APRS Type Switch", - "Bluetooth", - "Call", - "CDT Scan", - "Channel Name", - "Channel Ranging", - "Channel Settings", - "Channel Type Switch", - "CTCSS/DCS Settings", - "Dial", - "Dim Shut", - "DMR Encryption", - "DMR Monitor", - "FM APRS Info", - "FM Broadcast", - "FM Squelch", - "Frequency Step", - "Frequency Sync", - "GPS", - "GPS Information", - "GPS Roaming", - "Hot Key 1", - "Hot Key 2", - "Hot Key 3", - "Hot Key 4", - "Hot Key 5", - "Hot Key 6", - "Last Call Reply", - "Main Channel Toggle", - "MaxVolume", - "Mic Sound Quality", - "Monitor", - "Mute timing", - "NOAA Monitor", - "Nuisance Delete", - "Off", - "Power", - "Priority Zone", - "Ranging", - "Record", - "Record Switch", - "Repeater", - "Reverse", - "Roaming", - "RX NR", - "Satellite Predicting", - "Scan", - "Send TBST", - "Set Timed Roaming", - "Slot Switch", - "SMS", - "Sub Channel PTT", - "Sub Channel Toggle", - "Talk Around", - "TX NR", - "VFO Scan", - "VFO/Channel", - "Voltage", - "VOX", - "Work Alone", - "Zone Select" + "None", + "DMR", + "FM", + "Both" ] }, { - "key": "pf3-long-press-function", - "label": "PF3 Long Press Function", + "key": "enable-sms-alert", + "label": "Enable SMS Alert", + "type": "boolean" + }, + { + "key": "enable-call-alert", + "label": "Enable Call Alert", + "type": "boolean" + }, + { + "key": "dmr-channel-free-tone", + "label": "DMR channel free tone", "type": "select", "options": [ - "Alarm", - "APRS Scan", - "APRS Settings", - "APRS Type Switch", - "Bluetooth", - "Call", - "CDT Scan", - "Channel Name", - "Channel Ranging", - "Channel Type Switch", - "CTCSS/DCS Settings", - "Dial", - "Dim Shut", - "DMR Encryption", - "DMR Monitor", - "FM APRS Info", - "FM Broadcast", - "FM Squelch", - "GPS", - "GPS Information", - "GPS Roaming", - "Hot Key 1", - "Hot Key 2", - "Hot Key 3", - "Hot Key 4", - "Hot Key 5", - "Hot Key 6", - "Last Call Reply", - "Main Channel Toggle", - "MaxVolume", - "Mic Sound Quality", - "Monitor", - "Mute timing", - "Nuisance Delete", "Off", - "Power", - "Priority Zone", - "Ranging", - "Record", - "Record Switch", - "Reverse", - "Roaming", - "Satellite Predicting", - "Scan", - "Set Timed Roaming", - "Slot Switch", - "SMS", - "Sub Channel PTT", - "Sub Channel Toggle", - "Talk Around", - "VFO Scan", - "VFO/Channel", - "Voltage", - "VOX", - "Work Alone", - "Zone Select" + "Type 1", + "Type 2", + "Type 3" ] }, { - "key": "p1-short-press-function", - "label": "P1 Short Press Function", - "type": "select", - "options": [ - "Alarm", - "APRS Scan", - "APRS Settings", - "APRS Type Switch", - "Bluetooth", - "Call", - "CDT Scan", - "Channel Name", - "Channel Ranging", - "Channel Type Switch", - "CTCSS/DCS Settings", - "Dial", - "Dim Shut", - "DMR Encryption", - "DMR Monitor", - "FM APRS Info", - "FM Broadcast", - "FM Squelch", - "GPS", - "GPS Information", - "GPS Roaming", - "Hot Key 1", - "Hot Key 2", - "Hot Key 3", - "Hot Key 4", - "Hot Key 5", - "Hot Key 6", - "Last Call Reply", - "Main Channel Toggle", - "MaxVolume", - "Mic Sound Quality", - "Monitor", - "Mute timing", - "Nuisance Delete", - "Off", - "Power", - "Priority Zone", - "Ranging", - "Record", - "Record Switch", - "Reverse", - "Roaming", - "Satellite Predicting", - "Scan", - "Set Timed Roaming", - "Slot Switch", - "SMS", - "Sub Channel PTT", - "Sub Channel Toggle", - "Talk Around", - "VFO Scan", - "VFO/Channel", - "Voltage", - "VOX", - "Work Alone", - "Zone Select" - ] - }, - { - "key": "p1-long-press-function", - "label": "P1 Long Press Function", - "type": "select", - "options": [ - "Alarm", - "APRS Scan", - "APRS Settings", - "APRS Type Switch", - "Bluetooth", - "Call", - "CDT Scan", - "Channel Name", - "Channel Ranging", - "Channel Type Switch", - "CTCSS/DCS Settings", - "Dial", - "Dim Shut", - "DMR Encryption", - "DMR Monitor", - "FM APRS Info", - "FM Broadcast", - "FM Squelch", - "GPS", - "GPS Information", - "GPS Roaming", - "Hot Key 1", - "Hot Key 2", - "Hot Key 3", - "Hot Key 4", - "Hot Key 5", - "Hot Key 6", - "Last Call Reply", - "Main Channel Toggle", - "MaxVolume", - "Mic Sound Quality", - "Monitor", - "Mute timing", - "Nuisance Delete", - "Off", - "Power", - "Priority Zone", - "Ranging", - "Record", - "Record Switch", - "Reverse", - "Roaming", - "Satellite Predicting", - "Scan", - "Set Timed Roaming", - "Slot Switch", - "SMS", - "Sub Channel PTT", - "Sub Channel Toggle", - "Talk Around", - "VFO Scan", - "VFO/Channel", - "Voltage", - "VOX", - "Work Alone", - "Zone Select" - ] + "key": "enable-dmr-call-reset-tone", + "label": "Enable DMR call reset tone", + "type": "boolean" }, { - "key": "p2-short-press-function", - "label": "P2 Short Press Function", - "type": "select", - "options": [ - "Alarm", - "APRS Scan", - "APRS Settings", - "APRS Type Switch", - "Bluetooth", - "Call", - "CDT Scan", - "Channel Name", - "Channel Ranging", - "Channel Type Switch", - "CTCSS/DCS Settings", - "Dial", - "Dim Shut", - "DMR Encryption", - "DMR Monitor", - "FM APRS Info", - "FM Broadcast", - "FM Squelch", - "GPS", - "GPS Information", - "GPS Roaming", - "Hot Key 1", - "Hot Key 2", - "Hot Key 3", - "Hot Key 4", - "Hot Key 5", - "Hot Key 6", - "Last Call Reply", - "Main Channel Toggle", - "MaxVolume", - "Mic Sound Quality", - "Monitor", - "Mute timing", - "Nuisance Delete", - "Off", - "Power", - "Priority Zone", - "Ranging", - "Record", - "Record Switch", - "Reverse", - "Roaming", - "Satellite Predicting", - "Scan", - "Set Timed Roaming", - "Slot Switch", - "SMS", - "Sub Channel PTT", - "Sub Channel Toggle", - "Talk Around", - "VFO Scan", - "VFO/Channel", - "Voltage", - "VOX", - "Work Alone", - "Zone Select" - ] + "key": "analog-idle-tone", + "label": "Analog Idle Tone", + "type": "integer", + "min": 0, + "max": 255 }, { - "key": "p2-long-press-function", - "label": "P2 Long Press Function", - "type": "select", - "options": [ - "Alarm", - "APRS Scan", - "APRS Settings", - "APRS Type Switch", - "Bluetooth", - "Call", - "CDT Scan", - "Channel Name", - "Channel Ranging", - "Channel Type Switch", - "CTCSS/DCS Settings", - "Dial", - "Dim Shut", - "DMR Encryption", - "DMR Monitor", - "FM APRS Info", - "FM Broadcast", - "FM Squelch", - "GPS", - "GPS Information", - "GPS Roaming", - "Hot Key 1", - "Hot Key 2", - "Hot Key 3", - "Hot Key 4", - "Hot Key 5", - "Hot Key 6", - "Last Call Reply", - "Main Channel Toggle", - "MaxVolume", - "Mic Sound Quality", - "Monitor", - "Mute timing", - "Nuisance Delete", - "Off", - "Power", - "Priority Zone", - "Ranging", - "Record", - "Record Switch", - "Reverse", - "Roaming", - "Satellite Predicting", - "Scan", - "Set Timed Roaming", - "Slot Switch", - "SMS", - "Sub Channel PTT", - "Sub Channel Toggle", - "Talk Around", - "VFO Scan", - "VFO/Channel", - "Voltage", - "VOX", - "Work Alone", - "Zone Select" - ] + "key": "enable-enhanced-audio", + "label": "Enable enhanced audio", + "type": "boolean" }, { - "key": "long-press-duration", - "label": "Long Press Duration", + "key": "dynamic-range-control", + "label": "Dynamic Range Control", "type": "integer", "min": 0, "max": 255 }, { - "key": "show-volume-bar", - "label": "Show volume bar", + "key": "mute-duration", + "label": "Mute duration", "type": "integer", "min": 0, "max": 255 }, { - "key": "__sec_4", - "label": "Transmit", - "type": "section" + "key": "enable-recording", + "label": "Enable Recording", + "type": "boolean" }, { - "key": "tot", - "label": "Transmit Timeout", - "type": "integer", - "min": 0, - "max": 255 + "key": "enable-plug-in-recording-tone", + "label": "Enable plug-in recording tone", + "type": "boolean" }, { - "key": "tot-predict", - "label": "TOT Predict", - "type": "integer", - "min": 0, - "max": 255 + "key": "section-call-permit-melody", + "label": "Call Permit Melody", + "type": "section", + "group": "Sounds" }, { - "key": "tx-power-control", - "label": "TX Power Control", + "key": "call-permit-melody-tones.frequency.0", + "label": "Tone 1 frequency", "type": "integer", "min": 0, - "max": 255 + "max": 65535 }, { - "key": "squelch-level-vfo-a", - "label": "Squelch Level VFO A", + "key": "call-permit-melody-durations.duration.0", + "label": "Tone 1 duration", "type": "integer", "min": 0, - "max": 255 + "max": 65535 }, { - "key": "squelch-level-vfo-b", - "label": "Squelch Level VFO B", + "key": "call-permit-melody-tones.frequency.1", + "label": "Tone 2 frequency", "type": "integer", "min": 0, - "max": 255 + "max": 65535 }, { - "key": "frequency-step-size", - "label": "Frequency step size", - "type": "select", - "options": [ - "2.5 kHz", - "5 kHz", - "6.25 kHz", - "8.33 kHz", - "10 kHz", - "12.5 kHz", - "20 kHz", - "25 kHz", - "30 kHz", - "50 kHz" - ] + "key": "call-permit-melody-durations.duration.1", + "label": "Tone 2 duration", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "analog-mic-gain", - "label": "Analog Mic Gain", + "key": "call-permit-melody-tones.frequency.2", + "label": "Tone 3 frequency", "type": "integer", "min": 0, - "max": 255 + "max": 65535 }, { - "key": "dmr-mic-gain", - "label": "DMR mic gain", + "key": "call-permit-melody-durations.duration.2", + "label": "Tone 3 duration", "type": "integer", "min": 0, - "max": 255 + "max": 65535 }, { - "key": "__sec_5", - "label": "Audio & Alerts", - "type": "section" + "key": "call-permit-melody-tones.frequency.3", + "label": "Tone 4 frequency", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "max-speaker-volume", - "label": "Max speaker volume", + "key": "call-permit-melody-durations.duration.3", + "label": "Tone 4 duration", "type": "integer", "min": 0, - "max": 255 + "max": 65535 }, { - "key": "max-head-phone-volume", - "label": "Max head-phone volume", + "key": "call-permit-melody-tones.frequency.4", + "label": "Tone 5 frequency", "type": "integer", "min": 0, - "max": 255 + "max": 65535 }, { - "key": "enable-key-tone", - "label": "Enable key tone", - "type": "boolean" + "key": "call-permit-melody-durations.duration.4", + "label": "Tone 5 duration", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "key-tone-volume", - "label": "Key tone volume", + "key": "section-match-end-melody", + "label": "Match End Melody", + "type": "section", + "group": "Sounds" + }, + { + "key": "match-end-melody-tones.frequency.0", + "label": "Tone 1 frequency", "type": "integer", "min": 0, - "max": 255 + "max": 65535 }, { - "key": "talk-permit-tone", - "label": "Talk permit tone", - "type": "select", - "options": [ - "None", - "DMR", - "FM", - "Both" - ] + "key": "match-end-melody-durations.duration.0", + "label": "Tone 1 duration", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "tbst", - "label": "TBST", - "type": "select", - "options": [ - "1000 Hz", - "1450 Hz", - "1750 Hz", - "2100 Hz" - ] + "key": "match-end-melody-tones.frequency.1", + "label": "Tone 2 frequency", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "enable-sms-alert", - "label": "Enable SMS Alert", - "type": "boolean" + "key": "match-end-melody-durations.duration.1", + "label": "Tone 2 duration", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "enable-call-alert", - "label": "Enable Call Alert", - "type": "boolean" + "key": "match-end-melody-tones.frequency.2", + "label": "Tone 3 frequency", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "dmr-channel-free-tone", - "label": "DMR channel free tone", - "type": "select", - "options": [ - "Off", - "Type 1", - "Type 2", - "Type 3" - ] + "key": "match-end-melody-durations.duration.2", + "label": "Tone 3 duration", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "enable-dmr-call-reset-tone", - "label": "Enable DMR call reset tone", - "type": "boolean" + "key": "match-end-melody-tones.frequency.3", + "label": "Tone 4 frequency", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "enable-enhanced-audio", - "label": "Enable enhanced audio", - "type": "boolean" + "key": "match-end-melody-durations.duration.3", + "label": "Tone 4 duration", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "__sec_6", - "label": "DMR", - "type": "section" + "key": "match-end-melody-tones.frequency.4", + "label": "Tone 5 frequency", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "group-call-hang-time", - "label": "Group call hang time", + "key": "match-end-melody-durations.duration.4", + "label": "Tone 5 duration", "type": "integer", "min": 0, - "max": 255 + "max": 65535 }, { - "key": "private-call-hang-time", - "label": "Private call hang time", + "key": "section-unmatch-end-melody", + "label": "Unmatch End Melody", + "type": "section", + "group": "Sounds" + }, + { + "key": "unmatch-end-melody-tones.frequency.0", + "label": "Tone 1 frequency", "type": "integer", "min": 0, - "max": 255 + "max": 65535 }, { - "key": "manual-dial-grp-hold-time", - "label": "Manual Dial Grp Hold Time", + "key": "unmatch-end-melody-durations.duration.0", + "label": "Tone 1 duration", "type": "integer", "min": 0, - "max": 255 + "max": 65535 }, { - "key": "manual-dial-prv-hold-time", - "label": "Manual Dial Prv Hold Time", + "key": "unmatch-end-melody-tones.frequency.1", + "label": "Tone 2 frequency", "type": "integer", "min": 0, - "max": 255 + "max": 65535 }, { - "key": "dmr-monitor-mode", - "label": "DMR monitor mode", - "type": "select", - "options": [ - "Off", - "Single slot", - "Double slot" - ] + "key": "unmatch-end-melody-durations.duration.1", + "label": "Tone 2 duration", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "enable-dmr-monitor-slot-hold", - "label": "Enable DMR monitor slot hold", - "type": "boolean" + "key": "unmatch-end-melody-tones.frequency.2", + "label": "Tone 3 frequency", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "dmr-monitor-match-cc", - "label": "DMR monitor match CC", - "type": "select", - "options": [ - "Any", - "Same" - ] + "key": "unmatch-end-melody-durations.duration.2", + "label": "Tone 3 duration", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "dmr-monitor-match-id", - "label": "DMR monitor match id", - "type": "select", - "options": [ - "Any", - "Same" - ] + "key": "unmatch-end-melody-tones.frequency.3", + "label": "Tone 4 frequency", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "encryption-type", - "label": "Encryption Type", - "type": "select", - "options": [ - "Common", - "AES/ARC4" - ] + "key": "unmatch-end-melody-durations.duration.3", + "label": "Tone 4 duration", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "enable-filter-own-id", - "label": "Enable filter own Id", - "type": "boolean" + "key": "unmatch-end-melody-tones.frequency.4", + "label": "Tone 5 frequency", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "preamble-duration", - "label": "Preamble duration", + "key": "unmatch-end-melody-durations.duration.4", + "label": "Tone 5 duration", "type": "integer", "min": 0, - "max": 255 + "max": 65535 }, { - "key": "enable-answer-sub-channel", - "label": "Enable answer sub channel", - "type": "boolean" + "key": "section-call-reset-melody", + "label": "Call Reset Melody", + "type": "section", + "group": "Sounds" }, { - "key": "__sec_7", - "label": "VOX, Scan & Power Save", - "type": "section" + "key": "call-reset-melody-tones.frequency.0", + "label": "Tone 1 frequency", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "vox-sensitivity", - "label": "VOX sensitivity", - "type": "select", - "options": [ - "Off", - "1", - "2", - "3" - ] + "key": "call-reset-melody-durations.duration.0", + "label": "Tone 1 duration", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "vox-delay", - "label": "VOX Delay", + "key": "call-reset-melody-tones.frequency.1", + "label": "Tone 2 frequency", "type": "integer", "min": 0, - "max": 255 + "max": 65535 }, { - "key": "vox-source", - "label": "VOX Source", - "type": "select", - "options": [ - "Internal", - "External", - "Both" - ] + "key": "call-reset-melody-durations.duration.1", + "label": "Tone 2 duration", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "vfo-scan-type", - "label": "VFO Scan Type", - "type": "select", - "options": [ - "Fixed Time", - "Carrier", - "Stop" - ] - }, - { - "key": "power-save-mode", - "label": "Power save mode", - "type": "select", - "options": [ - "Off", - "1:1 (50%)", - "1:2 (66%)" - ] - }, - { - "key": "ste-type", - "label": "STE type", - "type": "select", - "options": [ - "Off", - "Silent", - "120 deg", - "180 deg", - "240 deg" - ] - }, - { - "key": "ste-frequency", - "label": "STE Frequency", - "type": "select", - "options": [ - "Off", - "55.2 Hz", - "259.2 Hz" - ] - }, - { - "key": "__sec_8", - "label": "GPS & Ranging", - "type": "section" - }, - { - "key": "enable-gps", - "label": "Enable GPS", - "type": "boolean" - }, - { - "key": "gps-mode", - "label": "GPS Mode", - "type": "select", - "options": [ - "GPS", - "BDS", - "GPS+BDS", - "GLONASS", - "GPS+GLONASS", - "BDS+GLONASS", - "All" - ] - }, - { - "key": "enable-gps-roaming", - "label": "Enable GPS Roaming", - "type": "boolean" - }, - { - "key": "ranging-interval", - "label": "Ranging interval", + "key": "call-reset-melody-tones.frequency.2", + "label": "Tone 3 frequency", "type": "integer", "min": 0, - "max": 255 + "max": 65535 }, { - "key": "time-zone", - "label": "Time Zone", + "key": "call-reset-melody-durations.duration.2", + "label": "Tone 3 duration", "type": "integer", "min": 0, - "max": 50 + "max": 65535 }, { - "key": "fixed-location", - "label": "Fixed Location", + "key": "call-reset-melody-tones.frequency.3", + "label": "Tone 4 frequency", "type": "integer", "min": 0, - "max": 8 + "max": 65535 }, { - "key": "noaa-alert", - "label": "NOAA Alert", + "key": "call-reset-melody-durations.duration.3", + "label": "Tone 4 duration", "type": "integer", "min": 0, - "max": 255 - }, - { - "key": "__sec_9", - "label": "Other settings", - "type": "section" - }, - { - "key": "enable-automatic-key-lock", - "label": "Enable automatic key lock", - "type": "boolean" - }, - { - "key": "auto-shutoff-delay", - "label": "Auto-shutoff delay", - "type": "select", - "options": [ - "Off", - "10 min", - "30 min", - "60 min", - "120 min" - ] + "max": 65535 }, { - "key": "voice-header-repetitions", - "label": "Voice Header Repetitions", + "key": "call-reset-melody-tones.frequency.4", + "label": "Tone 5 frequency", "type": "integer", - "min": 2, - "max": 10 + "min": 0, + "max": 65535 }, { - "key": "fm-broadcast-channel-index", - "label": "FM broadcast channel index", + "key": "call-reset-melody-durations.duration.4", + "label": "Tone 5 duration", "type": "integer", "min": 0, - "max": 255 - }, - { - "key": "fm-broadcast-mode", - "label": "FM broadcast mode", - "type": "select", - "options": [ - "Channel", - "VFO" - ] - }, - { - "key": "enable-recording", - "label": "Enable Recording", - "type": "boolean" - }, - { - "key": "enable-fm-broadcast-monitor", - "label": "Enable FM broadcast monitor", - "type": "boolean" - }, - { - "key": "enable-subchannel", - "label": "Enable Subchannel", - "type": "boolean" + "max": 65535 }, { - "key": "enable-remote-stun-kill", - "label": "Enable remote stun & kill", - "type": "boolean" + "key": "section-all-call-end-melody", + "label": "All Call End Melody", + "type": "section", + "group": "Sounds" }, { - "key": "enable-remote-monitor", - "label": "Enable remote monitor", - "type": "boolean" + "key": "all-call-end-melody-tones.frequency.0", + "label": "Tone 1 frequency", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "enable-rx-dmr-aprs-positions", - "label": "Enable RX DMR APRS Positions", - "type": "boolean" + "key": "all-call-end-melody-durations.duration.0", + "label": "Tone 1 duration", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "auto-repeater-a-direction", - "label": "Auto-repeater A direction", - "type": "select", - "options": [ - "Off", - "Positive", - "Negative" - ] + "key": "all-call-end-melody-tones.frequency.1", + "label": "Tone 2 frequency", + "type": "integer", + "min": 0, + "max": 65535 }, { - "key": "fm-call-hold-time", - "label": "FM Call hold time", + "key": "all-call-end-melody-durations.duration.1", + "label": "Tone 2 duration", "type": "integer", "min": 0, - "max": 255 + "max": 65535 }, { - "key": "show-clock", - "label": "Show Clock", + "key": "all-call-end-melody-tones.frequency.2", + "label": "Tone 3 frequency", "type": "integer", "min": 0, - "max": 255 + "max": 65535 }, { - "key": "sent-dmr-aprs-message", - "label": "Sent (DMR) APRS message.", + "key": "all-call-end-melody-durations.duration.2", + "label": "Tone 3 duration", "type": "integer", "min": 0, - "max": 255 + "max": 65535 }, { - "key": "vfo-scan-uhf-min-frequency", - "label": "VFO Scan UHF min Frequency", + "key": "all-call-end-melody-tones.frequency.3", + "label": "Tone 4 frequency", "type": "integer", "min": 0, - "max": 4294967295 + "max": 65535 }, { - "key": "vfo-scan-uhf-max-frequency", - "label": "VFO Scan UHF max Frequency", + "key": "all-call-end-melody-durations.duration.3", + "label": "Tone 4 duration", "type": "integer", "min": 0, - "max": 4294967295 + "max": 65535 }, { - "key": "vfo-scan-vhf-min-frequency", - "label": "VFO Scan VHF min Frequency", + "key": "all-call-end-melody-tones.frequency.4", + "label": "Tone 5 frequency", "type": "integer", "min": 0, - "max": 4294967295 + "max": 65535 }, { - "key": "vfo-scan-vhf-max-frequency", - "label": "VFO Scan VHF max Frequency", + "key": "all-call-end-melody-durations.duration.4", + "label": "Tone 5 duration", "type": "integer", "min": 0, - "max": 4294967295 + "max": 65535 }, { - "key": "uhf-auto-repeater-offset-frequency-1-index", - "label": "UHF Auto-repeater offset frequency 1 index", + "key": "__sec_4", + "label": "Transmit", + "type": "section", + "group": "Transmit & Receive" + }, + { + "key": "tot", + "label": "Transmit Timeout", "type": "integer", "min": 0, "max": 255 }, { - "key": "vhf-auto-repeater-1-offset-frequency-index", - "label": "VHF Auto-repeater 1 offset frequency index.", + "key": "tot-predict", + "label": "TOT Predict", "type": "integer", "min": 0, "max": 255 }, { - "key": "priority-zone-index-a", - "label": "Priority zone index A", + "key": "tx-power-control", + "label": "TX Power Control", "type": "integer", "min": 0, "max": 255 }, { - "key": "priority-zone-index-b", - "label": "Priority zone index B", + "key": "squelch-level-vfo-a", + "label": "Squelch Level VFO A", "type": "integer", "min": 0, "max": 255 }, { - "key": "call-permit-melody-tones.frequency.0", - "label": "Frequency", + "key": "squelch-level-vfo-b", + "label": "Squelch Level VFO B", "type": "integer", "min": 0, - "max": 65535 + "max": 255 }, { - "key": "call-permit-melody-tones.frequency.1", - "label": "Frequency", + "key": "analog-mic-gain", + "label": "Analog Mic Gain", "type": "integer", "min": 0, - "max": 65535 + "max": 255 }, { - "key": "call-permit-melody-tones.frequency.2", - "label": "Frequency", + "key": "dmr-mic-gain", + "label": "DMR mic gain", "type": "integer", "min": 0, - "max": 65535 + "max": 255 }, { - "key": "call-permit-melody-tones.frequency.3", - "label": "Frequency", + "key": "nx-mic-gain", + "label": "NX Mic gain", "type": "integer", "min": 0, - "max": 65535 + "max": 255 }, { - "key": "call-permit-melody-tones.frequency.4", - "label": "Frequency", + "key": "rx-noise-reduction", + "label": "RX Noise Reduction", "type": "integer", "min": 0, - "max": 65535 + "max": 255 }, { - "key": "call-permit-melody-durations.duration.0", - "label": "Duration", + "key": "tx-noise-reduction", + "label": "TX Noise Reduction", "type": "integer", "min": 0, - "max": 65535 - }, - { - "key": "call-permit-melody-durations.duration.1", - "label": "Duration", - "type": "integer", - "min": 0, - "max": 65535 - }, - { - "key": "call-permit-melody-durations.duration.2", - "label": "Duration", - "type": "integer", - "min": 0, - "max": 65535 - }, - { - "key": "call-permit-melody-durations.duration.3", - "label": "Duration", - "type": "integer", - "min": 0, - "max": 65535 + "max": 255 }, { - "key": "call-permit-melody-durations.duration.4", - "label": "Duration", - "type": "integer", - "min": 0, - "max": 65535 + "key": "tbst", + "label": "TBST", + "type": "select", + "options": [ + "1000 Hz", + "1450 Hz", + "1750 Hz", + "2100 Hz" + ] }, { - "key": "match-end-melody-tones.frequency.0", - "label": "Frequency", - "type": "integer", - "min": 0, - "max": 65535 + "key": "ste-type", + "label": "STE type", + "type": "select", + "options": [ + "Off", + "Silent", + "120 deg", + "180 deg", + "240 deg" + ] }, { - "key": "match-end-melody-tones.frequency.1", - "label": "Frequency", - "type": "integer", - "min": 0, - "max": 65535 + "key": "ste-frequency", + "label": "STE Frequency", + "type": "select", + "options": [ + "Off", + "55.2 Hz", + "259.2 Hz" + ] }, { - "key": "match-end-melody-tones.frequency.2", - "label": "Frequency", - "type": "integer", - "min": 0, - "max": 65535 + "key": "section-vox", + "label": "VOX", + "type": "section", + "group": "Transmit & Receive" }, { - "key": "match-end-melody-tones.frequency.3", - "label": "Frequency", - "type": "integer", - "min": 0, - "max": 65535 + "key": "vox-sensitivity", + "label": "VOX sensitivity", + "type": "select", + "options": [ + "Off", + "1", + "2", + "3" + ] }, { - "key": "match-end-melody-tones.frequency.4", - "label": "Frequency", + "key": "vox-delay", + "label": "VOX Delay", "type": "integer", "min": 0, - "max": 65535 + "max": 255 }, { - "key": "match-end-melody-durations.duration.0", - "label": "Duration", - "type": "integer", - "min": 0, - "max": 65535 + "key": "vox-source", + "label": "VOX Source", + "type": "select", + "options": [ + "Internal", + "External", + "Both" + ] }, { - "key": "match-end-melody-durations.duration.1", - "label": "Duration", - "type": "integer", - "min": 0, - "max": 65535 + "key": "section-auto-repeater", + "label": "Auto-Repeater", + "type": "section", + "group": "Transmit & Receive" }, { - "key": "match-end-melody-durations.duration.2", - "label": "Duration", - "type": "integer", - "min": 0, - "max": 65535 + "key": "auto-repeater-a-direction", + "label": "Auto-repeater A direction", + "type": "select", + "options": [ + "Off", + "Positive", + "Negative" + ] }, { - "key": "match-end-melody-durations.duration.3", - "label": "Duration", - "type": "integer", - "min": 0, - "max": 65535 + "key": "auto-repeater-b-direction", + "label": "Auto-repeater B direction", + "type": "select", + "options": [ + "Off", + "Positive", + "Negative" + ] }, { - "key": "match-end-melody-durations.duration.4", - "label": "Duration", + "key": "vhf-auto-repeater-1-offset-frequency-index", + "label": "VHF Auto-repeater 1 offset frequency index.", "type": "integer", "min": 0, - "max": 65535 + "max": 255 }, { - "key": "call-reset-melody-tones.frequency.0", - "label": "Frequency", + "key": "uhf-auto-repeater-offset-frequency-1-index", + "label": "UHF Auto-repeater offset frequency 1 index", "type": "integer", "min": 0, - "max": 65535 + "max": 255 }, { - "key": "call-reset-melody-tones.frequency.1", - "label": "Frequency", + "key": "vhf-auto-repeater-1-min-frequency", + "label": "VHF auto-repeater 1 min frequency", "type": "integer", "min": 0, - "max": 65535 + "max": 4294967295 }, { - "key": "call-reset-melody-tones.frequency.2", - "label": "Frequency", + "key": "vhf-auto-repeater-1-max-frequency", + "label": "VHF auto-repeater 1 max frequency", "type": "integer", "min": 0, - "max": 65535 + "max": 4294967295 }, { - "key": "call-reset-melody-tones.frequency.3", - "label": "Frequency", + "key": "uhf-auto-repeater-1-min-frequency", + "label": "UHF auto-repeater 1 min frequency", "type": "integer", "min": 0, - "max": 65535 + "max": 4294967295 }, { - "key": "call-reset-melody-tones.frequency.4", - "label": "Frequency", + "key": "uhf-auto-repeater-1-max-frequency", + "label": "UHF auto-repeater 1 max frequency", "type": "integer", "min": 0, - "max": 65535 + "max": 4294967295 }, { - "key": "call-reset-melody-durations.duration.0", - "label": "Duration", - "type": "integer", - "min": 0, - "max": 65535 + "key": "section-memory-and-vfo", + "label": "Memory & VFO", + "type": "section", + "group": "Memory & VFO" }, { - "key": "call-reset-melody-durations.duration.1", - "label": "Duration", - "type": "integer", - "min": 0, - "max": 65535 + "key": "main-vfo", + "label": "Main VFO", + "type": "select", + "options": [ + "A", + "B" + ] }, { - "key": "call-reset-melody-durations.duration.2", - "label": "Duration", - "type": "integer", - "min": 0, - "max": 65535 + "key": "work-mode-a", + "label": "Work Mode A", + "type": "select", + "options": [ + "Channel", + "VFO" + ] }, { - "key": "call-reset-melody-durations.duration.3", - "label": "Duration", - "type": "integer", - "min": 0, - "max": 65535 + "key": "work-mode-b", + "label": "Work Mode B", + "type": "select", + "options": [ + "Channel", + "VFO" + ] }, { - "key": "call-reset-melody-durations.duration.4", - "label": "Duration", - "type": "integer", - "min": 0, - "max": 65535 + "key": "channel-number-mode", + "label": "Channel number mode", + "type": "select", + "options": [ + "Total", + "Within Zone" + ] }, { - "key": "call-display-mode", - "label": "Call display mode", + "key": "frequency-step-size", + "label": "Frequency step size", "type": "select", "options": [ - "Off", - "Call", - "Name" + "2.5 kHz", + "5 kHz", + "6.25 kHz", + "8.33 kHz", + "10 kHz", + "12.5 kHz", + "20 kHz", + "25 kHz", + "30 kHz", + "50 kHz" ] }, { - "key": "enable-blue-tooth", - "label": "Enable blue tooth", + "key": "enable-subchannel", + "label": "Enable Subchannel", "type": "boolean" }, { - "key": "blue-tooth-and-internal-mic", - "label": "Blue tooth and internal mic", + "key": "priority-zone-index-a", + "label": "Priority zone index A", "type": "integer", "min": 0, "max": 255 }, { - "key": "blue-tooth-and-internal-speaker", - "label": "Blue tooth and internal speaker.", + "key": "priority-zone-index-b", + "label": "Priority zone index B", "type": "integer", "min": 0, "max": 255 }, { - "key": "enable-plug-in-recording-tone", - "label": "Enable plug-in recording tone", - "type": "boolean" + "key": "section-scan", + "label": "VFO Scan", + "type": "section", + "group": "Scan" }, { - "key": "blue-tooth-mic-gain", - "label": "Blue tooth mic gain", + "key": "vfo-scan-type", + "label": "VFO Scan Type", + "type": "select", + "options": [ + "Fixed Time", + "Carrier", + "Stop" + ] + }, + { + "key": "vfo-scan-vhf-min-frequency", + "label": "VFO Scan VHF min Frequency", "type": "integer", "min": 0, - "max": 255 + "max": 4294967295 }, { - "key": "blue-tooth-speaker-gain", - "label": "Blue tooth speaker gain", + "key": "vfo-scan-vhf-max-frequency", + "label": "VFO Scan VHF max Frequency", "type": "integer", "min": 0, - "max": 255 + "max": 4294967295 }, { - "key": "enable-show-current-contact", - "label": "Enable show current contact", - "type": "boolean" - }, + "key": "vfo-scan-uhf-min-frequency", + "label": "VFO Scan UHF min Frequency", + "type": "integer", + "min": 0, + "max": 4294967295 + }, { - "key": "auto-roaming-period", - "label": "Auto-roaming period", + "key": "vfo-scan-uhf-max-frequency", + "label": "VFO Scan UHF max Frequency", + "type": "integer", + "min": 0, + "max": 4294967295 + }, + { + "key": "section-signaling", + "label": "Analog Signaling", + "type": "section", + "group": "DTMF & Signaling" + }, + { + "key": "send-fm-own-id", + "label": "Send FM own ID", "type": "integer", "min": 0, "max": 255 }, { - "key": "call-sign-color", - "label": "Call sign color", - "type": "select", - "options": [ - "Orange", - "Red", - "Yellow", - "Green", - "Turquoise", - "Blue", - "White" - ] + "key": "fm-call-hold-time", + "label": "FM Call hold time", + "type": "integer", + "min": 0, + "max": 255 }, { - "key": "folk", - "label": "Forced lock", + "key": "enable-remote-stun-kill", + "label": "Enable remote stun & kill", "type": "boolean" }, { - "key": "sklk", - "label": "Side key lock", + "key": "enable-remote-monitor", + "label": "Enable remote monitor", "type": "boolean" }, { - "key": "kblk", - "label": "Enable keyboard lock", - "type": "boolean" + "key": "__sec_3", + "label": "Programmable Keys", + "type": "section", + "group": "Keys" }, { - "key": "knlk", - "label": "Enable knob lock", - "type": "boolean" + "key": "pf1-short-press-function", + "label": "PF1 Short Press Function", + "type": "select", + "options": [ + "Alarm", + "APRS Scan", + "APRS Settings", + "APRS Type Switch", + "Bluetooth", + "Call", + "CDT Scan", + "Channel Name", + "Channel Ranging", + "Channel Settings", + "Channel Type Switch", + "CTCSS/DCS Settings", + "Dial", + "Dim Shut", + "DMR Encryption", + "DMR Monitor", + "FM APRS Info", + "FM Broadcast", + "FM Squelch", + "Frequency Step", + "Frequency Sync", + "GPS", + "GPS Information", + "GPS Roaming", + "Hot Key 1", + "Hot Key 2", + "Hot Key 3", + "Hot Key 4", + "Hot Key 5", + "Hot Key 6", + "Last Call Reply", + "Main Channel Toggle", + "MaxVolume", + "Mic Sound Quality", + "Monitor", + "Mute timing", + "NOAA Monitor", + "Nuisance Delete", + "Off", + "Power", + "Priority Zone", + "Ranging", + "Record", + "Record Switch", + "Repeater", + "Reverse", + "Roaming", + "RX NR", + "Satellite Predicting", + "Scan", + "Send TBST", + "Set Timed Roaming", + "Slot Switch", + "SMS", + "Sub Channel PTT", + "Sub Channel Toggle", + "Talk Around", + "TX NR", + "VFO Scan", + "VFO/Channel", + "Voltage", + "VOX", + "Work Alone", + "Zone Select" + ] }, { - "key": "roaming-delay", - "label": "Roaming delay", - "type": "integer", - "min": 0, - "max": 255 + "key": "pf1-long-press-function", + "label": "PF1 Long Press Function", + "type": "select", + "options": [ + "Alarm", + "APRS Scan", + "APRS Settings", + "APRS Type Switch", + "Bluetooth", + "Call", + "CDT Scan", + "Channel Name", + "Channel Ranging", + "Channel Type Switch", + "CTCSS/DCS Settings", + "Dial", + "Dim Shut", + "DMR Encryption", + "DMR Monitor", + "FM APRS Info", + "FM Broadcast", + "FM Squelch", + "GPS", + "GPS Information", + "GPS Roaming", + "Hot Key 1", + "Hot Key 2", + "Hot Key 3", + "Hot Key 4", + "Hot Key 5", + "Hot Key 6", + "Last Call Reply", + "Main Channel Toggle", + "MaxVolume", + "Mic Sound Quality", + "Monitor", + "Mute timing", + "Nuisance Delete", + "Off", + "Power", + "Priority Zone", + "Ranging", + "Record", + "Record Switch", + "Reverse", + "Roaming", + "Satellite Predicting", + "Scan", + "Set Timed Roaming", + "Slot Switch", + "SMS", + "Sub Channel PTT", + "Sub Channel Toggle", + "Talk Around", + "VFO Scan", + "VFO/Channel", + "Voltage", + "VOX", + "Work Alone", + "Zone Select" + ] + }, + { + "key": "pf2-short-press-function", + "label": "PF2 Short Press Function", + "type": "select", + "options": [ + "Alarm", + "APRS Scan", + "APRS Settings", + "APRS Type Switch", + "Bluetooth", + "Call", + "CDT Scan", + "Channel Name", + "Channel Ranging", + "Channel Settings", + "Channel Type Switch", + "CTCSS/DCS Settings", + "Dial", + "Dim Shut", + "DMR Encryption", + "DMR Monitor", + "FM APRS Info", + "FM Broadcast", + "FM Squelch", + "Frequency Step", + "Frequency Sync", + "GPS", + "GPS Information", + "GPS Roaming", + "Hot Key 1", + "Hot Key 2", + "Hot Key 3", + "Hot Key 4", + "Hot Key 5", + "Hot Key 6", + "Last Call Reply", + "Main Channel Toggle", + "MaxVolume", + "Mic Sound Quality", + "Monitor", + "Mute timing", + "NOAA Monitor", + "Nuisance Delete", + "Off", + "Power", + "Priority Zone", + "Ranging", + "Record", + "Record Switch", + "Repeater", + "Reverse", + "Roaming", + "RX NR", + "Satellite Predicting", + "Scan", + "Send TBST", + "Set Timed Roaming", + "Slot Switch", + "SMS", + "Sub Channel PTT", + "Sub Channel Toggle", + "Talk Around", + "TX NR", + "VFO Scan", + "VFO/Channel", + "Voltage", + "VOX", + "Work Alone", + "Zone Select" + ] + }, + { + "key": "pf2-long-press-function", + "label": "PF2 Long Press Function", + "type": "select", + "options": [ + "Alarm", + "APRS Scan", + "APRS Settings", + "APRS Type Switch", + "Bluetooth", + "Call", + "CDT Scan", + "Channel Name", + "Channel Ranging", + "Channel Type Switch", + "CTCSS/DCS Settings", + "Dial", + "Dim Shut", + "DMR Encryption", + "DMR Monitor", + "FM APRS Info", + "FM Broadcast", + "FM Squelch", + "GPS", + "GPS Information", + "GPS Roaming", + "Hot Key 1", + "Hot Key 2", + "Hot Key 3", + "Hot Key 4", + "Hot Key 5", + "Hot Key 6", + "Last Call Reply", + "Main Channel Toggle", + "MaxVolume", + "Mic Sound Quality", + "Monitor", + "Mute timing", + "Nuisance Delete", + "Off", + "Power", + "Priority Zone", + "Ranging", + "Record", + "Record Switch", + "Reverse", + "Roaming", + "Satellite Predicting", + "Scan", + "Set Timed Roaming", + "Slot Switch", + "SMS", + "Sub Channel PTT", + "Sub Channel Toggle", + "Talk Around", + "VFO Scan", + "VFO/Channel", + "Voltage", + "VOX", + "Work Alone", + "Zone Select" + ] + }, + { + "key": "pf3-short-press-function", + "label": "PF3 Short Press Function", + "type": "select", + "options": [ + "Alarm", + "APRS Scan", + "APRS Settings", + "APRS Type Switch", + "Bluetooth", + "Call", + "CDT Scan", + "Channel Name", + "Channel Ranging", + "Channel Settings", + "Channel Type Switch", + "CTCSS/DCS Settings", + "Dial", + "Dim Shut", + "DMR Encryption", + "DMR Monitor", + "FM APRS Info", + "FM Broadcast", + "FM Squelch", + "Frequency Step", + "Frequency Sync", + "GPS", + "GPS Information", + "GPS Roaming", + "Hot Key 1", + "Hot Key 2", + "Hot Key 3", + "Hot Key 4", + "Hot Key 5", + "Hot Key 6", + "Last Call Reply", + "Main Channel Toggle", + "MaxVolume", + "Mic Sound Quality", + "Monitor", + "Mute timing", + "NOAA Monitor", + "Nuisance Delete", + "Off", + "Power", + "Priority Zone", + "Ranging", + "Record", + "Record Switch", + "Repeater", + "Reverse", + "Roaming", + "RX NR", + "Satellite Predicting", + "Scan", + "Send TBST", + "Set Timed Roaming", + "Slot Switch", + "SMS", + "Sub Channel PTT", + "Sub Channel Toggle", + "Talk Around", + "TX NR", + "VFO Scan", + "VFO/Channel", + "Voltage", + "VOX", + "Work Alone", + "Zone Select" + ] }, { - "key": "standby-text-color", - "label": "Standby text color", + "key": "pf3-long-press-function", + "label": "PF3 Long Press Function", "type": "select", "options": [ - "White", - "Black", - "Orange", - "Red", - "Yellow", - "Green", - "Turquoise", - "Blue" + "Alarm", + "APRS Scan", + "APRS Settings", + "APRS Type Switch", + "Bluetooth", + "Call", + "CDT Scan", + "Channel Name", + "Channel Ranging", + "Channel Type Switch", + "CTCSS/DCS Settings", + "Dial", + "Dim Shut", + "DMR Encryption", + "DMR Monitor", + "FM APRS Info", + "FM Broadcast", + "FM Squelch", + "GPS", + "GPS Information", + "GPS Roaming", + "Hot Key 1", + "Hot Key 2", + "Hot Key 3", + "Hot Key 4", + "Hot Key 5", + "Hot Key 6", + "Last Call Reply", + "Main Channel Toggle", + "MaxVolume", + "Mic Sound Quality", + "Monitor", + "Mute timing", + "Nuisance Delete", + "Off", + "Power", + "Priority Zone", + "Ranging", + "Record", + "Record Switch", + "Reverse", + "Roaming", + "Satellite Predicting", + "Scan", + "Set Timed Roaming", + "Slot Switch", + "SMS", + "Sub Channel PTT", + "Sub Channel Toggle", + "Talk Around", + "VFO Scan", + "VFO/Channel", + "Voltage", + "VOX", + "Work Alone", + "Zone Select" ] }, { - "key": "standby-background-image", - "label": "Standby background image", + "key": "p1-short-press-function", + "label": "P1 Short Press Function", "type": "select", "options": [ - "Default", - "Custom 1", - "Custom 2" + "Alarm", + "APRS Scan", + "APRS Settings", + "APRS Type Switch", + "Bluetooth", + "Call", + "CDT Scan", + "Channel Name", + "Channel Ranging", + "Channel Type Switch", + "CTCSS/DCS Settings", + "Dial", + "Dim Shut", + "DMR Encryption", + "DMR Monitor", + "FM APRS Info", + "FM Broadcast", + "FM Squelch", + "GPS", + "GPS Information", + "GPS Roaming", + "Hot Key 1", + "Hot Key 2", + "Hot Key 3", + "Hot Key 4", + "Hot Key 5", + "Hot Key 6", + "Last Call Reply", + "Main Channel Toggle", + "MaxVolume", + "Mic Sound Quality", + "Monitor", + "Mute timing", + "Nuisance Delete", + "Off", + "Power", + "Priority Zone", + "Ranging", + "Record", + "Record Switch", + "Reverse", + "Roaming", + "Satellite Predicting", + "Scan", + "Set Timed Roaming", + "Slot Switch", + "SMS", + "Sub Channel PTT", + "Sub Channel Toggle", + "Talk Around", + "VFO Scan", + "VFO/Channel", + "Voltage", + "VOX", + "Work Alone", + "Zone Select" ] }, { - "key": "show-last-caller-on-boot", - "label": "Show last caller on boot", - "type": "integer", - "min": 0, - "max": 255 + "key": "p1-long-press-function", + "label": "P1 Long Press Function", + "type": "select", + "options": [ + "Alarm", + "APRS Scan", + "APRS Settings", + "APRS Type Switch", + "Bluetooth", + "Call", + "CDT Scan", + "Channel Name", + "Channel Ranging", + "Channel Type Switch", + "CTCSS/DCS Settings", + "Dial", + "Dim Shut", + "DMR Encryption", + "DMR Monitor", + "FM APRS Info", + "FM Broadcast", + "FM Squelch", + "GPS", + "GPS Information", + "GPS Roaming", + "Hot Key 1", + "Hot Key 2", + "Hot Key 3", + "Hot Key 4", + "Hot Key 5", + "Hot Key 6", + "Last Call Reply", + "Main Channel Toggle", + "MaxVolume", + "Mic Sound Quality", + "Monitor", + "Mute timing", + "Nuisance Delete", + "Off", + "Power", + "Priority Zone", + "Ranging", + "Record", + "Record Switch", + "Reverse", + "Roaming", + "Satellite Predicting", + "Scan", + "Set Timed Roaming", + "Slot Switch", + "SMS", + "Sub Channel PTT", + "Sub Channel Toggle", + "Talk Around", + "VFO Scan", + "VFO/Channel", + "Voltage", + "VOX", + "Work Alone", + "Zone Select" + ] }, { - "key": "sms-standard", - "label": "SMS standard", + "key": "p2-short-press-function", + "label": "P2 Short Press Function", "type": "select", "options": [ - "Motorola", - "Hytera", - "ETSI DMR" + "Alarm", + "APRS Scan", + "APRS Settings", + "APRS Type Switch", + "Bluetooth", + "Call", + "CDT Scan", + "Channel Name", + "Channel Ranging", + "Channel Type Switch", + "CTCSS/DCS Settings", + "Dial", + "Dim Shut", + "DMR Encryption", + "DMR Monitor", + "FM APRS Info", + "FM Broadcast", + "FM Squelch", + "GPS", + "GPS Information", + "GPS Roaming", + "Hot Key 1", + "Hot Key 2", + "Hot Key 3", + "Hot Key 4", + "Hot Key 5", + "Hot Key 6", + "Last Call Reply", + "Main Channel Toggle", + "MaxVolume", + "Mic Sound Quality", + "Monitor", + "Mute timing", + "Nuisance Delete", + "Off", + "Power", + "Priority Zone", + "Ranging", + "Record", + "Record Switch", + "Reverse", + "Roaming", + "Satellite Predicting", + "Scan", + "Set Timed Roaming", + "Slot Switch", + "SMS", + "Sub Channel PTT", + "Sub Channel Toggle", + "Talk Around", + "VFO Scan", + "VFO/Channel", + "Voltage", + "VOX", + "Work Alone", + "Zone Select" ] }, { - "key": "vhf-auto-repeater-1-min-frequency", - "label": "VHF auto-repeater 1 min frequency", - "type": "integer", - "min": 0, - "max": 4294967295 - }, - { - "key": "vhf-auto-repeater-1-max-frequency", - "label": "VHF auto-repeater 1 max frequency", - "type": "integer", - "min": 0, - "max": 4294967295 - }, - { - "key": "uhf-auto-repeater-1-min-frequency", - "label": "UHF auto-repeater 1 min frequency", - "type": "integer", - "min": 0, - "max": 4294967295 - }, - { - "key": "uhf-auto-repeater-1-max-frequency", - "label": "UHF auto-repeater 1 max frequency", - "type": "integer", - "min": 0, - "max": 4294967295 - }, - { - "key": "auto-repeater-b-direction", - "label": "Auto-repeater B direction", + "key": "p2-long-press-function", + "label": "P2 Long Press Function", "type": "select", "options": [ + "Alarm", + "APRS Scan", + "APRS Settings", + "APRS Type Switch", + "Bluetooth", + "Call", + "CDT Scan", + "Channel Name", + "Channel Ranging", + "Channel Type Switch", + "CTCSS/DCS Settings", + "Dial", + "Dim Shut", + "DMR Encryption", + "DMR Monitor", + "FM APRS Info", + "FM Broadcast", + "FM Squelch", + "GPS", + "GPS Information", + "GPS Roaming", + "Hot Key 1", + "Hot Key 2", + "Hot Key 3", + "Hot Key 4", + "Hot Key 5", + "Hot Key 6", + "Last Call Reply", + "Main Channel Toggle", + "MaxVolume", + "Mic Sound Quality", + "Monitor", + "Mute timing", + "Nuisance Delete", "Off", - "Positive", - "Negative" + "Power", + "Priority Zone", + "Ranging", + "Record", + "Record Switch", + "Reverse", + "Roaming", + "Satellite Predicting", + "Scan", + "Set Timed Roaming", + "Slot Switch", + "SMS", + "Sub Channel PTT", + "Sub Channel Toggle", + "Talk Around", + "VFO Scan", + "VFO/Channel", + "Voltage", + "VOX", + "Work Alone", + "Zone Select" ] }, { - "key": "send-fm-own-id", - "label": "Send FM own ID", + "key": "long-press-duration", + "label": "Long Press Duration", "type": "integer", "min": 0, "max": 255 }, { - "key": "boot-zone-vfo-a", - "label": "Boot zone VFO A", - "type": "integer", - "min": 0, - "max": 255 + "key": "__sec_6", + "label": "DMR", + "type": "section", + "group": "Digital" }, { - "key": "boot-zoot-vfo-b", - "label": "Boot zoot VFO B", + "key": "group-call-hang-time", + "label": "Group call hang time", "type": "integer", "min": 0, "max": 255 }, { - "key": "roaming-zone-index", - "label": "Roaming zone index", + "key": "private-call-hang-time", + "label": "Private call hang time", "type": "integer", "min": 0, "max": 255 }, { - "key": "enable-repeater-check", - "label": "Enable repeater check", - "type": "boolean" - }, - { - "key": "repeater-check-interval", - "label": "Repeater check interval", + "key": "manual-dial-grp-hold-time", + "label": "Manual Dial Grp Hold Time", "type": "integer", "min": 0, "max": 255 }, { - "key": "repeater-check-retry-count", - "label": "Repeater check retry count", + "key": "manual-dial-prv-hold-time", + "label": "Manual Dial Prv Hold Time", "type": "integer", "min": 0, "max": 255 }, { - "key": "auto-roaming-start-condition", - "label": "Auto-roaming start condition", + "key": "dmr-monitor-mode", + "label": "DMR monitor mode", "type": "select", "options": [ - "Periodic", - "Out-of-range" + "Off", + "Single slot", + "Double slot" ] }, { - "key": "backlight-duration-tx", - "label": "Backlight duration TX", - "type": "integer", - "min": 0, - "max": 255 - }, - { - "key": "show-menu-separator", - "label": "Show menu separator", - "type": "integer", - "min": 0, - "max": 255 - }, - { - "key": "keep-last-caller", - "label": "Keep last caller", - "type": "integer", - "min": 0, - "max": 255 + "key": "enable-dmr-monitor-slot-hold", + "label": "Enable DMR monitor slot hold", + "type": "boolean" }, { - "key": "channel-a-name-color", - "label": "Channel A name color", + "key": "dmr-monitor-match-cc", + "label": "DMR monitor match CC", "type": "select", "options": [ - "Orange", - "Red", - "Yellow", - "Green", - "Turquoise", - "Blue", - "White" + "Any", + "Same" ] }, { - "key": "repeater-check-oor-notification", - "label": "Repeater check OOR notification", + "key": "dmr-monitor-match-id", + "label": "DMR monitor match id", "type": "select", "options": [ - "Off", - "Tone", - "Voice" + "Any", + "Same" ] }, { - "key": "backlight-duration-rx", - "label": "Backlight duration RX", - "type": "integer", - "min": 0, - "max": 255 - }, - { - "key": "enable-auto-roamin", - "label": "Enable auto roamin", - "type": "boolean" - }, - { - "key": "mute-duration", - "label": "Mute duration", - "type": "integer", - "min": 0, - "max": 255 - }, - { - "key": "repeater-check-oor-notification-count", - "label": "Repeater check OOR notification count", - "type": "integer", - "min": 0, - "max": 255 - }, - { - "key": "enable-mcu-reset", - "label": "Enable MCU reset", - "type": "boolean" - }, - { - "key": "blue-tooth-hold-duration", - "label": "Blue tooth hold duration", + "key": "encryption-type", + "label": "Encryption Type", "type": "select", "options": [ - "Off", - "1s", - "2s", - "3s", - "4s", - "5s", - "6s", - "7s", - "8s", - "9s", - "11s", - "12s", - "13s", - "14s", - "15s", - "16s", - "17s", - "18s", - "19s", - "20s", - "21s", - "22s", - "23s", - "24s", - "25s", - "26s", - "27s", - "28s", - "29s", - "30s", - "60s", - "120s", - "Infinite" + "Common", + "AES/ARC4" ] }, { - "key": "blue-tooth-rx-delay", - "label": "Blue tooth RX delay", + "key": "enable-filter-own-id", + "label": "Enable filter own Id", + "type": "boolean" + }, + { + "key": "preamble-duration", + "label": "Preamble duration", "type": "integer", "min": 0, "max": 255 }, { - "key": "analog-idle-tone", - "label": "Analog Idle Tone", + "key": "voice-header-repetitions", + "label": "Voice Header Repetitions", "type": "integer", - "min": 0, - "max": 255 + "min": 2, + "max": 10 }, { - "key": "unmatch-end-melody-tones.frequency.0", - "label": "Frequency", - "type": "integer", - "min": 0, - "max": 65535 + "key": "enable-answer-sub-channel", + "label": "Enable answer sub channel", + "type": "boolean" }, { - "key": "unmatch-end-melody-tones.frequency.1", - "label": "Frequency", - "type": "integer", - "min": 0, - "max": 65535 + "key": "sms-standard", + "label": "SMS standard", + "type": "select", + "options": [ + "Motorola", + "Hytera", + "ETSI DMR" + ] }, { - "key": "unmatch-end-melody-tones.frequency.2", - "label": "Frequency", - "type": "integer", - "min": 0, - "max": 65535 + "key": "reset-digital-protocol", + "label": "Reset Digital Protocol", + "type": "select", + "options": [ + "Off", + "DMR", + "NXDN" + ] }, { - "key": "unmatch-end-melody-tones.frequency.3", - "label": "Frequency", - "type": "integer", - "min": 0, - "max": 65535 + "key": "section-roaming", + "label": "Roaming & Repeater Check", + "type": "section", + "group": "Digital" }, { - "key": "unmatch-end-melody-tones.frequency.4", - "label": "Frequency", - "type": "integer", - "min": 0, - "max": 65535 + "key": "enable-auto-roamin", + "label": "Enable auto roamin", + "type": "boolean" }, { - "key": "unmatch-end-melody-durations.duration.0", - "label": "Duration", - "type": "integer", - "min": 0, - "max": 65535 + "key": "auto-roaming-start-condition", + "label": "Auto-roaming start condition", + "type": "select", + "options": [ + "Periodic", + "Out-of-range" + ] }, { - "key": "unmatch-end-melody-durations.duration.1", - "label": "Duration", + "key": "auto-roaming-period", + "label": "Auto-roaming period", "type": "integer", "min": 0, - "max": 65535 + "max": 255 }, { - "key": "unmatch-end-melody-durations.duration.2", - "label": "Duration", + "key": "roaming-delay", + "label": "Roaming delay", "type": "integer", "min": 0, - "max": 65535 + "max": 255 }, { - "key": "unmatch-end-melody-durations.duration.3", - "label": "Duration", + "key": "roaming-zone-index", + "label": "Roaming zone index", "type": "integer", "min": 0, - "max": 65535 + "max": 255 }, { - "key": "unmatch-end-melody-durations.duration.4", - "label": "Duration", - "type": "integer", - "min": 0, - "max": 65535 + "key": "enable-repeater-check", + "label": "Enable repeater check", + "type": "boolean" }, { - "key": "all-call-end-melody-tones.frequency.0", - "label": "Frequency", + "key": "repeater-check-interval", + "label": "Repeater check interval", "type": "integer", "min": 0, - "max": 65535 + "max": 255 }, { - "key": "all-call-end-melody-tones.frequency.1", - "label": "Frequency", + "key": "repeater-check-retry-count", + "label": "Repeater check retry count", "type": "integer", "min": 0, - "max": 65535 + "max": 255 }, { - "key": "all-call-end-melody-tones.frequency.2", - "label": "Frequency", - "type": "integer", - "min": 0, - "max": 65535 + "key": "repeater-check-oor-notification", + "label": "Repeater check OOR notification", + "type": "select", + "options": [ + "Off", + "Tone", + "Voice" + ] }, { - "key": "all-call-end-melody-tones.frequency.3", - "label": "Frequency", + "key": "repeater-check-oor-notification-count", + "label": "Repeater check OOR notification count", "type": "integer", "min": 0, - "max": 65535 + "max": 255 }, { - "key": "all-call-end-melody-tones.frequency.4", - "label": "Frequency", - "type": "integer", - "min": 0, - "max": 65535 + "key": "__sec_8", + "label": "GPS & Ranging", + "type": "section", + "group": "GPS" }, { - "key": "all-call-end-melody-durations.duration.0", - "label": "Duration", - "type": "integer", - "min": 0, - "max": 65535 + "key": "enable-gps", + "label": "Enable GPS", + "type": "boolean" }, { - "key": "all-call-end-melody-durations.duration.1", - "label": "Duration", - "type": "integer", - "min": 0, - "max": 65535 + "key": "gps-mode", + "label": "GPS Mode", + "type": "select", + "options": [ + "GPS", + "BDS", + "GPS+BDS", + "GLONASS", + "GPS+GLONASS", + "BDS+GLONASS", + "All" + ] }, { - "key": "all-call-end-melody-durations.duration.2", - "label": "Duration", + "key": "enable-gps-roaming", + "label": "Enable GPS Roaming", + "type": "boolean" + }, + { + "key": "ranging-interval", + "label": "Ranging interval", "type": "integer", "min": 0, - "max": 65535 + "max": 255 }, { - "key": "all-call-end-melody-durations.duration.3", - "label": "Duration", + "key": "time-zone", + "label": "Time Zone", "type": "integer", "min": 0, - "max": 65535 + "max": 50 }, { - "key": "all-call-end-melody-durations.duration.4", - "label": "Duration", + "key": "fixed-location", + "label": "Fixed Location", "type": "integer", "min": 0, - "max": 65535 + "max": 8 }, { - "key": "noaa-channel", - "label": "NOAA Channel", + "key": "section-dmr-aprs", + "label": "DMR APRS", + "type": "section", + "group": "APRS" + }, + { + "key": "enable-rx-dmr-aprs-positions", + "label": "Enable RX DMR APRS Positions", + "type": "boolean" + }, + { + "key": "sent-dmr-aprs-message", + "label": "Sent (DMR) APRS message.", "type": "integer", "min": 0, - "max": 9 + "max": 255 }, { - "key": "dynamic-range-control", - "label": "Dynamic Range Control", + "key": "section-bluetooth", + "label": "Bluetooth", + "type": "section", + "group": "Connections" + }, + { + "key": "enable-blue-tooth", + "label": "Enable blue tooth", + "type": "boolean" + }, + { + "key": "blue-tooth-and-internal-mic", + "label": "Blue tooth and internal mic", "type": "integer", "min": 0, "max": 255 }, { - "key": "rx-noise-reduction", - "label": "RX Noise Reduction", + "key": "blue-tooth-and-internal-speaker", + "label": "Blue tooth and internal speaker.", "type": "integer", "min": 0, "max": 255 }, { - "key": "tx-noise-reduction", - "label": "TX Noise Reduction", + "key": "blue-tooth-mic-gain", + "label": "Blue tooth mic gain", "type": "integer", "min": 0, "max": 255 }, { - "key": "nx-mic-gain", - "label": "NX Mic gain", + "key": "blue-tooth-speaker-gain", + "label": "Blue tooth speaker gain", "type": "integer", "min": 0, "max": 255 }, { - "key": "reset-digital-protocol", - "label": "Reset Digital Protocol", + "key": "blue-tooth-hold-duration", + "label": "Blue tooth hold duration", "type": "select", "options": [ "Off", - "DMR", - "NXDN" + "1s", + "2s", + "3s", + "4s", + "5s", + "6s", + "7s", + "8s", + "9s", + "11s", + "12s", + "13s", + "14s", + "15s", + "16s", + "17s", + "18s", + "19s", + "20s", + "21s", + "22s", + "23s", + "24s", + "25s", + "26s", + "27s", + "28s", + "29s", + "30s", + "60s", + "120s", + "Infinite" ] }, { - "key": "noaa-monitor", - "label": "NOAA Monitor", - "type": "integer", - "min": 0, - "max": 255 - }, - { - "key": "noaa-scan", - "label": "NOAA Scan", - "type": "integer", - "min": 0, - "max": 255 - }, - { - "key": "speaker-on-tx", - "label": "Speaker On TX", + "key": "blue-tooth-rx-delay", + "label": "Blue tooth RX delay", "type": "integer", "min": 0, "max": 255 diff --git a/src-tauri/src/bt9000_settings_schema.json b/src-tauri/src/bt9000_settings_schema.json index d7340a5..72e9b15 100644 --- a/src-tauri/src/bt9000_settings_schema.json +++ b/src-tauri/src/bt9000_settings_schema.json @@ -2,7 +2,8 @@ { "key": "section-vox", "label": "VOX", - "type": "section" + "type": "section", + "group": "Transmit & Receive" }, { "key": "vox-level", @@ -42,12 +43,14 @@ { "key": "section-radio", "label": "Radio", - "type": "section" + "type": "section", + "group": "General" }, { "key": "squelch", "label": "SQL", "type": "integer", + "group": "Transmit & Receive", "min": 1, "max": 9 }, @@ -71,6 +74,7 @@ "key": "tot", "label": "TOT", "type": "select", + "group": "Transmit & Receive", "options": [ "OFF", "30sec", @@ -87,6 +91,7 @@ "key": "scan-mode", "label": "Scan Mode", "type": "select", + "group": "Scan", "options": [ "Time", "Carrier", @@ -106,12 +111,14 @@ { "key": "tall", "label": "TALL", - "type": "boolean" + "type": "boolean", + "group": "Transmit & Receive" }, { "key": "rp-ste", "label": "RP-STE", "type": "select", + "group": "Transmit & Receive", "options": [ "OFF", "100ms", @@ -130,6 +137,7 @@ "key": "rpt-rl", "label": "RPT-RL", "type": "select", + "group": "Transmit & Receive", "options": [ "OFF", "100ms", @@ -148,6 +156,7 @@ "key": "roger", "label": "ROGRE", "type": "select", + "group": "Sounds", "options": [ "OFF", "Beep", @@ -158,6 +167,7 @@ "key": "r-tone", "label": "R-TONE", "type": "select", + "group": "Transmit & Receive", "options": [ "1000hz", "1450hz", @@ -168,17 +178,20 @@ { "key": "ab-rpt-mode", "label": "AB RPT-Mode", - "type": "boolean" + "type": "boolean", + "group": "Transmit & Receive" }, { "key": "rpt-speaker", "label": "RPT-Speaker", - "type": "boolean" + "type": "boolean", + "group": "Transmit & Receive" }, { "key": "section-vfo-ch", "label": "VFO&CH", - "type": "section" + "type": "section", + "group": "Display" }, { "key": "mdf-a", @@ -213,12 +226,14 @@ { "key": "section-setting", "label": "Setting", - "type": "section" + "type": "section", + "group": "General" }, { "key": "backlight", "label": "Back Light", "type": "select", + "group": "Display", "options": [ "Bright", "5 sec", @@ -234,17 +249,20 @@ { "key": "beep", "label": "Beep Prompt", - "type": "boolean" + "type": "boolean", + "group": "Sounds" }, { "key": "voice", "label": "Voice", - "type": "boolean" + "type": "boolean", + "group": "Sounds" }, { "key": "language", "label": "Language", "type": "select", + "group": "Display", "options": [ "English", "Chinese" @@ -265,6 +283,7 @@ "key": "power-on-display", "label": "Power On Display", "type": "select", + "group": "Display", "options": [ "Picture", "Voltage" @@ -274,6 +293,7 @@ "key": "menu-timeout", "label": "Menu OutTime", "type": "select", + "group": "Display", "options": [ "5 sec", "10 sec", @@ -291,7 +311,8 @@ { "key": "section-bluetooth", "label": "Bluetooth", - "type": "section" + "type": "section", + "group": "Connections" }, { "key": "bluetooth", @@ -301,7 +322,8 @@ { "key": "section-signaling", "label": "Signaling", - "type": "section" + "type": "section", + "group": "DTMF & Signaling" }, { "key": "dtmfst", @@ -317,7 +339,8 @@ { "key": "section-user-key", "label": "User Key", - "type": "section" + "type": "section", + "group": "Keys" }, { "key": "pf1-short", diff --git a/src-tauri/src/ft5d_settings_schema.json b/src-tauri/src/ft5d_settings_schema.json index f5d5034..1900342 100644 --- a/src-tauri/src/ft5d_settings_schema.json +++ b/src-tauri/src/ft5d_settings_schema.json @@ -1,8 +1,9 @@ [ { "key": "section-misc", - "label": "Misc", - "type": "section" + "label": "Display", + "type": "section", + "group": "Display" }, { "key": "opening-message-flag", @@ -25,6 +26,7 @@ "key": "beep-settings-beep-select", "label": "Beep Select", "type": "select", + "group": "Sounds", "options": [ "Off", "Key+Scan", @@ -87,7 +89,8 @@ { "key": "section-digital-modes", "label": "Digital Modes", - "type": "section" + "type": "section", + "group": "Digital" }, { "key": "mycall-callsign", @@ -357,7 +360,8 @@ { "key": "section-group-monitor-gm", "label": "Group Monitor(GM)", - "type": "section" + "type": "section", + "group": "Digital" }, { "key": "first-settings-gm-ring", @@ -382,12 +386,14 @@ { "key": "section-scan", "label": "Scan", - "type": "section" + "type": "section", + "group": "Scan" }, { "key": "squelch-vfo-a", "label": "VFO A Squelch", "type": "select", + "group": "Transmit & Receive", "options": [ "0", "1", @@ -411,6 +417,7 @@ "key": "squelch-vfo-b", "label": "VFO B Squelch", "type": "select", + "group": "Transmit & Receive", "options": [ "0", "1", @@ -495,6 +502,7 @@ "key": "scan-settings-tot", "label": "Transmit Timeout (TOT)", "type": "select", + "group": "Transmit & Receive", "options": [ "Off", "0.5 min", @@ -532,6 +540,7 @@ "key": "scan-settings-busy-led", "label": "Busy LED", "type": "select", + "group": "Display", "options": [ "Off", "On" @@ -541,6 +550,7 @@ "key": "scan-settings-vol-mode", "label": "Volume Mode", "type": "select", + "group": "Sounds", "options": [ "Normal", "Auto Back" @@ -549,7 +559,8 @@ { "key": "section-dtmf", "label": "DTMF", - "type": "section" + "type": "section", + "group": "DTMF & Signaling" }, { "key": "scan-settings-dtmf-delay", @@ -584,7 +595,8 @@ { "key": "section-aprs-general", "label": "APRS General", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "aprs-my-callsign-callsign", @@ -783,7 +795,8 @@ { "key": "section-aprs-receive", "label": "APRS Receive", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "aprs-rx-baud", @@ -1108,7 +1121,8 @@ { "key": "section-aprs-transmit", "label": "APRS Transmit", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "aprs-selected-beacon-status-txt", @@ -1158,7 +1172,8 @@ { "key": "section-aprs-smartbeacon", "label": "APRS SmartBeacon", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "aprs-active-smartbeaconing", diff --git a/src-tauri/src/id5100_settings_schema.json b/src-tauri/src/id5100_settings_schema.json index e24471c..330784e 100644 --- a/src-tauri/src/id5100_settings_schema.json +++ b/src-tauri/src/id5100_settings_schema.json @@ -2,12 +2,14 @@ { "key": "section-set-mode", "label": "Set Mode", - "type": "section" + "type": "section", + "group": "General" }, { "key": "set-mode-squelch-att-select", "label": "Squelch/ATT Select", "type": "select", + "group": "Transmit & Receive", "options": [ "OFF", "S-Meter Squelch", @@ -18,6 +20,7 @@ "key": "set-mode-squelch-delay", "label": "Squelch Delay", "type": "select", + "group": "Transmit & Receive", "options": [ "Short", "Long" @@ -54,22 +57,26 @@ { "key": "set-mode-one-touch-ptt-remote-mic", "label": "One-Touch PTT (Remote MIC)", - "type": "boolean" + "type": "boolean", + "group": "Transmit & Receive" }, { "key": "set-mode-ptt-lock", "label": "PTT Lock", - "type": "boolean" + "type": "boolean", + "group": "Transmit & Receive" }, { "key": "set-mode-busy-lockout", "label": "Busy Lockout", - "type": "boolean" + "type": "boolean", + "group": "Transmit & Receive" }, { "key": "set-mode-time-out-timer", "label": "Time-Out Timer", "type": "select", + "group": "Transmit & Receive", "options": [ "OFF", "1min", @@ -93,6 +100,7 @@ "key": "set-mode-mic-gain", "label": "MIC Gain", "type": "select", + "group": "Transmit & Receive", "options": [ "1", "2", @@ -104,6 +112,7 @@ "key": "set-mode-touch-operation-sub", "label": "Touch Operation (Sub)", "type": "select", + "group": "Display", "options": [ "Main Select", "Function Select" @@ -113,6 +122,7 @@ "key": "set-mode-keyboard-type", "label": "Keyboard Type", "type": "select", + "group": "Display", "options": [ "Ten-Key", "Full Keyboard" @@ -122,6 +132,7 @@ "key": "set-mode-data-speed", "label": "Data Speed", "type": "select", + "group": "Connections", "options": [ "4800bps", "9600bps" @@ -136,6 +147,7 @@ "key": "set-mode-auto-repeater", "label": "Auto Repeater", "type": "select", + "group": "Transmit & Receive", "options": [ "OFF", "ON (DUP)", @@ -145,7 +157,8 @@ { "key": "section-remote-mic-key", "label": "Remote MIC Key", - "type": "section" + "type": "section", + "group": "Keys" }, { "key": "remote-mic-key-during-rx-standby-f-1", @@ -228,7 +241,8 @@ { "key": "section-up-down-mic-key", "label": "Up/Down MIC Key", - "type": "section" + "type": "section", + "group": "Keys" }, { "key": "up-down-mic-key-during-rx-standby-up", @@ -329,7 +343,8 @@ { "key": "section-bluetooth", "label": "Bluetooth", - "type": "section" + "type": "section", + "group": "Connections" }, { "key": "bluetooth-bluetooth", @@ -344,7 +359,8 @@ { "key": "section-bluetooth-headset-set", "label": "Bluetooth - Headset Set", - "type": "section" + "type": "section", + "group": "Connections" }, { "key": "bluetooth-headset-set-af-output", @@ -419,7 +435,8 @@ { "key": "section-bluetooth-icom-headset", "label": "Bluetooth - Icom Headset", - "type": "section" + "type": "section", + "group": "Connections" }, { "key": "bluetooth-icom-headset-power-save", @@ -555,7 +572,8 @@ { "key": "section-bluetooth-data-device", "label": "Bluetooth - Data Device", - "type": "section" + "type": "section", + "group": "Connections" }, { "key": "bluetooth-data-device-serialport-function", @@ -570,7 +588,8 @@ { "key": "section-ci-v", "label": "CI-V", - "type": "section" + "type": "section", + "group": "Connections" }, { "key": "ci-v-ci-v-baud-rate", @@ -1052,7 +1071,8 @@ { "key": "section-display", "label": "Display", - "type": "section" + "type": "section", + "group": "Display" }, { "key": "display-backlight", @@ -1209,7 +1229,8 @@ { "key": "section-display-backlight-night-time-setting", "label": "Display - Backlight Night Time Setting", - "type": "section" + "type": "section", + "group": "Display" }, { "key": "display-backlight-night-time-setting-night-time-setting", @@ -1262,7 +1283,8 @@ { "key": "section-display-auto-dimmer-setting", "label": "Display - Auto Dimmer Setting", - "type": "section" + "type": "section", + "group": "Display" }, { "key": "display-auto-dimmer-setting-auto-dimmer", @@ -1311,7 +1333,8 @@ { "key": "section-display-dv", "label": "Display (DV)", - "type": "section" + "type": "section", + "group": "Display" }, { "key": "display-dv-rx-call-sign-display", @@ -1387,7 +1410,8 @@ { "key": "section-sounds", "label": "Sounds", - "type": "section" + "type": "section", + "group": "Sounds" }, { "key": "sounds-key-touch-beep", @@ -1450,7 +1474,8 @@ { "key": "section-sounds-dv", "label": "Sounds (DV)", - "type": "section" + "type": "section", + "group": "Sounds" }, { "key": "sounds-dv-standby-beep", @@ -1506,7 +1531,8 @@ { "key": "section-speech", "label": "SPEECH", - "type": "section" + "type": "section", + "group": "Sounds" }, { "key": "speech-rx-call-sign-speech", @@ -1580,7 +1606,8 @@ { "key": "section-qso-recorder-recorder", "label": "QSO Recorder - Recorder", - "type": "section" + "type": "section", + "group": "Sounds" }, { "key": "qso-recorder-recorder-rec-mode", @@ -1613,7 +1640,8 @@ { "key": "section-qso-recorder-player", "label": "QSO Recorder - Player", - "type": "section" + "type": "section", + "group": "Sounds" }, { "key": "qso-recorder-player-skip-time", @@ -1629,7 +1657,8 @@ { "key": "section-voice-tx", "label": "Voice TX", - "type": "section" + "type": "section", + "group": "Sounds" }, { "key": "voice-tx-repeat-time", @@ -1670,7 +1699,8 @@ { "key": "section-qso-rx-history-log", "label": "QSO/RX History Log", - "type": "section" + "type": "section", + "group": "Digital" }, { "key": "qso-rx-history-log-qso-log", @@ -1685,7 +1715,8 @@ { "key": "section-qso-rx-history-log-csv-format", "label": "QSO/RX History Log - CSV Format", - "type": "section" + "type": "section", + "group": "Digital" }, { "key": "qso-rx-history-log-csv-format-separator-decimal", @@ -1710,7 +1741,8 @@ { "key": "section-save", "label": "Save", - "type": "section" + "type": "section", + "group": "General" }, { "key": "save-save-form", @@ -1725,7 +1757,8 @@ { "key": "section-import-export-csv-format", "label": "Import/Export - CSV Format", - "type": "section" + "type": "section", + "group": "General" }, { "key": "import-export-csv-format-separator-decimal", @@ -1750,7 +1783,8 @@ { "key": "section-others", "label": "Others", - "type": "section" + "type": "section", + "group": "Transmit & Receive" }, { "key": "others-rf-power-vhf", @@ -1812,7 +1846,8 @@ { "key": "section-scan", "label": "Scan", - "type": "section" + "type": "section", + "group": "Scan" }, { "key": "scan-pause-timer-a", @@ -1911,7 +1946,8 @@ { "key": "section-scan-bank-link-a-band", "label": "Scan > Bank Link (A band)", - "type": "section" + "type": "section", + "group": "Scan" }, { "key": "scan-bank-link-a-a", @@ -2046,7 +2082,8 @@ { "key": "section-scan-bank-link-b-band", "label": "Scan > Bank Link (B band)", - "type": "section" + "type": "section", + "group": "Scan" }, { "key": "scan-bank-link-b-a", @@ -2181,7 +2218,8 @@ { "key": "section-gps", "label": "GPS", - "type": "section" + "type": "section", + "group": "GPS" }, { "key": "gps-gps-select", @@ -2231,7 +2269,8 @@ { "key": "section-gps-alarm", "label": "GPS Alarm", - "type": "section" + "type": "section", + "group": "GPS" }, { "key": "gps-alarm-alarm-area-rx-memory", @@ -2246,7 +2285,8 @@ { "key": "section-gps-tx", "label": "GPS TX", - "type": "section" + "type": "section", + "group": "GPS" }, { "key": "gps-tx-gps-tx-mode", @@ -2277,7 +2317,8 @@ { "key": "section-gps-tx-nmea", "label": "GPS TX (NMEA)", - "type": "section" + "type": "section", + "group": "GPS" }, { "key": "gps-tx-nmea-gps-message", @@ -2288,7 +2329,8 @@ { "key": "section-gps-tx-nmea-sentences-at-most-4", "label": "GPS TX (NMEA) sentences — at most 4", - "type": "section" + "type": "section", + "group": "GPS" }, { "key": "gps-tx-nmea-sentence-rmc", @@ -2323,7 +2365,8 @@ { "key": "section-gps-logger", "label": "GPS Logger", - "type": "section" + "type": "section", + "group": "GPS" }, { "key": "gps-logger-gps-logger", @@ -2345,7 +2388,8 @@ { "key": "section-gps-logger-record-sentences-at-least-1", "label": "GPS Logger record sentences — at least 1", - "type": "section" + "type": "section", + "group": "GPS" }, { "key": "gps-logger-record-sentence-rmc", @@ -2370,7 +2414,8 @@ { "key": "section-gps-manual-position", "label": "GPS Manual Position", - "type": "section" + "type": "section", + "group": "GPS" }, { "key": "gps-manual-position-latitude", @@ -2396,7 +2441,8 @@ { "key": "section-d-prs-aprs", "label": "D-PRS (APRS)", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "d-prs-tx-format", @@ -2418,7 +2464,8 @@ { "key": "section-d-prs-position-aprs", "label": "D-PRS Position (APRS)", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "d-prs-position-ssid", @@ -2624,7 +2671,8 @@ { "key": "section-d-prs-object-aprs", "label": "D-PRS Object (APRS)", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "d-prs-object-data-type", @@ -2806,7 +2854,8 @@ { "key": "section-d-prs-object-position-aprs", "label": "D-PRS Object position (APRS)", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "d-prs-object-position-latitude", @@ -2832,7 +2881,8 @@ { "key": "section-d-prs-item-aprs", "label": "D-PRS Item (APRS)", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "d-prs-item-data-type", @@ -3005,7 +3055,8 @@ { "key": "section-d-prs-item-position-aprs", "label": "D-PRS Item position (APRS)", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "d-prs-item-position-latitude", @@ -3031,7 +3082,8 @@ { "key": "section-d-prs-weather-aprs", "label": "D-PRS Weather (APRS)", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "d-prs-weather-ssid", @@ -3108,7 +3160,8 @@ { "key": "section-tone-control", "label": "Tone Control", - "type": "section" + "type": "section", + "group": "Sounds" }, { "key": "tone-control-rx-bass", @@ -3158,7 +3211,8 @@ { "key": "section-dv-set-mode", "label": "DV Set Mode", - "type": "section" + "type": "section", + "group": "Digital" }, { "key": "dv-set-mode-auto-reply", @@ -3245,7 +3299,8 @@ { "key": "section-my-station", "label": "My Station", - "type": "section" + "type": "section", + "group": "Digital" }, { "key": "my-station-my-call-sign-m01", @@ -3377,7 +3432,8 @@ { "key": "section-dtmf", "label": "DTMF", - "type": "section" + "type": "section", + "group": "DTMF & Signaling" }, { "key": "dtmf-dtmf-speed", @@ -3393,7 +3449,8 @@ { "key": "section-time-set", "label": "Time Set", - "type": "section" + "type": "section", + "group": "GPS" }, { "key": "time-set-utc-offset", @@ -3742,6 +3799,7 @@ { "key": "my-station-tx-message", "label": "TX Message", - "type": "boolean" + "type": "boolean", + "group": "Digital" } ] diff --git a/src-tauri/src/id52_settings_schema.json b/src-tauri/src/id52_settings_schema.json index 2dbcdae..0abe914 100644 --- a/src-tauri/src/id52_settings_schema.json +++ b/src-tauri/src/id52_settings_schema.json @@ -2,7 +2,8 @@ { "key": "section-function", "label": "Function", - "type": "section" + "type": "section", + "group": "General" }, { "key": "auto-power-off", @@ -20,6 +21,7 @@ "key": "auto-repeater", "label": "Auto Repeater", "type": "select", + "group": "Transmit & Receive", "options": [ "Off", "Dup", @@ -29,17 +31,20 @@ { "key": "ptt-lock", "label": "PTT Lock", - "type": "boolean" + "type": "boolean", + "group": "Transmit & Receive" }, { "key": "busy-channel-lockout", "label": "Busy Channel Lockout", - "type": "boolean" + "type": "boolean", + "group": "Transmit & Receive" }, { "key": "time-out-timer", "label": "Time-Out Timer", "type": "select", + "group": "Transmit & Receive", "options": [ "Off", "1", @@ -75,6 +80,7 @@ "key": "monitor", "label": "Monitor", "type": "select", + "group": "Transmit & Receive", "options": [ "Push", "Hold" @@ -99,12 +105,14 @@ { "key": "tone-burst", "label": "Tone Burst", - "type": "boolean" + "type": "boolean", + "group": "Transmit & Receive" }, { "key": "mic-gain-internal", "label": "Mic Gain Internal", "type": "select", + "group": "Transmit & Receive", "options": [ "1", "2", @@ -116,6 +124,7 @@ "key": "mic-gain-external", "label": "Mic Gain External", "type": "select", + "group": "Transmit & Receive", "options": [ "1", "2", @@ -127,6 +136,7 @@ "key": "sub-band-mute", "label": "Sub Band Mute", "type": "select", + "group": "Sounds", "options": [ "Off", "Mute", @@ -138,6 +148,7 @@ "key": "volume-select", "label": "Volume Select", "type": "select", + "group": "Sounds", "options": [ "All", "BC Radio Separate", @@ -148,6 +159,7 @@ "key": "heterodyne", "label": "Heterodyne", "type": "select", + "group": "Transmit & Receive", "options": [ "Normal", "Reverse" @@ -167,6 +179,7 @@ "key": "tx-delay-ptt", "label": "Tx Delay, PTT (sec, 0 = OFF)", "type": "integer", + "group": "Transmit & Receive", "min": 0, "max": 10 }, @@ -188,6 +201,7 @@ "key": "lo-call-key", "label": "LO/Call Key", "type": "select", + "group": "Keys", "options": [ "Standard", "ID-51" @@ -202,6 +216,7 @@ "key": "vhf-tx-power", "label": "VHF Tx Power", "type": "select", + "group": "Transmit & Receive", "options": [ "High" ] @@ -210,6 +225,7 @@ "key": "uhf-tx-power", "label": "UHF Tx Power", "type": "select", + "group": "Transmit & Receive", "options": [ "LO1", "High" @@ -219,6 +235,7 @@ "key": "squelch-a", "label": "Squelch A", "type": "select", + "group": "Transmit & Receive", "options": [ "Open", "Auto", @@ -237,6 +254,7 @@ "key": "squelch-b", "label": "Squelch B", "type": "select", + "group": "Transmit & Receive", "options": [ "Open", "Auto", @@ -254,7 +272,8 @@ { "key": "att-band-a", "label": "ATT (Band A)", - "type": "boolean" + "type": "boolean", + "group": "Transmit & Receive" }, { "key": "att-fm-radio", @@ -264,7 +283,8 @@ { "key": "section-vox", "label": "VOX", - "type": "section" + "type": "section", + "group": "Transmit & Receive" }, { "key": "vox-enable", @@ -312,7 +332,8 @@ { "key": "section-display", "label": "Display", - "type": "section" + "type": "section", + "group": "Display" }, { "key": "busy-led", @@ -532,7 +553,8 @@ { "key": "section-sounds-and-speech", "label": "Sounds and Speech", - "type": "section" + "type": "section", + "group": "Sounds" }, { "key": "standby-beep", @@ -659,7 +681,8 @@ { "key": "section-scan", "label": "Scan", - "type": "section" + "type": "section", + "group": "Scan" }, { "key": "scan-pause-timer-a", @@ -771,7 +794,8 @@ { "key": "section-dv-d-star", "label": "DV (D-STAR)", - "type": "section" + "type": "section", + "group": "Digital" }, { "key": "auto-reply", @@ -884,7 +908,8 @@ { "key": "section-gps", "label": "GPS", - "type": "section" + "type": "section", + "group": "GPS" }, { "key": "gps-tx-mode", @@ -1218,7 +1243,8 @@ { "key": "section-weather-and-units", "label": "Weather and Units", - "type": "section" + "type": "section", + "group": "Display" }, { "key": "temperature", @@ -1263,6 +1289,7 @@ "key": "wx-channel-a", "label": "Wx Channel (Band A)", "type": "integer", + "group": "General", "min": 0, "max": 9 }, @@ -1270,13 +1297,15 @@ "key": "wx-channel-b", "label": "Wx Channel (Band B)", "type": "integer", + "group": "General", "min": 0, "max": 9 }, { "key": "section-bluetooth-and-headset", "label": "Bluetooth and Headset", - "type": "section" + "type": "section", + "group": "Connections" }, { "key": "bluetooth-on", @@ -1390,7 +1419,8 @@ { "key": "section-connectors-and-ci-v", "label": "Connectors and CI-V", - "type": "section" + "type": "section", + "group": "Connections" }, { "key": "ci-v-address", @@ -1437,7 +1467,8 @@ { "key": "section-remote-microphone-keys", "label": "Remote Microphone Keys", - "type": "section" + "type": "section", + "group": "Keys" }, { "key": "remote-mic-rx-a", @@ -1554,7 +1585,8 @@ { "key": "section-fix-frequencies", "label": "FIX Frequencies", - "type": "section" + "type": "section", + "group": "Transmit & Receive" }, { "key": "fix-air", diff --git a/src-tauri/src/md380_settings_schema.json b/src-tauri/src/md380_settings_schema.json index 16526ed..bff39cc 100644 --- a/src-tauri/src/md380_settings_schema.json +++ b/src-tauri/src/md380_settings_schema.json @@ -2,7 +2,8 @@ { "key": "section-general", "label": "General", - "type": "section" + "type": "section", + "group": "General" }, { "key": "general-radio-name", @@ -21,6 +22,7 @@ "key": "general-intro-screen", "label": "Intro Screen", "type": "select", + "group": "Display", "options": [ "Character String", "Picture" @@ -30,18 +32,21 @@ "key": "general-intro-screen-line-1", "label": "Intro Screen Line 1", "type": "text", + "group": "Display", "max_length": 10 }, { "key": "general-intro-screen-line-2", "label": "Intro Screen Line 2", "type": "text", + "group": "Display", "max_length": 10 }, { "key": "general-save-preamble", "label": "Save Preamble", - "type": "boolean" + "type": "boolean", + "group": "Digital" }, { "key": "general-save-mode-receive", @@ -51,17 +56,20 @@ { "key": "general-disable-all-tones", "label": "Disable All Tones", - "type": "boolean" + "type": "boolean", + "group": "Sounds" }, { "key": "general-channel-free-indication-tone", "label": "Channel Free Indication Tone", - "type": "boolean" + "type": "boolean", + "group": "Sounds" }, { "key": "general-talk-permit-tone", "label": "Talk Permit Tone", "type": "select", + "group": "Sounds", "options": [ "None", "Digital", @@ -72,12 +80,14 @@ { "key": "general-keypad-tones", "label": "Keypad Tones", - "type": "boolean" + "type": "boolean", + "group": "Sounds" }, { "key": "general-call-alert-tone-duration-s", "label": "Call Alert Tone Duration (s)", "type": "select", + "group": "Sounds", "options": [ "Continue", "5", @@ -326,6 +336,7 @@ "key": "general-scan-digital-hang-time-ms", "label": "Scan Digital Hang Time (ms)", "type": "select", + "group": "Scan", "options": [ "500", "1000", @@ -353,6 +364,7 @@ "key": "general-scan-analog-hang-time-ms", "label": "Scan Analog Hang Time (ms)", "type": "select", + "group": "Scan", "options": [ "500", "1000", @@ -394,6 +406,7 @@ "key": "general-monitor-type", "label": "Monitor Type", "type": "select", + "group": "Transmit & Receive", "options": [ "Silent", "Open Squelch" @@ -403,6 +416,7 @@ "key": "general-vox-sensitivity", "label": "VOX Sensitivity", "type": "integer", + "group": "Transmit & Receive", "min": 1, "max": 10 }, @@ -410,6 +424,7 @@ "key": "general-tx-preamble-duration-ms", "label": "Tx Preamble Duration (ms)", "type": "select", + "group": "Digital", "options": [ "0", "60", @@ -697,6 +712,7 @@ "key": "general-backlight-time-s", "label": "Backlight Time (s)", "type": "select", + "group": "Display", "options": [ "Always", "5", @@ -718,7 +734,8 @@ { "key": "general-disable-all-leds", "label": "Disable All LEDS", - "type": "boolean" + "type": "boolean", + "group": "Display" }, { "key": "general-mode", @@ -733,6 +750,7 @@ "key": "general-group-call-hang-time-ms", "label": "Group Call Hang Time (ms)", "type": "select", + "group": "Digital", "options": [ "0", "500", @@ -755,6 +773,7 @@ "key": "general-private-call-hang-time-ms", "label": "Private Call Hang Time (ms)", "type": "select", + "group": "Digital", "options": [ "0", "500", @@ -776,7 +795,8 @@ { "key": "section-buttons", "label": "Buttons", - "type": "section" + "type": "section", + "group": "Keys" }, { "key": "buttons-long-press-duration-ms", @@ -952,7 +972,8 @@ { "key": "section-menu", "label": "Menu", - "type": "section" + "type": "section", + "group": "General" }, { "key": "menu-hang-time", diff --git a/src-tauri/src/radios/wiring.rs b/src-tauri/src/radios/wiring.rs index 7918680..569abf8 100644 --- a/src-tauri/src/radios/wiring.rs +++ b/src-tauri/src/radios/wiring.rs @@ -683,3 +683,70 @@ fn every_settings_schema_uses_only_field_types_the_form_can_render() { } assert!(checked > 100, "only {checked} fields checked — this would pass vacuously"); } + +/// ★ Every settings schema lands on the same tabs as every other radio (#131). +/// +/// The form splits each radio into the shared `SETTINGS_GROUPS` tabs — General, +/// Display, Sounds, APRS and the rest — by the `group` each section names. A +/// section with no group, or a group the list does not know, still renders: it +/// quietly falls to General, which is exactly how the editors drifted apart in +/// the first place. A field ahead of the first heading has no section to take a +/// group from at all. +/// +/// The list is read out of `src/lib/profiles.ts`, so adding a tab there is the +/// whole change and this guard follows it. +#[test] +fn every_settings_section_names_a_tab_the_form_draws() { + let profiles = read(&manifest_dir().join("../src/lib/profiles.ts")); + let decl = profiles + .split("export const SETTINGS_GROUPS = [") + .nth(1) + .and_then(|s| s.split(']').next()) + .expect("SETTINGS_GROUPS is declared in src/lib/profiles.ts"); + let groups: Vec<&str> = decl + .split(',') + .map(|s| s.trim().trim_matches('"')) + .filter(|s| !s.is_empty()) + .collect(); + assert!( + groups.contains(&"General") && groups.contains(&"APRS") && groups.len() >= 8, + "the list did not parse as expected: {groups:?}" + ); + + let mut sections = 0; + for (name, _, schema_json) in crate::seed::model_capability_rows() { + if schema_json.trim() == "[]" { + continue; + } + let schema: Vec = + serde_json::from_str(schema_json).unwrap_or_else(|e| panic!("{name}: {e}")); + assert_eq!( + schema.first().map(|f| &f["type"]), + Some(&serde_json::json!("section")), + "{name}: the schema must open with a section heading, or its first fields \ + have no group to take a tab from" + ); + for f in &schema { + let key = f["key"].as_str().unwrap_or_default(); + let group = f.get("group").and_then(|g| g.as_str()); + if f["type"] == "section" { + sections += 1; + let group = group.unwrap_or_else(|| { + panic!("{name}: section {key:?} names no `group` — one of {groups:?}") + }); + assert!( + groups.contains(&group), + "{name}: section {key:?} is grouped {group:?}, which is not a tab the \ + form draws. The form knows {groups:?}." + ); + } else if let Some(group) = group { + assert!( + groups.contains(&group), + "{name}: field {key:?} is grouped {group:?}, which is not a tab the \ + form draws. The form knows {groups:?}." + ); + } + } + } + assert!(sections > 50, "only {sections} sections checked — this would pass vacuously"); +} diff --git a/src-tauri/src/seed.rs b/src-tauri/src/seed.rs index bdb5943..a5a0091 100644 --- a/src-tauri/src/seed.rs +++ b/src-tauri/src/seed.rs @@ -275,36 +275,50 @@ fn models() -> Vec { // calibration group are intentionally omitted. Keys match CHIRP's // RadioSetting names so a future CHIRP-.img exporter can map directly. non_channel_settings_schema: r#"[ - {"key": "squelch", "label": "Carrier Squelch Level", "type": "integer", "min": 0, "max": 9}, + {"key": "section-general", "label": "General", "type": "section", "group": "General"}, {"key": "save", "label": "Battery Saver", "type": "select", "options": ["Off", "1:1", "1:2", "1:3", "1:4"]}, + {"key": "autolk", "label": "Automatic Key Lock", "type": "boolean"}, + {"key": "keylock", "label": "Keypad Lock", "type": "boolean"}, + {"key": "almod", "label": "Alarm Mode", "type": "select", "options": ["Site", "Tone", "Code"]}, + {"key": "fmradio", "label": "Broadcast FM Radio", "type": "boolean"}, + {"key": "reset", "label": "RESET Menu Enabled", "type": "boolean"}, + {"key": "menu", "label": "All Menus Enabled", "type": "boolean"}, + {"key": "section-display", "label": "Display", "type": "section", "group": "Display"}, {"key": "abr", "label": "Backlight Timeout (s)", "type": "integer", "min": 0, "max": 24}, - {"key": "beep", "label": "Key Beep", "type": "boolean"}, - {"key": "timeout", "label": "Timeout Timer", "type": "select", "options": ["15 sec", "30 sec", "45 sec", "60 sec", "75 sec", "90 sec", "105 sec", "120 sec", "135 sec", "150 sec", "165 sec", "180 sec", "195 sec", "210 sec", "225 sec", "240 sec", "255 sec", "270 sec", "285 sec", "300 sec", "315 sec", "330 sec", "345 sec", "360 sec", "375 sec", "390 sec", "405 sec", "420 sec", "435 sec", "450 sec", "465 sec", "480 sec", "495 sec", "510 sec", "525 sec", "540 sec", "555 sec", "570 sec", "585 sec", "600 sec", "Off (if supported by radio)"]}, {"key": "mdfa", "label": "Display Mode (A)", "type": "select", "options": ["Channel", "Name", "Frequency"]}, {"key": "mdfb", "label": "Display Mode (B)", "type": "select", "options": ["Channel", "Name", "Frequency"]}, + {"key": "displayab", "label": "Display Side", "type": "select", "options": ["A", "B"]}, {"key": "wtled", "label": "Standby LED Color", "type": "select", "options": ["Off", "Blue", "Orange", "Purple"]}, {"key": "rxled", "label": "RX LED Color", "type": "select", "options": ["Off", "Blue", "Orange", "Purple"]}, {"key": "txled", "label": "TX LED Color", "type": "select", "options": ["Off", "Blue", "Orange", "Purple"]}, + {"key": "poweron_msg.line1", "label": "Power-On Message Line 1", "type": "text", "max_length": 7}, + {"key": "poweron_msg.line2", "label": "Power-On Message Line 2", "type": "text", "max_length": 7}, + {"key": "section-sounds", "label": "Sounds", "type": "section", "group": "Sounds"}, + {"key": "beep", "label": "Key Beep", "type": "boolean"}, {"key": "roger", "label": "Roger Beep", "type": "boolean"}, + {"key": "voice", "label": "Voice Prompt", "type": "select", "options": ["Off", "English", "Chinese"]}, + {"key": "section-transmit-and-receive", "label": "Transmit & Receive", "type": "section", "group": "Transmit & Receive"}, + {"key": "squelch", "label": "Carrier Squelch Level", "type": "integer", "min": 0, "max": 9}, + {"key": "timeout", "label": "Timeout Timer", "type": "select", "options": ["15 sec", "30 sec", "45 sec", "60 sec", "75 sec", "90 sec", "105 sec", "120 sec", "135 sec", "150 sec", "165 sec", "180 sec", "195 sec", "210 sec", "225 sec", "240 sec", "255 sec", "270 sec", "285 sec", "300 sec", "315 sec", "330 sec", "345 sec", "360 sec", "375 sec", "390 sec", "405 sec", "420 sec", "435 sec", "450 sec", "465 sec", "480 sec", "495 sec", "510 sec", "525 sec", "540 sec", "555 sec", "570 sec", "585 sec", "600 sec", "Off (if supported by radio)"]}, {"key": "vox", "label": "VOX Sensitivity", "type": "select", "options": ["OFF", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]}, {"key": "tdr", "label": "Dual Watch", "type": "boolean"}, {"key": "tdrab", "label": "Dual Watch TX Priority", "type": "select", "options": ["Off", "A", "B"]}, - {"key": "almod", "label": "Alarm Mode", "type": "select", "options": ["Site", "Tone", "Code"]}, - {"key": "voice", "label": "Voice Prompt", "type": "select", "options": ["Off", "English", "Chinese"]}, - {"key": "screv", "label": "Scan Resume", "type": "select", "options": ["TO", "CO", "SE"]}, {"key": "bcl", "label": "Busy Channel Lockout", "type": "boolean"}, - {"key": "autolk", "label": "Automatic Key Lock", "type": "boolean"}, - {"key": "fmradio", "label": "Broadcast FM Radio", "type": "boolean"}, {"key": "ste", "label": "Squelch Tail Eliminate (HT to HT)", "type": "boolean"}, {"key": "rpste", "label": "Squelch Tail Eliminate (repeater)", "type": "select", "options": ["OFF", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]}, {"key": "rptrl", "label": "STE Repeater Delay", "type": "select", "options": ["OFF", "100 ms", "200 ms", "300 ms", "400 ms", "500 ms", "600 ms", "700 ms", "800 ms", "900 ms", "1000 ms"]}, - {"key": "reset", "label": "RESET Menu Enabled", "type": "boolean"}, - {"key": "menu", "label": "All Menus Enabled", "type": "boolean"}, - {"key": "displayab", "label": "Display Side", "type": "select", "options": ["A", "B"]}, + {"key": "section-band-limits", "label": "Band Limits", "type": "section", "group": "Transmit & Receive"}, + {"key": "limits.vhf.lower", "label": "VHF Lower Limit (MHz)", "type": "integer", "min": 1, "max": 1000}, + {"key": "limits.vhf.upper", "label": "VHF Upper Limit (MHz)", "type": "integer", "min": 1, "max": 1000}, + {"key": "limits.vhf.enable", "label": "VHF TX Enabled", "type": "boolean"}, + {"key": "limits.uhf.lower", "label": "UHF Lower Limit (MHz)", "type": "integer", "min": 1, "max": 1000}, + {"key": "limits.uhf.upper", "label": "UHF Upper Limit (MHz)", "type": "integer", "min": 1, "max": 1000}, + {"key": "limits.uhf.enable", "label": "UHF TX Enabled", "type": "boolean"}, + {"key": "section-memory-and-vfo", "label": "Memory & VFO", "type": "section", "group": "Memory & VFO"}, {"key": "workmode", "label": "VFO/MR Mode", "type": "select", "options": ["Frequency", "Channel"]}, - {"key": "keylock", "label": "Keypad Lock", "type": "boolean"}, {"key": "wmchannel.mrcha", "label": "MR A Channel", "type": "integer", "min": 0, "max": 127}, {"key": "wmchannel.mrchb", "label": "MR B Channel", "type": "integer", "min": 0, "max": 127}, + {"key": "section-vfo", "label": "VFO A / B", "type": "section", "group": "Memory & VFO"}, {"key": "vfoa.freq", "label": "VFO A Frequency (MHz)", "type": "text", "max_length": 10}, {"key": "vfob.freq", "label": "VFO B Frequency (MHz)", "type": "text", "max_length": 10}, {"key": "vfoa.sftd", "label": "VFO A Shift", "type": "select", "options": ["Off", "+", "-"]}, @@ -319,6 +333,17 @@ fn models() -> Vec { {"key": "vfob.scode", "label": "VFO B PTT-ID", "type": "select", "options": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"]}, {"key": "vfoa.step", "label": "VFO A Tuning Step", "type": "select", "options": ["2.5", "5.0", "6.25", "10.0", "12.5", "25.0"]}, {"key": "vfob.step", "label": "VFO B Tuning Step", "type": "select", "options": ["2.5", "5.0", "6.25", "10.0", "12.5", "25.0"]}, + {"key": "section-scan", "label": "Scan", "type": "section", "group": "Scan"}, + {"key": "screv", "label": "Scan Resume", "type": "select", "options": ["TO", "CO", "SE"]}, + {"key": "section-dtmf", "label": "DTMF & ANI", "type": "section", "group": "DTMF & Signaling"}, + {"key": "dtmfst", "label": "DTMF Sidetone", "type": "select", "options": ["OFF", "DT-ST", "ANI-ST", "DT+ANI"]}, + {"key": "ani.dtmfon", "label": "DTMF Speed (on)", "type": "select", "options": ["50 ms", "60 ms", "70 ms", "80 ms", "90 ms", "100 ms", "110 ms", "120 ms", "130 ms", "140 ms", "150 ms", "160 ms", "170 ms", "180 ms", "190 ms", "200 ms", "210 ms", "220 ms", "230 ms", "240 ms", "250 ms", "260 ms", "270 ms", "280 ms", "290 ms", "300 ms", "310 ms", "320 ms", "330 ms", "340 ms", "350 ms", "360 ms", "370 ms", "380 ms", "390 ms", "400 ms", "410 ms", "420 ms", "430 ms", "440 ms", "450 ms", "460 ms", "470 ms", "480 ms", "490 ms", "500 ms", "510 ms", "520 ms", "530 ms", "540 ms", "550 ms", "560 ms", "570 ms", "580 ms", "590 ms", "600 ms", "610 ms", "620 ms", "630 ms", "640 ms", "650 ms", "660 ms", "670 ms", "680 ms", "690 ms", "700 ms", "710 ms", "720 ms", "730 ms", "740 ms", "750 ms", "760 ms", "770 ms", "780 ms", "790 ms", "800 ms", "810 ms", "820 ms", "830 ms", "840 ms", "850 ms", "860 ms", "870 ms", "880 ms", "890 ms", "900 ms", "910 ms", "920 ms", "930 ms", "940 ms", "950 ms", "960 ms", "970 ms", "980 ms", "990 ms", "1000 ms", "1010 ms", "1020 ms", "1030 ms", "1040 ms", "1050 ms", "1060 ms", "1070 ms", "1080 ms", "1090 ms", "1100 ms", "1110 ms", "1120 ms", "1130 ms", "1140 ms", "1150 ms", "1160 ms", "1170 ms", "1180 ms", "1190 ms", "1200 ms", "1210 ms", "1220 ms", "1230 ms", "1240 ms", "1250 ms", "1260 ms", "1270 ms", "1280 ms", "1290 ms", "1300 ms", "1310 ms", "1320 ms", "1330 ms", "1340 ms", "1350 ms", "1360 ms", "1370 ms", "1380 ms", "1390 ms", "1400 ms", "1410 ms", "1420 ms", "1430 ms", "1440 ms", "1450 ms", "1460 ms", "1470 ms", "1480 ms", "1490 ms", "1500 ms", "1510 ms", "1520 ms", "1530 ms", "1540 ms", "1550 ms", "1560 ms", "1570 ms", "1580 ms", "1590 ms", "1600 ms", "1610 ms", "1620 ms", "1630 ms", "1640 ms", "1650 ms", "1660 ms", "1670 ms", "1680 ms", "1690 ms", "1700 ms", "1710 ms", "1720 ms", "1730 ms", "1740 ms", "1750 ms", "1760 ms", "1770 ms", "1780 ms", "1790 ms", "1800 ms", "1810 ms", "1820 ms", "1830 ms", "1840 ms", "1850 ms", "1860 ms", "1870 ms", "1880 ms", "1890 ms", "1900 ms", "1910 ms", "1920 ms", "1930 ms", "1940 ms", "1950 ms", "1960 ms", "1970 ms", "1980 ms", "1990 ms", "2000 ms"]}, + {"key": "ani.dtmfoff", "label": "DTMF Speed (off)", "type": "select", "options": ["50 ms", "60 ms", "70 ms", "80 ms", "90 ms", "100 ms", "110 ms", "120 ms", "130 ms", "140 ms", "150 ms", "160 ms", "170 ms", "180 ms", "190 ms", "200 ms", "210 ms", "220 ms", "230 ms", "240 ms", "250 ms", "260 ms", "270 ms", "280 ms", "290 ms", "300 ms", "310 ms", "320 ms", "330 ms", "340 ms", "350 ms", "360 ms", "370 ms", "380 ms", "390 ms", "400 ms", "410 ms", "420 ms", "430 ms", "440 ms", "450 ms", "460 ms", "470 ms", "480 ms", "490 ms", "500 ms", "510 ms", "520 ms", "530 ms", "540 ms", "550 ms", "560 ms", "570 ms", "580 ms", "590 ms", "600 ms", "610 ms", "620 ms", "630 ms", "640 ms", "650 ms", "660 ms", "670 ms", "680 ms", "690 ms", "700 ms", "710 ms", "720 ms", "730 ms", "740 ms", "750 ms", "760 ms", "770 ms", "780 ms", "790 ms", "800 ms", "810 ms", "820 ms", "830 ms", "840 ms", "850 ms", "860 ms", "870 ms", "880 ms", "890 ms", "900 ms", "910 ms", "920 ms", "930 ms", "940 ms", "950 ms", "960 ms", "970 ms", "980 ms", "990 ms", "1000 ms", "1010 ms", "1020 ms", "1030 ms", "1040 ms", "1050 ms", "1060 ms", "1070 ms", "1080 ms", "1090 ms", "1100 ms", "1110 ms", "1120 ms", "1130 ms", "1140 ms", "1150 ms", "1160 ms", "1170 ms", "1180 ms", "1190 ms", "1200 ms", "1210 ms", "1220 ms", "1230 ms", "1240 ms", "1250 ms", "1260 ms", "1270 ms", "1280 ms", "1290 ms", "1300 ms", "1310 ms", "1320 ms", "1330 ms", "1340 ms", "1350 ms", "1360 ms", "1370 ms", "1380 ms", "1390 ms", "1400 ms", "1410 ms", "1420 ms", "1430 ms", "1440 ms", "1450 ms", "1460 ms", "1470 ms", "1480 ms", "1490 ms", "1500 ms", "1510 ms", "1520 ms", "1530 ms", "1540 ms", "1550 ms", "1560 ms", "1570 ms", "1580 ms", "1590 ms", "1600 ms", "1610 ms", "1620 ms", "1630 ms", "1640 ms", "1650 ms", "1660 ms", "1670 ms", "1680 ms", "1690 ms", "1700 ms", "1710 ms", "1720 ms", "1730 ms", "1740 ms", "1750 ms", "1760 ms", "1770 ms", "1780 ms", "1790 ms", "1800 ms", "1810 ms", "1820 ms", "1830 ms", "1840 ms", "1850 ms", "1860 ms", "1870 ms", "1880 ms", "1890 ms", "1900 ms", "1910 ms", "1920 ms", "1930 ms", "1940 ms", "1950 ms", "1960 ms", "1970 ms", "1980 ms", "1990 ms", "2000 ms"]}, + {"key": "pttlt", "label": "PTT ID Delay", "type": "integer", "min": 0, "max": 50}, + {"key": "ani.code", "label": "ANI Code", "type": "text", "max_length": 5}, + {"key": "ani.aniid", "label": "ANI ID", "type": "select", "options": ["Off", "BOT", "EOT", "Both"]}, + {"key": "ani.alarmcode", "label": "Alarm Code", "type": "text", "max_length": 3}, + {"key": "section-ptt-id-codes", "label": "PTT ID Codes", "type": "section", "group": "DTMF & Signaling"}, {"key": "pttid/0.code", "label": "PTT ID Code 1", "type": "text", "max_length": 5}, {"key": "pttid/1.code", "label": "PTT ID Code 2", "type": "text", "max_length": 5}, {"key": "pttid/2.code", "label": "PTT ID Code 3", "type": "text", "max_length": 5}, @@ -333,22 +358,7 @@ fn models() -> Vec { {"key": "pttid/11.code", "label": "PTT ID Code 12", "type": "text", "max_length": 5}, {"key": "pttid/12.code", "label": "PTT ID Code 13", "type": "text", "max_length": 5}, {"key": "pttid/13.code", "label": "PTT ID Code 14", "type": "text", "max_length": 5}, - {"key": "pttid/14.code", "label": "PTT ID Code 15", "type": "text", "max_length": 5}, - {"key": "ani.code", "label": "ANI Code", "type": "text", "max_length": 5}, - {"key": "ani.aniid", "label": "ANI ID", "type": "select", "options": ["Off", "BOT", "EOT", "Both"]}, - {"key": "ani.alarmcode", "label": "Alarm Code", "type": "text", "max_length": 3}, - {"key": "dtmfst", "label": "DTMF Sidetone", "type": "select", "options": ["OFF", "DT-ST", "ANI-ST", "DT+ANI"]}, - {"key": "ani.dtmfon", "label": "DTMF Speed (on)", "type": "select", "options": ["50 ms", "60 ms", "70 ms", "80 ms", "90 ms", "100 ms", "110 ms", "120 ms", "130 ms", "140 ms", "150 ms", "160 ms", "170 ms", "180 ms", "190 ms", "200 ms", "210 ms", "220 ms", "230 ms", "240 ms", "250 ms", "260 ms", "270 ms", "280 ms", "290 ms", "300 ms", "310 ms", "320 ms", "330 ms", "340 ms", "350 ms", "360 ms", "370 ms", "380 ms", "390 ms", "400 ms", "410 ms", "420 ms", "430 ms", "440 ms", "450 ms", "460 ms", "470 ms", "480 ms", "490 ms", "500 ms", "510 ms", "520 ms", "530 ms", "540 ms", "550 ms", "560 ms", "570 ms", "580 ms", "590 ms", "600 ms", "610 ms", "620 ms", "630 ms", "640 ms", "650 ms", "660 ms", "670 ms", "680 ms", "690 ms", "700 ms", "710 ms", "720 ms", "730 ms", "740 ms", "750 ms", "760 ms", "770 ms", "780 ms", "790 ms", "800 ms", "810 ms", "820 ms", "830 ms", "840 ms", "850 ms", "860 ms", "870 ms", "880 ms", "890 ms", "900 ms", "910 ms", "920 ms", "930 ms", "940 ms", "950 ms", "960 ms", "970 ms", "980 ms", "990 ms", "1000 ms", "1010 ms", "1020 ms", "1030 ms", "1040 ms", "1050 ms", "1060 ms", "1070 ms", "1080 ms", "1090 ms", "1100 ms", "1110 ms", "1120 ms", "1130 ms", "1140 ms", "1150 ms", "1160 ms", "1170 ms", "1180 ms", "1190 ms", "1200 ms", "1210 ms", "1220 ms", "1230 ms", "1240 ms", "1250 ms", "1260 ms", "1270 ms", "1280 ms", "1290 ms", "1300 ms", "1310 ms", "1320 ms", "1330 ms", "1340 ms", "1350 ms", "1360 ms", "1370 ms", "1380 ms", "1390 ms", "1400 ms", "1410 ms", "1420 ms", "1430 ms", "1440 ms", "1450 ms", "1460 ms", "1470 ms", "1480 ms", "1490 ms", "1500 ms", "1510 ms", "1520 ms", "1530 ms", "1540 ms", "1550 ms", "1560 ms", "1570 ms", "1580 ms", "1590 ms", "1600 ms", "1610 ms", "1620 ms", "1630 ms", "1640 ms", "1650 ms", "1660 ms", "1670 ms", "1680 ms", "1690 ms", "1700 ms", "1710 ms", "1720 ms", "1730 ms", "1740 ms", "1750 ms", "1760 ms", "1770 ms", "1780 ms", "1790 ms", "1800 ms", "1810 ms", "1820 ms", "1830 ms", "1840 ms", "1850 ms", "1860 ms", "1870 ms", "1880 ms", "1890 ms", "1900 ms", "1910 ms", "1920 ms", "1930 ms", "1940 ms", "1950 ms", "1960 ms", "1970 ms", "1980 ms", "1990 ms", "2000 ms"]}, - {"key": "ani.dtmfoff", "label": "DTMF Speed (off)", "type": "select", "options": ["50 ms", "60 ms", "70 ms", "80 ms", "90 ms", "100 ms", "110 ms", "120 ms", "130 ms", "140 ms", "150 ms", "160 ms", "170 ms", "180 ms", "190 ms", "200 ms", "210 ms", "220 ms", "230 ms", "240 ms", "250 ms", "260 ms", "270 ms", "280 ms", "290 ms", "300 ms", "310 ms", "320 ms", "330 ms", "340 ms", "350 ms", "360 ms", "370 ms", "380 ms", "390 ms", "400 ms", "410 ms", "420 ms", "430 ms", "440 ms", "450 ms", "460 ms", "470 ms", "480 ms", "490 ms", "500 ms", "510 ms", "520 ms", "530 ms", "540 ms", "550 ms", "560 ms", "570 ms", "580 ms", "590 ms", "600 ms", "610 ms", "620 ms", "630 ms", "640 ms", "650 ms", "660 ms", "670 ms", "680 ms", "690 ms", "700 ms", "710 ms", "720 ms", "730 ms", "740 ms", "750 ms", "760 ms", "770 ms", "780 ms", "790 ms", "800 ms", "810 ms", "820 ms", "830 ms", "840 ms", "850 ms", "860 ms", "870 ms", "880 ms", "890 ms", "900 ms", "910 ms", "920 ms", "930 ms", "940 ms", "950 ms", "960 ms", "970 ms", "980 ms", "990 ms", "1000 ms", "1010 ms", "1020 ms", "1030 ms", "1040 ms", "1050 ms", "1060 ms", "1070 ms", "1080 ms", "1090 ms", "1100 ms", "1110 ms", "1120 ms", "1130 ms", "1140 ms", "1150 ms", "1160 ms", "1170 ms", "1180 ms", "1190 ms", "1200 ms", "1210 ms", "1220 ms", "1230 ms", "1240 ms", "1250 ms", "1260 ms", "1270 ms", "1280 ms", "1290 ms", "1300 ms", "1310 ms", "1320 ms", "1330 ms", "1340 ms", "1350 ms", "1360 ms", "1370 ms", "1380 ms", "1390 ms", "1400 ms", "1410 ms", "1420 ms", "1430 ms", "1440 ms", "1450 ms", "1460 ms", "1470 ms", "1480 ms", "1490 ms", "1500 ms", "1510 ms", "1520 ms", "1530 ms", "1540 ms", "1550 ms", "1560 ms", "1570 ms", "1580 ms", "1590 ms", "1600 ms", "1610 ms", "1620 ms", "1630 ms", "1640 ms", "1650 ms", "1660 ms", "1670 ms", "1680 ms", "1690 ms", "1700 ms", "1710 ms", "1720 ms", "1730 ms", "1740 ms", "1750 ms", "1760 ms", "1770 ms", "1780 ms", "1790 ms", "1800 ms", "1810 ms", "1820 ms", "1830 ms", "1840 ms", "1850 ms", "1860 ms", "1870 ms", "1880 ms", "1890 ms", "1900 ms", "1910 ms", "1920 ms", "1930 ms", "1940 ms", "1950 ms", "1960 ms", "1970 ms", "1980 ms", "1990 ms", "2000 ms"]}, - {"key": "pttlt", "label": "PTT ID Delay", "type": "integer", "min": 0, "max": 50}, - {"key": "poweron_msg.line1", "label": "Power-On Message Line 1", "type": "text", "max_length": 7}, - {"key": "poweron_msg.line2", "label": "Power-On Message Line 2", "type": "text", "max_length": 7}, - {"key": "limits.vhf.lower", "label": "VHF Lower Limit (MHz)", "type": "integer", "min": 1, "max": 1000}, - {"key": "limits.vhf.upper", "label": "VHF Upper Limit (MHz)", "type": "integer", "min": 1, "max": 1000}, - {"key": "limits.vhf.enable", "label": "VHF TX Enabled", "type": "boolean"}, - {"key": "limits.uhf.lower", "label": "UHF Lower Limit (MHz)", "type": "integer", "min": 1, "max": 1000}, - {"key": "limits.uhf.upper", "label": "UHF Upper Limit (MHz)", "type": "integer", "min": 1, "max": 1000}, - {"key": "limits.uhf.enable", "label": "UHF TX Enabled", "type": "boolean"} + {"key": "pttid/14.code", "label": "PTT ID Code 15", "type": "text", "max_length": 5} ]"#, }, // -------------------------------------------------------- @@ -523,69 +533,86 @@ fn models() -> Vec { // omitted (channel-like data, not a global setting). Defaults are // sensible factory-ish values (CHIRP reads them from the radio). non_channel_settings_schema: r##"[ - {"key": "squelch", "label": "Squelch Level", "type": "select", "options": ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]}, - {"key": "ligcon", "label": "Backlight Timeout", "type": "select", "options": ["CONT", "5s", "10s", "15s", "30s"]}, - {"key": "voiceprompt", "label": "Voice Prompt", "type": "boolean"}, + {"key": "section-general", "label": "General", "type": "section", "group": "General"}, + {"key": "save", "label": "Power Save", "type": "select", "options": ["Off", "1:1", "1:2", "1:3", "1:4", "1:8"]}, {"key": "keyautolock", "label": "Auto Keypad Lock", "type": "boolean"}, + {"key": "onlychmode", "label": "Channel Mode Only", "type": "boolean"}, + {"key": "alarm", "label": "Alarm Mode", "type": "select", "options": ["On site", "Alarm"]}, + {"key": "section-fm-radio", "label": "FM Radio", "type": "section", "group": "General"}, + {"key": "fmworkmode", "label": "FM Radio Work Mode", "type": "select", "options": ["VFO", "CH"]}, + {"key": "fmroad", "label": "FM Radio Channel", "type": "select", "options": ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"]}, + {"key": "fmvfo", "label": "FM Radio VFO (76.0-108.0 MHz)", "type": "text", "max_length": 6}, + {"key": "section-display", "label": "Display", "type": "section", "group": "Display"}, + {"key": "ligcon", "label": "Backlight Timeout", "type": "select", "options": ["CONT", "5s", "10s", "15s", "30s"]}, + {"key": "brightness", "label": "Brightness", "type": "select", "options": ["1", "2", "3", "4", "5"]}, {"key": "mdfa", "label": "Display Mode (A)", "type": "select", "options": ["Frequency", "Name"]}, {"key": "mdfb", "label": "Display Mode (B)", "type": "select", "options": ["Frequency", "Name"]}, - {"key": "sync", "label": "A/B Sync", "type": "boolean"}, - {"key": "save", "label": "Power Save", "type": "select", "options": ["Off", "1:1", "1:2", "1:3", "1:4", "1:8"]}, - {"key": "dbrx", "label": "Dual Receive", "type": "boolean"}, - {"key": "astep", "label": "Tuning Step (A)", "type": "select", "options": ["2.5", "5.0", "6.25", "10.0", "12.5", "25.0"]}, - {"key": "bstep", "label": "Tuning Step (B)", "type": "select", "options": ["2.5", "5.0", "6.25", "10.0", "12.5", "25.0"]}, - {"key": "scanmode", "label": "Scan Resume", "type": "select", "options": ["TO", "CO", "SE"]}, - {"key": "pritx", "label": "Priority TX", "type": "select", "options": ["Edit", "Busy"]}, - {"key": "btnvoice", "label": "Key Beep", "type": "boolean"}, - {"key": "rogerprompt", "label": "Roger Beep", "type": "select", "options": ["Off", "TONE1", "TONE2"]}, - {"key": "brightness", "label": "Brightness", "type": "select", "options": ["1", "2", "3", "4", "5"]}, {"key": "txled", "label": "Display LCD (TX)", "type": "boolean"}, {"key": "rxled", "label": "Display LCD (RX)", "type": "boolean"}, - {"key": "onlychmode", "label": "Channel Mode Only", "type": "boolean"}, - {"key": "ssidekey1", "label": "PF1 Key (Short Press)", "type": "select", "options": ["None", "FM Radio", "Lamp", "Monitor", "TONE", "Alarm", "Weather"]}, - {"key": "lsidekey3", "label": "PF1 Key (Long Press)", "type": "select", "options": ["None", "FM Radio", "Lamp", "Monitor", "TONE", "Alarm", "Weather"]}, + {"key": "breathled", "label": "Breathing LED", "type": "select", "options": ["Off", "5S", "10S", "15S", "30S"]}, + {"key": "lang", "label": "Language", "type": "select", "options": ["Chinese", "English"]}, + {"key": "ponmsg", "label": "Power-On Display", "type": "select", "options": ["Off", "Msg", "Icon"]}, + {"key": "poweron_msg.msg1", "label": "Power-On Message 1", "type": "text", "max_length": 16}, + {"key": "poweron_msg.msg2", "label": "Power-On Message 2", "type": "text", "max_length": 16}, + {"key": "poweron_msg.msg3", "label": "Power-On Message 3", "type": "text", "max_length": 16}, + {"key": "section-sounds", "label": "Sounds", "type": "section", "group": "Sounds"}, + {"key": "voiceprompt", "label": "Voice Prompt", "type": "boolean"}, + {"key": "btnvoice", "label": "Key Beep", "type": "boolean"}, + {"key": "rogerprompt", "label": "Roger Beep", "type": "select", "options": ["Off", "TONE1", "TONE2"]}, + {"key": "section-transmit-and-receive", "label": "Transmit & Receive", "type": "section", "group": "Transmit & Receive"}, + {"key": "squelch", "label": "Squelch Level", "type": "select", "options": ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]}, + {"key": "tot", "label": "Time-Out Timer", "type": "select", "options": ["Off", "30S", "60S", "90S", "120S", "150S", "180S", "210S"]}, + {"key": "dbrx", "label": "Dual Receive", "type": "boolean"}, + {"key": "pritx", "label": "Priority TX", "type": "select", "options": ["Edit", "Busy"]}, {"key": "tonevoice", "label": "Repeater Tone Burst", "type": "select", "options": ["1000 Hz", "1450 Hz", "1750 Hz", "2100 Hz"]}, {"key": "tailclean", "label": "QT/DQT Tail Elimination", "type": "boolean"}, {"key": "fmrec", "label": "Default Bandwidth", "type": "select", "options": ["Wide", "Narrow"]}, - {"key": "lang", "label": "Language", "type": "select", "options": ["Chinese", "English"]}, - {"key": "alarm", "label": "Alarm Mode", "type": "select", "options": ["On site", "Alarm"]}, + {"key": "micgain", "label": "Mic Gain", "type": "select", "options": ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]}, + {"key": "voxgain", "label": "VOX Gain", "type": "select", "options": ["Off", "1", "2", "3", "4", "5"]}, + {"key": "voxdelay", "label": "VOX Delay", "type": "select", "options": ["1.05s", "2.0s", "3.0s"]}, + {"key": "section-band-enables", "label": "Band Enables", "type": "section", "group": "Transmit & Receive"}, {"key": "amband", "label": "AM Band Enable", "type": "boolean"}, - {"key": "tot", "label": "Time-Out Timer", "type": "select", "options": ["Off", "30S", "60S", "90S", "120S", "150S", "180S", "210S"]}, {"key": "tx220", "label": "TX 220 MHz Enable", "type": "boolean"}, {"key": "tx350", "label": "TX 350 MHz Enable", "type": "boolean"}, {"key": "tx500", "label": "TX 500 MHz Enable", "type": "boolean"}, - {"key": "scanband", "label": "Scan Band", "type": "select", "options": ["All", "0.5M", "1.0M", "1.5M", "2.0M", "2.5M", "3.0M", "3.5M", "4.0M", "4.5M", "5.0M"]}, - {"key": "voxgain", "label": "VOX Gain", "type": "select", "options": ["Off", "1", "2", "3", "4", "5"]}, - {"key": "voxdelay", "label": "VOX Delay", "type": "select", "options": ["1.05s", "2.0s", "3.0s"]}, - {"key": "breathled", "label": "Breathing LED", "type": "select", "options": ["Off", "5S", "10S", "15S", "30S"]}, - {"key": "ponmsg", "label": "Power-On Display", "type": "select", "options": ["Off", "Msg", "Icon"]}, - {"key": "micgain", "label": "Mic Gain", "type": "select", "options": ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]}, - {"key": "kill", "label": "Remote Kill Enable", "type": "boolean"}, - {"key": "stun", "label": "Remote Stun Enable", "type": "boolean"}, - {"key": "poweron_msg.msg1", "label": "Power-On Message 1", "type": "text", "max_length": 16}, - {"key": "poweron_msg.msg2", "label": "Power-On Message 2", "type": "text", "max_length": 16}, - {"key": "poweron_msg.msg3", "label": "Power-On Message 3", "type": "text", "max_length": 16}, + {"key": "section-memory-and-vfo", "label": "Memory & VFO", "type": "section", "group": "Memory & VFO"}, + {"key": "sync", "label": "A/B Sync", "type": "boolean"}, + {"key": "astep", "label": "Tuning Step (A)", "type": "select", "options": ["2.5", "5.0", "6.25", "10.0", "12.5", "25.0"]}, + {"key": "bstep", "label": "Tuning Step (B)", "type": "select", "options": ["2.5", "5.0", "6.25", "10.0", "12.5", "25.0"]}, + {"key": "section-vfo", "label": "VFO A / B", "type": "section", "group": "Memory & VFO"}, {"key": "rxfreqa", "label": "VFO A Frequency (MHz)", "type": "text", "max_length": 10}, - {"key": "a", "label": "VFO A Offset (MHz)", "type": "text", "max_length": 10}, - {"key": "dira", "label": "VFO A Offset Direction", "type": "select", "options": ["Off", "-", "+"]}, - {"key": "lowpower", "label": "VFO A Power", "type": "select", "options": ["Low", "High"]}, - {"key": "wide", "label": "VFO A Bandwidth", "type": "select", "options": ["Wide", "Narrow"]}, - {"key": "bcl", "label": "VFO A Busy Lockout", "type": "boolean"}, - {"key": "specialqta", "label": "VFO A Special QT/DQT", "type": "boolean"}, - {"key": "aworkmode", "label": "VFO A Work Mode", "type": "select", "options": ["VFO", "VFO+CH", "CH Mode"]}, {"key": "rxfreqb", "label": "VFO B Frequency (MHz)", "type": "text", "max_length": 10}, + {"key": "a", "label": "VFO A Offset (MHz)", "type": "text", "max_length": 10}, {"key": "b", "label": "VFO B Offset (MHz)", "type": "text", "max_length": 10}, + {"key": "dira", "label": "VFO A Offset Direction", "type": "select", "options": ["Off", "-", "+"]}, {"key": "dirb", "label": "VFO B Offset Direction", "type": "select", "options": ["Off", "-", "+"]}, + {"key": "lowpower", "label": "VFO A Power", "type": "select", "options": ["Low", "High"]}, {"key": "lowpowerb", "label": "VFO B Power", "type": "select", "options": ["Low", "High"]}, + {"key": "wide", "label": "VFO A Bandwidth", "type": "select", "options": ["Wide", "Narrow"]}, {"key": "wideb", "label": "VFO B Bandwidth", "type": "select", "options": ["Wide", "Narrow"]}, + {"key": "bcl", "label": "VFO A Busy Lockout", "type": "boolean"}, {"key": "bclb", "label": "VFO B Busy Lockout", "type": "boolean"}, + {"key": "specialqta", "label": "VFO A Special QT/DQT", "type": "boolean"}, {"key": "specialqtb", "label": "VFO B Special QT/DQT", "type": "boolean"}, + {"key": "aworkmode", "label": "VFO A Work Mode", "type": "select", "options": ["VFO", "VFO+CH", "CH Mode"]}, {"key": "bworkmode", "label": "VFO B Work Mode", "type": "select", "options": ["VFO", "VFO+CH", "CH Mode"]}, - {"key": "fmworkmode", "label": "FM Radio Work Mode", "type": "select", "options": ["VFO", "CH"]}, - {"key": "fmroad", "label": "FM Radio Channel", "type": "select", "options": ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"]}, - {"key": "fmvfo", "label": "FM Radio VFO (76.0-108.0 MHz)", "type": "text", "max_length": 6}, + {"key": "section-scan", "label": "Scan", "type": "section", "group": "Scan"}, + {"key": "scanmode", "label": "Scan Resume", "type": "select", "options": ["TO", "CO", "SE"]}, + {"key": "scanband", "label": "Scan Band", "type": "select", "options": ["All", "0.5M", "1.0M", "1.5M", "2.0M", "2.5M", "3.0M", "3.5M", "4.0M", "4.5M", "5.0M"]}, + {"key": "section-keys", "label": "Side Keys", "type": "section", "group": "Keys"}, + {"key": "ssidekey1", "label": "PF1 Key (Short Press)", "type": "select", "options": ["None", "FM Radio", "Lamp", "Monitor", "TONE", "Alarm", "Weather"]}, + {"key": "lsidekey3", "label": "PF1 Key (Long Press)", "type": "select", "options": ["None", "FM Radio", "Lamp", "Monitor", "TONE", "Alarm", "Weather"]}, + {"key": "section-dtmf", "label": "DTMF", "type": "section", "group": "DTMF & Signaling"}, + {"key": "dtmfst", "label": "DTMF Side Tone", "type": "boolean"}, + {"key": "dtmfdecode", "label": "DTMF Decode Enable", "type": "boolean"}, + {"key": "dtmfspeed", "label": "DTMF Speed", "type": "select", "options": ["80ms", "90ms", "100ms", "110ms", "120ms", "130ms", "140ms", "150ms"]}, + {"key": "dtmfautorst", "label": "DTMF Auto Reset Time", "type": "select", "options": ["Off", "5S", "10S", "15S"]}, + {"key": "dtmfdecoderesp", "label": "DTMF Decode Response", "type": "select", "options": ["NULL", "RING", "REPLY", "BOTH"]}, {"key": "gcode", "label": "DTMF Group Code", "type": "select", "options": ["Off", "*", "#", "A", "B", "C", "D"]}, {"key": "icode", "label": "DTMF ID Code", "type": "text", "max_length": 3}, + {"key": "scode", "label": "PTT ID Start Code (BOT)", "type": "text", "max_length": 7}, + {"key": "ecode", "label": "PTT ID End Code (EOT)", "type": "text", "max_length": 7}, + {"key": "section-dtmf-groups", "label": "DTMF Groups", "type": "section", "group": "DTMF & Signaling"}, {"key": "group1", "label": "DTMF Group 1", "type": "text", "max_length": 7}, {"key": "group2", "label": "DTMF Group 2", "type": "text", "max_length": 7}, {"key": "group3", "label": "DTMF Group 3", "type": "text", "max_length": 7}, @@ -594,15 +621,11 @@ fn models() -> Vec { {"key": "group6", "label": "DTMF Group 6", "type": "text", "max_length": 7}, {"key": "group7", "label": "DTMF Group 7", "type": "text", "max_length": 7}, {"key": "group8", "label": "DTMF Group 8", "type": "text", "max_length": 7}, - {"key": "scode", "label": "PTT ID Start Code (BOT)", "type": "text", "max_length": 7}, - {"key": "ecode", "label": "PTT ID End Code (EOT)", "type": "text", "max_length": 7}, + {"key": "section-remote-stun-kill", "label": "Remote Stun / Kill", "type": "section", "group": "DTMF & Signaling"}, + {"key": "stun", "label": "Remote Stun Enable", "type": "boolean"}, {"key": "stuncode", "label": "Stun Code", "type": "text", "max_length": 16}, - {"key": "killcode", "label": "Kill Code", "type": "text", "max_length": 16}, - {"key": "dtmfst", "label": "DTMF Side Tone", "type": "boolean"}, - {"key": "dtmfdecode", "label": "DTMF Decode Enable", "type": "boolean"}, - {"key": "dtmfautorst", "label": "DTMF Auto Reset Time", "type": "select", "options": ["Off", "5S", "10S", "15S"]}, - {"key": "dtmfdecoderesp", "label": "DTMF Decode Response", "type": "select", "options": ["NULL", "RING", "REPLY", "BOTH"]}, - {"key": "dtmfspeed", "label": "DTMF Speed", "type": "select", "options": ["80ms", "90ms", "100ms", "110ms", "120ms", "130ms", "140ms", "150ms"]} + {"key": "kill", "label": "Remote Kill Enable", "type": "boolean"}, + {"key": "killcode", "label": "Kill Code", "type": "text", "max_length": 16} ]"##, }, // -------------------------------------------------------- diff --git a/src-tauri/src/thd72_settings_schema.json b/src-tauri/src/thd72_settings_schema.json index ce5ab3a..b558b5d 100644 --- a/src-tauri/src/thd72_settings_schema.json +++ b/src-tauri/src/thd72_settings_schema.json @@ -2,7 +2,8 @@ { "key": "section-display", "label": "Display", - "type": "section" + "type": "section", + "group": "Display" }, { "key": "lamp-timer", @@ -37,7 +38,8 @@ { "key": "section-battery", "label": "Battery", - "type": "section" + "type": "section", + "group": "General" }, { "key": "battery-saver", @@ -71,7 +73,8 @@ { "key": "section-audio", "label": "Audio", - "type": "section" + "type": "section", + "group": "Sounds" }, { "key": "key-beep", @@ -99,7 +102,8 @@ { "key": "section-radio", "label": "Radio", - "type": "section" + "type": "section", + "group": "Transmit & Receive" }, { "key": "vhf-aip", @@ -139,7 +143,8 @@ { "key": "section-vox", "label": "VOX", - "type": "section" + "type": "section", + "group": "Transmit & Receive" }, { "key": "vox", @@ -175,7 +180,8 @@ { "key": "section-memory", "label": "Memory", - "type": "section" + "type": "section", + "group": "Memory & VFO" }, { "key": "recall-method", @@ -189,7 +195,8 @@ { "key": "section-scan", "label": "Scan", - "type": "section" + "type": "section", + "group": "Scan" }, { "key": "scan-resume", @@ -218,7 +225,8 @@ { "key": "image-common1", "label": "Common 1", - "type": "section" + "type": "section", + "group": "General" }, { "key": "common1-1144", @@ -258,6 +266,7 @@ "key": "common1-1029", "label": "Panel PF Key — PF1", "type": "select", + "group": "Keys", "options": [ "WX", "GROUP UP", @@ -423,6 +432,7 @@ "key": "common1-1157", "label": "Lamp control", "type": "select", + "group": "Display", "options": [ "Manual", "Auto" @@ -431,7 +441,8 @@ { "key": "image-common2", "label": "Common 2", - "type": "section" + "type": "section", + "group": "Transmit & Receive" }, { "key": "common2-1186", @@ -466,12 +477,14 @@ { "key": "common2-1291", "label": "Display Memory Name", - "type": "boolean" + "type": "boolean", + "group": "Display" }, { "key": "common2-1158", "label": "Sky Command II — Tone frequency", "type": "select", + "group": "General", "options": [ "67.0", "69.3", @@ -520,7 +533,8 @@ { "key": "image-txrx", "label": "Tx / Rx / Repeater", - "type": "section" + "type": "section", + "group": "Transmit & Receive" }, { "key": "txrx-1149", @@ -614,7 +628,8 @@ { "key": "image-dtmf", "label": "DTMF, EchoLink, Weather", - "type": "section" + "type": "section", + "group": "DTMF & Signaling" }, { "key": "dtmf-1016", @@ -648,7 +663,8 @@ { "key": "image-gps", "label": "GPS", - "type": "section" + "type": "section", + "group": "GPS" }, { "key": "gps-1257", @@ -725,7 +741,8 @@ { "key": "image-aprs1", "label": "APRS", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "aprs1-1168", @@ -1048,7 +1065,8 @@ { "key": "image-aprs2", "label": "APRS — stations", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "aprs2-1234", @@ -1135,7 +1153,8 @@ { "key": "image-aprs3", "label": "APRS — NAVITRA", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "aprs3-1303", diff --git a/src-tauri/src/thd75_settings_schema.json b/src-tauri/src/thd75_settings_schema.json index 8c7fab1..63c0983 100644 --- a/src-tauri/src/thd75_settings_schema.json +++ b/src-tauri/src/thd75_settings_schema.json @@ -2,7 +2,8 @@ { "key": "section-common", "label": "Common", - "type": "section" + "type": "section", + "group": "Transmit & Receive" }, { "key": "a-band-tx-power", @@ -50,6 +51,7 @@ "key": "usb-out-select-rts-detect-out-select", "label": "USB Out Select (RTS: \"Detect Out Select\")", "type": "select", + "group": "Connections", "options": [ "Off (AF)", "IF", @@ -137,6 +139,7 @@ "key": "resume", "label": "Resume", "type": "select", + "group": "Scan", "options": [ "Time", "Carrier", @@ -147,6 +150,7 @@ "key": "resume-digital", "label": "Resume (Digital)", "type": "select", + "group": "Scan", "options": [ "Time", "Carrier", @@ -157,6 +161,7 @@ "key": "time-restart", "label": "Time Restart", "type": "integer", + "group": "Scan", "min": 1, "max": 10 }, @@ -164,23 +169,27 @@ "key": "carrier-restart", "label": "Carrier Restart", "type": "integer", + "group": "Scan", "min": 1, "max": 10 }, { "key": "priority-scan", "label": "Priority Scan", - "type": "boolean" + "type": "boolean", + "group": "Scan" }, { "key": "auto-backlight", "label": "Auto Backlight", - "type": "boolean" + "type": "boolean", + "group": "Display" }, { "key": "auto-wx-scan", "label": "Auto Wx Scan", "type": "select", + "group": "Scan", "options": [ "Off", "15", @@ -197,6 +206,7 @@ "key": "call-key", "label": "Call Key", "type": "select", + "group": "Keys", "options": [ "CALL", "1750 Hz" @@ -264,22 +274,26 @@ { "key": "qso-log", "label": "QSO Log", - "type": "boolean" + "type": "boolean", + "group": "Digital" }, { "key": "led-control-rx", "label": "LED Control — RX", - "type": "boolean" + "type": "boolean", + "group": "Display" }, { "key": "led-control-fm-radio", "label": "LED Control — FM Radio", - "type": "boolean" + "type": "boolean", + "group": "Display" }, { "key": "recall-method", "label": "Recall Method", "type": "select", + "group": "Memory & VFO", "options": [ "All Bands", "Current Band" @@ -289,6 +303,7 @@ "key": "recording-band", "label": "Recording Band", "type": "select", + "group": "Sounds", "options": [ "A Band", "B Band" @@ -303,6 +318,7 @@ "key": "backlight-control", "label": "Backlight Control", "type": "select", + "group": "Display", "options": [ "Manual", "On", @@ -314,6 +330,7 @@ "key": "backlight-timer", "label": "Backlight Timer", "type": "integer", + "group": "Display", "min": 3, "max": 60 }, @@ -321,6 +338,7 @@ "key": "lcd-brightness", "label": "LCD Brightness", "type": "select", + "group": "Display", "options": [ "Low", "Medium", @@ -331,6 +349,7 @@ "key": "single-band-display", "label": "Single Band Display", "type": "select", + "group": "Display", "options": [ "Off", "GPS (Altitude)", @@ -343,6 +362,7 @@ "key": "meter-type", "label": "Meter Type", "type": "select", + "group": "Display", "options": [ "Type 1", "Type 2", @@ -353,6 +373,7 @@ "key": "background-color-rts-backlight-color", "label": "Background Color (RTS: \"Backlight Color\")", "type": "select", + "group": "Display", "options": [ "Black", "White" @@ -362,6 +383,7 @@ "key": "info-backlight", "label": "Info Backlight", "type": "select", + "group": "Display", "options": [ "Off", "LCD", @@ -372,12 +394,14 @@ "key": "power-on-message", "label": "Power On Message", "type": "text", + "group": "Display", "max_length": 16 }, { "key": "digital-auto-reply", "label": "Digital Auto Reply", "type": "select", + "group": "Digital", "options": [ "Off", "Voice Message 1", @@ -389,12 +413,14 @@ { "key": "section-configuration", "label": "Configuration", - "type": "section" + "type": "section", + "group": "General" }, { "key": "balance", "label": "Balance", "type": "select", + "group": "Sounds", "options": [ "A:100/B:0", "A:100/B:25", @@ -411,22 +437,26 @@ { "key": "equalizer-enables-menu-911-receive-eq", "label": "Equalizer enables (menu 911) — Receive EQ", - "type": "boolean" + "type": "boolean", + "group": "Sounds" }, { "key": "equalizer-enables-menu-911-tx-eq-fm", "label": "Equalizer enables (menu 911) — Tx EQ (FM", - "type": "boolean" + "type": "boolean", + "group": "Sounds" }, { "key": "equalizer-enables-menu-911-tx-eq-dv", "label": "Equalizer enables (menu 911) — Tx EQ (DV)", - "type": "boolean" + "type": "boolean", + "group": "Sounds" }, { "key": "tx-equalizer-level-0-4-khz", "label": "Tx Equalizer Level — 0.4 kHz", "type": "select", + "group": "Sounds", "options": [ "-9", "-8", @@ -447,6 +477,7 @@ "key": "tx-equalizer-level-0-8-khz", "label": "Tx Equalizer Level — 0.8 kHz", "type": "select", + "group": "Sounds", "options": [ "-9", "-8", @@ -467,6 +498,7 @@ "key": "tx-equalizer-level-1-6-khz", "label": "Tx Equalizer Level — 1.6 kHz", "type": "select", + "group": "Sounds", "options": [ "-9", "-8", @@ -487,6 +519,7 @@ "key": "tx-equalizer-level-3-2-khz", "label": "Tx Equalizer Level — 3.2 kHz", "type": "select", + "group": "Sounds", "options": [ "-9", "-8", @@ -507,6 +540,7 @@ "key": "rx-equalizer-level-0-4-khz", "label": "Rx Equalizer Level — 0.4 kHz", "type": "select", + "group": "Sounds", "options": [ "-9", "-8", @@ -533,6 +567,7 @@ "key": "rx-equalizer-level-0-8-khz", "label": "Rx Equalizer Level — 0.8 kHz", "type": "select", + "group": "Sounds", "options": [ "-9", "-8", @@ -559,6 +594,7 @@ "key": "rx-equalizer-level-1-6-khz", "label": "Rx Equalizer Level — 1.6 kHz", "type": "select", + "group": "Sounds", "options": [ "-9", "-8", @@ -585,6 +621,7 @@ "key": "rx-equalizer-level-3-2-khz", "label": "Rx Equalizer Level — 3.2 kHz", "type": "select", + "group": "Sounds", "options": [ "-9", "-8", @@ -611,6 +648,7 @@ "key": "rx-equalizer-level-6-4-khz", "label": "Rx Equalizer Level — 6.4 kHz", "type": "select", + "group": "Sounds", "options": [ "-9", "-8", @@ -636,12 +674,14 @@ { "key": "beep-a", "label": "Beep (A)", - "type": "boolean" + "type": "boolean", + "group": "Sounds" }, { "key": "beep-volume", "label": "Beep Volume", "type": "select", + "group": "Sounds", "options": [ "Volume Link", "Level 1", @@ -657,6 +697,7 @@ "key": "voice-guidance", "label": "Voice Guidance", "type": "select", + "group": "Sounds", "options": [ "Off", "Manual", @@ -668,6 +709,7 @@ "key": "voice-guidance-volume", "label": "Voice Guidance Volume", "type": "select", + "group": "Sounds", "options": [ "Volume Link", "Level 1", @@ -683,6 +725,7 @@ "key": "usb-audio-level", "label": "USB Audio Level", "type": "select", + "group": "Sounds", "options": [ "Level 1", "Level 2", @@ -724,17 +767,20 @@ { "key": "bluetooth-enable", "label": "Bluetooth Enable", - "type": "boolean" + "type": "boolean", + "group": "Connections" }, { "key": "bluetooth-auto-connect", "label": "Bluetooth Auto Connect", - "type": "boolean" + "type": "boolean", + "group": "Connections" }, { "key": "pf1-key", "label": "PF1 Key", "type": "select", + "group": "Keys", "options": [ "Recording", "Voice Msg 1", @@ -769,6 +815,7 @@ "key": "pf2-key", "label": "PF2 Key", "type": "select", + "group": "Keys", "options": [ "Recording", "Voice Msg 1", @@ -803,6 +850,7 @@ "key": "pf1-key-mic", "label": "PF1 Key (Mic)", "type": "select", + "group": "Keys", "options": [ "Recording", "Voice Msg 1", @@ -860,6 +908,7 @@ "key": "pf2-key-mic", "label": "PF2 Key (Mic)", "type": "select", + "group": "Keys", "options": [ "Recording", "Voice Msg 1", @@ -917,6 +966,7 @@ "key": "pf3-key-mic", "label": "PF3 Key (Mic)", "type": "select", + "group": "Keys", "options": [ "Recording", "Voice Msg 1", @@ -974,6 +1024,7 @@ "key": "time-zone", "label": "Time Zone", "type": "integer", + "group": "GPS", "min": 0, "max": 112 }, @@ -1007,6 +1058,7 @@ "key": "speed-distance", "label": "Speed, Distance", "type": "select", + "group": "Display", "options": [ "mi/h", "km/h", @@ -1018,6 +1070,7 @@ "key": "altitude-rain", "label": "Altitude, Rain", "type": "select", + "group": "Display", "options": [ "inch", "mm" @@ -1027,6 +1080,7 @@ "key": "temperature", "label": "Temperature", "type": "select", + "group": "Display", "options": [ "F", "C" @@ -1036,6 +1090,7 @@ "key": "latitude-longitude", "label": "Latitude, Longitude", "type": "select", + "group": "Display", "options": [ "dd mm.mm", "dd mm ss.s" @@ -1045,6 +1100,7 @@ "key": "grid-square", "label": "Grid Square", "type": "select", + "group": "Display", "options": [ "Maidenhead", "SAR", @@ -1055,6 +1111,7 @@ "key": "pc-output-gps", "label": "PC Output (GPS)", "type": "select", + "group": "Connections", "options": [ "USB", "Bluetooth" @@ -1064,6 +1121,7 @@ "key": "pc-output-aprs", "label": "PC Output (APRS)", "type": "select", + "group": "Connections", "options": [ "USB", "Bluetooth" @@ -1073,6 +1131,7 @@ "key": "kiss", "label": "KISS", "type": "select", + "group": "Connections", "options": [ "USB", "Bluetooth" @@ -1082,6 +1141,7 @@ "key": "dv-dr", "label": "DV/DR", "type": "select", + "group": "Connections", "options": [ "USB", "Bluetooth" @@ -1091,6 +1151,7 @@ "key": "language", "label": "Language", "type": "select", + "group": "Display", "options": [ "English", "Japanese" @@ -1100,6 +1161,7 @@ "key": "pc-io-dv-gateway", "label": "PC IO (DV Gateway)", "type": "select", + "group": "Connections", "options": [ "USB", "Bluetooth" @@ -1114,6 +1176,7 @@ "key": "callsign-readout", "label": "Callsign Readout", "type": "select", + "group": "Sounds", "options": [ "Standard", "Full Phonetics", @@ -1124,6 +1187,7 @@ "key": "voice-guidance-speed", "label": "Voice Guidance Speed", "type": "select", + "group": "Sounds", "options": [ "Speed 1", "Speed 2", @@ -1135,12 +1199,14 @@ "key": "bluetooth-device-name", "label": "Bluetooth Device Name", "type": "text", + "group": "Connections", "max_length": 16 }, { "key": "section-dtmf-fm", "label": "DTMF / FM", - "type": "section" + "type": "section", + "group": "DTMF & Signaling" }, { "key": "dtmf-speed", @@ -1174,17 +1240,20 @@ { "key": "fm-radio-mode", "label": "FM Radio Mode", - "type": "boolean" + "type": "boolean", + "group": "General" }, { "key": "fm-auto-mute-return-time", "label": "FM Auto Mute Return Time", - "type": "integer" + "type": "integer", + "group": "General" }, { "key": "section-gps", "label": "GPS", - "type": "section" + "type": "section", + "group": "GPS" }, { "key": "builtin-gps", @@ -1283,7 +1352,8 @@ { "key": "section-digital", "label": "Digital", - "type": "section" + "type": "section", + "group": "Digital" }, { "key": "direct-reply", @@ -1496,7 +1566,8 @@ { "key": "section-aprs-basic", "label": "APRS Basic", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "decay-algorithm-moving", @@ -2145,7 +2216,8 @@ { "key": "section-aprs-messaging", "label": "APRS Messaging", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "pc-output", @@ -2739,7 +2811,8 @@ { "key": "section-aprs-digipeat", "label": "APRS Digipeat", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "digipeat-my-callsign", @@ -2799,7 +2872,8 @@ { "key": "section-aprs-mic-e-codes", "label": "APRS Mic-E Codes", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "mice-k-handy-1-type", @@ -2984,7 +3058,8 @@ { "key": "section-aprs-objects", "label": "APRS Objects", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "selected-beacon-object", diff --git a/src-tauri/src/tmd710_settings_schema.json b/src-tauri/src/tmd710_settings_schema.json index 8c3dc45..c654378 100644 --- a/src-tauri/src/tmd710_settings_schema.json +++ b/src-tauri/src/tmd710_settings_schema.json @@ -2,7 +2,8 @@ { "key": "section-audio-and-voice", "label": "Audio and Voice", - "type": "section" + "type": "section", + "group": "Sounds" }, { "key": "key-beep", @@ -92,7 +93,8 @@ { "key": "section-receive-and-transmit", "label": "Receive and Transmit", - "type": "section" + "type": "section", + "group": "Transmit & Receive" }, { "key": "vhf-aip", @@ -146,7 +148,8 @@ { "key": "section-memory-and-echolink", "label": "Memory and EchoLink", - "type": "section" + "type": "section", + "group": "Memory & VFO" }, { "key": "memory-recall-method", @@ -161,6 +164,7 @@ "key": "echolink-speed", "label": "EchoLink speed (Menu 205)", "type": "select", + "group": "DTMF & Signaling", "options": [ "Fast", "Slow" @@ -169,7 +173,8 @@ { "key": "section-dtmf", "label": "DTMF", - "type": "section" + "type": "section", + "group": "DTMF & Signaling" }, { "key": "dtmf-hold", @@ -207,7 +212,8 @@ { "key": "section-repeater", "label": "Repeater", - "type": "section" + "type": "section", + "group": "Transmit & Receive" }, { "key": "automatic-repeater-offset", @@ -222,7 +228,8 @@ { "key": "section-display", "label": "Display", - "type": "section" + "type": "section", + "group": "Display" }, { "key": "power-on-message", @@ -263,7 +270,8 @@ { "key": "section-auxiliary", "label": "Auxiliary", - "type": "section" + "type": "section", + "group": "General" }, { "key": "microphone-key-lock", @@ -274,6 +282,7 @@ "key": "scan-resume-method", "label": "Scan resume method (Menu 514)", "type": "select", + "group": "Scan", "options": [ "Time-operated", "Carrier-operated", @@ -297,6 +306,7 @@ "key": "external-data-band", "label": "External data band (Menu 517)", "type": "select", + "group": "Connections", "options": [ "A band", "B band", @@ -308,6 +318,7 @@ "key": "external-data-speed", "label": "External data speed (Menu 518)", "type": "select", + "group": "Connections", "options": [ "1200 bps", "9600 bps" @@ -317,6 +328,7 @@ "key": "sqc-output-source", "label": "SQC output source (Menu 520)", "type": "select", + "group": "Connections", "options": [ "Off", "Busy", @@ -329,17 +341,20 @@ { "key": "auto-pm-store", "label": "Auto PM store (Menu 521)", - "type": "boolean" + "type": "boolean", + "group": "Memory & VFO" }, { "key": "display-partition-bar", "label": "Display partition bar (Menu 527)", - "type": "boolean" + "type": "boolean", + "group": "Display" }, { "key": "section-aprs-basic", "label": "APRS Basic", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "aprs-my-callsign", @@ -359,7 +374,8 @@ { "key": "section-aprs-internal-tnc", "label": "APRS Internal TNC", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "aprs-data-band", @@ -409,7 +425,8 @@ { "key": "section-aprs-gps-and-waypoints", "label": "APRS GPS and Waypoints", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "aprs-gps-baud", @@ -476,7 +493,8 @@ { "key": "section-aprs-my-position", "label": "APRS My Position", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "aprs-position-1-name", @@ -581,7 +599,8 @@ { "key": "section-aprs-beacon-information", "label": "APRS Beacon Information", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "aprs-speed-info", @@ -630,7 +649,8 @@ { "key": "section-aprs-status-text", "label": "APRS Status Text", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "aprs-status-text-1", @@ -745,7 +765,8 @@ { "key": "section-aprs-packet-filter", "label": "APRS Packet Filter", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "aprs-position-limit", @@ -797,7 +818,8 @@ { "key": "section-aprs-beacon-transmission", "label": "APRS Beacon Transmission", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "aprs-station-icon", @@ -846,7 +868,8 @@ { "key": "section-aprs-voice-alert-and-timing", "label": "APRS Voice Alert and Timing", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "aprs-voice-alert", @@ -912,7 +935,8 @@ { "key": "section-aprs-display-and-sound", "label": "APRS Display and Sound", - "type": "section" + "type": "section", + "group": "APRS" }, { "key": "aprs-rx-beep", diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index 930f059..a1a4aaf 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -22,7 +22,7 @@ const NAV = [ { to: "/talkgroups", label: "Talkgroups", icon: Users }, { to: "/dmr-contacts", label: "DMR Contacts", icon: IdCard }, { to: "/codeplugs", label: "Codeplugs", icon: Package }, - { to: "/radio-profiles", label: "Radios", icon: HandheldRadio }, + { to: "/radio-profiles", label: "Radio Profiles", icon: HandheldRadio }, { to: "/settings", label: "Settings", icon: Settings }, ]; diff --git a/src/components/codeplugs/ProgramRadioDialog.tsx b/src/components/codeplugs/ProgramRadioDialog.tsx index 2ebff3a..a0ab87c 100644 --- a/src/components/codeplugs/ProgramRadioDialog.tsx +++ b/src/components/codeplugs/ProgramRadioDialog.tsx @@ -471,7 +471,7 @@ export function ProgramRadioDialog({ <> {" "} This radio’s settings are written separately — open the - profile under Radios and use{" "} + profile under Radio Profiles and use{" "} Write to radio. )} diff --git a/src/components/codeplugs/Tdh3RadioOptions.tsx b/src/components/codeplugs/Tdh3RadioOptions.tsx index 7f0a7fa..78110e8 100644 --- a/src/components/codeplugs/Tdh3RadioOptions.tsx +++ b/src/components/codeplugs/Tdh3RadioOptions.tsx @@ -13,7 +13,7 @@ import { Button, Spinner, Select } from "../ui"; /** * TD-H3 Phase C: apply a saved radio profile's settings straight to the radio * (channels untouched). Reading the radio's settings and saving them into a - * profile is done in the profile editor under Radios (the same flow as the + * profile is done in the profile editor under Radio Profiles (the same flow as the * UV-5R), so this tab is just the "push a profile to the radio" direction. * Every apply downloads + backs up the full image first, patches only the * settings bits, uploads, then reads back to verify. @@ -93,9 +93,9 @@ export function Tdh3RadioOptions({ Apply a saved radio profile

- Write the settings from a profile you configured under Radios{" "} + Write the settings from a profile you configured under Radio Profiles{" "} straight to the radio. Channels are left untouched. To capture the radio's - current settings into a profile, open the profile under Radios{" "} + current settings into a profile, open the profile under Radio Profiles{" "} and use Download from radio.

diff --git a/src/components/icons/HandheldRadio.tsx b/src/components/icons/HandheldRadio.tsx index e3c18ff..0681fdf 100644 --- a/src/components/icons/HandheldRadio.tsx +++ b/src/components/icons/HandheldRadio.tsx @@ -4,7 +4,7 @@ import type { SVGProps } from "react"; * Handheld transceiver (HT / "walkie-talkie") icon, drawn in the Lucide style * (24x24 viewBox, currentColor stroke, 2px round strokes) so it sits cleanly * next to the other lucide-react nav icons. Lucide has no HT/walkie-talkie - * glyph, so this fills that gap for the "Radios" section. + * glyph, so this fills that gap for the "Radio Profiles" section. * * Silhouette: stubby antenna + volume/channel knob on top, a display window, * speaker grille, and a PTT button on the rounded body. diff --git a/src/components/profiles/ProfileEditor.tsx b/src/components/profiles/ProfileEditor.tsx index 81dd33a..d218470 100644 --- a/src/components/profiles/ProfileEditor.tsx +++ b/src/components/profiles/ProfileEditor.tsx @@ -668,9 +668,8 @@ function Capabilities({ model }: { model: RadioModel }) { } /** - * The two-column field grid. Takes a flat list, so it draws either a whole - * schema — headings included — or the fields of one sub-tab, which have had - * their heading lifted into the tab button. + * The two-column field grid. Takes a flat list with its section headings + * already placed, so it draws a whole schema or one sub-tab alike. */ function SettingsGrid({ fields, @@ -850,8 +849,8 @@ export function ProfileEditor({ const [saving, setSaving] = useState(false); const fields = useMemo(() => parseSchema(model), [model]); - // Non-null only for the radios whose settings are split across sub-tabs — - // see `settingsTabs`. Null keeps the original single scroll. + // Every radio's settings split into the same named tabs — see + // `settingsTabs` (#131). Null only for a schema with no fields. const subTabs = useMemo(() => settingsTabs(fields), [fields]); const [subTab, setSubTab] = useState(null); const openSubTab = @@ -1100,11 +1099,11 @@ export function ProfileEditor({ {model.driver_key === "anytone_atd890uv" && ( )} - {fields.length === 0 ? ( + {!openSubTab ? (

This model has no configurable non-channel settings.

- ) : openSubTab ? ( + ) : ( /* Split across sub-tabs. Every field's value stays in `values` whichever tab is open, so this changes what is drawn and nothing about what is saved. */ @@ -1140,13 +1139,6 @@ export function ProfileEditor({ onChange={setValue} />
- ) : ( - )}
diff --git a/src/lib/profiles.ts b/src/lib/profiles.ts index 47c5acf..6c7eefa 100644 --- a/src/lib/profiles.ts +++ b/src/lib/profiles.ts @@ -114,47 +114,98 @@ export function modelModes(m: RadioModel): string[] { return modes; } -/** One sub-tab of the settings form: a section heading and the fields under it. */ +/** + * The tabs every radio's settings form is split into, in the order they are + * drawn (#131). Each schema section names one of these as its `group`, and a + * field may name another when its OEM section mixes subjects — the TH-D75's + * "Common" holds TX power, scan resume and the backlight side by side. A radio + * shows only the tabs it has fields for. + * + * The OEM's own section names survive as headings inside a tab, so an operator + * matching the form against the manufacturer's software still finds the names + * they know. `wiring.rs` reads this list and refuses a schema whose section + * names a group that is not on it. + */ +export const SETTINGS_GROUPS = [ + "General", + "Display", + "Sounds", + "Transmit & Receive", + "Memory & VFO", + "Scan", + "DTMF & Signaling", + "Keys", + "Digital", + "GPS", + "APRS", + "Connections", +] as const; + +/** One sub-tab of the settings form: a group and the fields drawn under it. */ export interface SettingsTab { key: string; label: string; + /** Section headings included, ready for `SettingsGrid`. */ fields: SettingField[]; } /** - * Split a schema into sub-tabs on its section headings, or return null to leave - * it as the single scroll it has always been. + * Split a schema into its `SETTINGS_GROUPS` tabs, or return null when it has + * no fields at all. * - * Only schemas carrying an APRS section are split. Those radios keep their APRS - * settings in tables — status texts, canned phrases, beacon objects — so their - * field count runs away from the rest, and their own programming software - * already presents APRS on tabs of its own. Splitting there matches what the - * operator has seen before; splitting a radio with no APRS would just add a - * click to a list that reads fine as one column. + * A field lands in its own `group` if it names one, else its section's. A tab + * draws its own sections first, under their OEM headings in schema order; only + * the first may drop a heading that would just repeat the tab's name, since a + * later one would read as part of the heading above it. Fields borrowed from + * another tab's section follow, under that section's heading — but only when + * the tab draws headings at all, so a tab made of borrowed fields (the TH-D75's + * Display, all from "Common") is not stamped with a name that says nothing. * * Tabs are presentation only. The form holds every field's value whether or not * its tab is on screen, so saving is unaffected by which one is open. */ export function settingsTabs(fields: SettingField[]): SettingsTab[] | null { - const hasAprs = fields.some( - (f) => f.type === "section" && /^APRS\b/i.test(f.label), - ); - if (!hasAprs) return null; - - const tabs: SettingsTab[] = []; + const known = (g: string | undefined) => + g && (SETTINGS_GROUPS as readonly string[]).includes(g) ? g : undefined; + // A section or group the list does not know falls to General rather than + // vanishing; the wiring guard keeps that from happening to a seeded radio. + const buckets = new Map(); + let section: SettingField | null = null; for (const f of fields) { if (f.type === "section") { - tabs.push({ key: f.key, label: f.label, fields: [] }); - } else if (tabs.length > 0) { - tabs[tabs.length - 1].fields.push(f); - } else { - // A field ahead of the first heading. No schema does this today, but - // dropping it would hide a real setting, so it gets a tab of its own. - tabs.push({ key: "section-general", label: "General", fields: [f] }); + section = f; + continue; } + const group = known(f.group) ?? known(section?.group) ?? "General"; + if (!buckets.has(group)) buckets.set(group, []); + buckets.get(group)!.push({ section, field: f }); } - // A heading with nothing under it would be an empty tab. - return tabs.filter((t) => t.fields.length > 0); + if (buckets.size === 0) return null; + + return SETTINGS_GROUPS.filter((g) => buckets.has(g)).map((group) => { + const entries = buckets.get(group)!; + const owned = (s: SettingField | null) => + (known(s?.group) ?? "General") === group; + const mine = entries.filter((e) => owned(e.section)); + const borrowed = entries.filter((e) => !owned(e.section)); + const out: SettingField[] = []; + let last: SettingField | null | undefined; + for (const { section, field } of mine) { + const first = section === mine[0].section; + if (section !== last && section && !(first && section.label === group)) + out.push(section); + last = section; + out.push(field); + } + const headed = out.some((f) => f.type === "section"); + last = undefined; + for (const { section, field } of borrowed) { + if (headed && section !== last && section) out.push(section); + last = section; + out.push(field); + } + return { key: `group-${group}`, label: group, fields: out }; + }); } /** diff --git a/src/lib/types.ts b/src/lib/types.ts index 230ed07..ac2cbfe 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -1,6 +1,8 @@ // TypeScript mirrors of the Rust models. Field names are snake_case to match // the JSON returned by the Tauri commands (serde serializes struct fields as-is). +import type { SETTINGS_GROUPS } from "./profiles"; + export interface Channel { id: number; rb_name: string | null; @@ -209,6 +211,10 @@ export interface SettingField { // "section" is a full-width heading used to group the fields that follow it; // it carries no value and is skipped when seeding/saving settings. type: "text" | "integer" | "select" | "boolean" | "section"; + // Which settings tab this lands on — one of SETTINGS_GROUPS in profiles.ts. + // Every section names one; a field names its own only when it belongs on a + // different tab from the rest of its OEM section (#131). + group?: (typeof SETTINGS_GROUPS)[number]; min?: number; max?: number; max_length?: number; diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx index fcd7aa4..7776825 100644 --- a/src/pages/Dashboard.tsx +++ b/src/pages/Dashboard.tsx @@ -12,7 +12,7 @@ const STAT_CARDS = [ { key: "total_scan_lists", label: "Scan Lists", icon: ScanLine }, { key: "total_talkgroups", label: "Talkgroups", icon: Users }, { key: "total_codeplugs", label: "Codeplugs", icon: Package }, - { key: "total_radio_profiles", label: "Radios", icon: HandheldRadio }, + { key: "total_radio_profiles", label: "Radio Profiles", icon: HandheldRadio }, ] as const; export function Dashboard() { diff --git a/src/pages/RadioProfiles.tsx b/src/pages/RadioProfiles.tsx index 5d1c2ee..7dfa4e3 100644 --- a/src/pages/RadioProfiles.tsx +++ b/src/pages/RadioProfiles.tsx @@ -73,7 +73,7 @@ export function RadioProfiles() { <> } - title="Radios" + title="Radio Profiles" subtitle={`Your instances of radio models · ${profiles.length} ${ profiles.length === 1 ? "profile" : "profiles" }`}