not1mm 24.11.24__tar.gz → 24.11.25__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-24.11.24 → not1mm-24.11.25}/PKG-INFO +28 -26
  2. {not1mm-24.11.24 → not1mm-24.11.25}/README.md +27 -25
  3. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/cat_interface.py +2 -1
  4. not1mm-24.11.25/not1mm/lib/version.py +3 -0
  5. not1mm-24.11.25/not1mm/plugins/10_10_fall_cw.py +452 -0
  6. not1mm-24.11.25/not1mm/plugins/10_10_spring_cw.py +451 -0
  7. not1mm-24.11.25/not1mm/plugins/10_10_summer_phone.py +455 -0
  8. not1mm-24.11.25/not1mm/plugins/10_10_winter_phone.py +453 -0
  9. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/arrl_10m.py +110 -0
  10. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/arrl_vhf_jan.py +92 -1
  11. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/arrl_vhf_jun.py +92 -1
  12. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/arrl_vhf_sep.py +95 -1
  13. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/cq_160_cw.py +94 -5
  14. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/cq_160_ssb.py +94 -5
  15. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/cq_ww_cw.py +14 -5
  16. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/cq_ww_ssb.py +13 -5
  17. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm.egg-info/PKG-INFO +28 -26
  18. {not1mm-24.11.24 → not1mm-24.11.25}/pyproject.toml +1 -1
  19. not1mm-24.11.24/not1mm/lib/version.py +0 -3
  20. not1mm-24.11.24/not1mm/plugins/10_10_fall_cw.py +0 -361
  21. not1mm-24.11.24/not1mm/plugins/10_10_spring_cw.py +0 -360
  22. not1mm-24.11.24/not1mm/plugins/10_10_summer_phone.py +0 -364
  23. not1mm-24.11.24/not1mm/plugins/10_10_winter_phone.py +0 -362
  24. {not1mm-24.11.24 → not1mm-24.11.25}/LICENSE +0 -0
  25. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/__init__.py +0 -0
  26. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/__main__.py +0 -0
  27. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/bandmap.py +0 -0
  28. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/checkwindow.py +0 -0
  29. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/JetBrainsMono-ExtraLight.ttf +0 -0
  30. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/MASTER.SCP +0 -0
  31. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/about.ui +0 -0
  32. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/alpha bravo charlie delta.txt +0 -0
  33. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/bandmap.ui +0 -0
  34. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/check.png +0 -0
  35. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/checkwindow.ui +0 -0
  36. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/configuration.ui +0 -0
  37. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/contests.sql +0 -0
  38. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/cty.json +0 -0
  39. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/cwmacros.txt +0 -0
  40. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/donors.html +0 -0
  41. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/editcontact.ui +0 -0
  42. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/editmacro.ui +0 -0
  43. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/greendot.png +0 -0
  44. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/k6gte-not1mm.desktop +0 -0
  45. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/k6gte.not1mm-128.png +0 -0
  46. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/k6gte.not1mm-32.png +0 -0
  47. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/k6gte.not1mm-64.png +0 -0
  48. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/logwindow.ui +0 -0
  49. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/logwindowx.ui +0 -0
  50. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/main.ui +0 -0
  51. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/new_contest.ui +0 -0
  52. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/not1mm.html +0 -0
  53. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/opon.ui +0 -0
  54. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/0.wav +0 -0
  55. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/1.wav +0 -0
  56. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/2.wav +0 -0
  57. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/3.wav +0 -0
  58. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/4.wav +0 -0
  59. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/5.wav +0 -0
  60. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/6.wav +0 -0
  61. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/7.wav +0 -0
  62. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/73.wav +0 -0
  63. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/8.wav +0 -0
  64. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/9.wav +0 -0
  65. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/a.wav +0 -0
  66. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/again.wav +0 -0
  67. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/b.wav +0 -0
  68. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/c.wav +0 -0
  69. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/contest.wav +0 -0
  70. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/cq.wav +0 -0
  71. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/cq2.wav +0 -0
  72. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/d.wav +0 -0
  73. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/e.wav +0 -0
  74. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/f.wav +0 -0
  75. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/g.wav +0 -0
  76. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/h.wav +0 -0
  77. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/i.wav +0 -0
  78. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/j.wav +0 -0
  79. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/k.wav +0 -0
  80. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/k6gte.wav +0 -0
  81. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/l.wav +0 -0
  82. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/m.wav +0 -0
  83. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/mynumber.wav +0 -0
  84. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/n.wav +0 -0
  85. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/nil.wav +0 -0
  86. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/o.wav +0 -0
  87. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/p.wav +0 -0
  88. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/q.wav +0 -0
  89. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/r.wav +0 -0
  90. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/roger.wav +0 -0
  91. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/s.wav +0 -0
  92. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/space.wav +0 -0
  93. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/t.wav +0 -0
  94. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/thankyou.wav +0 -0
  95. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/thankyouqrz.wav +0 -0
  96. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/u.wav +0 -0
  97. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/v.wav +0 -0
  98. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/w.wav +0 -0
  99. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/x.wav +0 -0
  100. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/y.wav +0 -0
  101. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/yourcall.wav +0 -0
  102. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/z.wav +0 -0
  103. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/pickcontest.ui +0 -0
  104. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/radio_green.png +0 -0
  105. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/radio_grey.png +0 -0
  106. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/radio_red.png +0 -0
  107. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/reddot.png +0 -0
  108. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/rttymacros.txt +0 -0
  109. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/settings.ui +0 -0
  110. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/splash.png +0 -0
  111. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/ssbmacros.txt +0 -0
  112. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/vfo.ui +0 -0
  113. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/fsutils.py +0 -0
  114. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/__init__.py +0 -0
  115. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/about.py +0 -0
  116. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/cwinterface.py +0 -0
  117. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/database.py +0 -0
  118. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/edit_contact.py +0 -0
  119. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/edit_macro.py +0 -0
  120. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/edit_opon.py +0 -0
  121. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/edit_station.py +0 -0
  122. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/fldigi_sendstring.py +0 -0
  123. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/fldigi_watcher.py +0 -0
  124. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/ft8_watcher.py +0 -0
  125. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/ham_utility.py +0 -0
  126. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/lookup.py +0 -0
  127. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/multicast.py +0 -0
  128. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/n1mm.py +0 -0
  129. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/new_contest.py +0 -0
  130. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/plugin_common.py +0 -0
  131. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/select_contest.py +0 -0
  132. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/settings.py +0 -0
  133. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/super_check_partial.py +0 -0
  134. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/versiontest.py +0 -0
  135. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/logwindow.py +0 -0
  136. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lookupservice.py +0 -0
  137. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/__init__.py +0 -0
  138. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/arrl_dx_cw.py +0 -0
  139. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/arrl_dx_ssb.py +0 -0
  140. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/arrl_field_day.py +0 -0
  141. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/arrl_rtty_ru.py +0 -0
  142. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/arrl_ss_cw.py +0 -0
  143. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/arrl_ss_phone.py +0 -0
  144. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/canada_day.py +0 -0
  145. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/cq_wpx_cw.py +0 -0
  146. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/cq_wpx_rtty.py +0 -0
  147. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/cq_wpx_ssb.py +0 -0
  148. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/cq_ww_rtty.py +0 -0
  149. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/cwt.py +0 -0
  150. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/darc_xmas.py +0 -0
  151. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/general_logging.py +0 -0
  152. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/helvetia.py +0 -0
  153. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/iaru_fieldday_r1_cw.py +0 -0
  154. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/iaru_fieldday_r1_ssb.py +0 -0
  155. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/iaru_hf.py +0 -0
  156. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/icwc_mst.py +0 -0
  157. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/jidx_cw.py +0 -0
  158. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/jidx_ph.py +0 -0
  159. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/k1usn_sst.py +0 -0
  160. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/lz-dx.py +0 -0
  161. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/naqp_cw.py +0 -0
  162. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/naqp_rtty.py +0 -0
  163. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/naqp_ssb.py +0 -0
  164. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/phone_weekly_test.py +0 -0
  165. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/raem.py +0 -0
  166. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/ref_cw.py +0 -0
  167. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/ref_ssb.py +0 -0
  168. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/stew_perry_topband.py +0 -0
  169. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/weekly_rtty.py +0 -0
  170. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/winter_field_day.py +0 -0
  171. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/radio.py +0 -0
  172. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/test.py +0 -0
  173. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/vfo.py +0 -0
  174. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/voice_keying.py +0 -0
  175. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm.egg-info/SOURCES.txt +0 -0
  176. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm.egg-info/dependency_links.txt +0 -0
  177. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm.egg-info/entry_points.txt +0 -0
  178. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm.egg-info/requires.txt +0 -0
  179. {not1mm-24.11.24 → not1mm-24.11.25}/not1mm.egg-info/top_level.txt +0 -0
  180. {not1mm-24.11.24 → not1mm-24.11.25}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: not1mm
