not1mm 24.4.26__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 (153) hide show
  1. {not1mm-24.4.26 → not1mm-24.4.30}/PKG-INFO +58 -34
  2. {not1mm-24.4.26 → not1mm-24.4.30}/README.md +57 -33
  3. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/__main__.py +33 -93
  4. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/bandmap.py +28 -81
  5. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/checkwindow.py +23 -35
  6. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/configuration.ui +5 -5
  7. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/lib/cat_interface.py +28 -0
  8. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/lib/cwinterface.py +18 -6
  9. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/lib/settings.py +6 -1
  10. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/lib/version.py +1 -1
  11. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/logwindow.py +37 -50
  12. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/radio.py +9 -0
  13. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/vfo.py +26 -38
  14. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm.egg-info/PKG-INFO +58 -34
  15. {not1mm-24.4.26 → not1mm-24.4.30}/pyproject.toml +1 -1
  16. {not1mm-24.4.26 → not1mm-24.4.30}/LICENSE +0 -0
  17. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/__init__.py +0 -0
  18. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/JetBrainsMono-Regular.ttf +0 -0
  19. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/MASTER.SCP +0 -0
  20. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/about.ui +0 -0
  21. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/alpha bravo charlie delta.txt +0 -0
  22. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/bandmap.ui +0 -0
  23. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/check.png +0 -0
  24. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/checkwindow.ui +0 -0
  25. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/contests.sql +0 -0
  26. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/cty.json +0 -0
  27. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/cwmacros.txt +0 -0
  28. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/donors.html +0 -0
  29. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/editcontact.ui +0 -0
  30. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/editmacro.ui +0 -0
  31. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/greendot.png +0 -0
  32. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/k6gte-not1mm.desktop +0 -0
  33. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/k6gte.not1mm-128.png +0 -0
  34. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/k6gte.not1mm-32.png +0 -0
  35. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/k6gte.not1mm-64.png +0 -0
  36. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/logwindow.ui +0 -0
  37. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/logwindowx.ui +0 -0
  38. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/main.ui +0 -0
  39. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/new_contest.ui +0 -0
  40. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/not1mm.html +0 -0
  41. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/opon.ui +0 -0
  42. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/0.wav +0 -0
  43. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/1.wav +0 -0
  44. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/2.wav +0 -0
  45. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/3.wav +0 -0
  46. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/4.wav +0 -0
  47. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/5.wav +0 -0
  48. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/6.wav +0 -0
  49. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/7.wav +0 -0
  50. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/73.wav +0 -0
  51. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/8.wav +0 -0
  52. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/9.wav +0 -0
  53. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/a.wav +0 -0
  54. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/again.wav +0 -0
  55. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/b.wav +0 -0
  56. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/c.wav +0 -0
  57. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/contest.wav +0 -0
  58. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/cq.wav +0 -0
  59. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/d.wav +0 -0
  60. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/e.wav +0 -0
  61. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/f.wav +0 -0
  62. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/g.wav +0 -0
  63. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/h.wav +0 -0
  64. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/i.wav +0 -0
  65. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/j.wav +0 -0
  66. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/k.wav +0 -0
  67. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/k6gte.wav +0 -0
  68. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/l.wav +0 -0
  69. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/m.wav +0 -0
  70. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/mynumber.wav +0 -0
  71. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/n.wav +0 -0
  72. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/nil.wav +0 -0
  73. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/o.wav +0 -0
  74. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/p.wav +0 -0
  75. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/q.wav +0 -0
  76. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/r.wav +0 -0
  77. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/roger.wav +0 -0
  78. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/s.wav +0 -0
  79. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/space.wav +0 -0
  80. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/t.wav +0 -0
  81. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/thankyou.wav +0 -0
  82. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/thankyouqrz.wav +0 -0
  83. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/u.wav +0 -0
  84. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/v.wav +0 -0
  85. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/w.wav +0 -0
  86. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/x.wav +0 -0
  87. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/y.wav +0 -0
  88. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/yourcall.wav +0 -0
  89. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/phonetics/z.wav +0 -0
  90. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/pickcontest.ui +0 -0
  91. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/radio_green.png +0 -0
  92. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/radio_grey.png +0 -0
  93. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/radio_red.png +0 -0
  94. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/reddot.png +0 -0
  95. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/settings.ui +0 -0
  96. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/ssbmacros.txt +0 -0
  97. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/data/vfo.ui +0 -0
  98. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/fsutils.py +0 -0
  99. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/lib/__init__.py +0 -0
  100. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/lib/about.py +0 -0
  101. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/lib/database.py +0 -0
  102. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/lib/edit_contact.py +0 -0
  103. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/lib/edit_macro.py +0 -0
  104. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/lib/edit_opon.py +0 -0
  105. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/lib/edit_station.py +0 -0
  106. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/lib/ft8_watcher.py +0 -0
  107. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/lib/ham_utility.py +0 -0
  108. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/lib/lookup.py +0 -0
  109. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/lib/multicast.py +0 -0
  110. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/lib/n1mm.py +0 -0
  111. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/lib/new_contest.py +0 -0
  112. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/lib/plugin_common.py +0 -0
  113. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/lib/select_contest.py +0 -0
  114. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/lib/super_check_partial.py +0 -0
  115. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/lib/versiontest.py +0 -0
  116. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/10_10_fall_cw.py +0 -0
  117. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/10_10_spring_cw.py +0 -0
  118. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/10_10_summer_phone.py +0 -0
  119. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/10_10_winter_phone.py +0 -0
  120. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/__init__.py +0 -0
  121. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/arrl_10m.py +0 -0
  122. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/arrl_dx_cw.py +0 -0
  123. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/arrl_dx_ssb.py +0 -0
  124. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/arrl_field_day.py +0 -0
  125. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/arrl_rtty_ru.py +0 -0
  126. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/arrl_ss_cw.py +0 -0
  127. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/arrl_ss_phone.py +0 -0
  128. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/arrl_vhf_jan.py +0 -0
  129. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/arrl_vhf_jun.py +0 -0
  130. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/arrl_vhf_sep.py +0 -0
  131. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/canada_day.py +0 -0
  132. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/cq_160_cw.py +0 -0
  133. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/cq_160_ssb.py +0 -0
  134. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/cq_wpx_cw.py +0 -0
  135. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/cq_wpx_ssb.py +0 -0
  136. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/cq_ww_cw.py +0 -0
  137. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/cq_ww_ssb.py +0 -0
  138. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/cwt.py +0 -0
  139. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/general_logging.py +0 -0
  140. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/iaru_hf.py +0 -0
  141. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/jidx_cw.py +0 -0
  142. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/jidx_ph.py +0 -0
  143. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/naqp_cw.py +0 -0
  144. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/naqp_ssb.py +0 -0
  145. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/phone_weekly_test.py +0 -0
  146. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/stew_perry_topband.py +0 -0
  147. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm/plugins/winter_field_day.py +0 -0
  148. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm.egg-info/SOURCES.txt +0 -0
  149. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm.egg-info/dependency_links.txt +0 -0
  150. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm.egg-info/entry_points.txt +0 -0
  151. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm.egg-info/requires.txt +0 -0
  152. {not1mm-24.4.26 → not1mm-24.4.30}/not1mm.egg-info/top_level.txt +0 -0
  153. {not1mm-24.4.26 → 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.26
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,16 +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)
58
- - [Ubuntu 24.04](#ubuntu-2404)
59
+ - [Ubuntu 24.04 LTS](#ubuntu-2404-lts)
59
60
  - [Fedora 38 \& 39](#fedora-38--39)
60
61
  - [Fedora 40](#fedora-40)
61
62
  - [Python, PyPI, pip and pipx](#python-pypi-pip-and-pipx)
62
63
  - [Bootstrapping pipx](#bootstrapping-pipx)
63
64
  - [Installing with pipx](#installing-with-pipx)
65
+ - [Installing from GitHub source](#installing-from-github-source)
64
66
  - [After the install](#after-the-install)
65
67
  - [You may or may not get a warning message like](#you-may-or-may-not-get-a-warning-message-like)
66
68
  - [Or this fan favorite](#or-this-fan-favorite)
67
- - [Installing from GitHub source](#installing-from-github-source)
68
69
  - [Various data file locations](#various-data-file-locations)
69
70
  - [Data](#data)
70
71
  - [Config](#config)
@@ -179,6 +180,8 @@ I wish to thank those who've contributed to the project.
179
180
 
180
181
  ## Recent Changes
181
182
 
183
+ - [24-4-30] Allowsending CW via rigctld if your radio supports it.
184
+ - [24-4-27] Cleaned up dark mode code.
182
185
  - [24-4-25-1] Reduce delta time to poll. Reorder poll_radio callback. Remove unused CAT lib from main.
183
186
  - [24-4-25] Limited loop in radio.py, reducing clock cycles used. Moved Log window to the top of the logger.
184
187
  - [24-4-24] Placed CAT control into a thread so disconnecting the radio wouldn't lock up the interface.
@@ -217,6 +220,10 @@ through your distribution's package manager before continuing.
217
220
  I've taken the time to install some common Linux distributions into a VM and
218
221
  noted the minimum steps needed to install not1mm.
219
222
 
223
+ <details>
224
+
225
+ <summary><b>Ubuntu 22.04 LTS, 23.04 and 24.04 LTS</b></summary>
226
+
220
227
  #### Ubuntu 22.04 LTS
221
228
 
222
229
  ```bash
@@ -236,7 +243,7 @@ pipx install not1mm
236
243
  pipx ensurepath
237
244
  ```
238
245
 
239
- #### Ubuntu 24.04
246
+ #### Ubuntu 24.04 LTS
240
247
 
241
248
  ```bash
242
249
  sudo apt update
@@ -246,6 +253,12 @@ pip install --break-system-packages not1mm
246
253
  source .profile
247
254
  ```
248
255
 
256
+ </details>
257
+
258
+ <details>
259
+
260
+ <summary><b>Fedora 38, 39 and 40</b></summary>
261
+
249
262
  #### Fedora 38 & 39
250
263
 
251
264
  ```bash
@@ -262,6 +275,9 @@ sudo dnf install python3-pip python3-pyqt6 portaudio
262
275
  pip install not1mm
263
276
  ```
264
277
 
278
+ </details>
279
+ <br>
280
+
265
281
  You can now open a new terminal and type not1mm. On it's first run, it may or
266
282
  may not install a lovely non AI generated icon, which you can later click on to
267
283
  launch the application.
@@ -313,6 +329,40 @@ If you need to later update not1mm, you can do so with:
313
329
  pipx upgrade not1mm
314
330
  ```
315
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
+
316
366
  ## After the install
317
367
 
318
368
  You can now open a new terminal and type `not1mm`. On it's first run, it may or
@@ -344,35 +394,6 @@ For a more permanent solution you can place the line
344
394
  `export QT_QPA_PLATFORM=wayland` in your home directories .bashrc file. Then
345
395
  after logging out and back in you should be able to launch it normally.
346
396
 
347
- ### Installing from GitHub source
348
-
349
- Since this is packaged for PyPI, if you want to work on your own source branch,
350
- after cloning from github you would:
351
-
352
- ```bash
353
- pip install --upgrade pip
354
- pip install setuptools
355
- pip install build
356
- source rebuild.sh
357
- ```
358
-
359
- from the root directory. This installs a build chain and a local editable copy
360
- of not1mm.
361
-
362
- There's two ways to launch the program from the local editable copy.
363
-
364
- You can either be in the root of the source directory and type:
365
-
366
- ```bash
367
- python not1mm
368
- ```
369
-
370
- or be in some other directory and just type:
371
-
372
- ```bash
373
- not1mm
374
- ```
375
-
376
397
  ## Various data file locations
377
398
 
378
399
  ### Data
@@ -482,7 +503,10 @@ onscreen icon for CAT status. Green good, Red bad, Grey neither.
482
503
 
483
504
  Under the `CW` TAB, There are three options. `cwdaemon`, which normally uses IP
484
505
  `127.0.0.1` and port `6789`. `pywinkeyer` which normally uses IP `127.0.0.1` and
485
- 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.
486
510
 
487
511
  ### Cluster
488
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,16 +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)
26
- - [Ubuntu 24.04](#ubuntu-2404)
27
+ - [Ubuntu 24.04 LTS](#ubuntu-2404-lts)
27
28
  - [Fedora 38 \& 39](#fedora-38--39)
28
29
  - [Fedora 40](#fedora-40)
29
30
  - [Python, PyPI, pip and pipx](#python-pypi-pip-and-pipx)
30
31
  - [Bootstrapping pipx](#bootstrapping-pipx)
31
32
  - [Installing with pipx](#installing-with-pipx)
33
+ - [Installing from GitHub source](#installing-from-github-source)
32
34
  - [After the install](#after-the-install)
33
35
  - [You may or may not get a warning message like](#you-may-or-may-not-get-a-warning-message-like)
34
36
  - [Or this fan favorite](#or-this-fan-favorite)
35
- - [Installing from GitHub source](#installing-from-github-source)
36
37
  - [Various data file locations](#various-data-file-locations)
37
38
  - [Data](#data)
38
39
  - [Config](#config)
@@ -147,6 +148,8 @@ I wish to thank those who've contributed to the project.
147
148
 
148
149
  ## Recent Changes
149
150
 
151
+ - [24-4-30] Allowsending CW via rigctld if your radio supports it.
152
+ - [24-4-27] Cleaned up dark mode code.
150
153
  - [24-4-25-1] Reduce delta time to poll. Reorder poll_radio callback. Remove unused CAT lib from main.
151
154
  - [24-4-25] Limited loop in radio.py, reducing clock cycles used. Moved Log window to the top of the logger.
152
155
  - [24-4-24] Placed CAT control into a thread so disconnecting the radio wouldn't lock up the interface.
@@ -185,6 +188,10 @@ through your distribution's package manager before continuing.
185
188
  I've taken the time to install some common Linux distributions into a VM and
186
189
  noted the minimum steps needed to install not1mm.
187
190
 
191
+ <details>
192
+
193
+ <summary><b>Ubuntu 22.04 LTS, 23.04 and 24.04 LTS</b></summary>
194
+
188
195
  #### Ubuntu 22.04 LTS
189
196
 
190
197
  ```bash
@@ -204,7 +211,7 @@ pipx install not1mm
204
211
  pipx ensurepath
205
212
  ```
206
213
 
207
- #### Ubuntu 24.04
214
+ #### Ubuntu 24.04 LTS
208
215
 
209
216
  ```bash
210
217
  sudo apt update
@@ -214,6 +221,12 @@ pip install --break-system-packages not1mm
214
221
  source .profile
215
222
  ```
216
223
 
224
+ </details>
225
+
226
+ <details>
227
+
228
+ <summary><b>Fedora 38, 39 and 40</b></summary>
229
+
217
230
  #### Fedora 38 & 39
218
231
 
219
232
  ```bash
@@ -230,6 +243,9 @@ sudo dnf install python3-pip python3-pyqt6 portaudio
230
243
  pip install not1mm
231
244
  ```
232
245
 
246
+ </details>
247
+ <br>
248
+
233
249
  You can now open a new terminal and type not1mm. On it's first run, it may or
234
250
  may not install a lovely non AI generated icon, which you can later click on to
235
251
  launch the application.
@@ -281,6 +297,40 @@ If you need to later update not1mm, you can do so with:
281
297
  pipx upgrade not1mm
282
298
  ```
283
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
+
284
334
  ## After the install
285
335
 
286
336
  You can now open a new terminal and type `not1mm`. On it's first run, it may or
@@ -312,35 +362,6 @@ For a more permanent solution you can place the line
312
362
  `export QT_QPA_PLATFORM=wayland` in your home directories .bashrc file. Then
313
363
  after logging out and back in you should be able to launch it normally.
314
364
 
315
- ### Installing from GitHub source
316
-
317
- Since this is packaged for PyPI, if you want to work on your own source branch,
318
- after cloning from github you would:
319
-
320
- ```bash
321
- pip install --upgrade pip
322
- pip install setuptools
323
- pip install build
324
- source rebuild.sh
325
- ```
326
-
327
- from the root directory. This installs a build chain and a local editable copy
328
- of not1mm.
329
-
330
- There's two ways to launch the program from the local editable copy.
331
-
332
- You can either be in the root of the source directory and type:
333
-
334
- ```bash
335
- python not1mm
336
- ```
337
-
338
- or be in some other directory and just type:
339
-
340
- ```bash
341
- not1mm
342
- ```
343
-
344
365
  ## Various data file locations
345
366
 
346
367
  ### Data
@@ -450,7 +471,10 @@ onscreen icon for CAT status. Green good, Red bad, Grey neither.
450
471
 
451
472
  Under the `CW` TAB, There are three options. `cwdaemon`, which normally uses IP
452
473
  `127.0.0.1` and port `6789`. `pywinkeyer` which normally uses IP `127.0.0.1` and
453
- 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.
454
478
 
455
479
  ### Cluster
456
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
@@ -567,76 +567,50 @@ class MainWindow(QtWidgets.QMainWindow):
567
567
  """
568
568
  print(f"{result=}")
569
569
 
570
- def setDarkMode(self, dark):
571
- """testing"""
570
+ def setDarkMode(self, setdarkmode=False) -> None:
571
+ """Forces a darkmode palette."""
572
572
 
573
- logger.debug(f"Dark mode set to: {dark}")
573
+ logger.debug(f"Dark mode set to: {setdarkmode}")
574
574
 
575
575
  cmd = {}
576
576
  cmd["cmd"] = "DARKMODE"
577
- cmd["state"] = dark
577
+ cmd["state"] = setdarkmode
578
578
  cmd["station"] = platform.node()
579
579
  self.multicast_interface.send_as_json(cmd)
580
580
 
581
- if dark:
582
- darkPalette = QtGui.QPalette()
583
- darkColor = QtGui.QColor(56, 56, 56)
584
- disabledColor = QtGui.QColor(127, 127, 127)
585
- 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))
586
595
  darkPalette.setColor(
587
- QtGui.QPalette.ColorRole.WindowText, QColorConstants.White
596
+ QPalette.ColorRole.HighlightedText, QColorConstants.Black
588
597
  )
589
598
  darkPalette.setColor(
590
- QtGui.QPalette.ColorRole.Base, QtGui.QColor(45, 45, 45)
591
- )
592
- darkPalette.setColor(QtGui.QPalette.ColorRole.AlternateBase, darkColor)
593
- darkPalette.setColor(QtGui.QPalette.ColorRole.Text, QColorConstants.White)
594
- darkPalette.setColor(
595
- QtGui.QPalette.ColorGroup.Disabled,
596
- QtGui.QPalette.ColorRole.Text,
599
+ QPalette.ColorGroup.Disabled,
600
+ QPalette.ColorRole.ButtonText,
597
601
  disabledColor,
598
602
  )
599
- darkPalette.setColor(QtGui.QPalette.ColorRole.Button, darkColor)
600
- darkPalette.setColor(
601
- QtGui.QPalette.ColorRole.ButtonText, QColorConstants.White
602
- )
603
603
  darkPalette.setColor(
604
- QtGui.QPalette.ColorGroup.Disabled,
605
- QtGui.QPalette.ColorRole.ButtonText,
604
+ QPalette.ColorGroup.Disabled,
605
+ QPalette.ColorRole.HighlightedText,
606
606
  disabledColor,
607
607
  )
608
608
  darkPalette.setColor(
609
- QtGui.QPalette.ColorRole.BrightText, QColorConstants.Red
610
- )
611
- darkPalette.setColor(
612
- QtGui.QPalette.ColorRole.Link, QtGui.QColor(42, 130, 218)
613
- )
614
- darkPalette.setColor(
615
- QtGui.QPalette.ColorRole.Highlight, QtGui.QColor(42, 130, 218)
616
- )
617
- darkPalette.setColor(
618
- QtGui.QPalette.ColorRole.HighlightedText, QColorConstants.Black
619
- )
620
- darkPalette.setColor(
621
- QtGui.QPalette.ColorGroup.Disabled,
622
- QtGui.QPalette.ColorRole.HighlightedText,
609
+ QPalette.ColorGroup.Disabled,
610
+ QPalette.ColorRole.Text,
623
611
  disabledColor,
624
612
  )
625
- dark_button_style = (
626
- "QPushButton {"
627
- "background-color: rgb(56,56,56);"
628
- "color: white;"
629
- "border-style: outset;"
630
- "border-width: 2px;"
631
- "border-radius: 5px;"
632
- "border-color: rgb(45,45,45);"
633
- "padding: 6px;"
634
- "}"
635
- "QPushButton:pressed {"
636
- "background-color: rgb(127, 127, 127);"
637
- "border-style: inset;"
638
- "}"
639
- )
613
+
640
614
  self.current_palette = darkPalette
641
615
  self.setPalette(darkPalette)
642
616
  self.text_color = QColorConstants.White
@@ -651,18 +625,6 @@ class MainWindow(QtWidgets.QMainWindow):
651
625
  self.other_1.setPalette(darkPalette)
652
626
  self.other_2.setPalette(darkPalette)
653
627
  self.cw_entry.setPalette(darkPalette)
654
- self.F1.setStyleSheet(dark_button_style)
655
- self.F2.setStyleSheet(dark_button_style)
656
- self.F3.setStyleSheet(dark_button_style)
657
- self.F4.setStyleSheet(dark_button_style)
658
- self.F5.setStyleSheet(dark_button_style)
659
- self.F6.setStyleSheet(dark_button_style)
660
- self.F7.setStyleSheet(dark_button_style)
661
- self.F8.setStyleSheet(dark_button_style)
662
- self.F9.setStyleSheet(dark_button_style)
663
- self.F10.setStyleSheet(dark_button_style)
664
- self.F11.setStyleSheet(dark_button_style)
665
- self.F12.setStyleSheet(dark_button_style)
666
628
  else:
667
629
  palette = self.style().standardPalette()
668
630
  self.current_palette = palette
@@ -679,33 +641,6 @@ class MainWindow(QtWidgets.QMainWindow):
679
641
  self.other_2.setPalette(palette)
680
642
  self.cw_entry.setPalette(palette)
681
643
  self.text_color = QColorConstants.Black
682
- light_button_style = (
683
- "QPushButton {"
684
- "background-color: rgb(245,245,245);"
685
- "color: rgb(52,52,52);"
686
- "border-style: outset;"
687
- "border-width: 2px;"
688
- "border-radius: 5px;"
689
- "border-color: rgb(150,150,150);"
690
- "padding: 6px;"
691
- "}"
692
- "QPushButton:pressed {"
693
- "background-color: rgb(127, 127, 127);"
694
- "border-style: inset;"
695
- "}"
696
- )
697
- self.F1.setStyleSheet(light_button_style)
698
- self.F2.setStyleSheet(light_button_style)
699
- self.F3.setStyleSheet(light_button_style)
700
- self.F4.setStyleSheet(light_button_style)
701
- self.F5.setStyleSheet(light_button_style)
702
- self.F6.setStyleSheet(light_button_style)
703
- self.F7.setStyleSheet(light_button_style)
704
- self.F8.setStyleSheet(light_button_style)
705
- self.F9.setStyleSheet(light_button_style)
706
- self.F10.setStyleSheet(light_button_style)
707
- self.F11.setStyleSheet(light_button_style)
708
- self.F12.setStyleSheet(light_button_style)
709
644
 
710
645
  def set_radio_icon(self, state: int) -> None:
711
646
  """
@@ -770,7 +705,9 @@ class MainWindow(QtWidgets.QMainWindow):
770
705
  # self.send_backspace()
771
706
  self.oldtext = newtext
772
707
  return
773
- 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:
774
711
  self.cw.sendcw(newtext[len(self.oldtext) :])
775
712
  self.oldtext = newtext
776
713
 
@@ -2375,6 +2312,9 @@ class MainWindow(QtWidgets.QMainWindow):
2375
2312
  self.voice_string(self.process_macro(function_key.toolTip()))
2376
2313
  return
2377
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
2378
2318
  self.cw.sendcw(self.process_macro(function_key.toolTip()))
2379
2319
 
2380
2320
  def run_sp_buttons_clicked(self) -> None: