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.
Files changed (154) hide show
  1. {not1mm-24.4.25.1 → not1mm-24.4.30}/PKG-INFO +76 -32
  2. {not1mm-24.4.25.1 → not1mm-24.4.30}/README.md +75 -31
  3. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/__main__.py +37 -96
  4. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/bandmap.py +28 -81
  5. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/checkwindow.py +23 -35
  6. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/configuration.ui +5 -5
  7. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/cat_interface.py +28 -0
  8. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/cwinterface.py +18 -6
  9. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/settings.py +6 -1
  10. not1mm-24.4.30/not1mm/lib/version.py +3 -0
  11. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/logwindow.py +37 -50
  12. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/radio.py +9 -0
  13. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/vfo.py +26 -38
  14. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm.egg-info/PKG-INFO +76 -32
  15. {not1mm-24.4.25.1 → not1mm-24.4.30}/pyproject.toml +1 -1
  16. not1mm-24.4.25.1/not1mm/lib/version.py +0 -3
  17. {not1mm-24.4.25.1 → not1mm-24.4.30}/LICENSE +0 -0
  18. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/__init__.py +0 -0
  19. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/JetBrainsMono-Regular.ttf +0 -0
  20. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/MASTER.SCP +0 -0
  21. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/about.ui +0 -0
  22. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/alpha bravo charlie delta.txt +0 -0
  23. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/bandmap.ui +0 -0
  24. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/check.png +0 -0
  25. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/checkwindow.ui +0 -0
  26. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/contests.sql +0 -0
  27. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/cty.json +0 -0
  28. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/cwmacros.txt +0 -0
  29. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/donors.html +0 -0
  30. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/editcontact.ui +0 -0
  31. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/editmacro.ui +0 -0
  32. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/greendot.png +0 -0
  33. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/k6gte-not1mm.desktop +0 -0
  34. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/k6gte.not1mm-128.png +0 -0
  35. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/k6gte.not1mm-32.png +0 -0
  36. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/k6gte.not1mm-64.png +0 -0
  37. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/logwindow.ui +0 -0
  38. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/logwindowx.ui +0 -0
  39. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/main.ui +0 -0
  40. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/new_contest.ui +0 -0
  41. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/not1mm.html +0 -0
  42. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/opon.ui +0 -0
  43. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/0.wav +0 -0
  44. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/1.wav +0 -0
  45. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/2.wav +0 -0
  46. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/3.wav +0 -0
  47. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/4.wav +0 -0
  48. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/5.wav +0 -0
  49. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/6.wav +0 -0
  50. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/7.wav +0 -0
  51. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/73.wav +0 -0
  52. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/8.wav +0 -0
  53. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/9.wav +0 -0
  54. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/a.wav +0 -0
  55. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/again.wav +0 -0
  56. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/b.wav +0 -0
  57. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/c.wav +0 -0
  58. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/contest.wav +0 -0
  59. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/cq.wav +0 -0
  60. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/d.wav +0 -0
  61. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/e.wav +0 -0
  62. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/f.wav +0 -0
  63. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/g.wav +0 -0
  64. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/h.wav +0 -0
  65. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/i.wav +0 -0
  66. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/j.wav +0 -0
  67. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/k.wav +0 -0
  68. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/k6gte.wav +0 -0
  69. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/l.wav +0 -0
  70. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/m.wav +0 -0
  71. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/mynumber.wav +0 -0
  72. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/n.wav +0 -0
  73. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/nil.wav +0 -0
  74. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/o.wav +0 -0
  75. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/p.wav +0 -0
  76. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/q.wav +0 -0
  77. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/r.wav +0 -0
  78. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/roger.wav +0 -0
  79. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/s.wav +0 -0
  80. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/space.wav +0 -0
  81. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/t.wav +0 -0
  82. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/thankyou.wav +0 -0
  83. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/thankyouqrz.wav +0 -0
  84. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/u.wav +0 -0
  85. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/v.wav +0 -0
  86. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/w.wav +0 -0
  87. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/x.wav +0 -0
  88. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/y.wav +0 -0
  89. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/yourcall.wav +0 -0
  90. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/phonetics/z.wav +0 -0
  91. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/pickcontest.ui +0 -0
  92. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/radio_green.png +0 -0
  93. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/radio_grey.png +0 -0
  94. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/radio_red.png +0 -0
  95. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/reddot.png +0 -0
  96. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/settings.ui +0 -0
  97. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/ssbmacros.txt +0 -0
  98. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/data/vfo.ui +0 -0
  99. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/fsutils.py +0 -0
  100. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/__init__.py +0 -0
  101. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/about.py +0 -0
  102. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/database.py +0 -0
  103. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/edit_contact.py +0 -0
  104. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/edit_macro.py +0 -0
  105. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/edit_opon.py +0 -0
  106. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/edit_station.py +0 -0
  107. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/ft8_watcher.py +0 -0
  108. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/ham_utility.py +0 -0
  109. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/lookup.py +0 -0
  110. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/multicast.py +0 -0
  111. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/n1mm.py +0 -0
  112. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/new_contest.py +0 -0
  113. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/plugin_common.py +0 -0
  114. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/select_contest.py +0 -0
  115. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/super_check_partial.py +0 -0
  116. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/lib/versiontest.py +0 -0
  117. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/10_10_fall_cw.py +0 -0
  118. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/10_10_spring_cw.py +0 -0
  119. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/10_10_summer_phone.py +0 -0
  120. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/10_10_winter_phone.py +0 -0
  121. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/__init__.py +0 -0
  122. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/arrl_10m.py +0 -0
  123. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/arrl_dx_cw.py +0 -0
  124. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/arrl_dx_ssb.py +0 -0
  125. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/arrl_field_day.py +0 -0
  126. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/arrl_rtty_ru.py +0 -0
  127. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/arrl_ss_cw.py +0 -0
  128. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/arrl_ss_phone.py +0 -0
  129. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/arrl_vhf_jan.py +0 -0
  130. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/arrl_vhf_jun.py +0 -0
  131. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/arrl_vhf_sep.py +0 -0
  132. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/canada_day.py +0 -0
  133. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/cq_160_cw.py +0 -0
  134. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/cq_160_ssb.py +0 -0
  135. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/cq_wpx_cw.py +0 -0
  136. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/cq_wpx_ssb.py +0 -0
  137. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/cq_ww_cw.py +0 -0
  138. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/cq_ww_ssb.py +0 -0
  139. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/cwt.py +0 -0
  140. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/general_logging.py +0 -0
  141. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/iaru_hf.py +0 -0
  142. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/jidx_cw.py +0 -0
  143. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/jidx_ph.py +0 -0
  144. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/naqp_cw.py +0 -0
  145. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/naqp_ssb.py +0 -0
  146. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/phone_weekly_test.py +0 -0
  147. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/stew_perry_topband.py +0 -0
  148. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm/plugins/winter_field_day.py +0 -0
  149. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm.egg-info/SOURCES.txt +0 -0
  150. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm.egg-info/dependency_links.txt +0 -0
  151. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm.egg-info/entry_points.txt +0 -0
  152. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm.egg-info/requires.txt +0 -0
  153. {not1mm-24.4.25.1 → not1mm-24.4.30}/not1mm.egg-info/top_level.txt +0 -0
  154. {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.25.1
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
  ![logo](https://github.com/mbridak/not1mm/raw/master/not1mm/data/k6gte.not1mm.svg)
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
- port `8000`. Or `None`, if you want to Morse it like it's 1899.
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
  ![logo](https://github.com/mbridak/not1mm/raw/master/not1mm/data/k6gte.not1mm.svg)
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
- port `8000`. Or `None`, if you want to Morse it like it's 1899.
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": True,
154
- "bandmapwindow": True,
155
- "checkwindow": True,
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, dark):
570
- """testing"""
570
+ def setDarkMode(self, setdarkmode=False) -> None:
571
+ """Forces a darkmode palette."""
571
572
 
572
- logger.debug(f"Dark mode set to: {dark}")
573
+ logger.debug(f"Dark mode set to: {setdarkmode}")
573
574
 
574
575
  cmd = {}
575
576
  cmd["cmd"] = "DARKMODE"
576
- cmd["state"] = dark
577
+ cmd["state"] = setdarkmode
577
578
  cmd["station"] = platform.node()
578
579
  self.multicast_interface.send_as_json(cmd)
579
580
 
580
- if dark:
581
- darkPalette = QtGui.QPalette()
582
- darkColor = QtGui.QColor(56, 56, 56)
583
- disabledColor = QtGui.QColor(127, 127, 127)
584
- darkPalette.setColor(QtGui.QPalette.ColorRole.Window, darkColor)
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
- QtGui.QPalette.ColorRole.WindowText, QColorConstants.White
596
+ QPalette.ColorRole.HighlightedText, QColorConstants.Black
587
597
  )
588
598
  darkPalette.setColor(
589
- QtGui.QPalette.ColorRole.Base, QtGui.QColor(45, 45, 45)
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
- QtGui.QPalette.ColorGroup.Disabled,
604
- QtGui.QPalette.ColorRole.ButtonText,
604
+ QPalette.ColorGroup.Disabled,
605
+ QPalette.ColorRole.HighlightedText,
605
606
  disabledColor,
606
607
  )
607
608
  darkPalette.setColor(
608
- QtGui.QPalette.ColorRole.BrightText, QColorConstants.Red
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
- dark_button_style = (
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.cw is not None:
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: