not1mm 24.10.14__tar.gz → 24.10.15__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 (175) hide show
  1. {not1mm-24.10.14 → not1mm-24.10.15}/PKG-INFO +4 -3
  2. {not1mm-24.10.14 → not1mm-24.10.15}/README.md +3 -2
  3. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/new_contest.ui +5 -0
  4. not1mm-24.10.15/not1mm/lib/version.py +3 -0
  5. not1mm-24.10.15/not1mm/plugins/naqp_cw.py +519 -0
  6. not1mm-24.10.15/not1mm/plugins/naqp_rtty.py +628 -0
  7. not1mm-24.10.15/not1mm/plugins/naqp_ssb.py +489 -0
  8. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm.egg-info/PKG-INFO +4 -3
  9. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm.egg-info/SOURCES.txt +1 -0
  10. {not1mm-24.10.14 → not1mm-24.10.15}/pyproject.toml +1 -1
  11. not1mm-24.10.14/not1mm/lib/version.py +0 -3
  12. not1mm-24.10.14/not1mm/plugins/naqp_cw.py +0 -393
  13. not1mm-24.10.14/not1mm/plugins/naqp_ssb.py +0 -363
  14. {not1mm-24.10.14 → not1mm-24.10.15}/LICENSE +0 -0
  15. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/__init__.py +0 -0
  16. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/__main__.py +0 -0
  17. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/bandmap.py +0 -0
  18. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/checkwindow.py +0 -0
  19. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/JetBrainsMono-ExtraLight.ttf +0 -0
  20. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/MASTER.SCP +0 -0
  21. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/about.ui +0 -0
  22. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/alpha bravo charlie delta.txt +0 -0
  23. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/bandmap.ui +0 -0
  24. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/check.png +0 -0
  25. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/checkwindow.ui +0 -0
  26. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/configuration.ui +0 -0
  27. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/contests.sql +0 -0
  28. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/cty.json +0 -0
  29. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/cwmacros.txt +0 -0
  30. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/donors.html +0 -0
  31. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/editcontact.ui +0 -0
  32. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/editmacro.ui +0 -0
  33. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/greendot.png +0 -0
  34. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/k6gte-not1mm.desktop +0 -0
  35. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/k6gte.not1mm-128.png +0 -0
  36. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/k6gte.not1mm-32.png +0 -0
  37. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/k6gte.not1mm-64.png +0 -0
  38. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/logwindow.ui +0 -0
  39. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/logwindowx.ui +0 -0
  40. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/main.ui +0 -0
  41. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/not1mm.html +0 -0
  42. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/opon.ui +0 -0
  43. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/0.wav +0 -0
  44. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/1.wav +0 -0
  45. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/2.wav +0 -0
  46. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/3.wav +0 -0
  47. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/4.wav +0 -0
  48. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/5.wav +0 -0
  49. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/6.wav +0 -0
  50. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/7.wav +0 -0
  51. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/73.wav +0 -0
  52. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/8.wav +0 -0
  53. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/9.wav +0 -0
  54. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/a.wav +0 -0
  55. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/again.wav +0 -0
  56. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/b.wav +0 -0
  57. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/c.wav +0 -0
  58. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/contest.wav +0 -0
  59. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/cq.wav +0 -0
  60. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/d.wav +0 -0
  61. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/e.wav +0 -0
  62. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/f.wav +0 -0
  63. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/g.wav +0 -0
  64. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/h.wav +0 -0
  65. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/i.wav +0 -0
  66. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/j.wav +0 -0
  67. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/k.wav +0 -0
  68. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/k6gte.wav +0 -0
  69. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/l.wav +0 -0
  70. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/m.wav +0 -0
  71. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/mynumber.wav +0 -0
  72. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/n.wav +0 -0
  73. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/nil.wav +0 -0
  74. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/o.wav +0 -0
  75. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/p.wav +0 -0
  76. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/q.wav +0 -0
  77. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/r.wav +0 -0
  78. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/roger.wav +0 -0
  79. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/s.wav +0 -0
  80. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/space.wav +0 -0
  81. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/t.wav +0 -0
  82. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/thankyou.wav +0 -0
  83. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/thankyouqrz.wav +0 -0
  84. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/u.wav +0 -0
  85. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/v.wav +0 -0
  86. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/w.wav +0 -0
  87. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/x.wav +0 -0
  88. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/y.wav +0 -0
  89. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/yourcall.wav +0 -0
  90. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/phonetics/z.wav +0 -0
  91. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/pickcontest.ui +0 -0
  92. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/radio_green.png +0 -0
  93. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/radio_grey.png +0 -0
  94. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/radio_red.png +0 -0
  95. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/reddot.png +0 -0
  96. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/rttymacros.txt +0 -0
  97. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/settings.ui +0 -0
  98. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/splash.png +0 -0
  99. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/ssbmacros.txt +0 -0
  100. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/data/vfo.ui +0 -0
  101. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/fsutils.py +0 -0
  102. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/__init__.py +0 -0
  103. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/about.py +0 -0
  104. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/cat_interface.py +0 -0
  105. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/cwinterface.py +0 -0
  106. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/database.py +0 -0
  107. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/edit_contact.py +0 -0
  108. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/edit_macro.py +0 -0
  109. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/edit_opon.py +0 -0
  110. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/edit_station.py +0 -0
  111. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/fldigi_sendstring.py +0 -0
  112. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/fldigi_watcher.py +0 -0
  113. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/ft8_watcher.py +0 -0
  114. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/ham_utility.py +0 -0
  115. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/lookup.py +0 -0
  116. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/multicast.py +0 -0
  117. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/n1mm.py +0 -0
  118. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/new_contest.py +0 -0
  119. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/playsound.py +0 -0
  120. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/plugin_common.py +0 -0
  121. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/select_contest.py +0 -0
  122. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/settings.py +0 -0
  123. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/super_check_partial.py +0 -0
  124. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lib/versiontest.py +0 -0
  125. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/logwindow.py +0 -0
  126. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/lookupservice.py +0 -0
  127. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/10_10_fall_cw.py +0 -0
  128. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/10_10_spring_cw.py +0 -0
  129. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/10_10_summer_phone.py +0 -0
  130. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/10_10_winter_phone.py +0 -0
  131. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/__init__.py +0 -0
  132. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/arrl_10m.py +0 -0
  133. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/arrl_dx_cw.py +0 -0
  134. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/arrl_dx_ssb.py +0 -0
  135. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/arrl_field_day.py +0 -0
  136. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/arrl_rtty_ru.py +0 -0
  137. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/arrl_ss_cw.py +0 -0
  138. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/arrl_ss_phone.py +0 -0
  139. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/arrl_vhf_jan.py +0 -0
  140. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/arrl_vhf_jun.py +0 -0
  141. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/arrl_vhf_sep.py +0 -0
  142. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/canada_day.py +0 -0
  143. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/cq_160_cw.py +0 -0
  144. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/cq_160_ssb.py +0 -0
  145. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/cq_wpx_cw.py +0 -0
  146. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/cq_wpx_rtty.py +0 -0
  147. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/cq_wpx_ssb.py +0 -0
  148. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/cq_ww_cw.py +0 -0
  149. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/cq_ww_rtty.py +0 -0
  150. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/cq_ww_ssb.py +0 -0
  151. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/cwt.py +0 -0
  152. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/general_logging.py +0 -0
  153. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/helvetia.py +0 -0
  154. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/iaru_fieldday_r1_cw.py +0 -0
  155. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/iaru_fieldday_r1_ssb.py +0 -0
  156. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/iaru_hf.py +0 -0
  157. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/icwc_mst.py +0 -0
  158. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/jidx_cw.py +0 -0
  159. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/jidx_ph.py +0 -0
  160. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/k1usn_sst.py +0 -0
  161. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/phone_weekly_test.py +0 -0
  162. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/ref_cw.py +0 -0
  163. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/stew_perry_topband.py +0 -0
  164. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/weekly_rtty.py +0 -0
  165. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/plugins/winter_field_day.py +0 -0
  166. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/radio.py +0 -0
  167. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/test.py +0 -0
  168. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/vfo.py +0 -0
  169. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm/voice_keying.py +0 -0
  170. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm.egg-info/dependency_links.txt +0 -0
  171. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm.egg-info/entry_points.txt +0 -0
  172. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm.egg-info/requires.txt +0 -0
  173. {not1mm-24.10.14 → not1mm-24.10.15}/not1mm.egg-info/top_level.txt +0 -0
  174. {not1mm-24.10.14 → not1mm-24.10.15}/setup.cfg +0 -0
  175. {not1mm-24.10.14 → not1mm-24.10.15}/test/contests.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: not1mm
