not1mm 24.4.25.1__tar.gz → 24.4.30__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {not1mm-24.4.25.1 → not1mm-24.4.30}/PKG-INFO +76 -32
- {not1mm-24.4.25.1 → not1mm-24.4.30}/README.md +75 -31
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/__main__.py +37 -96
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/bandmap.py +28 -81
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/checkwindow.py +23 -35
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/configuration.ui +5 -5
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/cat_interface.py +28 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/cwinterface.py +18 -6
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/settings.py +6 -1
- not1mm-24.4.30/not1mm/lib/version.py +3 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/logwindow.py +37 -50
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/radio.py +9 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/vfo.py +26 -38
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm.egg-info/PKG-INFO +76 -32
- {not1mm-24.4.25.1 → not1mm-24.4.30}/pyproject.toml +1 -1
- not1mm-24.4.25.1/not1mm/lib/version.py +0 -3
- {not1mm-24.4.25.1 → not1mm-24.4.30}/LICENSE +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/__init__.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/JetBrainsMono-Regular.ttf +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/MASTER.SCP +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/about.ui +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/alpha bravo charlie delta.txt +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/bandmap.ui +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/check.png +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/checkwindow.ui +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/contests.sql +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/cty.json +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/cwmacros.txt +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/donors.html +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/editcontact.ui +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/editmacro.ui +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/greendot.png +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/k6gte-not1mm.desktop +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/k6gte.not1mm-128.png +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/k6gte.not1mm-32.png +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/k6gte.not1mm-64.png +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/logwindow.ui +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/logwindowx.ui +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/main.ui +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/new_contest.ui +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/not1mm.html +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/opon.ui +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/0.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/1.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/2.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/3.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/4.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/5.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/6.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/7.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/73.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/8.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/9.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/a.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/again.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/b.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/c.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/contest.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/cq.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/d.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/e.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/f.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/g.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/h.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/i.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/j.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/k.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/k6gte.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/l.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/m.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/mynumber.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/n.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/nil.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/o.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/p.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/q.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/r.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/roger.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/s.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/space.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/t.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/thankyou.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/thankyouqrz.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/u.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/v.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/w.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/x.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/y.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/yourcall.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/z.wav +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/pickcontest.ui +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/radio_green.png +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/radio_grey.png +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/radio_red.png +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/reddot.png +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/settings.ui +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/ssbmacros.txt +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/vfo.ui +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/fsutils.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/__init__.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/about.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/database.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/edit_contact.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/edit_macro.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/edit_opon.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/edit_station.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/ft8_watcher.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/ham_utility.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/lookup.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/multicast.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/n1mm.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/new_contest.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/plugin_common.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/select_contest.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/super_check_partial.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/versiontest.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/10_10_fall_cw.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/10_10_spring_cw.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/10_10_summer_phone.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/10_10_winter_phone.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/__init__.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/arrl_10m.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/arrl_dx_cw.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/arrl_dx_ssb.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/arrl_field_day.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/arrl_rtty_ru.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/arrl_ss_cw.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/arrl_ss_phone.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/arrl_vhf_jan.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/arrl_vhf_jun.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/arrl_vhf_sep.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/canada_day.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/cq_160_cw.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/cq_160_ssb.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/cq_wpx_cw.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/cq_wpx_ssb.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/cq_ww_cw.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/cq_ww_ssb.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/cwt.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/general_logging.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/iaru_hf.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/jidx_cw.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/jidx_ph.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/naqp_cw.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/naqp_ssb.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/phone_weekly_test.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/stew_perry_topband.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/winter_field_day.py +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm.egg-info/SOURCES.txt +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm.egg-info/dependency_links.txt +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm.egg-info/entry_points.txt +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm.egg-info/requires.txt +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm.egg-info/top_level.txt +0 -0
- {not1mm-24.4.25.1 → not1mm-24.4.30}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: not1mm
|
3
|
-
Version: 24.4.
|
3
|
+
Version: 24.4.30
|
4
4
|
Summary: NOT1MM Logger
|
5
5
|
Author-email: Michael Bridak <michael.bridak@gmail.com>
|
6
6
|
Project-URL: Homepage, https://github.com/mbridak/not1mm
|
@@ -31,6 +31,7 @@ Requires-Dist: appdata
|
|
31
31
|
Requires-Dist: Levenshtein
|
32
32
|
|
33
33
|
# Not1MM
|
34
|
+
<!-- markdownlint-disable MD001 MD033 -->
|
34
35
|
|
35
36
|

