not1mm 25.2.6__tar.gz → 25.2.22__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 (180) hide show
  1. {not1mm-25.2.6 → not1mm-25.2.22}/PKG-INFO +24 -6
  2. {not1mm-25.2.6 → not1mm-25.2.22}/README.md +23 -5
  3. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/__main__.py +45 -22
  4. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/configuration.ui +56 -12
  5. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/main.ui +15 -0
  6. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/new_contest.ui +5 -0
  7. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lib/settings.py +9 -2
  8. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lib/version.py +1 -1
  9. not1mm-25.2.22/not1mm/plugins/randomgram.py +262 -0
  10. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/voice_keying.py +1 -1
  11. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm.egg-info/PKG-INFO +24 -6
  12. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm.egg-info/SOURCES.txt +1 -0
  13. {not1mm-25.2.6 → not1mm-25.2.22}/pyproject.toml +1 -1
  14. {not1mm-25.2.6 → not1mm-25.2.22}/LICENSE +0 -0
  15. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/__init__.py +0 -0
  16. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/bandmap.py +0 -0
  17. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/checkwindow.py +0 -0
  18. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/JetBrainsMono-ExtraLight.ttf +0 -0
  19. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/MASTER.SCP +0 -0
  20. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/about.ui +0 -0
  21. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/alpha bravo charlie delta.txt +0 -0
  22. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/bandmap.ui +0 -0
  23. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/check.png +0 -0
  24. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/checkwindow.ui +0 -0
  25. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/contests.sql +0 -0
  26. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/cty.json +0 -0
  27. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/cwmacros.txt +0 -0
  28. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/donors.html +0 -0
  29. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/editcontact.ui +0 -0
  30. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/editmacro.ui +0 -0
  31. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/greendot.png +0 -0
  32. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/k6gte-not1mm.desktop +0 -0
  33. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/k6gte.not1mm-128.png +0 -0
  34. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/k6gte.not1mm-32.png +0 -0
  35. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/k6gte.not1mm-64.png +0 -0
  36. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/logwindow.ui +0 -0
  37. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/logwindowx.ui +0 -0
  38. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/not1mm.html +0 -0
  39. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/opon.ui +0 -0
  40. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/0.wav +0 -0
  41. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/1.wav +0 -0
  42. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/2.wav +0 -0
  43. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/3.wav +0 -0
  44. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/4.wav +0 -0
  45. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/5.wav +0 -0
  46. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/6.wav +0 -0
  47. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/7.wav +0 -0
  48. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/73.wav +0 -0
  49. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/8.wav +0 -0
  50. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/9.wav +0 -0
  51. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/a.wav +0 -0
  52. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/again.wav +0 -0
  53. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/b.wav +0 -0
  54. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/c.wav +0 -0
  55. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/contest.wav +0 -0
  56. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/cq.wav +0 -0
  57. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/cq2.wav +0 -0
  58. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/d.wav +0 -0
  59. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/e.wav +0 -0
  60. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/f.wav +0 -0
  61. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/g.wav +0 -0
  62. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/h.wav +0 -0
  63. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/i.wav +0 -0
  64. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/j.wav +0 -0
  65. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/k.wav +0 -0
  66. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/k6gte.wav +0 -0
  67. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/l.wav +0 -0
  68. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/m.wav +0 -0
  69. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/mynumber.wav +0 -0
  70. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/n.wav +0 -0
  71. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/nil.wav +0 -0
  72. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/o.wav +0 -0
  73. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/p.wav +0 -0
  74. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/q.wav +0 -0
  75. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/r.wav +0 -0
  76. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/roger.wav +0 -0
  77. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/s.wav +0 -0
  78. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/space.wav +0 -0
  79. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/t.wav +0 -0
  80. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/thankyou.wav +0 -0
  81. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/thankyouqrz.wav +0 -0
  82. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/u.wav +0 -0
  83. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/v.wav +0 -0
  84. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/w.wav +0 -0
  85. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/x.wav +0 -0
  86. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/y.wav +0 -0
  87. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/yourcall.wav +0 -0
  88. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/phonetics/z.wav +0 -0
  89. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/pickcontest.ui +0 -0
  90. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/radio_green.png +0 -0
  91. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/radio_grey.png +0 -0
  92. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/radio_red.png +0 -0
  93. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/ratewindow.ui +0 -0
  94. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/reddot.png +0 -0
  95. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/rttymacros.txt +0 -0
  96. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/settings.ui +0 -0
  97. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/splash.png +0 -0
  98. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/ssbmacros.txt +0 -0
  99. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/data/vfo.ui +0 -0
  100. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/fsutils.py +0 -0
  101. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lib/__init__.py +0 -0
  102. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lib/about.py +0 -0
  103. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lib/cat_interface.py +0 -0
  104. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lib/cwinterface.py +0 -0
  105. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lib/database.py +0 -0
  106. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lib/edit_contact.py +0 -0
  107. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lib/edit_macro.py +0 -0
  108. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lib/edit_opon.py +0 -0
  109. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lib/edit_station.py +0 -0
  110. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lib/fldigi_sendstring.py +0 -0
  111. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lib/ft8_watcher.py +0 -0
  112. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lib/ham_utility.py +0 -0
  113. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lib/lookup.py +0 -0
  114. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lib/multicast.py +0 -0
  115. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lib/n1mm.py +0 -0
  116. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lib/new_contest.py +0 -0
  117. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lib/plugin_common.py +0 -0
  118. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lib/select_contest.py +0 -0
  119. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lib/super_check_partial.py +0 -0
  120. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lib/versiontest.py +0 -0
  121. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/logwindow.py +0 -0
  122. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/lookupservice.py +0 -0
  123. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/10_10_fall_cw.py +0 -0
  124. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/10_10_spring_cw.py +0 -0
  125. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/10_10_summer_phone.py +0 -0
  126. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/10_10_winter_phone.py +0 -0
  127. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/__init__.py +0 -0
  128. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/arrl_10m.py +0 -0
  129. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/arrl_160m.py +0 -0
  130. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/arrl_dx_cw.py +0 -0
  131. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/arrl_dx_ssb.py +0 -0
  132. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/arrl_field_day.py +0 -0
  133. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/arrl_rtty_ru.py +0 -0
  134. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/arrl_ss_cw.py +0 -0
  135. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/arrl_ss_phone.py +0 -0
  136. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/arrl_vhf_jan.py +0 -0
  137. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/arrl_vhf_jun.py +0 -0
  138. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/arrl_vhf_sep.py +0 -0
  139. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/canada_day.py +0 -0
  140. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/cq_160_cw.py +0 -0
  141. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/cq_160_ssb.py +0 -0
  142. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/cq_wpx_cw.py +0 -0
  143. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/cq_wpx_rtty.py +0 -0
  144. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/cq_wpx_ssb.py +0 -0
  145. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/cq_ww_cw.py +0 -0
  146. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/cq_ww_rtty.py +0 -0
  147. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/cq_ww_ssb.py +0 -0
  148. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/cwt.py +0 -0
  149. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/darc_xmas.py +0 -0
  150. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/general_logging.py +0 -0
  151. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/helvetia.py +0 -0
  152. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/iaru_fieldday_r1_cw.py +0 -0
  153. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/iaru_fieldday_r1_ssb.py +0 -0
  154. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/iaru_hf.py +0 -0
  155. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/icwc_mst.py +0 -0
  156. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/jidx_cw.py +0 -0
  157. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/jidx_ph.py +0 -0
  158. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/k1usn_sst.py +0 -0
  159. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/labre_rs_digi.py +0 -0
  160. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/lz-dx.py +0 -0
  161. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/naqp_cw.py +0 -0
  162. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/naqp_rtty.py +0 -0
  163. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/naqp_ssb.py +0 -0
  164. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/phone_weekly_test.py +0 -0
  165. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/raem.py +0 -0
  166. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/ref_cw.py +0 -0
  167. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/ref_ssb.py +0 -0
  168. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/stew_perry_topband.py +0 -0
  169. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/weekly_rtty.py +0 -0
  170. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/plugins/winter_field_day.py +0 -0
  171. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/radio.py +0 -0
  172. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/ratewindow.py +0 -0
  173. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/rtc_service.py +0 -0
  174. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/test.py +0 -0
  175. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm/vfo.py +0 -0
  176. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm.egg-info/dependency_links.txt +0 -0
  177. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm.egg-info/entry_points.txt +0 -0
  178. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm.egg-info/requires.txt +0 -0
  179. {not1mm-25.2.6 → not1mm-25.2.22}/not1mm.egg-info/top_level.txt +0 -0
  180. {not1mm-25.2.6 → not1mm-25.2.22}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: not1mm