3
- Version: 24.10.14
3
+ Version: 24.10.15
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
@@ -213,7 +213,7 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
213
213
  - ARRL Sweepstakes CW, SSB
214
214
  - ARRL VHF January, June, September
215
215
  - CQ 160 CW, SSB
216
- - CQ WPX CW, RTTY, SSB
216
+ - .CQ WPX CW, RTTY, SSB
217
217
  - .CQ World Wide CW, RTTY, SSB
218
218
  - .CWOps CWT
219
219
  - Helvetia
@@ -222,7 +222,7 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
222
222
  - ICWC MST
223
223
  - Japan International DX CW, SSB
224
224
  - .K1USN Slow Speed Test
225
- - NAQP CW, SSB
225
+ - .NAQP CW, RTTY, SSB
226
226
  - Phone Weekly Test
227
227
  - RAC Canada Day
228
228
  - Stew Perry Topband
@@ -231,6 +231,7 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
231
231
 
232
232
  ## Recent Changes
233
233
 
234
+ - [24-10-15] Add NAQP RTTY, Added ESM to NAQP.
234
235
  - [24-10-14] Add ESM to CQ WPX.
235
236
  - [24-10-13] Added ESM to Weekly RTTY, K1USN and CWT.
236
237
  - [24-10-11] added ESM to CQWW SSB and RTTY.