|
36
37
|
|
@@ -55,14 +56,16 @@ Requires-Dist: Levenshtein
|
|
55
56
|
- [Common installation recipes for Ubuntu and Fedora](#common-installation-recipes-for-ubuntu-and-fedora)
|
56
57
|
- [Ubuntu 22.04 LTS](#ubuntu-2204-lts)
|
57
58
|
- [Ubuntu 23.04](#ubuntu-2304)
|
59
|
+
- [Ubuntu 24.04 LTS](#ubuntu-2404-lts)
|
58
60
|
- [Fedora 38 \& 39](#fedora-38--39)
|
61
|
+
- [Fedora 40](#fedora-40)
|
59
62
|
- [Python, PyPI, pip and pipx](#python-pypi-pip-and-pipx)
|
60
63
|
- [Bootstrapping pipx](#bootstrapping-pipx)
|
61
64
|
- [Installing with pipx](#installing-with-pipx)
|
65
|
+
- [Installing from GitHub source](#installing-from-github-source)
|
62
66
|
- [After the install](#after-the-install)
|
63
67
|
- [You may or may not get a warning message like](#you-may-or-may-not-get-a-warning-message-like)
|
64
68
|
- [Or this fan favorite](#or-this-fan-favorite)
|
65
|
-
- [Installing from GitHub source](#installing-from-github-source)
|
66
69
|
- [Various data file locations](#various-data-file-locations)
|
67
70
|
- [Data](#data)
|
68
71
|
- [Config](#config)
|
@@ -177,6 +180,8 @@ I wish to thank those who've contributed to the project.
|
|
177
180
|
|
178
181
|
## Recent Changes
|
179
182
|
|
183
|
+
- [24-4-30] Allowsending CW via rigctld if your radio supports it.
|
184
|
+
- [24-4-27] Cleaned up dark mode code.
|
180
185
|
- [24-4-25-1] Reduce delta time to poll. Reorder poll_radio callback. Remove unused CAT lib from main.
|
181
186
|
- [24-4-25] Limited loop in radio.py, reducing clock cycles used. Moved Log window to the top of the logger.
|
182
187
|
- [24-4-24] Placed CAT control into a thread so disconnecting the radio wouldn't lock up the interface.
|
@@ -215,6 +220,10 @@ through your distribution's package manager before continuing.
|
|
215
220
|
I've taken the time to install some common Linux distributions into a VM and
|
216
221
|
noted the minimum steps needed to install not1mm.
|
217
222
|
|
223
|
+
<details>
|
224
|
+
|
225
|
+
<summary><b>Ubuntu 22.04 LTS, 23.04 and 24.04 LTS</b></summary>
|
226
|
+
|
218
227
|
#### Ubuntu 22.04 LTS
|
219
228
|
|
220
229
|
```bash
|
@@ -234,6 +243,22 @@ pipx install not1mm
|
|
234
243
|
pipx ensurepath
|
235
244
|
```
|
236
245
|
|
246
|
+
#### Ubuntu 24.04 LTS
|
247
|
+
|
248
|
+
```bash
|
249
|
+
sudo apt update
|
250
|
+
sudo apt upgrade
|
251
|
+
sudo apt install -y libportaudio2 pyqt6-dev-tools python3-pip
|
252
|
+
pip install --break-system-packages not1mm
|
253
|
+
source .profile
|
254
|
+
```
|
255
|
+
|
256
|
+
</details>
|
257
|
+
|
258
|
+
<details>
|
259
|
+
|
260
|
+
<summary><b>Fedora 38, 39 and 40</b></summary>
|
261
|
+
|
237
262
|
#### Fedora 38 & 39
|
238
263
|
|
239
264
|
```bash
|
@@ -242,6 +267,17 @@ sudo dnf install python3-pip portaudio
|
|
242
267
|
pip install not1mm
|
243
268
|
```
|
244
269
|
|
270
|
+
#### Fedora 40
|
271
|
+
|
272
|
+
```bash
|
273
|
+
sudo dnf upgrade --refresh
|
274
|
+
sudo dnf install python3-pip python3-pyqt6 portaudio
|
275
|
+
pip install not1mm
|
276
|
+
```
|
277
|
+
|
278
|
+
</details>
|
279
|
+
<br>
|
280
|
+
|
245
281
|
You can now open a new terminal and type not1mm. On it's first run, it may or
|
246
282
|
may not install a lovely non AI generated icon, which you can later click on to
|
247
283
|
launch the application.
|
@@ -293,6 +329,40 @@ If you need to later update not1mm, you can do so with:
|
|
293
329
|
pipx upgrade not1mm
|
294
330
|
```
|
295
331
|
|
332
|
+
<details>
|
333
|
+
<summary><b>Installing from GitHub source.</b></summary>
|
334
|
+
|
335
|
+
### Installing from GitHub source
|
336
|
+
|
337
|
+
Since this is packaged for PyPI, if you want to work on your own source branch,
|
338
|
+
after cloning from github you would:
|
339
|
+
|
340
|
+
```bash
|
341
|
+
pip install --upgrade pip
|
342
|
+
pip install setuptools
|
343
|
+
pip install build
|
344
|
+
source rebuild.sh
|
345
|
+
```
|
346
|
+
|
347
|
+
from the root directory. This installs a build chain and a local editable copy
|
348
|
+
of not1mm.
|
349
|
+
|
350
|
+
There's two ways to launch the program from the local editable copy.
|
351
|
+
|
352
|
+
You can either be in the root of the source directory and type:
|
353
|
+
|
354
|
+
```bash
|
355
|
+
python not1mm
|
356
|
+
```
|
357
|
+
|
358
|
+
or be in some other directory and just type:
|
359
|
+
|
360
|
+
```bash
|
361
|
+
not1mm
|
362
|
+
```
|
363
|
+
|
364
|
+
</details>
|
365
|
+
|
296
366
|
## After the install
|
297
367
|
|
298
368
|
You can now open a new terminal and type `not1mm`. On it's first run, it may or
|
@@ -324,35 +394,6 @@ For a more permanent solution you can place the line
|
|
324
394
|
`export QT_QPA_PLATFORM=wayland` in your home directories .bashrc file. Then
|
325
395
|
after logging out and back in you should be able to launch it normally.
|
326
396
|
|
327
|
-
### Installing from GitHub source
|
328
|
-
|
329
|
-
Since this is packaged for PyPI, if you want to work on your own source branch,
|
330
|
-
after cloning from github you would:
|
331
|
-
|
332
|
-
```bash
|
333
|
-
pip install --upgrade pip
|
334
|
-
pip install setuptools
|
335
|
-
pip install build
|
336
|
-
source rebuild.sh
|
337
|
-
```
|
338
|
-
|
339
|
-
from the root directory. This installs a build chain and a local editable copy
|
340
|
-
of not1mm.
|
341
|
-
|
342
|
-
There's two ways to launch the program from the local editable copy.
|
343
|
-
|
344
|
-
You can either be in the root of the source directory and type:
|
345
|
-
|
346
|
-
```bash
|
347
|
-
python not1mm
|
348
|
-
```
|
349
|
-
|
350
|
-
or be in some other directory and just type:
|
351
|
-
|
352
|
-
```bash
|
353
|
-
not1mm
|
354
|
-
```
|
355
|
-
|
356
397
|
## Various data file locations
|
357
398
|
|
358
399
|
### Data
|
@@ -462,7 +503,10 @@ onscreen icon for CAT status. Green good, Red bad, Grey neither.
|
|
462
503
|
|
463
504
|
Under the `CW` TAB, There are three options. `cwdaemon`, which normally uses IP
|
464
505
|
`127.0.0.1` and port `6789`. `pywinkeyer` which normally uses IP `127.0.0.1` and
|
465
|
-
|
506
|
+
`CAT` which if your radio supports it, sends Morse characters via rigctld. As far
|
507
|
+
as I can tell rigctld does not support setting the radios internal keyer speed. So
|
508
|
+
the CW speed control widget will not be functional and you'd need to control the
|
509
|
+
keyer speed thru the radios interface.
|
466
510
|
|
467
511
|
### Cluster
|
468
512
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# Not1MM
|
2
|
+
<!-- markdownlint-disable MD001 MD033 -->
|
2
3
|
|
3
4
|

|
4
5
|
|
@@ -23,14 +24,16 @@
|
|
23
24
|
- [Common installation recipes for Ubuntu and Fedora](#common-installation-recipes-for-ubuntu-and-fedora)
|
24
25
|
- [Ubuntu 22.04 LTS](#ubuntu-2204-lts)
|
25
26
|
- [Ubuntu 23.04](#ubuntu-2304)
|
27
|
+
- [Ubuntu 24.04 LTS](#ubuntu-2404-lts)
|
26
28
|
- [Fedora 38 \& 39](#fedora-38--39)
|
29
|
+
- [Fedora 40](#fedora-40)
|
27
30
|
- [Python, PyPI, pip and pipx](#python-pypi-pip-and-pipx)
|
28
31
|
- [Bootstrapping pipx](#bootstrapping-pipx)
|
29
32
|
- [Installing with pipx](#installing-with-pipx)
|
33
|
+
- [Installing from GitHub source](#installing-from-github-source)
|
30
34
|
- [After the install](#after-the-install)
|
31
35
|
- [You may or may not get a warning message like](#you-may-or-may-not-get-a-warning-message-like)
|
32
36
|
- [Or this fan favorite](#or-this-fan-favorite)
|
33
|
-
- [Installing from GitHub source](#installing-from-github-source)
|
34
37
|
- [Various data file locations](#various-data-file-locations)
|
35
38
|
- [Data](#data)
|
36
39
|
- [Config](#config)
|
@@ -145,6 +148,8 @@ I wish to thank those who've contributed to the project.
|
|
145
148
|
|
146
149
|
## Recent Changes
|
147
150
|
|
151
|
+
- [24-4-30] Allowsending CW via rigctld if your radio supports it.
|
152
|
+
- [24-4-27] Cleaned up dark mode code.
|
148
153
|
- [24-4-25-1] Reduce delta time to poll. Reorder poll_radio callback. Remove unused CAT lib from main.
|
149
154
|
- [24-4-25] Limited loop in radio.py, reducing clock cycles used. Moved Log window to the top of the logger.
|
150
155
|
- [24-4-24] Placed CAT control into a thread so disconnecting the radio wouldn't lock up the interface.
|
@@ -183,6 +188,10 @@ through your distribution's package manager before continuing.
|
|
183
188
|
I've taken the time to install some common Linux distributions into a VM and
|
184
189
|
noted the minimum steps needed to install not1mm.
|
185
190
|
|
191
|
+
<details>
|
192
|
+
|
193
|
+
<summary><b>Ubuntu 22.04 LTS, 23.04 and 24.04 LTS</b></summary>
|
194
|
+
|
186
195
|
#### Ubuntu 22.04 LTS
|
187
196
|
|
188
197
|
```bash
|
@@ -202,6 +211,22 @@ pipx install not1mm
|
|
202
211
|
pipx ensurepath
|
203
212
|
```
|
204
213
|
|
214
|
+
#### Ubuntu 24.04 LTS
|
215
|
+
|
216
|
+
```bash
|
217
|
+
sudo apt update
|
218
|
+
sudo apt upgrade
|
219
|
+
sudo apt install -y libportaudio2 pyqt6-dev-tools python3-pip
|
220
|
+
pip install --break-system-packages not1mm
|
221
|
+
source .profile
|
222
|
+
```
|
223
|
+
|
224
|
+
</details>
|
225
|
+
|
226
|
+
<details>
|
227
|
+
|
228
|
+
<summary><b>Fedora 38, 39 and 40</b></summary>
|
229
|
+
|
205
230
|
#### Fedora 38 & 39
|
206
231
|
|
207
232
|
```bash
|
@@ -210,6 +235,17 @@ sudo dnf install python3-pip portaudio
|
|
210
235
|
pip install not1mm
|
211
236
|
```
|
212
237
|
|
238
|
+
#### Fedora 40
|
239
|
+
|
240
|
+
```bash
|
241
|
+
sudo dnf upgrade --refresh
|
242
|
+
sudo dnf install python3-pip python3-pyqt6 portaudio
|
243
|
+
pip install not1mm
|
244
|
+
```
|
245
|
+
|
246
|
+
</details>
|
247
|
+
<br>
|
248
|
+
|
213
249
|
You can now open a new terminal and type not1mm. On it's first run, it may or
|
214
250
|
may not install a lovely non AI generated icon, which you can later click on to
|
215
251
|
launch the application.
|
@@ -261,6 +297,40 @@ If you need to later update not1mm, you can do so with:
|
|
261
297
|
pipx upgrade not1mm
|
262
298
|
```
|
263
299
|
|
300
|
+
<details>
|
301
|
+
<summary><b>Installing from GitHub source.</b></summary>
|
302
|
+
|
303
|
+
### Installing from GitHub source
|
304
|
+
|
305
|
+
Since this is packaged for PyPI, if you want to work on your own source branch,
|
306
|
+
after cloning from github you would:
|
307
|
+
|
308
|
+
```bash
|
309
|
+
pip install --upgrade pip
|
310
|
+
pip install setuptools
|
311
|
+
pip install build
|
312
|
+
source rebuild.sh
|
313
|
+
```
|
314
|
+
|
315
|
+
from the root directory. This installs a build chain and a local editable copy
|
316
|
+
of not1mm.
|
317
|
+
|
318
|
+
There's two ways to launch the program from the local editable copy.
|
319
|
+
|
320
|
+
You can either be in the root of the source directory and type:
|
321
|
+
|
322
|
+
```bash
|
323
|
+
python not1mm
|
324
|
+
```
|
325
|
+
|
326
|
+
or be in some other directory and just type:
|
327
|
+
|
328
|
+
```bash
|
329
|
+
not1mm
|
330
|
+
```
|
331
|
+
|
332
|
+
</details>
|
333
|
+
|
264
334
|
## After the install
|
265
335
|
|
266
336
|
You can now open a new terminal and type `not1mm`. On it's first run, it may or
|
@@ -292,35 +362,6 @@ For a more permanent solution you can place the line
|
|
292
362
|
`export QT_QPA_PLATFORM=wayland` in your home directories .bashrc file. Then
|
293
363
|
after logging out and back in you should be able to launch it normally.
|
294
364
|
|
295
|
-
### Installing from GitHub source
|
296
|
-
|
297
|
-
Since this is packaged for PyPI, if you want to work on your own source branch,
|
298
|
-
after cloning from github you would:
|
299
|
-
|
300
|
-
```bash
|
301
|
-
pip install --upgrade pip
|
302
|
-
pip install setuptools
|
303
|
-
pip install build
|
304
|
-
source rebuild.sh
|
305
|
-
```
|
306
|
-
|
307
|
-
from the root directory. This installs a build chain and a local editable copy
|
308
|
-
of not1mm.
|
309
|
-
|
310
|
-
There's two ways to launch the program from the local editable copy.
|
311
|
-
|
312
|
-
You can either be in the root of the source directory and type:
|
313
|
-
|
314
|
-
```bash
|
315
|
-
python not1mm
|
316
|
-
```
|
317
|
-
|
318
|
-
or be in some other directory and just type:
|
319
|
-
|
320
|
-
```bash
|
321
|
-
not1mm
|
322
|
-
```
|
323
|
-
|
324
365
|
## Various data file locations
|
325
366
|
|
326
367
|
### Data
|
@@ -430,7 +471,10 @@ onscreen icon for CAT status. Green good, Red bad, Grey neither.
|
|
430
471
|
|
431
472
|
Under the `CW` TAB, There are three options. `cwdaemon`, which normally uses IP
|
432
473
|
`127.0.0.1` and port `6789`. `pywinkeyer` which normally uses IP `127.0.0.1` and
|
433
|
-
|
474
|
+
`CAT` which if your radio supports it, sends Morse characters via rigctld. As far
|
475
|
+
as I can tell rigctld does not support setting the radios internal keyer speed. So
|
476
|
+
the CW speed control widget will not be functional and you'd need to control the
|
477
|
+
keyer speed thru the radios interface.
|
434
478
|
|
435
479
|
### Cluster
|
436
480
|
|
@@ -38,7 +38,7 @@ except OSError as exception:
|
|
38
38
|
import soundfile as sf
|
39
39
|
from PyQt6 import QtCore, QtGui, QtWidgets, uic
|
40
40
|
from PyQt6.QtCore import QDir, Qt, QThread
|
41
|
-
from PyQt6.QtGui import QFontDatabase, QColorConstants
|
41
|
+
from PyQt6.QtGui import QFontDatabase, QColorConstants, QPalette, QColor
|
42
42
|
from PyQt6.QtWidgets import QFileDialog
|
43
43
|
|
44
44
|
from not1mm.lib.about import About
|
@@ -150,10 +150,11 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
150
150
|
"cluster_port": 7373,
|
151
151
|
"cluster_filter": "Set DX Filter SpotterCont=NA",
|
152
152
|
"cluster_mode": "OPEN",
|
153
|
-
"logwindow":
|
154
|
-
"bandmapwindow":
|
155
|
-
"checkwindow":
|
153
|
+
"logwindow": False,
|
154
|
+
"bandmapwindow": False,
|
155
|
+
"checkwindow": False,
|
156
156
|
"vfowindow": False,
|
157
|
+
"darkmode": True,
|
157
158
|
}
|
158
159
|
appstarted = False
|
159
160
|
contact = {}
|
@@ -566,76 +567,50 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
566
567
|
"""
|
567
568
|
print(f"{result=}")
|
568
569
|
|
569
|
-
def setDarkMode(self,
|
570
|
-
"""
|
570
|
+
def setDarkMode(self, setdarkmode=False) -> None:
|
571
|
+
"""Forces a darkmode palette."""
|
571
572
|
|
572
|
-
logger.debug(f"Dark mode set to: {
|
573
|
+
logger.debug(f"Dark mode set to: {setdarkmode}")
|
573
574
|
|
574
575
|
cmd = {}
|
575
576
|
cmd["cmd"] = "DARKMODE"
|
576
|
-
cmd["state"] =
|
577
|
+
cmd["state"] = setdarkmode
|
577
578
|
cmd["station"] = platform.node()
|
578
579
|
self.multicast_interface.send_as_json(cmd)
|
579
580
|
|
580
|
-
if
|
581
|
-
darkPalette =
|
582
|
-
darkColor =
|
583
|
-
disabledColor =
|
584
|
-
darkPalette.setColor(
|
581
|
+
if setdarkmode:
|
582
|
+
darkPalette = QPalette()
|
583
|
+
darkColor = QColor(56, 56, 56)
|
584
|
+
disabledColor = QColor(127, 127, 127)
|
585
|
+
darkPalette.setColor(QPalette.ColorRole.Window, darkColor)
|
586
|
+
darkPalette.setColor(QPalette.ColorRole.WindowText, QColorConstants.White)
|
587
|
+
darkPalette.setColor(QPalette.ColorRole.Base, QColor(45, 45, 45))
|
588
|
+
darkPalette.setColor(QPalette.ColorRole.AlternateBase, darkColor)
|
589
|
+
darkPalette.setColor(QPalette.ColorRole.Text, QColorConstants.White)
|
590
|
+
darkPalette.setColor(QPalette.ColorRole.Button, darkColor)
|
591
|
+
darkPalette.setColor(QPalette.ColorRole.ButtonText, QColorConstants.White)
|
592
|
+
darkPalette.setColor(QPalette.ColorRole.BrightText, QColorConstants.Red)
|
593
|
+
darkPalette.setColor(QPalette.ColorRole.Link, QColor(42, 130, 218))
|
594
|
+
darkPalette.setColor(QPalette.ColorRole.Highlight, QColor(42, 130, 218))
|
585
595
|
darkPalette.setColor(
|
586
|
-
|
596
|
+
QPalette.ColorRole.HighlightedText, QColorConstants.Black
|
587
597
|
)
|
588
598
|
darkPalette.setColor(
|
589
|
-
|
590
|
-
|
591
|
-
darkPalette.setColor(QtGui.QPalette.ColorRole.AlternateBase, darkColor)
|
592
|
-
darkPalette.setColor(QtGui.QPalette.ColorRole.Text, QColorConstants.White)
|
593
|
-
darkPalette.setColor(
|
594
|
-
QtGui.QPalette.ColorGroup.Disabled,
|
595
|
-
QtGui.QPalette.ColorRole.Text,
|
599
|
+
QPalette.ColorGroup.Disabled,
|
600
|
+
QPalette.ColorRole.ButtonText,
|
596
601
|
disabledColor,
|
597
602
|
)
|
598
|
-
darkPalette.setColor(QtGui.QPalette.ColorRole.Button, darkColor)
|
599
|
-
darkPalette.setColor(
|
600
|
-
QtGui.QPalette.ColorRole.ButtonText, QColorConstants.White
|
601
|
-
)
|
602
603
|
darkPalette.setColor(
|
603
|
-
|
604
|
-
|
604
|
+
QPalette.ColorGroup.Disabled,
|
605
|
+
QPalette.ColorRole.HighlightedText,
|
605
606
|
disabledColor,
|
606
607
|
)
|
607
608
|
darkPalette.setColor(
|
608
|
-
|
609
|
-
|
610
|
-
darkPalette.setColor(
|
611
|
-
QtGui.QPalette.ColorRole.Link, QtGui.QColor(42, 130, 218)
|
612
|
-
)
|
613
|
-
darkPalette.setColor(
|
614
|
-
QtGui.QPalette.ColorRole.Highlight, QtGui.QColor(42, 130, 218)
|
615
|
-
)
|
616
|
-
darkPalette.setColor(
|
617
|
-
QtGui.QPalette.ColorRole.HighlightedText, QColorConstants.Black
|
618
|
-
)
|
619
|
-
darkPalette.setColor(
|
620
|
-
QtGui.QPalette.ColorGroup.Disabled,
|
621
|
-
QtGui.QPalette.ColorRole.HighlightedText,
|
609
|
+
QPalette.ColorGroup.Disabled,
|
610
|
+
QPalette.ColorRole.Text,
|
622
611
|
disabledColor,
|
623
612
|
)
|
624
|
-
|
625
|
-
"QPushButton {"
|
626
|
-
"background-color: rgb(56,56,56);"
|
627
|
-
"color: white;"
|
628
|
-
"border-style: outset;"
|
629
|
-
"border-width: 2px;"
|
630
|
-
"border-radius: 5px;"
|
631
|
-
"border-color: rgb(45,45,45);"
|
632
|
-
"padding: 6px;"
|
633
|
-
"}"
|
634
|
-
"QPushButton:pressed {"
|
635
|
-
"background-color: rgb(127, 127, 127);"
|
636
|
-
"border-style: inset;"
|
637
|
-
"}"
|
638
|
-
)
|
613
|
+
|
639
614
|
self.current_palette = darkPalette
|
640
615
|
self.setPalette(darkPalette)
|
641
616
|
self.text_color = QColorConstants.White
|
@@ -650,18 +625,6 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
650
625
|
self.other_1.setPalette(darkPalette)
|
651
626
|
self.other_2.setPalette(darkPalette)
|
652
627
|
self.cw_entry.setPalette(darkPalette)
|
653
|
-
self.F1.setStyleSheet(dark_button_style)
|
654
|
-
self.F2.setStyleSheet(dark_button_style)
|
655
|
-
self.F3.setStyleSheet(dark_button_style)
|
656
|
-
self.F4.setStyleSheet(dark_button_style)
|
657
|
-
self.F5.setStyleSheet(dark_button_style)
|
658
|
-
self.F6.setStyleSheet(dark_button_style)
|
659
|
-
self.F7.setStyleSheet(dark_button_style)
|
660
|
-
self.F8.setStyleSheet(dark_button_style)
|
661
|
-
self.F9.setStyleSheet(dark_button_style)
|
662
|
-
self.F10.setStyleSheet(dark_button_style)
|
663
|
-
self.F11.setStyleSheet(dark_button_style)
|
664
|
-
self.F12.setStyleSheet(dark_button_style)
|
665
628
|
else:
|
666
629
|
palette = self.style().standardPalette()
|
667
630
|
self.current_palette = palette
|
@@ -678,33 +641,6 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
678
641
|
self.other_2.setPalette(palette)
|
679
642
|
self.cw_entry.setPalette(palette)
|
680
643
|
self.text_color = QColorConstants.Black
|
681
|
-
light_button_style = (
|
682
|
-
"QPushButton {"
|
683
|
-
"background-color: rgb(245,245,245);"
|
684
|
-
"color: rgb(52,52,52);"
|
685
|
-
"border-style: outset;"
|
686
|
-
"border-width: 2px;"
|
687
|
-
"border-radius: 5px;"
|
688
|
-
"border-color: rgb(150,150,150);"
|
689
|
-
"padding: 6px;"
|
690
|
-
"}"
|
691
|
-
"QPushButton:pressed {"
|
692
|
-
"background-color: rgb(127, 127, 127);"
|
693
|
-
"border-style: inset;"
|
694
|
-
"}"
|
695
|
-
)
|
696
|
-
self.F1.setStyleSheet(light_button_style)
|
697
|
-
self.F2.setStyleSheet(light_button_style)
|
698
|
-
self.F3.setStyleSheet(light_button_style)
|
699
|
-
self.F4.setStyleSheet(light_button_style)
|
700
|
-
self.F5.setStyleSheet(light_button_style)
|
701
|
-
self.F6.setStyleSheet(light_button_style)
|
702
|
-
self.F7.setStyleSheet(light_button_style)
|
703
|
-
self.F8.setStyleSheet(light_button_style)
|
704
|
-
self.F9.setStyleSheet(light_button_style)
|
705
|
-
self.F10.setStyleSheet(light_button_style)
|
706
|
-
self.F11.setStyleSheet(light_button_style)
|
707
|
-
self.F12.setStyleSheet(light_button_style)
|
708
644
|
|
709
645
|
def set_radio_icon(self, state: int) -> None:
|
710
646
|
"""
|
@@ -769,7 +705,9 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
769
705
|
# self.send_backspace()
|
770
706
|
self.oldtext = newtext
|
771
707
|
return
|
772
|
-
if self.
|
708
|
+
if self.pref.get("cwtype") == 3 and self.rig_control is not None:
|
709
|
+
self.rig_control.sendcw(newtext[len(self.oldtext) :])
|
710
|
+
elif self.cw is not None:
|
773
711
|
self.cw.sendcw(newtext[len(self.oldtext) :])
|
774
712
|
self.oldtext = newtext
|
775
713
|
|
@@ -2374,6 +2312,9 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
2374
2312
|
self.voice_string(self.process_macro(function_key.toolTip()))
|
2375
2313
|
return
|
2376
2314
|
if self.cw:
|
2315
|
+
if self.pref.get("cwtype") == 3 and self.rig_control is not None:
|
2316
|
+
self.rig_control.sendcw(self.process_macro(function_key.toolTip()))
|
2317
|
+
return
|
2377
2318
|
self.cw.sendcw(self.process_macro(function_key.toolTip()))
|
2378
2319
|
|
2379
2320
|
def run_sp_buttons_clicked(self) -> None:
|