3
- Version: 25.2.6
3
+ Version: 25.2.22
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
@@ -102,7 +102,10 @@ Requires-Dist: Levenshtein
102
102
  - [Options](#options)
103
103
  - [Logging WSJT-X FT8/FT4/ETC and FLDIGI RTTY contacts](#logging-wsjt-x-ft8ft4etc-and-fldigi-rtty-contacts)
104
104
  - [Sending CW](#sending-cw)
105
- - [Editing macro keys](#editing-macro-keys)
105
+ - [Sending CW Macros](#sending-cw-macros)
106
+ - [Auto CQ](#auto-cq)
107
+ - [Sending CW Free Form](#sending-cw-free-form)
108
+ - [Editing macro keys](#editing-macro-keys)
106
109
  - [Macro substitutions](#macro-substitutions)
107
110
  - [Macro use with voice](#macro-use-with-voice)
108
111
  - [cty.dat and QRZ lookups for distance and bearing](#ctydat-and-qrz-lookups-for-distance-and-bearing)
@@ -228,6 +231,7 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
228
231
  - NAQP CW, RTTY, SSB
229
232
  - Phone Weekly Test
230
233
  - RAEM
234
+ - RandomGram
231
235
  - RAC Canada Day
232
236
  - REF CW, SSB
233
237
  - Stew Perry Topband
@@ -236,6 +240,8 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
236
240
 
237
241
  ## Recent Changes
238
242
 
243
+ - [25-2-22] Add Auto CQ.
244
+ - [25-2-12] Merged PR from @alduhoo Adding RandomGram event.
239
245
  - [25-2-6] Trimmed out newer tags from UI files, 'cause stuff be old sometimes.
240
246
 
241
247
  See [CHANGELOG.md](CHANGELOG.md) for prior changes.
@@ -631,15 +637,27 @@ Generic Contest. Make sure the Text Capture Order field says CALL EXCHANGE.
631
637
 
632
638
  ## Sending CW
633
639
 
640
+ ### Sending CW Macros
641
+
634
642
  Other than sending CW by hand, you can also send predefined CW text messages by
635
- pressing F1 - F12. See next section on Editing macro keys.
643
+ pressing F1 - F12. See next section on Editing macro keys.
644
+
645
+ ### Auto CQ
646
+
647
+ If you press `SHIFT-F1` The Auto CQ mode will be activated and the F1 macro will be resent
648
+ after each Auto CQ Delay interval has passed. The delay can be changed by going to the
649
+ `Options` TAB in the Configuration dialog.
650
+
651
+ The auto CQ can be cancelled by either typing in the call sign field, or by pressing ESC.
652
+
653
+ ### Sending CW Free Form
636
654
 
637
655
  If you need to send something freeform, you can press `CTRL-SHIFT-K`, this will
638
656
  expose an entry field at the bottom of the window which you can type directly into.
639
657
  When you're done you can either press CTRL-SHIFT-K again, or press the Enter Key to
640
658
  close the field.
641
659
 
642
- ## Editing macro keys
660
+ ### Editing macro keys
643
661
 
644
662
  To edit the macros, choose `File` > `Edit Macros`. This will open your systems
645
663
  registered text editor with current macros loaded. When your done just save the
@@ -686,7 +704,7 @@ files in your own voice.
686
704
  Aside from the `[filename]` wav files, there are also NATO phonetic wav files
687
705
  for each letter and number. So if your macro key holds
688
706
  `{HISCALL} {SNT} {SENTNR}` and you have entered K5TUX in callsign field during
689
- CQ WW SSB while in CQ Zone 3. You'll here Kilo 5 Tango Uniform X-ray, 5 9 9, 3.
707
+ CQ WW SSB while in CQ Zone 3. You'll here Kilo 5 Tango Uniform X-ray, 5 9, 3.
690
708
  Hopefully not in an idiots voice.
691
709
 
692
710
  ## cty.dat and QRZ lookups for distance and bearing
@@ -694,7 +712,7 @@ Hopefully not in an idiots voice.
694
712
  When a callsign is entered, a look up is first done in a cty.dat file to
695
713
  determin the country of origin, geographic center, cq zone and ITU region.
696
714
  Great circle calculations are done to determin the heading and distance from
697
- your gridsquare to the grographic center. This information then displayed at the
715
+ your gridsquare to the geographic center. This information then displayed at the
698
716
  bottom left.
699
717
 
700
718
  ![snapshot of heading and distance](https://github.com/mbridak/not1mm/raw/master/pic/heading_distance.png)
@@ -71,7 +71,10 @@
71
71
  - [Options](#options)
72
72
  - [Logging WSJT-X FT8/FT4/ETC and FLDIGI RTTY contacts](#logging-wsjt-x-ft8ft4etc-and-fldigi-rtty-contacts)
73
73
  - [Sending CW](#sending-cw)
74
- - [Editing macro keys](#editing-macro-keys)
74
+ - [Sending CW Macros](#sending-cw-macros)
75
+ - [Auto CQ](#auto-cq)
76
+ - [Sending CW Free Form](#sending-cw-free-form)
77
+ - [Editing macro keys](#editing-macro-keys)
75
78
  - [Macro substitutions](#macro-substitutions)
76
79
  - [Macro use with voice](#macro-use-with-voice)
77
80
  - [cty.dat and QRZ lookups for distance and bearing](#ctydat-and-qrz-lookups-for-distance-and-bearing)
@@ -197,6 +200,7 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
197
200
  - NAQP CW, RTTY, SSB
198
201
  - Phone Weekly Test
199
202
  - RAEM
203
+ - RandomGram
200
204
  - RAC Canada Day
201
205
  - REF CW, SSB
202
206
  - Stew Perry Topband
@@ -205,6 +209,8 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
205
209
 
206
210
  ## Recent Changes
207
211
 
212
+ - [25-2-22] Add Auto CQ.
213
+ - [25-2-12] Merged PR from @alduhoo Adding RandomGram event.
208
214
  - [25-2-6] Trimmed out newer tags from UI files, 'cause stuff be old sometimes.
209
215
 
210
216
  See [CHANGELOG.md](CHANGELOG.md) for prior changes.
@@ -600,15 +606,27 @@ Generic Contest. Make sure the Text Capture Order field says CALL EXCHANGE.
600
606
 
601
607
  ## Sending CW
602
608
 
609
+ ### Sending CW Macros
610
+
603
611
  Other than sending CW by hand, you can also send predefined CW text messages by
604
- pressing F1 - F12. See next section on Editing macro keys.
612
+ pressing F1 - F12. See next section on Editing macro keys.
613
+
614
+ ### Auto CQ
615
+
616
+ If you press `SHIFT-F1` The Auto CQ mode will be activated and the F1 macro will be resent
617
+ after each Auto CQ Delay interval has passed. The delay can be changed by going to the
618
+ `Options` TAB in the Configuration dialog.
619
+
620
+ The auto CQ can be cancelled by either typing in the call sign field, or by pressing ESC.
621
+
622
+ ### Sending CW Free Form
605
623
 
606
624
  If you need to send something freeform, you can press `CTRL-SHIFT-K`, this will
607
625
  expose an entry field at the bottom of the window which you can type directly into.
608
626
  When you're done you can either press CTRL-SHIFT-K again, or press the Enter Key to
609
627
  close the field.
610
628
 
611
- ## Editing macro keys
629
+ ### Editing macro keys
612
630
 
613
631
  To edit the macros, choose `File` > `Edit Macros`. This will open your systems
614
632
  registered text editor with current macros loaded. When your done just save the
@@ -655,7 +673,7 @@ files in your own voice.
655
673
  Aside from the `[filename]` wav files, there are also NATO phonetic wav files
656
674
  for each letter and number. So if your macro key holds
657
675
  `{HISCALL} {SNT} {SENTNR}` and you have entered K5TUX in callsign field during
658
- CQ WW SSB while in CQ Zone 3. You'll here Kilo 5 Tango Uniform X-ray, 5 9 9, 3.
676
+ CQ WW SSB while in CQ Zone 3. You'll here Kilo 5 Tango Uniform X-ray, 5 9, 3.
659
677
  Hopefully not in an idiots voice.
660
678
 
661
679
  ## cty.dat and QRZ lookups for distance and bearing
@@ -663,7 +681,7 @@ Hopefully not in an idiots voice.
663
681
  When a callsign is entered, a look up is first done in a cty.dat file to
664
682
  determin the country of origin, geographic center, cq zone and ITU region.
665
683
  Great circle calculations are done to determin the heading and distance from
666
- your gridsquare to the grographic center. This information then displayed at the
684
+ your gridsquare to the geographic center. This information then displayed at the
667
685
  bottom left.
668
686
 
669
687
  ![snapshot of heading and distance](https://github.com/mbridak/not1mm/raw/master/pic/heading_distance.png)
@@ -27,12 +27,6 @@ from shutil import copyfile
27
27
 
28
28
  import notctyparser
29
29
 
30
- try:
31
- import sounddevice as sd
32
- except OSError as exception:
33
- print(exception)
34
- print("portaudio is not installed")
35
- sd = None
36
30
  from PyQt6 import QtCore, QtGui, QtWidgets, uic, QtNetwork
37
31
  from PyQt6.QtCore import QDir, Qt, QThread, QSettings, QCoreApplication
38
32
  from PyQt6.QtGui import QFontDatabase, QColorConstants, QPalette, QColor, QPixmap
@@ -189,6 +183,10 @@ class MainWindow(QtWidgets.QMainWindow):
189
183
 
190
184
  current_widget = None
191
185
 
186
+ auto_cq = False
187
+ auto_cq_time = datetime.datetime.now()
188
+ auto_cq_delay = 15000
189
+
192
190
  def __init__(self, splash):
193
191
  super().__init__()
194
192
  logger.info("MainWindow: __init__")
@@ -779,8 +777,6 @@ class MainWindow(QtWidgets.QMainWindow):
779
777
  group[item] = ""
780
778
  count += 1
781
779
  group_list.append(group)
782
- # database.add_callhistory_item(group)
783
- # print(f"{group=}")
784
780
  except IndexError:
785
781
  ...
786
782
  self.database.add_callhistory_items(group_list)
@@ -2030,6 +2026,7 @@ class MainWindow(QtWidgets.QMainWindow):
2030
2026
 
2031
2027
  def stop_cw(self):
2032
2028
  """"""
2029
+ self.auto_cq = False
2033
2030
  if self.cw is not None:
2034
2031
  if self.cw.servertype == 1:
2035
2032
  self.cw.sendcw("\x1b4")
@@ -2086,9 +2083,6 @@ class MainWindow(QtWidgets.QMainWindow):
2086
2083
  ABCDEFGHIJKLMNOPQRSTUVWXY
2087
2084
  """
2088
2085
  modifier = event.modifiers()
2089
- # the_key = event.key()
2090
-
2091
- # print(f"Modifier is {modifier=} Key is {the_key=}")
2092
2086
 
2093
2087
  if (
2094
2088
  event.key() == Qt.Key.Key_Equal
@@ -2149,16 +2143,17 @@ class MainWindow(QtWidgets.QMainWindow):
2149
2143
  event.key() == Qt.Key.Key_Escape
2150
2144
  and modifier != Qt.KeyboardModifier.ControlModifier
2151
2145
  ):
2152
- if self.cw is not None:
2153
- if self.cw.servertype == 1:
2154
- self.cw.sendcw("\x1b4")
2155
- return
2156
- if self.rig_control:
2157
- if self.rig_control.online:
2158
- if self.pref.get("cwtype") == 3 and self.rig_control is not None:
2159
- if self.rig_control.interface == "flrig":
2160
- self.rig_control.cat.set_flrig_cw_send(False)
2161
- self.rig_control.cat.set_flrig_cw_send(True)
2146
+ self.stop_cw()
2147
+ # if self.cw is not None:
2148
+ # if self.cw.servertype == 1:
2149
+ # self.cw.sendcw("\x1b4")
2150
+ # return
2151
+ # if self.rig_control:
2152
+ # if self.rig_control.online:
2153
+ # if self.pref.get("cwtype") == 3 and self.rig_control is not None:
2154
+ # if self.rig_control.interface == "flrig":
2155
+ # self.rig_control.cat.set_flrig_cw_send(False)
2156
+ # self.rig_control.cat.set_flrig_cw_send(True)
2162
2157
  if event.key() == Qt.Key.Key_Up:
2163
2158
  cmd = {}
2164
2159
  cmd["cmd"] = "PREVSPOT"
@@ -2274,27 +2269,43 @@ class MainWindow(QtWidgets.QMainWindow):
2274
2269
  next_tab.end(False)
2275
2270
  return
2276
2271
  if event.key() == Qt.Key.Key_F1:
2272
+ if event.modifiers() == Qt.KeyboardModifier.ShiftModifier:
2273
+ self.auto_cq = True
2274
+ self.auto_cq_time = datetime.datetime.now() + datetime.timedelta(
2275
+ milliseconds=self.auto_cq_delay
2276
+ )
2277
2277
  self.process_function_key(self.F1)
2278
+ return
2278
2279
  if event.key() == Qt.Key.Key_F2:
2279
2280
  self.process_function_key(self.F2)
2281
+ return
2280
2282
  if event.key() == Qt.Key.Key_F3:
2281
2283
  self.process_function_key(self.F3)
2284
+ return
2282
2285
  if event.key() == Qt.Key.Key_F4:
2283
2286
  self.process_function_key(self.F4)
2287
+ return
2284
2288
  if event.key() == Qt.Key.Key_F5:
2285
2289
  self.process_function_key(self.F5)
2290
+ return
2286
2291
  if event.key() == Qt.Key.Key_F6:
2287
2292
  self.process_function_key(self.F6)
2293
+ return
2288
2294
  if event.key() == Qt.Key.Key_F7:
2289
2295
  self.process_function_key(self.F7)
2296
+ return
2290
2297
  if event.key() == Qt.Key.Key_F8:
2291
2298
  self.process_function_key(self.F8)
2299
+ return
2292
2300
  if event.key() == Qt.Key.Key_F9:
2293
2301
  self.process_function_key(self.F9)
2302
+ return
2294
2303
  if event.key() == Qt.Key.Key_F10:
2295
2304
  self.process_function_key(self.F10)
2305
+ return
2296
2306
  if event.key() == Qt.Key.Key_F11:
2297
2307
  self.process_function_key(self.F11)
2308
+ return
2298
2309
  if event.key() == Qt.Key.Key_F12:
2299
2310
  self.process_function_key(self.F12)
2300
2311
 
@@ -2997,12 +3008,16 @@ class MainWindow(QtWidgets.QMainWindow):
2997
3008
  self.rtc_pass = self.pref.get("rtc_pass", "")
2998
3009
  self.rtc_interval = self.pref.get("rtc_interval", 2)
2999
3010
 
3011
+ try:
3012
+ self.auto_cq_delay = int(self.pref.get("auto_cq_interval", 15)) * 1000
3013
+ except ValueError:
3014
+ self.auto_cq_delay = 15000
3015
+
3000
3016
  if self.pref.get("send_rtc_scores", False):
3001
3017
  self.rtc_service = RTCService()
3002
3018
  self.rtc_service.moveToThread(self.rtc_thread)
3003
3019
  self.rtc_thread.started.connect(self.rtc_service.run)
3004
3020
  self.rtc_thread.finished.connect(self.rtc_service.deleteLater)
3005
- # self.rtc_service.poll_callback.connect(self.rtc_result)
3006
3021
  self.rtc_thread.start()
3007
3022
  self.rtc_service.rtc_callback.connect(self.rtc_response)
3008
3023
 
@@ -3336,6 +3351,8 @@ class MainWindow(QtWidgets.QMainWindow):
3336
3351
  -------
3337
3352
  None
3338
3353
  """
3354
+ if self.auto_cq is True:
3355
+ self.stop_cw()
3339
3356
  text = self.callsign.text()
3340
3357
  text = text.upper()
3341
3358
  position = self.callsign.cursorPosition()
@@ -3696,6 +3713,12 @@ class MainWindow(QtWidgets.QMainWindow):
3696
3713
  Passing in a dictionary object with the
3697
3714
  vfo freq, mode, bandwidth, and online state of the radio.
3698
3715
  """
3716
+ if self.auto_cq is True:
3717
+ if datetime.datetime.now() > self.auto_cq_time:
3718
+ self.auto_cq_time = datetime.datetime.now() + datetime.timedelta(
3719
+ milliseconds=self.auto_cq_delay
3720
+ )
3721
+ self.process_function_key(self.F1)
3699
3722
  logger.debug(f"{the_dict=}")
3700
3723
  self.set_radio_icon(0)
3701
3724
  info_dirty = False
@@ -2244,24 +2244,68 @@
2244
2244
  </widget>
2245
2245
  </item>
2246
2246
  <item>
2247
- <widget class="QLabel" name="label_28">
2248
- <property name="text">
2249
- <string>Score posting interval (minutes)</string>
2247
+ <layout class="QFormLayout" name="formLayout_3">
2248
+ <property name="bottomMargin">
2249
+ <number>0</number>
2250
2250
  </property>
2251
- <property name="alignment">
2252
- <set>Qt::AlignCenter</set>
2251
+ <item row="0" column="0">
2252
+ <widget class="QLabel" name="label_28">
2253
+ <property name="text">
2254
+ <string>Post Interval (minutes)</string>
2255
+ </property>
2256
+ <property name="alignment">
2257
+ <set>Qt::AlignCenter</set>
2258
+ </property>
2259
+ </widget>
2260
+ </item>
2261
+ <item row="0" column="1">
2262
+ <widget class="QLineEdit" name="rtc_interval">
2263
+ <property name="text">
2264
+ <string>2</string>
2265
+ </property>
2266
+ <property name="alignment">
2267
+ <set>Qt::AlignCenter</set>
2268
+ </property>
2269
+ </widget>
2270
+ </item>
2271
+ </layout>
2272
+ </item>
2273
+ <item>
2274
+ <widget class="Line" name="line_3">
2275
+ <property name="orientation">
2276
+ <enum>Qt::Horizontal</enum>
2253
2277
  </property>
2254
2278
  </widget>
2255
2279
  </item>
2256
2280
  <item>
2257
- <widget class="QLineEdit" name="rtc_interval">
2258
- <property name="text">
2259
- <string>2</string>
2281
+ <layout class="QFormLayout" name="formLayout_2">
2282
+ <property name="horizontalSpacing">
2283
+ <number>6</number>
2260
2284
  </property>
2261
- <property name="alignment">
2262
- <set>Qt::AlignCenter</set>
2285
+ <property name="verticalSpacing">
2286
+ <number>6</number>
2263
2287
  </property>
2264
- </widget>
2288
+ <property name="bottomMargin">
2289
+ <number>0</number>
2290
+ </property>
2291
+ <item row="0" column="0">
2292
+ <widget class="QLabel" name="label_30">
2293
+ <property name="text">
2294
+ <string>Auto CQ Delay (Seconds)</string>
2295
+ </property>
2296
+ </widget>
2297
+ </item>
2298
+ <item row="0" column="1">
2299
+ <widget class="QLineEdit" name="auto_cq_delay">
2300
+ <property name="text">
2301
+ <string>15</string>
2302
+ </property>
2303
+ <property name="alignment">
2304
+ <set>Qt::AlignCenter</set>
2305
+ </property>
2306
+ </widget>
2307
+ </item>
2308
+ </layout>
2265
2309
  </item>
2266
2310
  <item>
2267
2311
  <spacer name="verticalSpacer_8">
@@ -2397,7 +2441,7 @@
2397
2441
  </property>
2398
2442
  </designerdata>
2399
2443
  <buttongroups>
2400
- <buttongroup name="buttonGroup"/>
2401
2444
  <buttongroup name="buttonGroup_2"/>
2445
+ <buttongroup name="buttonGroup"/>
2402
2446
  </buttongroups>
2403
2447
  </ui>
@@ -1745,6 +1745,9 @@
1745
1745
  <family>JetBrains Mono ExtraLight</family>
1746
1746
  </font>
1747
1747
  </property>
1748
+ <property name="shortcut">
1749
+ <string>Alt+L</string>
1750
+ </property>
1748
1751
  <property name="autoRepeat">
1749
1752
  <bool>false</bool>
1750
1753
  </property>
@@ -1913,6 +1916,9 @@
1913
1916
  <family>JetBrains Mono ExtraLight</family>
1914
1917
  </font>
1915
1918
  </property>
1919
+ <property name="shortcut">
1920
+ <string>Alt+B</string>
1921
+ </property>
1916
1922
  </action>
1917
1923
  <action name="actionQuit">
1918
1924
  <property name="text">
@@ -1961,6 +1967,9 @@
1961
1967
  <family>JetBrains Mono ExtraLight</family>
1962
1968
  </font>
1963
1969
  </property>
1970
+ <property name="shortcut">
1971
+ <string>Alt+C</string>
1972
+ </property>
1964
1973
  </action>
1965
1974
  <action name="actionRate_Window">
1966
1975
  <property name="checkable">
@@ -1974,6 +1983,9 @@
1974
1983
  <family>JetBrains Mono ExtraLight</family>
1975
1984
  </font>
1976
1985
  </property>
1986
+ <property name="shortcut">
1987
+ <string>Alt+R</string>
1988
+ </property>
1977
1989
  </action>
1978
1990
  <action name="actionVFO">
1979
1991
  <property name="checkable">
@@ -1987,6 +1999,9 @@
1987
1999
  <family>JetBrains Mono ExtraLight</family>
1988
2000
  </font>
1989
2001
  </property>
2002
+ <property name="shortcut">
2003
+ <string>Alt+V</string>
2004
+ </property>
1990
2005
  </action>
1991
2006
  <action name="actionDark_Mode_2">
1992
2007
  <property name="checkable">
@@ -397,6 +397,11 @@
397
397
  <string>RAEM</string>
398
398
  </property>
399
399
  </item>
400
+ <item>
401
+ <property name="text">
402
+ <string>RANDOMGRAM</string>
403
+ </property>
404
+ </item>
400
405
  <item>
401
406
  <property name="text">
402
407
  <string>REF CW</string>
@@ -6,8 +6,6 @@ from PyQt6 import QtWidgets, uic
6
6
  try:
7
7
  import sounddevice as sd
8
8
  except OSError as exception:
9
- print(exception)
10
- print("portaudio is not installed")
11
9
  sd = None
12
10
 
13
11
 
@@ -54,6 +52,8 @@ class Settings(QtWidgets.QDialog):
54
52
  self.rtc_pass.setText(str(self.preference.get("rtc_pass", "")))
55
53
  self.rtc_interval.setText(str(self.preference.get("rtc_interval", "2")))
56
54
 
55
+ self.auto_cq_delay.setText(str(self.preference.get("auto_cq_interval", "15")))
56
+
57
57
  self.use_call_history.setChecked(
58
58
  bool(self.preference.get("use_call_history", False))
59
59
  )
@@ -221,6 +221,13 @@ class Settings(QtWidgets.QDialog):
221
221
  except ValueError:
222
222
  self.preference["rtc_interval"] = 2
223
223
 
224
+ try:
225
+ self.preference["auto_cq_interval"] = int(self.auto_cq_delay.text())
226
+ except ValueError:
227
+ self.preference["auto_cq_interval"] = 15
228
+
229
+ self.auto_cq_delay.setText(str(self.preference.get("auto_cq_interval", "15")))
230
+
224
231
  self.preference["use_call_history"] = self.use_call_history.isChecked()
225
232
  self.preference["use_esm"] = self.use_esm.isChecked()
226
233
  self.preference["esm_cq"] = self.esm_cq.currentText()
@@ -1,3 +1,3 @@
1
1
  """It's the version"""
2
2
 
3
- __version__ = "25.2.6"
3
+ __version__ = "25.2.22"