diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..8b0643b --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,15 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +polar: # Replace with a single Polar username +buy_me_a_coffee: krinkle +thanks_dev: # Replace with a single thanks.dev username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index be27da7..cdc4b91 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -2,7 +2,7 @@ name: Bug report about: Create a report to help us improve title: '' -labels: '' +labels: bug assignees: '' --- @@ -28,8 +28,5 @@ If applicable, add screenshots to help explain your problem. - Hunterlog application version: [e.g. 0.0.1L] - Hunterlog database version: [e.g. db: 922a7b854b71] -*The hunterlog version info is at the bottom of the application screen. Scroll down all the way to see it.* - - **Additional context** Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..11fc491 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: enhancement +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/README.md b/README.md index df0519e..3275936 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ -# Hunterlog +# Hunterlog++ + +> **Note:** This is an enhanced fork of the original [Hunterlog by N9FZ](https://github.com/cwhelchel/hunterlog) with additional features and improvements. + [![GitHub Release](https://img.shields.io/badge/download-windows-green)](https://github.com/cwhelchel/hunterlog/releases/download/v0.0.9/hunterlog_0.0.9.zip) [![GitHub Release](https://img.shields.io/badge/download-linux-green)](https://github.com/cwhelchel/hunterlog/releases/download/v0.0.9/hunterlog-ubuntu_0.0.9-hotfix.zip) [![GitHub Release](https://img.shields.io/badge/download-mac-green)](https://github.com/cwhelchel/hunterlog/releases/download/v0.0.6/hunterlog-macos_0.0.6.zip) @@ -26,6 +29,16 @@ CAT control, and log them to your master logger. It will also keep track of the * Use CAT control to immediately jump to a spot * supports: FLRIG, RIGCTLD, and N3FJP's CAT API (more possible) +## Hunterlog++ Enhancements + +This fork includes the following additional features: + +* **Automatic Scanning** - Automatically cycle through filtered POTA/SOTA spots + * Configurable wait time per station + * Smart PTT detection to pause scanning when transmitting + * Visual indicators for currently scanned station + * See [Scanning Feature](#scanning-feature) for detailed usage instructions + ## Community If you're not comfortable using Github to submit issues and enhancement requests, feel free to join our Discord community server. Hop in and ask questions, share comments, propose new features or get help using Hunterlog. @@ -138,6 +151,50 @@ Click a spot to load the QSO info into the top portion of the screen. Click gree *It also will store a copy locally in hunter.adi as well as in the database.* This is for your convenience and I'd hate for anyone to lose a QSO. +## Scanning Feature + +The Scanning feature allows you to automatically cycle through filtered POTA/SOTA spots, tuning your radio to each station for a configurable amount of time. This is useful for monitoring multiple activations or hunting for new parks. + +### How to Use Scanning + +1. **Filter Your Spots** - Use the filter bar to narrow down the spots you want to scan (e.g., specific mode, band, or region) +2. **Configure Scan Settings** (Optional) + - Click **CONFIGURATION** + - Go to the **Scanning** tab + - Set **Scan Wait Time** (default: 5 seconds) - how long to stay on each station + - Click **Save** +3. **Start Scanning** + - Click the **Scan** button in the spot viewer toolbar + - The button will change to **Stop Scanning** with a different color + - Your radio will automatically tune to each filtered station + +### Scanning Behavior + +- **Visual Indicators**: As scanning progresses: + - The selected row will be highlighted + - The frequency button will change from green to yellow for the current station + - The top info panel will update with park/activator details + +- **Automatic Stop Conditions**: + - Pressing your PTT (Push-To-Talk) will immediately stop scanning + - Clicking **Stop Scanning** button + - If filters reduce the list to 1 or 0 stations + +- **Requirements**: + - At least 2 filtered spots must be visible + - The Scan button will be disabled if there are 0 or 1 spots + +- **Scanning Cycle**: The scanner will continuously loop through all filtered spots until stopped + +> [!TIP] +> Use filters effectively to scan only the spots you're interested in. For example: +> - Filter by SSB mode to scan only phone activations +> - Filter by 20m band to scan a specific band +> - Filter by region to scan only US or specific states + +> [!NOTE] +> The PTT check runs every 250ms, so scanning will stop almost immediately when you press PTT to make a contact. + ## Spotting You can spot/re-spot POTA activators through Hunterlog. When this is done the diff --git a/package-lock.json b/package-lock.json index 908f616..001e2f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -183,6 +183,7 @@ "version": "11.11.3", "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.3.tgz", "integrity": "sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==", + "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", @@ -223,6 +224,7 @@ "version": "11.11.0", "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", @@ -746,6 +748,7 @@ "version": "5.15.10", "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.10.tgz", "integrity": "sha512-YJJGHjwDOucecjDEV5l9ISTCo+l9YeWrho623UajzoHRYxuKUmwrGVYOW4PKwGvCx9SU9oklZnbbi2Clc5XZHw==", + "peer": true, "dependencies": { "@babel/runtime": "^7.23.9", "@mui/base": "5.0.0-beta.36", @@ -847,6 +850,7 @@ "version": "5.15.9", "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.9.tgz", "integrity": "sha512-SxkaaZ8jsnIJ77bBXttfG//LUf6nTfOcaOuIgItqfHv60ZCQy/Hu7moaob35kBb+guxVJnoSZ+7vQJrA/E7pKg==", + "peer": true, "dependencies": { "@babel/runtime": "^7.23.9", "@mui/private-theming": "^5.15.9", @@ -1159,6 +1163,7 @@ "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.12.0.tgz", "integrity": "sha512-s+6pwEj+GfKf7vqGUzN9iSEPueUssCCQrCBUlcAfKrJe0a22hTUCjewpB0I7lNrCIULt8dkndD+sMdOrXsRl6Q==", "dev": true, + "peer": true, "dependencies": { "@mischnic/json-sourcemap": "^0.1.0", "@parcel/cache": "2.12.0", @@ -2853,6 +2858,7 @@ "version": "18.2.55", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.55.tgz", "integrity": "sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA==", + "peer": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3424,6 +3430,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001587", "electron-to-chromium": "^1.4.668", @@ -3625,7 +3632,6 @@ "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, "optional": true, - "peer": true, "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", @@ -3643,7 +3649,6 @@ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "optional": true, - "peer": true, "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -3659,7 +3664,6 @@ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "optional": true, - "peer": true, "dependencies": { "domelementtype": "^2.3.0" }, @@ -3676,7 +3680,6 @@ "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "optional": true, - "peer": true, "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -3692,7 +3695,6 @@ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, "optional": true, - "peer": true, "engines": { "node": ">=0.12" }, @@ -3706,7 +3708,6 @@ "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dev": true, "optional": true, - "peer": true, "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" @@ -3733,7 +3734,6 @@ "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dev": true, "optional": true, - "peer": true, "dependencies": { "css-tree": "~2.2.0" }, @@ -3748,7 +3748,6 @@ "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "dev": true, "optional": true, - "peer": true, "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" @@ -3763,8 +3762,7 @@ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "node_modules/csstype": { "version": "3.1.3", @@ -3825,7 +3823,8 @@ "node_modules/dayjs": { "version": "1.11.10", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", + "peer": true }, "node_modules/debug": { "version": "4.4.3", @@ -5492,7 +5491,8 @@ "node_modules/leaflet": { "version": "1.9.4", "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", - "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==" + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", + "peer": true }, "node_modules/levn": { "version": "0.4.1", @@ -5808,8 +5808,7 @@ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "node_modules/merge2": { "version": "1.4.1", @@ -6476,6 +6475,7 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -6487,6 +6487,7 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" @@ -7020,6 +7021,7 @@ "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", "dev": true, + "peer": true, "engines": { "node": ">=12" }, @@ -7179,33 +7181,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svgo": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.2.0.tgz", - "integrity": "sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.3.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" - } - }, "node_modules/term-size": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", @@ -7366,6 +7341,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true, + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/src/@types/Config.d.ts b/src/@types/Config.d.ts index e523723..444685c 100644 --- a/src/@types/Config.d.ts +++ b/src/@types/Config.d.ts @@ -16,6 +16,7 @@ export interface UserConfig { rig_if_type: string, include_rst: boolean, enabled_progs: string + scan_wait_time: number, } export interface ConfigVer2 { diff --git a/src/api.py b/src/api.py index fd4b165..52786dc 100644 --- a/src/api.py +++ b/src/api.py @@ -580,6 +580,21 @@ def qsy_to(self, freq, mode: str): return self._response(True, "") + def get_ptt(self): + '''Returns the PTT state from CAT control''' + if self.cat is None: + return self._response(False, "CAT control failure.") + + try: + ptt = self.cat.get_ptt() + except NotImplementedError as nie: + logging.error( + 'get_ptt not available for this CAT mode', + exc_info=nie) + return self._response(False, '', not_implemented=True) + + return self._response(True, "", ptt=ptt) + def export_park_data(self) -> str: ''' Dumps the entire parks table into a file named 'park_export.json'. diff --git a/src/cat/aclog_interface.py b/src/cat/aclog_interface.py index 0f26e42..04b13cb 100644 --- a/src/cat/aclog_interface.py +++ b/src/cat/aclog_interface.py @@ -62,3 +62,6 @@ def set_vfo(self, freq: str) -> bool: return False return False + + def get_ptt(self) -> bool: + raise NotImplementedError diff --git a/src/cat/dxlabs.py b/src/cat/dxlabs.py index 7416b5d..ac63f5f 100644 --- a/src/cat/dxlabs.py +++ b/src/cat/dxlabs.py @@ -68,7 +68,7 @@ def set_vfo(self, freq: str) -> bool: fMHz_size = len(str(fMHz)) t = f'{fMHz}' cmd = f'CmdSetFreq{t}' - + logger.debug(f"dxlabs vfocmd: {cmd}") if self.dxlabs_sock: @@ -85,6 +85,8 @@ def set_vfo(self, freq: str) -> bool: logger.error("set_vfo", exc_info=e) self.dxlabs_sock = None return False - + return False + def get_ptt(self) -> bool: + raise NotImplementedError diff --git a/src/cat/flrig.py b/src/cat/flrig.py index 87bd8a2..8c9821c 100644 --- a/src/cat/flrig.py +++ b/src/cat/flrig.py @@ -53,3 +53,15 @@ def set_vfo(self, freq: str) -> bool: self.online = False logger.warning("set_vfo", exc_info=e) return False + + def get_ptt(self): + """Returns ptt state via flrig""" + try: + self.online = True + res = self.server.rig.get_ptt() + logger.debug(f'get_ptt -> {res}') + return res + except ConnectionRefusedError as exception: + self.online = False + logger.debug("%s", exception) + return False diff --git a/src/cat/icat.py b/src/cat/icat.py index 124dfee..36aec26 100644 --- a/src/cat/icat.py +++ b/src/cat/icat.py @@ -37,3 +37,7 @@ def set_vfo(self, freq_Hz: str) -> bool: returns True on success ''' raise NotImplementedError + + @abstractmethod + def get_ptt(self) -> bool: + raise NotImplementedError diff --git a/src/cat/rigctld.py b/src/cat/rigctld.py index 09f7294..8b79971 100644 --- a/src/cat/rigctld.py +++ b/src/cat/rigctld.py @@ -64,3 +64,20 @@ def set_vfo(self, freq: str) -> bool: self.init_cat(host=self.host, port=self.port) return False + + def get_ptt(self): + """Returns ptt state via rigctld""" + if self.socket: + try: + self.online = True + self.socket.send(b"t\n") + ptt = self.socket.recv(1024).decode() + logger.debug("%s", ptt) + ptt = ptt.strip() + logger.debug(f'get_ptt -> {ptt}') + return ptt + except socket.error as exception: + self.online = False + logger.debug("%s", exception) + self.socket = None + return False diff --git a/src/cat/wsjtx.py b/src/cat/wsjtx.py index ce6477e..327b489 100644 --- a/src/cat/wsjtx.py +++ b/src/cat/wsjtx.py @@ -9,7 +9,7 @@ class wsjtx(ICat): ''' This class emulated the udp cat commands that wsjt-x emits. - + It's a copy of dxlabs.py because the wsjt-x is based off of dxlabs protocol except the freq is different. ''' @@ -70,11 +70,11 @@ def set_vfo(self, freq: str) -> bool: # convert the hz to kHz fkHz = float(freq) / 1_000 - # heres where wsjt-x differs. we need to add a localized separator to + # heres where wsjt-x differs. we need to add a localized separator to # the string or mcloggerdx will truncate it. format_kHz = "{:,.3f}".format(fkHz) - # note: i dont know how macloggerdx will work if in a locale that the + # note: i dont know how macloggerdx will work if in a locale that the # comma is not the thousands separator. this maybe a future bug where # i need to use the real locale separator @@ -82,7 +82,7 @@ def set_vfo(self, freq: str) -> bool: fMHz_size = len(format_kHz) t = f'{format_kHz}' cmd = f'CmdSetFreq{t}' - + logger.debug(f"wjstx vfocmd: {cmd}") if self.wsjtx_sock: @@ -99,6 +99,8 @@ def set_vfo(self, freq: str) -> bool: logger.error("set_vfo", exc_info=e) self.wsjtx_sock = None return False - + return False + def get_ptt(self) -> bool: + raise NotImplementedError diff --git a/src/components/AppContext.tsx b/src/components/AppContext.tsx index e1607bb..41c74c8 100644 --- a/src/components/AppContext.tsx +++ b/src/components/AppContext.tsx @@ -35,6 +35,7 @@ const defData: ContextData = { export const AppContext = React.createContext(null); +// eslint-disable-next-line @typescript-eslint/no-explicit-any export const AppContextProvider = ( {children}: any ) => { const [contextData, setContextData] = React.useState(defData); const [qsyButtonId, setQsyButtonId] = React.useState(''); diff --git a/src/components/Config/ConfigContextProvider.tsx b/src/components/Config/ConfigContextProvider.tsx index 0108fec..77cefdb 100644 --- a/src/components/Config/ConfigContextProvider.tsx +++ b/src/components/Config/ConfigContextProvider.tsx @@ -18,7 +18,8 @@ const defData: UserConfig = { qth_string: '', rig_if_type: '', include_rst: false, - enabled_progs: '' + enabled_progs: '', + scan_wait_time: 5 }; export interface ConfigContextType { diff --git a/src/components/Config/ConfigModal.tsx b/src/components/Config/ConfigModal.tsx index b491065..d9b7686 100644 --- a/src/components/Config/ConfigModal.tsx +++ b/src/components/Config/ConfigModal.tsx @@ -12,6 +12,7 @@ import { useConfigContext } from './ConfigContextProvider' import GeneralSettingsTab from './GeneralSettingsTab'; import LoggerSettingsTab from './LoggerSettingsTab'; import RadioSettingsTab from './RadioSettingsTab'; +import ScanningSettingsTab from './ScanningSettingsTab'; import { setErrorMsg } from '../../tsx/util'; import { useAppContext } from '../AppContext'; import ProgramSettingsTab from './ProgramSettingsTab'; @@ -109,6 +110,7 @@ export default function ConfigModal() { config.logger_type = Number(getVar(cfg2, "logger_type")); config.include_rst = Number(getVar(cfg2, "include_rst")) != 0; config.enabled_progs = getVar(cfg2, 'enabled_programs'); + config.scan_wait_time = Number(getVar(cfg2, "scan_wait_time")); setConfig(config); } @@ -127,6 +129,7 @@ export default function ConfigModal() { setVar(config2, "rig_if_type", config.rig_if_type); setVar(config2, "include_rst", config.include_rst.toString()); setVar(config2, "enabled_programs", config.enabled_progs); + setVar(config2, "scan_wait_time", config.scan_wait_time.toString()); setConfig2(config2); } @@ -169,8 +172,9 @@ export default function ConfigModal() { > - - + + + @@ -185,6 +189,9 @@ export default function ConfigModal() { + + +