@@ -182,7 +182,7 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
182
182
  - ARRL Sweepstakes CW, SSB
183
183
  - ARRL VHF January, June, September
184
184
  - CQ 160 CW, SSB
185
- - CQ WPX CW, RTTY, SSB
185
+ - .CQ WPX CW, RTTY, SSB
186
186
  - .CQ World Wide CW, RTTY, SSB
187
187
  - .CWOps CWT
188
188
  - Helvetia
@@ -191,7 +191,7 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
191
191
  - ICWC MST
192
192
  - Japan International DX CW, SSB
193
193
  - .K1USN Slow Speed Test
194
- - NAQP CW, SSB
194
+ - .NAQP CW, RTTY, SSB
195
195
  - Phone Weekly Test
196
196
  - RAC Canada Day
197
197
  - Stew Perry Topband
@@ -200,6 +200,7 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
200
200
 
201
201
  ## Recent Changes
202
202
 
203
+ - [24-10-15] Add NAQP RTTY, Added ESM to NAQP.
203
204
  - [24-10-14] Add ESM to CQ WPX.
204
205
  - [24-10-13] Added ESM to Weekly RTTY, K1USN and CWT.
205
206
  - [24-10-11] added ESM to CQWW SSB and RTTY.
@@ -352,6 +352,11 @@
352
352
  <string>NAQP CW</string>
353
353
  </property>
354
354
  </item>
355
+ <item>
356
+ <property name="text">
357
+ <string>NAQP RTTY</string>
358
+ </property>
359
+ </item>
355
360
  <item>
356
361
  <property name="text">
357
362
  <string>NAQP SSB</string>