3
- Version: 24.11.24
3
+ Version: 24.11.25
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
@@ -57,7 +57,7 @@ Requires-Dist: Levenshtein
57
57
  - [Data and RTTY](#data-and-rtty)
58
58
  - [Other not so supported contests](#other-not-so-supported-contests)
59
59
  - [Our Code Contributors ✨](#our-code-contributors-)
60
- - [List of should be working contests, those in bold have ESM](#list-of-should-be-working-contests-those-in-bold-have-esm)
60
+ - [List of should be working contests](#list-of-should-be-working-contests)
61
61
  - [Recent Changes (Polishing the Turd)](#recent-changes-polishing-the-turd)
62
62
  - [Flatpak](#flatpak)
63
63
  - [Installation](#installation)
@@ -203,41 +203,43 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
203
203
  <img src="https://contrib.rocks/image?repo=mbridak/not1mm" alt="Avatar icons for code contributors." />
204
204
  </a>
205
205
 
206
- ## List of should be working contests, those in bold have ESM
206
+ ## List of should be working contests
207
207
 
208
- - **General Logging** (There are better general loggers like QLog, KLog, CQRLog)
208
+ - General Logging (There are better general loggers like QLog, KLog, CQRLog)
209
209
  - 10 10 Fall CW
210
210
  - 10 10 Spring CW
211
211
  - 10 10 Summer Phone
212
212
  - 10 10 Winter Phone
213
213
  - ARRL 10M
214
- - **ARRL DX CW, SSB**
215
- - **ARRL Field Day**
216
- - **ARRL Sweepstakes CW, SSB**
214
+ - ARRL DX CW, SSB
215
+ - ARRL Field Day
216
+ - ARRL Sweepstakes CW, SSB
217
217
  - ARRL VHF January, June, September
218
218
  - CQ 160 CW, SSB
219
- - **CQ WPX CW, RTTY, SSB**
220
- - **CQ World Wide CW, RTTY, SSB**
221
- - **CWOps CWT**
222
- - **DARC Xmas**
223
- - **Helvetia**
224
- - **IARU Fieldday R1 CW, SSB**
225
- - **IARU HF**
226
- - **ICWC MST**
227
- - **Japan International DX CW, SSB**
228
- - **K1USN Slow Speed Test**
229
- - **LZ DX**
230
- - **NAQP CW, RTTY, SSB**
231
- - **Phone Weekly Test**
232
- - **RAEM**
233
- - **RAC Canada Day**
234
- - **REF CW, SSB**
235
- - **Stew Perry Topband**
236
- - **Weekly RTTY**
237
- - **Winter Field Day**
219
+ - CQ WPX CW, RTTY, SSB
220
+ - CQ World Wide CW, RTTY, SSB
221
+ - CWOps CWT
222
+ - DARC Xmas
223
+ - Helvetia
224
+ - IARU Fieldday R1 CW, SSB
225
+ - IARU HF
226
+ - ICWC MST
227
+ - Japan International DX CW, SSB
228
+ - K1USN Slow Speed Test
229
+ - LZ DX
230
+ - NAQP CW, RTTY, SSB
231
+ - Phone Weekly Test
232
+ - RAEM
233
+ - RAC Canada Day
234
+ - REF CW, SSB
235
+ - Stew Perry Topband
236
+ - Weekly RTTY
237
+ - Winter Field Day
238
238
 
239
239
  ## Recent Changes (Polishing the Turd)
240
240
 
241
+ - [24-22-15] Fix CQWW points, fix mode showing as RPRT.
242
+ - [24-11-24-1] Add ESM to CQ160, ARRL VHF, ARRL 10M, 10 10 contests.
241
243
  - [24-11-24] Added ESM to IARU HF and FieldDay.
242
244
  - [24-11-23] Made macros per contest.
243
245
  - [24-11-21] Merged PR from alduhoo setting CW Speed via rigctld, Added ESM and call history support for General Logging.
@@ -26,7 +26,7 @@
26
26
  - [Data and RTTY](#data-and-rtty)
27
27
  - [Other not so supported contests](#other-not-so-supported-contests)
28
28
  - [Our Code Contributors ✨](#our-code-contributors-)
29
- - [List of should be working contests, those in bold have ESM](#list-of-should-be-working-contests-those-in-bold-have-esm)
29
+ - [List of should be working contests](#list-of-should-be-working-contests)
30
30
  - [Recent Changes (Polishing the Turd)](#recent-changes-polishing-the-turd)
31
31
  - [Flatpak](#flatpak)
32
32
  - [Installation](#installation)
@@ -172,41 +172,43 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
172
172
  <img src="https://contrib.rocks/image?repo=mbridak/not1mm" alt="Avatar icons for code contributors." />
173
173
  </a>
174
174
 
175
- ## List of should be working contests, those in bold have ESM
175
+ ## List of should be working contests
176
176
 
177
- - **General Logging** (There are better general loggers like QLog, KLog, CQRLog)
177
+ - General Logging (There are better general loggers like QLog, KLog, CQRLog)
178
178
  - 10 10 Fall CW
179
179
  - 10 10 Spring CW
180
180
  - 10 10 Summer Phone
181
181
  - 10 10 Winter Phone
182
182
  - ARRL 10M
183
- - **ARRL DX CW, SSB**
184
- - **ARRL Field Day**
185
- - **ARRL Sweepstakes CW, SSB**
183
+ - ARRL DX CW, SSB
184
+ - ARRL Field Day
185
+ - ARRL Sweepstakes CW, SSB
186
186
  - ARRL VHF January, June, September
187
187
  - CQ 160 CW, SSB
188
- - **CQ WPX CW, RTTY, SSB**
189
- - **CQ World Wide CW, RTTY, SSB**
190
- - **CWOps CWT**
191
- - **DARC Xmas**
192
- - **Helvetia**
193
- - **IARU Fieldday R1 CW, SSB**
194
- - **IARU HF**
195
- - **ICWC MST**
196
- - **Japan International DX CW, SSB**
197
- - **K1USN Slow Speed Test**
198
- - **LZ DX**
199
- - **NAQP CW, RTTY, SSB**
200
- - **Phone Weekly Test**
201
- - **RAEM**
202
- - **RAC Canada Day**
203
- - **REF CW, SSB**
204
- - **Stew Perry Topband**
205
- - **Weekly RTTY**
206
- - **Winter Field Day**
188
+ - CQ WPX CW, RTTY, SSB
189
+ - CQ World Wide CW, RTTY, SSB
190
+ - CWOps CWT
191
+ - DARC Xmas
192
+ - Helvetia
193
+ - IARU Fieldday R1 CW, SSB
194
+ - IARU HF
195
+ - ICWC MST
196
+ - Japan International DX CW, SSB
197
+ - K1USN Slow Speed Test
198
+ - LZ DX
199
+ - NAQP CW, RTTY, SSB
200
+ - Phone Weekly Test
201
+ - RAEM
202
+ - RAC Canada Day
203
+ - REF CW, SSB
204
+ - Stew Perry Topband
205
+ - Weekly RTTY
206
+ - Winter Field Day
207
207
 
208
208
  ## Recent Changes (Polishing the Turd)
209
209
 
210
+ - [24-22-15] Fix CQWW points, fix mode showing as RPRT.
211
+ - [24-11-24-1] Add ESM to CQ160, ARRL VHF, ARRL 10M, 10 10 contests.
210
212
  - [24-11-24] Added ESM to IARU HF and FieldDay.
211
213
  - [24-11-23] Made macros per contest.
212
214
  - [24-11-21] Merged PR from alduhoo setting CW Speed via rigctld, Added ESM and call history support for General Logging.
@@ -337,7 +337,8 @@ class CAT:
337
337
  self.rigctrlsocket.send(b"m\n")
338
338
  mode = self.__get_serial_string()
339
339
  mode = mode.strip().split()[0]
340
- # logger.debug("%s", mode)
340
+ if mode == "RPRT":
341
+ return ""
341
342
  return mode
342
343
  except IndexError as exception:
343
344
  logger.debug("%s", f"{exception}")
@@ -0,0 +1,3 @@
1
+ """It's the version"""
2
+
3
+ __version__ = "24.11.25"
@@ -0,0 +1,452 @@
1
+ """10 10 fall cw plugin"""
2
+
3
+ # pylint: disable=invalid-name, unused-argument, unused-variable, c-extension-no-member, unused-import
4
+
5
+ import datetime
6
+ import logging
7
+ from pathlib import Path
8
+
9
+ from PyQt6 import QtWidgets
10
+
11
+ from not1mm.lib.plugin_common import gen_adif, get_points
12
+ from not1mm.lib.version import __version__
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+ EXCHANGE_HINT = "Name + 10-10# + SPC"
17
+
18
+ name = "10 10 FALL CW"
19
+ cabrillo_name = "10-10-FALL-CW"
20
+ mode = "CW" # CW SSB BOTH RTTY
21
+ # columns = [0, 1, 2, 3, 4, 5, 6, 15]
22
+ columns = [
23
+ "YYYY-MM-DD HH:MM:SS",
24
+ "Call",
25
+ "Freq",
26
+ "Snt",
27
+ "Rcv",
28
+ "SentNr",
29
+ "RcvNr",
30
+ "PTS",
31
+ ]
32
+
33
+ # 1 once per contest, 2 work each band, 3 each band/mode, 4 no dupe checking
34
+ dupe_type = 1
35
+
36
+
37
+ def init_contest(self):
38
+ """setup plugin"""
39
+ set_tab_next(self)
40
+ set_tab_prev(self)
41
+ interface(self)
42
+ self.next_field = self.other_2
43
+
44
+
45
+ def interface(self):
46
+ """Setup user interface"""
47
+ self.field1.show()
48
+ self.field2.show()
49
+ self.field3.hide()
50
+ self.field4.show()
51
+ self.snt_label.setText("SNT")
52
+ self.field1.setAccessibleName("RST Sent")
53
+ # label = self.field4.findChild(QtWidgets.QLabel)
54
+ self.exch_label.setText("Name 1010# SPC")
55
+ self.field4.setAccessibleName("Name 10 10 # SPC")
56
+
57
+
58
+ def reset_label(self):
59
+ """reset label after field cleared"""
60
+
61
+
62
+ def set_tab_next(self):
63
+ """Set TAB Advances"""
64
+ self.tab_next = {
65
+ self.callsign: self.sent,
66
+ self.sent: self.receive,
67
+ self.receive: self.other_2,
68
+ self.other_1: self.callsign,
69
+ self.other_2: self.callsign,
70
+ }
71
+
72
+
73
+ def set_tab_prev(self):
74
+ """Set TAB Advances"""
75
+ self.tab_prev = {
76
+ self.callsign: self.other_2,
77
+ self.sent: self.callsign,
78
+ self.receive: self.sent,
79
+ self.other_1: self.receive,
80
+ self.other_2: self.receive,
81
+ }
82
+
83
+
84
+ def validate(self):
85
+ """doc"""
86
+ exchange = self.other_2.text().upper().split()
87
+ if len(exchange) == 3:
88
+ if exchange[0].isalpha() and exchange[1].isdigit() and exchange[2].isalpha():
89
+ return True
90
+ return False
91
+
92
+
93
+ def set_contact_vars(self):
94
+ """Contest Specific"""
95
+ self.contact["SNT"] = self.sent.text()
96
+ self.contact["RCV"] = self.receive.text()
97
+ self.contact["NR"] = self.other_2.text().upper()
98
+ self.contact["SentNr"] = self.contest_settings.get("SentExchange", 0)
99
+ exchange = self.other_2.text().upper().split()
100
+ if len(exchange) == 3:
101
+ self.contact["Name"] = exchange[0]
102
+ self.contact["Comment"] = name
103
+ if validate(self) is False:
104
+ self.show_message_box("The exchange was invalid.")
105
+
106
+
107
+ def predupe(self):
108
+ """called after callsign entered"""
109
+
110
+
111
+ def prefill(self):
112
+ """Fill sentnr"""
113
+ self.other_1.setText(str(self.contest_settings.get("SentExchange", 0)))
114
+
115
+
116
+ def points(self):
117
+ """Calc point"""
118
+ exchange = self.other_2.text().upper().split()
119
+ if len(exchange) == 3:
120
+ try:
121
+ tentennumber = exchange[1]
122
+ if int(tentennumber) > 0:
123
+ return 2
124
+ return 1
125
+ except ValueError:
126
+ ...
127
+ return 0
128
+
129
+
130
+ def show_mults(self):
131
+ """Return display string for mults"""
132
+ return 0
133
+
134
+
135
+ def show_qso(self):
136
+ """Return qso count"""
137
+ result = self.database.fetch_qso_count()
138
+ if result:
139
+ return int(result.get("qsos", 0))
140
+ return 0
141
+
142
+
143
+ def calc_score(self):
144
+ """Return calculated score"""
145
+ result = self.database.fetch_points()
146
+ if result is not None:
147
+ score = result.get("Points", "0")
148
+ if score is None:
149
+ score = "0"
150
+ contest_points = int(score)
151
+ return contest_points
152
+ return 0
153
+
154
+
155
+ def adif(self):
156
+ """Call the generate ADIF function"""
157
+ gen_adif(self, cabrillo_name)
158
+
159
+
160
+ def output_cabrillo_line(line_to_output, ending, file_descriptor, file_encoding):
161
+ """"""
162
+ print(
163
+ line_to_output.encode(file_encoding, errors="ignore").decode(),
164
+ end=ending,
165
+ file=file_descriptor,
166
+ )
167
+
168
+
169
+ def cabrillo(self, file_encoding):
170
+ """Generates Cabrillo file. Maybe."""
171
+ # https://www.cqwpx.com/cabrillo.htm
172
+ logger.debug("******Cabrillo*****")
173
+ logger.debug("Station: %s", f"{self.station}")
174
+ logger.debug("Contest: %s", f"{self.contest_settings}")
175
+ now = datetime.datetime.now()
176
+ date_time = now.strftime("%Y-%m-%d_%H-%M-%S")
177
+ filename = (
178
+ str(Path.home())
179
+ + "/"
180
+ + f"{self.station.get('Call', '').upper()}_{cabrillo_name}_{date_time}.log"
181
+ )
182
+ logger.debug("%s", filename)
183
+ log = self.database.fetch_all_contacts_asc()
184
+ try:
185
+ with open(filename, "w", encoding=file_encoding) as file_descriptor:
186
+ output_cabrillo_line(
187
+ "START-OF-LOG: 3.0",
188
+ "\r\n",
189
+ file_descriptor,
190
+ file_encoding,
191
+ )
192
+ output_cabrillo_line(
193
+ f"CREATED-BY: Not1MM v{__version__}",
194
+ "\r\n",
195
+ file_descriptor,
196
+ file_encoding,
197
+ )
198
+ output_cabrillo_line(
199
+ f"CONTEST: {cabrillo_name}",
200
+ "\r\n",
201
+ file_descriptor,
202
+ file_encoding,
203
+ )
204
+ if self.station.get("Club", ""):
205
+ output_cabrillo_line(
206
+ f"CLUB: {self.station.get('Club', '').upper()}",
207
+ "\r\n",
208
+ file_descriptor,
209
+ file_encoding,
210
+ )
211
+ output_cabrillo_line(
212
+ f"CALLSIGN: {self.station.get('Call','')}",
213
+ "\r\n",
214
+ file_descriptor,
215
+ file_encoding,
216
+ )
217
+ output_cabrillo_line(
218
+ f"LOCATION: {self.station.get('ARRLSection', '')}",
219
+ "\r\n",
220
+ file_descriptor,
221
+ file_encoding,
222
+ )
223
+ output_cabrillo_line(
224
+ f"CATEGORY-OPERATOR: {self.contest_settings.get('OperatorCategory','')}",
225
+ "\r\n",
226
+ file_descriptor,
227
+ file_encoding,
228
+ )
229
+ output_cabrillo_line(
230
+ f"CATEGORY-ASSISTED: {self.contest_settings.get('AssistedCategory','')}",
231
+ "\r\n",
232
+ file_descriptor,
233
+ file_encoding,
234
+ )
235
+ output_cabrillo_line(
236
+ f"CATEGORY-BAND: {self.contest_settings.get('BandCategory','')}",
237
+ "\r\n",
238
+ file_descriptor,
239
+ file_encoding,
240
+ )
241
+ output_cabrillo_line(
242
+ f"CATEGORY-MODE: {self.contest_settings.get('ModeCategory','')}",
243
+ "\r\n",
244
+ file_descriptor,
245
+ file_encoding,
246
+ )
247
+ output_cabrillo_line(
248
+ f"CATEGORY-TRANSMITTER: {self.contest_settings.get('TransmitterCategory','')}",
249
+ "\r\n",
250
+ file_descriptor,
251
+ file_encoding,
252
+ )
253
+ if self.contest_settings.get("OverlayCategory", "") != "N/A":
254
+ output_cabrillo_line(
255
+ f"CATEGORY-OVERLAY: {self.contest_settings.get('OverlayCategory','')}",
256
+ "\r\n",
257
+ file_descriptor,
258
+ file_encoding,
259
+ )
260
+ output_cabrillo_line(
261
+ f"GRID-LOCATOR: {self.station.get('GridSquare','')}",
262
+ "\r\n",
263
+ file_descriptor,
264
+ file_encoding,
265
+ )
266
+ output_cabrillo_line(
267
+ f"CATEGORY-POWER: {self.contest_settings.get('PowerCategory','')}",
268
+ "\r\n",
269
+ file_descriptor,
270
+ file_encoding,
271
+ )
272
+
273
+ output_cabrillo_line(
274
+ f"CLAIMED-SCORE: {calc_score(self)}",
275
+ "\r\n",
276
+ file_descriptor,
277
+ file_encoding,
278
+ )
279
+ ops = f"@{self.station.get('Call','')}"
280
+ list_of_ops = self.database.get_ops()
281
+ for op in list_of_ops:
282
+ ops += f", {op.get('Operator', '')}"
283
+ output_cabrillo_line(
284
+ f"OPERATORS: {ops}",
285
+ "\r\n",
286
+ file_descriptor,
287
+ file_encoding,
288
+ )
289
+ output_cabrillo_line(
290
+ f"NAME: {self.station.get('Name', '')}",
291
+ "\r\n",
292
+ file_descriptor,
293
+ file_encoding,
294
+ )
295
+ output_cabrillo_line(
296
+ f"ADDRESS: {self.station.get('Street1', '')}",
297
+ "\r\n",
298
+ file_descriptor,
299
+ file_encoding,
300
+ )
301
+ output_cabrillo_line(
302
+ f"ADDRESS-CITY: {self.station.get('City', '')}",
303
+ "\r\n",
304
+ file_descriptor,
305
+ file_encoding,
306
+ )
307
+ output_cabrillo_line(
308
+ f"ADDRESS-STATE-PROVINCE: {self.station.get('State', '')}",
309
+ "\r\n",
310
+ file_descriptor,
311
+ file_encoding,
312
+ )
313
+ output_cabrillo_line(
314
+ f"ADDRESS-POSTALCODE: {self.station.get('Zip', '')}",
315
+ "\r\n",
316
+ file_descriptor,
317
+ file_encoding,
318
+ )
319
+ output_cabrillo_line(
320
+ f"ADDRESS-COUNTRY: {self.station.get('Country', '')}",
321
+ "\r\n",
322
+ file_descriptor,
323
+ file_encoding,
324
+ )
325
+ output_cabrillo_line(
326
+ f"EMAIL: {self.station.get('Email', '')}",
327
+ "\r\n",
328
+ file_descriptor,
329
+ file_encoding,
330
+ )
331
+ for contact in log:
332
+ the_date_and_time = contact.get("TS", "")
333
+ themode = contact.get("Mode", "")
334
+ if themode == "LSB" or themode == "USB":
335
+ themode = "PH"
336
+ frequency = str(int(contact.get("Freq", "0"))).rjust(5)
337
+
338
+ loggeddate = the_date_and_time[:10]
339
+ loggedtime = the_date_and_time[11:13] + the_date_and_time[14:16]
340
+ output_cabrillo_line(
341
+ f"QSO: {frequency} {themode} {loggeddate} {loggedtime} "
342
+ f"{contact.get('StationPrefix', '').ljust(13)} "
343
+ f"{str(contact.get('SNT', '')).ljust(3)} "
344
+ f"{str(contact.get('SentNr', '')).ljust(6)} "
345
+ f"{contact.get('Call', '').ljust(13)} "
346
+ f"{str(contact.get('RCV', '')).ljust(3)} "
347
+ f"{str(contact.get('NR', '')).ljust(6)}",
348
+ "\r\n",
349
+ file_descriptor,
350
+ file_encoding,
351
+ )
352
+ output_cabrillo_line("END-OF-LOG:", "\r\n", file_descriptor, file_encoding)
353
+ self.show_message_box(f"Cabrillo saved to: {filename}")
354
+ except IOError as exception:
355
+ logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
356
+ self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
357
+ return
358
+
359
+
360
+ def recalculate_mults(self):
361
+ """Recalculates multipliers after change in logged qso."""
362
+
363
+
364
+ def process_esm(self, new_focused_widget=None, with_enter=False):
365
+ """ESM State Machine"""
366
+
367
+ # self.pref["run_state"]
368
+
369
+ # -----===== Assigned F-Keys =====-----
370
+ # self.esm_dict["CQ"]
371
+ # self.esm_dict["EXCH"]
372
+ # self.esm_dict["QRZ"]
373
+ # self.esm_dict["AGN"]
374
+ # self.esm_dict["HISCALL"]
375
+ # self.esm_dict["MYCALL"]
376
+ # self.esm_dict["QSOB4"]
377
+
378
+ # ----==== text fields ====----
379
+ # self.callsign
380
+ # self.sent
381
+ # self.receive
382
+ # self.other_1
383
+ # self.other_2
384
+
385
+ if new_focused_widget is not None:
386
+ self.current_widget = self.inputs_dict.get(new_focused_widget)
387
+
388
+ # print(f"checking esm {self.current_widget=} {with_enter=} {self.pref.get("run_state")=}")
389
+
390
+ for a_button in [
391
+ self.esm_dict["CQ"],
392
+ self.esm_dict["EXCH"],
393
+ self.esm_dict["QRZ"],
394
+ self.esm_dict["AGN"],
395
+ self.esm_dict["HISCALL"],
396
+ self.esm_dict["MYCALL"],
397
+ self.esm_dict["QSOB4"],
398
+ ]:
399
+ if a_button is not None:
400
+ self.restore_button_color(a_button)
401
+
402
+ buttons_to_send = []
403
+
404
+ if self.pref.get("run_state"):
405
+ if self.current_widget == "callsign":
406
+ if len(self.callsign.text()) < 3:
407
+ self.make_button_green(self.esm_dict["CQ"])
408
+ buttons_to_send.append(self.esm_dict["CQ"])
409
+ elif len(self.callsign.text()) > 2:
410
+ self.make_button_green(self.esm_dict["HISCALL"])
411
+ self.make_button_green(self.esm_dict["EXCH"])
412
+ buttons_to_send.append(self.esm_dict["HISCALL"])
413
+ buttons_to_send.append(self.esm_dict["EXCH"])
414
+
415
+ elif self.current_widget in ["other_2"]:
416
+ if self.other_2.text() == "":
417
+ self.make_button_green(self.esm_dict["AGN"])
418
+ buttons_to_send.append(self.esm_dict["AGN"])
419
+ else:
420
+ self.make_button_green(self.esm_dict["QRZ"])
421
+ buttons_to_send.append(self.esm_dict["QRZ"])
422
+ buttons_to_send.append("LOGIT")
423
+
424
+ if with_enter is True and bool(len(buttons_to_send)):
425
+ for button in buttons_to_send:
426
+ if button:
427
+ if button == "LOGIT":
428
+ self.save_contact()
429
+ continue
430
+ self.process_function_key(button)
431
+ else:
432
+ if self.current_widget == "callsign":
433
+ if len(self.callsign.text()) > 2:
434
+ self.make_button_green(self.esm_dict["MYCALL"])
435
+ buttons_to_send.append(self.esm_dict["MYCALL"])
436
+
437
+ elif self.current_widget in ["other_2"]:
438
+ if self.other_2.text() == "":
439
+ self.make_button_green(self.esm_dict["AGN"])
440
+ buttons_to_send.append(self.esm_dict["AGN"])
441
+ else:
442
+ self.make_button_green(self.esm_dict["EXCH"])
443
+ buttons_to_send.append(self.esm_dict["EXCH"])
444
+ buttons_to_send.append("LOGIT")
445
+
446
+ if with_enter is True and bool(len(buttons_to_send)):
447
+ for button in buttons_to_send:
448
+ if button:
449
+ if button == "LOGIT":
450
+ self.save_contact()
451
+ continue
452
+ self.process_function_key(button)