@@ -0,0 +1,3 @@
1
+ """It's the version"""
2
+
3
+ __version__ = "24.10.15"
@@ -0,0 +1,519 @@
1
+ """NAQP CW plugin"""
2
+
3
+ # pylint: disable=invalid-name, unused-argument, unused-variable, c-extension-no-member, unused-import
4
+
5
+ # North American QSO Party, CW
6
+ # Status: Active
7
+ # Geographic Focus: North America
8
+ # Participation: Worldwide
9
+ # Awards: North America
10
+ # Mode: CW
11
+ # Bands: 160, 80, 40, 20, 15, 10m
12
+ # Classes: Single Op (QRP/Low)
13
+ # Single Op Assisted (QRP/Low)
14
+ # Single Op Overlay: Youth
15
+ # Multi-Two (Low)
16
+ # Max operating hours: Single Op: 10 hours
17
+ # Multi-Two: 12 hours
18
+ # Max power: LP: 100 watts
19
+ # QRP: 5 watts
20
+ # Exchange: NA: Name + (state/DC/province/country)
21
+ # non-NA: Name
22
+ # Work stations: Once per band
23
+ # QSO Points: NA station: 1 point per QSO
24
+ # non-NA station: 1 point per QSO with an NA station
25
+ # Multipliers: Each US state and DC (including KH6/KL7) once per band
26
+ # Each VE province/territory once per band
27
+ # Each North American country (except W/VE) once per band
28
+ # Score Calculation: Total score = total QSO points x total mults
29
+ # E-mail logs to: (none)
30
+ # Upload log at: http://www.ncjweb.com/naqplogsubmit/
31
+ # Mail logs to: (none)
32
+ # Find rules at: https://www.ncjweb.com/NAQP-Rules.pdf
33
+ # Cabrillo name: NAQP-CW
34
+
35
+ import datetime
36
+ import logging
37
+ import platform
38
+
39
+ from pathlib import Path
40
+
41
+ from PyQt6 import QtWidgets
42
+
43
+ from not1mm.lib.plugin_common import gen_adif, get_points
44
+ from not1mm.lib.version import __version__
45
+
46
+ logger = logging.getLogger(__name__)
47
+
48
+ EXCHANGE_HINT = "Name or Name + SPC"
49
+
50
+ name = "NAQP CW"
51
+ cabrillo_name = "NAQP-CW"
52
+ mode = "CW" # CW SSB BOTH RTTY
53
+ # columns = [0, 1, 2, 3, 4, 10, 11, 14, 15]
54
+ columns = [
55
+ "YYYY-MM-DD HH:MM:SS",
56
+ "Call",
57
+ "Freq",
58
+ "Name",
59
+ "Sect",
60
+ "M1",
61
+ "PTS",
62
+ ]
63
+
64
+ advance_on_space = [True, True, True, True, True]
65
+
66
+ # 1 once per contest, 2 work each band, 3 each band/mode, 4 no dupe checking
67
+ dupe_type = 2
68
+
69
+
70
+ def init_contest(self):
71
+ """setup plugin"""
72
+ set_tab_next(self)
73
+ set_tab_prev(self)
74
+ interface(self)
75
+ self.next_field = self.other_1
76
+
77
+
78
+ def interface(self):
79
+ """Setup user interface"""
80
+ self.field1.hide()
81
+ self.field2.hide()
82
+ self.field3.show()
83
+ self.field4.show()
84
+ self.snt_label.setText("SNT")
85
+ self.field1.setAccessibleName("RST Sent")
86
+ namefield = self.field3.findChild(QtWidgets.QLabel)
87
+ namefield.setText("Name")
88
+ self.field3.setAccessibleName("Name")
89
+ spc = self.field4.findChild(QtWidgets.QLabel)
90
+ spc.setText("State")
91
+ self.field4.setAccessibleName("State")
92
+
93
+
94
+ def reset_label(self):
95
+ """reset label after field cleared"""
96
+
97
+
98
+ def set_tab_next(self):
99
+ """Set TAB Advances"""
100
+ self.tab_next = {
101
+ self.callsign: self.field3.findChild(QtWidgets.QLineEdit),
102
+ self.field3.findChild(QtWidgets.QLineEdit): self.field4.findChild(
103
+ QtWidgets.QLineEdit
104
+ ),
105
+ self.field4.findChild(QtWidgets.QLineEdit): self.callsign,
106
+ }
107
+
108
+
109
+ def set_tab_prev(self):
110
+ """Set TAB Advances"""
111
+ self.tab_prev = {
112
+ self.callsign: self.field4.findChild(QtWidgets.QLineEdit),
113
+ self.field3.findChild(QtWidgets.QLineEdit): self.callsign,
114
+ self.field4.findChild(QtWidgets.QLineEdit): self.field3.findChild(
115
+ QtWidgets.QLineEdit
116
+ ),
117
+ }
118
+
119
+
120
+ def set_contact_vars(self):
121
+ """Contest Specific"""
122
+ self.contact["SNT"] = self.sent.text()
123
+ self.contact["RCV"] = self.receive.text()
124
+ self.contact["Name"] = self.other_1.text().upper()
125
+ self.contact["Sect"] = self.other_2.text().upper()
126
+ self.contact["SentNr"] = self.contest_settings.get("SentExchange", 0)
127
+
128
+ if self.contact.get("Sect", ""):
129
+ result = self.database.fetch_sect_band_exists(
130
+ self.contact.get("Sect", ""), self.contact.get("Band", "")
131
+ )
132
+ if result.get("sect_count", ""):
133
+ self.contact["IsMultiplier1"] = 0
134
+ else:
135
+ self.contact["IsMultiplier1"] = 1
136
+
137
+
138
+ def predupe(self):
139
+ """called after callsign entered"""
140
+
141
+
142
+ def prefill(self):
143
+ """Fill sentnr"""
144
+
145
+
146
+ def points(self):
147
+ """Calc point"""
148
+ mycontinent = ""
149
+ hiscontinent = ""
150
+ result = self.cty_lookup(self.station.get("Call", ""))
151
+ if result:
152
+ for item in result.items():
153
+ mycontinent = item[1].get("continent", "")
154
+ result = self.cty_lookup(self.contact.get("Call", ""))
155
+ if result:
156
+ for item in result.items():
157
+ hiscontinent = item[1].get("continent", "")
158
+ if mycontinent == "NA" or hiscontinent == "NA":
159
+ return 1
160
+ return 0
161
+
162
+
163
+ def show_mults(self):
164
+ """Return display string for mults"""
165
+ result = self.database.fetch_section_band_count_nodx()
166
+ if result:
167
+ return int(result.get("sb_count", 0))
168
+ return 0
169
+
170
+
171
+ def show_qso(self):
172
+ """Return qso count"""
173
+ result = self.database.fetch_qso_count()
174
+ if result:
175
+ return int(result.get("qsos", 0))
176
+ return 0
177
+
178
+
179
+ def calc_score(self):
180
+ """Return calculated score"""
181
+ result = self.database.fetch_points()
182
+ if result is not None:
183
+ score = result.get("Points", "0")
184
+ if score is None:
185
+ score = "0"
186
+ contest_points = int(score)
187
+ mults = show_mults(self)
188
+ return contest_points * mults
189
+ return 0
190
+
191
+
192
+ def adif(self):
193
+ """Call the generate ADIF function"""
194
+ gen_adif(self, cabrillo_name, "NAQP-CW")
195
+
196
+
197
+ def cabrillo(self):
198
+ """Generates Cabrillo file. Maybe."""
199
+ # https://www.cqwpx.com/cabrillo.htm
200
+ logger.debug("******Cabrillo*****")
201
+ logger.debug("Station: %s", f"{self.station}")
202
+ logger.debug("Contest: %s", f"{self.contest_settings}")
203
+ now = datetime.datetime.now()
204
+ date_time = now.strftime("%Y-%m-%d_%H-%M-%S")
205
+ filename = (
206
+ str(Path.home())
207
+ + "/"
208
+ + f"{self.station.get('Call', '').upper()}_{cabrillo_name}_{date_time}.log"
209
+ )
210
+ logger.debug("%s", filename)
211
+ log = self.database.fetch_all_contacts_asc()
212
+ try:
213
+ with open(filename, "w", encoding="ascii") as file_descriptor:
214
+ print("START-OF-LOG: 3.0", end="\r\n", file=file_descriptor)
215
+ print(
216
+ f"CREATED-BY: Not1MM v{__version__}",
217
+ end="\r\n",
218
+ file=file_descriptor,
219
+ )
220
+ print(
221
+ f"CONTEST: {cabrillo_name}",
222
+ end="\r\n",
223
+ file=file_descriptor,
224
+ )
225
+ if self.station.get("Club", ""):
226
+ print(
227
+ f"CLUB: {self.station.get('Club', '').upper()}",
228
+ end="\r\n",
229
+ file=file_descriptor,
230
+ )
231
+ print(
232
+ f"CALLSIGN: {self.station.get('Call','')}",
233
+ end="\r\n",
234
+ file=file_descriptor,
235
+ )
236
+ print(
237
+ f"LOCATION: {self.station.get('ARRLSection', '')}",
238
+ end="\r\n",
239
+ file=file_descriptor,
240
+ )
241
+ # print(
242
+ # f"ARRL-SECTION: {self.pref.get('section', '')}",
243
+ # end="\r\n",
244
+ # file=file_descriptor,
245
+ # )
246
+ print(
247
+ f"CATEGORY-OPERATOR: {self.contest_settings.get('OperatorCategory','')}",
248
+ end="\r\n",
249
+ file=file_descriptor,
250
+ )
251
+ print(
252
+ f"CATEGORY-ASSISTED: {self.contest_settings.get('AssistedCategory','')}",
253
+ end="\r\n",
254
+ file=file_descriptor,
255
+ )
256
+ print(
257
+ f"CATEGORY-BAND: {self.contest_settings.get('BandCategory','')}",
258
+ end="\r\n",
259
+ file=file_descriptor,
260
+ )
261
+ print(
262
+ f"CATEGORY-MODE: {self.contest_settings.get('ModeCategory','')}",
263
+ end="\r\n",
264
+ file=file_descriptor,
265
+ )
266
+ print(
267
+ f"CATEGORY-TRANSMITTER: {self.contest_settings.get('TransmitterCategory','')}",
268
+ end="\r\n",
269
+ file=file_descriptor,
270
+ )
271
+ if self.contest_settings.get("OverlayCategory", "") != "N/A":
272
+ print(
273
+ f"CATEGORY-OVERLAY: {self.contest_settings.get('OverlayCategory','')}",
274
+ end="\r\n",
275
+ file=file_descriptor,
276
+ )
277
+ print(
278
+ f"GRID-LOCATOR: {self.station.get('GridSquare','')}",
279
+ end="\r\n",
280
+ file=file_descriptor,
281
+ )
282
+ # print(
283
+ # f"CATEGORY: {None}",
284
+ # end="\r\n",
285
+ # file=file_descriptor,
286
+ # )
287
+ print(
288
+ f"CATEGORY-POWER: {self.contest_settings.get('PowerCategory','')}",
289
+ end="\r\n",
290
+ file=file_descriptor,
291
+ )
292
+
293
+ print(
294
+ f"CLAIMED-SCORE: {calc_score(self)}",
295
+ end="\r\n",
296
+ file=file_descriptor,
297
+ )
298
+ ops = f"@{self.station.get('Call','')}"
299
+ list_of_ops = self.database.get_ops()
300
+ for op in list_of_ops:
301
+ ops += f", {op.get('Operator', '')}"
302
+ print(
303
+ f"OPERATORS: {ops}",
304
+ end="\r\n",
305
+ file=file_descriptor,
306
+ )
307
+ print(
308
+ f"NAME: {self.station.get('Name', '')}",
309
+ end="\r\n",
310
+ file=file_descriptor,
311
+ )
312
+ print(
313
+ f"ADDRESS: {self.station.get('Street1', '')}",
314
+ end="\r\n",
315
+ file=file_descriptor,
316
+ )
317
+ print(
318
+ f"ADDRESS-CITY: {self.station.get('City', '')}",
319
+ end="\r\n",
320
+ file=file_descriptor,
321
+ )
322
+ print(
323
+ f"ADDRESS-STATE-PROVINCE: {self.station.get('State', '')}",
324
+ end="\r\n",
325
+ file=file_descriptor,
326
+ )
327
+ print(
328
+ f"ADDRESS-POSTALCODE: {self.station.get('Zip', '')}",
329
+ end="\r\n",
330
+ file=file_descriptor,
331
+ )
332
+ print(
333
+ f"ADDRESS-COUNTRY: {self.station.get('Country', '')}",
334
+ end="\r\n",
335
+ file=file_descriptor,
336
+ )
337
+ print(
338
+ f"EMAIL: {self.station.get('Email', '')}",
339
+ end="\r\n",
340
+ file=file_descriptor,
341
+ )
342
+ for contact in log:
343
+ the_date_and_time = contact.get("TS", "")
344
+ themode = contact.get("Mode", "")
345
+ if themode == "LSB" or themode == "USB":
346
+ themode = "PH"
347
+ frequency = str(int(contact.get("Freq", "0"))).rjust(5)
348
+
349
+ loggeddate = the_date_and_time[:10]
350
+ loggedtime = the_date_and_time[11:13] + the_date_and_time[14:16]
351
+ print(
352
+ f"QSO: {frequency} {themode} {loggeddate} {loggedtime} "
353
+ f"{contact.get('StationPrefix', '').ljust(13)} "
354
+ f"{str(contact.get('SentNr', '')).upper()} "
355
+ f"{contact.get('Call', '').ljust(13)} "
356
+ f"{str(contact.get('Name', '')).ljust(11)} "
357
+ f"{str(contact.get('Sect', '')).ljust(5)}",
358
+ end="\r\n",
359
+ file=file_descriptor,
360
+ )
361
+ print("END-OF-LOG:", end="\r\n", file=file_descriptor)
362
+ self.show_message_box(f"Cabrillo saved to: {filename}")
363
+ except IOError as exception:
364
+ logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
365
+ self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
366
+ return
367
+
368
+
369
+ def recalculate_mults(self):
370
+ """Recalculates multipliers after change in logged qso."""
371
+
372
+ all_contacts = self.database.fetch_all_contacts_asc()
373
+ for contact in all_contacts:
374
+ time_stamp = contact.get("TS", "")
375
+ sect = contact.get("Sect", "")
376
+ band = contact.get("Band", "")
377
+ query = (
378
+ f"select count(*) as sect_count from dxlog where TS < '{time_stamp}' "
379
+ f"and Sect = '{sect}' "
380
+ f"and Band = '{band}' "
381
+ f"and ContestNR = {self.pref.get('contest', '1')};"
382
+ )
383
+ result = self.database.exec_sql(query)
384
+ count = result.get("sect_count", 1)
385
+ if count == 0 and contact.get("Points", 0) == 1 and sect != "DX":
386
+ contact["IsMultiplier1"] = 1
387
+ else:
388
+ contact["IsMultiplier1"] = 0
389
+ self.database.change_contact(contact)
390
+ cmd = {}
391
+ cmd["cmd"] = "UPDATELOG"
392
+ cmd["station"] = platform.node()
393
+ self.multicast_interface.send_as_json(cmd)
394
+
395
+
396
+ def process_esm(self, new_focused_widget=None, with_enter=False):
397
+ """ESM State Machine"""
398
+
399
+ # self.pref["run_state"]
400
+
401
+ # -----===== Assigned F-Keys =====-----
402
+ # self.esm_dict["CQ"]
403
+ # self.esm_dict["EXCH"]
404
+ # self.esm_dict["QRZ"]
405
+ # self.esm_dict["AGN"]
406
+ # self.esm_dict["HISCALL"]
407
+ # self.esm_dict["MYCALL"]
408
+ # self.esm_dict["QSOB4"]
409
+
410
+ # ----==== text fields ====----
411
+ # self.callsign
412
+ # self.sent
413
+ # self.receive
414
+ # self.other_1
415
+ # self.other_2
416
+
417
+ if new_focused_widget is not None:
418
+ self.current_widget = self.inputs_dict.get(new_focused_widget)
419
+
420
+ # print(f"checking esm {self.current_widget=} {with_enter=} {self.pref.get("run_state")=}")
421
+
422
+ for a_button in [
423
+ self.F1,
424
+ self.F2,
425
+ self.F3,
426
+ self.F4,
427
+ self.F5,
428
+ self.F6,
429
+ self.F7,
430
+ self.F8,
431
+ self.F9,
432
+ self.F10,
433
+ self.F11,
434
+ self.F12,
435
+ ]:
436
+ self.restore_button_color(a_button)
437
+
438
+ buttons_to_send = []
439
+
440
+ if self.pref.get("run_state"):
441
+ if self.current_widget == "callsign":
442
+ if len(self.callsign.text()) < 3:
443
+ self.make_button_green(self.esm_dict["CQ"])
444
+ buttons_to_send.append(self.esm_dict["CQ"])
445
+ elif len(self.callsign.text()) > 2 and self.callsign.text().isalnum():
446
+ self.make_button_green(self.esm_dict["HISCALL"])
447
+ self.make_button_green(self.esm_dict["EXCH"])
448
+ buttons_to_send.append(self.esm_dict["HISCALL"])
449
+ buttons_to_send.append(self.esm_dict["EXCH"])
450
+
451
+ elif self.current_widget == "other_1" or self.current_widget == "other_2":
452
+ continent = self.contact.get("Continent")
453
+ print(
454
+ f"{self.current_widget=} {self.other_1.text().isalpha()=} {self.other_2.text().isalpha()=} {continent=}"
455
+ )
456
+ if self.other_1.text() == "" or (
457
+ self.other_2.text() == "" and continent == "NA"
458
+ ):
459
+ self.make_button_green(self.esm_dict["AGN"])
460
+ buttons_to_send.append(self.esm_dict["AGN"])
461
+ elif (
462
+ self.other_1.text().isalpha()
463
+ and self.other_2.text().isalpha()
464
+ and continent == "NA"
465
+ ):
466
+ self.make_button_green(self.esm_dict["QRZ"])
467
+ buttons_to_send.append(self.esm_dict["QRZ"])
468
+ buttons_to_send.append("LOGIT")
469
+ elif self.other_1.text().isalpha() and continent != "NA":
470
+ self.make_button_green(self.esm_dict["QRZ"])
471
+ buttons_to_send.append(self.esm_dict["QRZ"])
472
+ buttons_to_send.append("LOGIT")
473
+ else:
474
+ self.make_button_green(self.esm_dict["AGN"])
475
+ buttons_to_send.append(self.esm_dict["AGN"])
476
+
477
+ if with_enter is True and bool(len(buttons_to_send)):
478
+ for button in buttons_to_send:
479
+ if button:
480
+ if button == "LOGIT":
481
+ self.save_contact()
482
+ continue
483
+ self.process_function_key(button)
484
+ else:
485
+ if self.current_widget == "callsign":
486
+ if len(self.callsign.text()) > 2 and self.callsign.text().isalnum():
487
+ self.make_button_green(self.esm_dict["MYCALL"])
488
+ buttons_to_send.append(self.esm_dict["MYCALL"])
489
+
490
+ elif self.current_widget == "other_1" or self.current_widget == "other_2":
491
+ continent = self.contact.get("Continent")
492
+ if self.other_1.text() == "" or (
493
+ self.other_2.text() == "" and continent == "NA"
494
+ ):
495
+ self.make_button_green(self.esm_dict["AGN"])
496
+ buttons_to_send.append(self.esm_dict["AGN"])
497
+ elif (
498
+ self.other_1.text().isalpha()
499
+ and self.other_2.text().isalpha()
500
+ and continent == "NA"
501
+ ):
502
+ self.make_button_green(self.esm_dict["EXCH"])
503
+ buttons_to_send.append(self.esm_dict["EXCH"])
504
+ buttons_to_send.append("LOGIT")
505
+ elif self.other_1.text().isalpha() and continent != "NA":
506
+ self.make_button_green(self.esm_dict["EXCH"])
507
+ buttons_to_send.append(self.esm_dict["EXCH"])
508
+ buttons_to_send.append("LOGIT")
509
+ else:
510
+ self.make_button_green(self.esm_dict["AGN"])
511
+ buttons_to_send.append(self.esm_dict["AGN"])
512
+
513
+ if with_enter is True and bool(len(buttons_to_send)):
514
+ for button in buttons_to_send:
515
+ if button:
516
+ if button == "LOGIT":
517
+ self.save_contact()
518
+ continue
519
+ self.process_function_key(button)