not1mm 23.12.24__tar.gz → 24.1.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 (156) hide show
  1. {not1mm-23.12.24 → not1mm-24.1.15}/PKG-INFO +3 -9
  2. {not1mm-23.12.24 → not1mm-24.1.15}/README.md +2 -8
  3. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/__main__.py +33 -27
  4. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/new_contest.ui +6 -1
  5. not1mm-24.1.15/not1mm/lib/version.py +2 -0
  6. not1mm-24.1.15/not1mm/plugins/phone_weekly_test.py +372 -0
  7. not1mm-24.1.15/not1mm/plugins/stew_perry_topband.py +336 -0
  8. not1mm-24.1.15/not1mm/weee.py +10 -0
  9. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm.egg-info/PKG-INFO +3 -9
  10. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm.egg-info/SOURCES.txt +3 -0
  11. {not1mm-23.12.24 → not1mm-24.1.15}/pyproject.toml +1 -1
  12. not1mm-23.12.24/not1mm/lib/version.py +0 -2
  13. {not1mm-23.12.24 → not1mm-24.1.15}/LICENSE +0 -0
  14. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/__init__.py +0 -0
  15. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/bandmap.py +0 -0
  16. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/checkwindow.py +0 -0
  17. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/JetBrainsMono-Regular.ttf +0 -0
  18. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/MASTER.SCP +0 -0
  19. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/about.ui +0 -0
  20. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/alpha bravo charlie delta.txt +0 -0
  21. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/bandmap.ui +0 -0
  22. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/check.png +0 -0
  23. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/checkwindow.ui +0 -0
  24. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/configuration.ui +0 -0
  25. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/contests.sql +0 -0
  26. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/cty.json +0 -0
  27. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/cwmacros.txt +0 -0
  28. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/donors.html +0 -0
  29. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/editcontact.ui +0 -0
  30. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/editmacro.ui +0 -0
  31. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/greendot.png +0 -0
  32. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/k6gte-not1mm.desktop +0 -0
  33. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/k6gte.not1mm-128.png +0 -0
  34. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/k6gte.not1mm-32.png +0 -0
  35. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/k6gte.not1mm-64.png +0 -0
  36. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/logwindow.ui +0 -0
  37. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/main.ui +0 -0
  38. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/not1mm.html +0 -0
  39. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/opon.ui +0 -0
  40. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/0.wav +0 -0
  41. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/1.wav +0 -0
  42. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/2.wav +0 -0
  43. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/3.wav +0 -0
  44. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/4.wav +0 -0
  45. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/5.wav +0 -0
  46. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/6.wav +0 -0
  47. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/7.wav +0 -0
  48. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/73.wav +0 -0
  49. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/8.wav +0 -0
  50. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/9.wav +0 -0
  51. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/a.wav +0 -0
  52. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/again.wav +0 -0
  53. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/b.wav +0 -0
  54. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/c.wav +0 -0
  55. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/contest.wav +0 -0
  56. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/cq.wav +0 -0
  57. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/d.wav +0 -0
  58. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/e.wav +0 -0
  59. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/f.wav +0 -0
  60. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/g.wav +0 -0
  61. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/h.wav +0 -0
  62. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/i.wav +0 -0
  63. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/j.wav +0 -0
  64. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/k.wav +0 -0
  65. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/k6gte.wav +0 -0
  66. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/l.wav +0 -0
  67. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/m.wav +0 -0
  68. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/mynumber.wav +0 -0
  69. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/n.wav +0 -0
  70. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/nil.wav +0 -0
  71. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/o.wav +0 -0
  72. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/p.wav +0 -0
  73. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/q.wav +0 -0
  74. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/r.wav +0 -0
  75. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/roger.wav +0 -0
  76. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/s.wav +0 -0
  77. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/space.wav +0 -0
  78. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/t.wav +0 -0
  79. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/thankyou.wav +0 -0
  80. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/thankyouqrz.wav +0 -0
  81. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/u.wav +0 -0
  82. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/v.wav +0 -0
  83. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/w.wav +0 -0
  84. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/x.wav +0 -0
  85. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/y.wav +0 -0
  86. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/yourcall.wav +0 -0
  87. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/phonetics/z.wav +0 -0
  88. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/pickcontest.ui +0 -0
  89. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/radio_green.png +0 -0
  90. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/radio_grey.png +0 -0
  91. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/radio_red.png +0 -0
  92. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/reddot.png +0 -0
  93. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/settings.ui +0 -0
  94. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/ssbmacros.txt +0 -0
  95. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/data/vfo.ui +0 -0
  96. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/lib/__init__.py +0 -0
  97. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/lib/about.py +0 -0
  98. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/lib/cat_interface.py +0 -0
  99. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/lib/cwinterface.py +0 -0
  100. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/lib/database.py +0 -0
  101. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/lib/edit_contact.py +0 -0
  102. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/lib/edit_macro.py +0 -0
  103. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/lib/edit_opon.py +0 -0
  104. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/lib/edit_station.py +0 -0
  105. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/lib/ham_utility.py +0 -0
  106. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/lib/lookup.py +0 -0
  107. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/lib/multicast.py +0 -0
  108. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/lib/n1mm.py +0 -0
  109. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/lib/new_contest.py +0 -0
  110. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/lib/plugin_common.py +0 -0
  111. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/lib/select_contest.py +0 -0
  112. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/lib/settings.py +0 -0
  113. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/lib/super_check_partial.py +0 -0
  114. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/lib/versiontest.py +0 -0
  115. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/logwindow.py +0 -0
  116. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/10_10_fall_cw.py +0 -0
  117. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/10_10_spring_cw.py +0 -0
  118. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/10_10_summer_phone.py +0 -0
  119. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/10_10_winter_phone.py +0 -0
  120. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/__init__.py +0 -0
  121. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/arrl_10m.py +0 -0
  122. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/arrl_dx_cw.py +0 -0
  123. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/arrl_dx_ssb.py +0 -0
  124. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/arrl_field_day.py +0 -0
  125. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/arrl_rtty_ru.py +0 -0
  126. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/arrl_ss_cw.py +0 -0
  127. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/arrl_ss_phone.py +0 -0
  128. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/arrl_vhf_jan.py +0 -0
  129. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/arrl_vhf_jun.py +0 -0
  130. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/arrl_vhf_sep.py +0 -0
  131. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/canada_day.py +0 -0
  132. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/cq_wpx_cw.py +0 -0
  133. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/cq_wpx_ssb.py +0 -0
  134. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/cq_ww_cw.py +0 -0
  135. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/cq_ww_ssb.py +0 -0
  136. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/cwt.py +0 -0
  137. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/general_logging.py +0 -0
  138. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/iaru_hf.py +0 -0
  139. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/jidx_cw.py +0 -0
  140. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/jidx_ph.py +0 -0
  141. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/naqp_cw.py +0 -0
  142. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/naqp_ssb.py +0 -0
  143. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/plugins/winter_field_day.py +0 -0
  144. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/testing/fakeflrig.py +0 -0
  145. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/testing/flrigclient.py +0 -0
  146. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/testing/multicast_listener.py +0 -0
  147. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/testing/n1mm_listener.py +0 -0
  148. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/testing/test.py +0 -0
  149. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm/vfo.py +0 -0
  150. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm.egg-info/dependency_links.txt +0 -0
  151. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm.egg-info/entry_points.txt +0 -0
  152. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm.egg-info/requires.txt +0 -0
  153. {not1mm-23.12.24 → not1mm-24.1.15}/not1mm.egg-info/top_level.txt +0 -0
  154. {not1mm-23.12.24 → not1mm-24.1.15}/setup.cfg +0 -0
  155. {not1mm-23.12.24 → not1mm-24.1.15}/testing/test.py +0 -0
  156. {not1mm-23.12.24 → not1mm-24.1.15}/usb_vfo_knob/code.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: not1mm
3
- Version: 23.12.24
3
+ Version: 24.1.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
@@ -158,19 +158,13 @@ I wish to thank those who've contributed to the project.
158
158
  - Japan International DX SSB
159
159
  - NAQP CW
160
160
  - NAQP SSB
161
+ - Phone Weekly Test
161
162
  - RAC Canada Day
162
163
  - Winter Field Day
163
164
 
164
165
  ## Recent Changes
165
166
 
166
- - [23-12-24] Fixed bug where no bands showed onscreen during initial launch.
167
- - [23-12-22] Refactored a bunch of code.
168
- - [23-12-20] Add ARRL VHF Jun and Sep.
169
- - [23-12-19] Add ARRL VHF contest. Add VHF frequencies. Add Bands TAB to configuration dialog to select active bands you want displayed.
170
- - [23-12-17] Add ARRL 10M contest. Fixed crash in RAC Canada Day
171
- - [23-12-5] Removed deprecated datetime.utcnow()
172
- - [23-12-4] Moved get_points to plugin_common, fixing crash.
173
- - [23-12-3] Initial WFD plugin.
167
+ - [24-1-15] Added the Phone Weekly Test.
174
168
 
175
169
  See [CHANGELOG.md](CHANGELOG.md) for prior changes.
176
170
 
@@ -129,19 +129,13 @@ I wish to thank those who've contributed to the project.
129
129
  - Japan International DX SSB
130
130
  - NAQP CW
131
131
  - NAQP SSB
132
+ - Phone Weekly Test
132
133
  - RAC Canada Day
133
134
  - Winter Field Day
134
135
 
135
136
  ## Recent Changes
136
137
 
137
- - [23-12-24] Fixed bug where no bands showed onscreen during initial launch.
138
- - [23-12-22] Refactored a bunch of code.
139
- - [23-12-20] Add ARRL VHF Jun and Sep.
140
- - [23-12-19] Add ARRL VHF contest. Add VHF frequencies. Add Bands TAB to configuration dialog to select active bands you want displayed.
141
- - [23-12-17] Add ARRL 10M contest. Fixed crash in RAC Canada Day
142
- - [23-12-5] Removed deprecated datetime.utcnow()
143
- - [23-12-4] Moved get_points to plugin_common, fixing crash.
144
- - [23-12-3] Initial WFD plugin.
138
+ - [24-1-15] Added the Phone Weekly Test.
145
139
 
146
140
  See [CHANGELOG.md](CHANGELOG.md) for prior changes.
147
141
 
@@ -846,34 +846,40 @@ class MainWindow(QtWidgets.QMainWindow):
846
846
  self.pref.get("contest")
847
847
  )
848
848
  if self.contest_settings:
849
- self.database.current_contest = self.pref.get("contest")
850
- if self.contest_settings.get("ContestName"):
851
- self.contest = doimp(self.contest_settings.get("ContestName"))
852
- logger.debug("Loaded Contest Name = %s", self.contest.name)
853
- self.set_window_title()
854
- self.contest.init_contest(self)
855
- self.hide_band_mode(self.contest_settings.get("ModeCategory", ""))
856
- logger.debug("%s", f"{self.contest_settings}")
857
- if self.contest_settings.get("ModeCategory", "") == "CW":
858
- self.setmode("CW")
859
- self.radio_state["mode"] = "CW"
860
- if self.rig_control:
861
- if self.rig_control.online:
862
- self.rig_control.set_mode("CW")
863
- band = getband(str(self.radio_state.get("vfoa", "0.0")))
864
- self.set_band_indicator(band)
865
- self.set_window_title()
866
- if self.contest_settings.get("ModeCategory", "") == "SSB":
867
- self.setmode("SSB")
868
- if int(self.radio_state.get("vfoa", 0)) > 10000000:
869
- self.radio_state["mode"] = "USB"
870
- else:
871
- self.radio_state["mode"] = "LSB"
872
- band = getband(str(self.radio_state.get("vfoa", "0.0")))
873
- self.set_band_indicator(band)
849
+ try:
850
+ self.database.current_contest = self.pref.get("contest")
851
+ if self.contest_settings.get("ContestName"):
852
+ self.contest = doimp(self.contest_settings.get("ContestName"))
853
+ logger.debug("Loaded Contest Name = %s", self.contest.name)
874
854
  self.set_window_title()
875
- if self.rig_control:
876
- self.rig_control.set_mode(self.radio_state.get("mode"))
855
+ self.contest.init_contest(self)
856
+ self.hide_band_mode(
857
+ self.contest_settings.get("ModeCategory", "")
858
+ )
859
+ logger.debug("%s", f"{self.contest_settings}")
860
+ if self.contest_settings.get("ModeCategory", "") == "CW":
861
+ self.setmode("CW")
862
+ self.radio_state["mode"] = "CW"
863
+ if self.rig_control:
864
+ if self.rig_control.online:
865
+ self.rig_control.set_mode("CW")
866
+ band = getband(str(self.radio_state.get("vfoa", "0.0")))
867
+ self.set_band_indicator(band)
868
+ self.set_window_title()
869
+ if self.contest_settings.get("ModeCategory", "") == "SSB":
870
+ self.setmode("SSB")
871
+ if int(self.radio_state.get("vfoa", 0)) > 10000000:
872
+ self.radio_state["mode"] = "USB"
873
+ else:
874
+ self.radio_state["mode"] = "LSB"
875
+ band = getband(str(self.radio_state.get("vfoa", "0.0")))
876
+ self.set_band_indicator(band)
877
+ self.set_window_title()
878
+ if self.rig_control:
879
+ self.rig_control.set_mode(self.radio_state.get("mode"))
880
+ except ModuleNotFoundError:
881
+ self.pref["contest"] = 1
882
+ self.show_message_box("Contest plugin not found")
877
883
 
878
884
  if hasattr(self.contest, "mode"):
879
885
  logger.debug("%s", f" **** {self.contest}")
@@ -312,6 +312,11 @@
312
312
  <string>NAQP SSB</string>
313
313
  </property>
314
314
  </item>
315
+ <item>
316
+ <property name="text">
317
+ <string>PHONE WEEKLY TEST</string>
318
+ </property>
319
+ </item>
315
320
  <item>
316
321
  <property name="text">
317
322
  <string>WINTER FIELD DAY</string>
@@ -326,7 +331,7 @@
326
331
  </property>
327
332
  <property name="time">
328
333
  <time>
329
- <hour>0</hour>
334
+ <hour>16</hour>
330
335
  <minute>0</minute>
331
336
  <second>0</second>
332
337
  </time>
@@ -0,0 +1,2 @@
1
+ """It's the version"""
2
+ __version__ = "24.1.15"
@@ -0,0 +1,372 @@
1
+ """Phone Weekly Test plugin"""
2
+
3
+ # Geographic Focus: North America
4
+ # Participation: Worldwide
5
+ # Mode: SSB
6
+ # Bands: 160, 80, 40, 20, 15m
7
+ # Classes: Single Op
8
+ # Max power: 100 watts
9
+ # Exchange: NA: Name + (state/province/country)
10
+ # non-NA: Name
11
+ # Work stations: Once per band
12
+ # QSO Points: NA station: 1 point per QSO
13
+ # non-NA station: 1 point per QSO with an NA station
14
+ # Multipliers: Each US state (including KH6/KL7) once per band
15
+ # Each VE province/territory once per band
16
+ # Each North American country (except W/VE) once per band
17
+ # Score Calculation: Total score = total QSO points x total mults
18
+ # Submit logs by: 0300Z January 19, 2024
19
+ # E-mail logs to: (none)
20
+ # Post log summary at: http://www.3830scores.com
21
+ # Mail logs to: (none)
22
+ # Find rules at: http://www.perluma.com/Phone_Fray_Contest_Rules.pdf
23
+
24
+
25
+ # pylint: disable=invalid-name, unused-argument, unused-variable, c-extension-no-member, unused-import
26
+
27
+ import datetime
28
+ import logging
29
+ import platform
30
+
31
+ from pathlib import Path
32
+
33
+ from PyQt5 import QtWidgets
34
+
35
+ from not1mm.lib.plugin_common import gen_adif, get_points
36
+ from not1mm.lib.version import __version__
37
+
38
+ logger = logging.getLogger("__main__")
39
+
40
+ name = "PHONE WEEKLY TEST"
41
+ cabrillo_name = "PHONE-WEEKLY-TEST"
42
+ mode = "SSB" # CW SSB BOTH RTTY
43
+ # columns = [0, 1, 2, 3, 4, 10, 11, 14, 15]
44
+ columns = [
45
+ "YYYY-MM-DD HH:MM:SS",
46
+ "Call",
47
+ "Freq",
48
+ "Name",
49
+ "Sect",
50
+ "M1",
51
+ "PTS",
52
+ ]
53
+
54
+ advance_on_space = [True, True, True, True, True]
55
+
56
+ # 1 once per contest, 2 work each band, 3 each band/mode, 4 no dupe checking
57
+ dupe_type = 2
58
+
59
+
60
+ def init_contest(self):
61
+ """setup plugin"""
62
+ set_tab_next(self)
63
+ set_tab_prev(self)
64
+ interface(self)
65
+ self.next_field = self.other_1
66
+
67
+
68
+ def interface(self):
69
+ """Setup user interface"""
70
+ self.field1.hide()
71
+ self.field2.hide()
72
+ self.field3.show()
73
+ self.field4.show()
74
+ namefield = self.field3.findChild(QtWidgets.QLabel)
75
+ namefield.setText("Name")
76
+ self.field3.setAccessibleName("Name")
77
+ spc = self.field4.findChild(QtWidgets.QLabel)
78
+ spc.setText("State")
79
+ self.field4.setAccessibleName("State")
80
+
81
+
82
+ def reset_label(self):
83
+ """reset label after field cleared"""
84
+
85
+
86
+ def set_tab_next(self):
87
+ """Set TAB Advances"""
88
+ self.tab_next = {
89
+ self.callsign: self.field3.findChild(QtWidgets.QLineEdit),
90
+ self.field3.findChild(QtWidgets.QLineEdit): self.field4.findChild(
91
+ QtWidgets.QLineEdit
92
+ ),
93
+ self.field4.findChild(QtWidgets.QLineEdit): self.callsign,
94
+ }
95
+
96
+
97
+ def set_tab_prev(self):
98
+ """Set TAB Advances"""
99
+ self.tab_prev = {
100
+ self.callsign: self.field4.findChild(QtWidgets.QLineEdit),
101
+ self.field3.findChild(QtWidgets.QLineEdit): self.callsign,
102
+ self.field4.findChild(QtWidgets.QLineEdit): self.field3.findChild(
103
+ QtWidgets.QLineEdit
104
+ ),
105
+ }
106
+
107
+
108
+ def set_contact_vars(self):
109
+ """Contest Specific"""
110
+ self.contact["SNT"] = self.sent.text()
111
+ self.contact["RCV"] = self.receive.text()
112
+ self.contact["Name"] = self.other_1.text().upper()
113
+ self.contact["Sect"] = self.other_2.text().upper()
114
+ self.contact["SentNr"] = self.contest_settings.get("SentExchange", 0)
115
+
116
+ if self.contact.get("Sect"):
117
+ result = self.database.fetch_sect_band_exists(
118
+ self.contact.get("Sect", ""), self.contact.get("Band", "")
119
+ )
120
+ if result.get("sect_count"):
121
+ self.contact["IsMultiplier1"] = 0
122
+ else:
123
+ self.contact["IsMultiplier1"] = 1
124
+
125
+
126
+ def predupe(self):
127
+ """called after callsign entered"""
128
+
129
+
130
+ def prefill(self):
131
+ """Fill sentnr"""
132
+ # if len(self.other_2.text()) == 0:
133
+ # self.other_2.setText(str(self.contact.get("ZN", "")))
134
+ # self.other_1.setText(str(self.contest_settings.get("SentExchange", 0)))
135
+
136
+
137
+ def points(self):
138
+ """Calc point"""
139
+ mycontinent = ""
140
+ hiscontinent = ""
141
+ result = self.cty_lookup(self.station.get("Call", ""))
142
+ if result:
143
+ for item in result.items():
144
+ mycontinent = item[1].get("continent", "")
145
+ result = self.cty_lookup(self.contact.get("Call", ""))
146
+ if result:
147
+ for item in result.items():
148
+ hiscontinent = item[1].get("continent", "")
149
+ if mycontinent == "NA" or hiscontinent == "NA":
150
+ return 1
151
+ return 0
152
+
153
+
154
+ def show_mults(self):
155
+ """Return display string for mults"""
156
+ result = self.database.fetch_section_band_count_nodx()
157
+ if result:
158
+ return int(result.get("sb_count", 0))
159
+ return 0
160
+
161
+
162
+ def show_qso(self):
163
+ """Return qso count"""
164
+ result = self.database.fetch_qso_count()
165
+ if result:
166
+ return int(result.get("qsos", 0))
167
+ return 0
168
+
169
+
170
+ def calc_score(self):
171
+ """Return calculated score"""
172
+ result = self.database.fetch_points()
173
+ if result is not None:
174
+ score = result.get("Points", "0")
175
+ if score is None:
176
+ score = "0"
177
+ contest_points = int(score)
178
+ mults = show_mults(self)
179
+ return contest_points * mults
180
+ return 0
181
+
182
+
183
+ def adif(self):
184
+ """Call the generate ADIF function"""
185
+ gen_adif(self, cabrillo_name, "NAQP-SSB")
186
+
187
+
188
+ def cabrillo(self):
189
+ """Generates Cabrillo file. Maybe."""
190
+ # https://www.cqwpx.com/cabrillo.htm
191
+ logger.debug("******Cabrillo*****")
192
+ logger.debug("Station: %s", f"{self.station}")
193
+ logger.debug("Contest: %s", f"{self.contest_settings}")
194
+ now = datetime.datetime.now()
195
+ date_time = now.strftime("%Y-%m-%d_%H-%M-%S")
196
+ filename = (
197
+ str(Path.home())
198
+ + "/"
199
+ + f"{self.station.get('Call').upper()}_{cabrillo_name}_{date_time}.log"
200
+ )
201
+ logger.debug("%s", filename)
202
+ log = self.database.fetch_all_contacts_asc()
203
+ try:
204
+ with open(filename, "w", encoding="ascii") as file_descriptor:
205
+ print("START-OF-LOG: 3.0", end="\r\n", file=file_descriptor)
206
+ print(
207
+ f"CREATED-BY: Not1MM v{__version__}",
208
+ end="\r\n",
209
+ file=file_descriptor,
210
+ )
211
+ print(
212
+ f"CONTEST: {cabrillo_name}",
213
+ end="\r\n",
214
+ file=file_descriptor,
215
+ )
216
+ print(
217
+ f"CALLSIGN: {self.station.get('Call','')}",
218
+ end="\r\n",
219
+ file=file_descriptor,
220
+ )
221
+ print(
222
+ f"LOCATION: {self.station.get('ARRLSection', '')}",
223
+ end="\r\n",
224
+ file=file_descriptor,
225
+ )
226
+ # print(
227
+ # f"ARRL-SECTION: {self.pref.get('section', '')}",
228
+ # end="\r\n",
229
+ # file=file_descriptor,
230
+ # )
231
+ print(
232
+ f"CATEGORY-OPERATOR: {self.contest_settings.get('OperatorCategory','')}",
233
+ end="\r\n",
234
+ file=file_descriptor,
235
+ )
236
+ print(
237
+ f"CATEGORY-ASSISTED: {self.contest_settings.get('AssistedCategory','')}",
238
+ end="\r\n",
239
+ file=file_descriptor,
240
+ )
241
+ print(
242
+ f"CATEGORY-BAND: {self.contest_settings.get('BandCategory','')}",
243
+ end="\r\n",
244
+ file=file_descriptor,
245
+ )
246
+ print(
247
+ f"CATEGORY-MODE: {self.contest_settings.get('ModeCategory','')}",
248
+ end="\r\n",
249
+ file=file_descriptor,
250
+ )
251
+ print(
252
+ f"CATEGORY-TRANSMITTER: {self.contest_settings.get('TransmitterCategory','')}",
253
+ end="\r\n",
254
+ file=file_descriptor,
255
+ )
256
+ if self.contest_settings.get("OverlayCategory", "") != "N/A":
257
+ print(
258
+ f"CATEGORY-OVERLAY: {self.contest_settings.get('OverlayCategory','')}",
259
+ end="\r\n",
260
+ file=file_descriptor,
261
+ )
262
+ print(
263
+ f"GRID-LOCATOR: {self.station.get('GridSquare','')}",
264
+ end="\r\n",
265
+ file=file_descriptor,
266
+ )
267
+ # print(
268
+ # f"CATEGORY: {None}",
269
+ # end="\r\n",
270
+ # file=file_descriptor,
271
+ # )
272
+ print(
273
+ f"CATEGORY-POWER: {self.contest_settings.get('PowerCategory','')}",
274
+ end="\r\n",
275
+ file=file_descriptor,
276
+ )
277
+
278
+ print(
279
+ f"CLAIMED-SCORE: {calc_score(self)}",
280
+ end="\r\n",
281
+ file=file_descriptor,
282
+ )
283
+ print(
284
+ f"OPERATORS: {self.contest_settings.get('Operators','')}",
285
+ end="\r\n",
286
+ file=file_descriptor,
287
+ )
288
+ print(
289
+ f"NAME: {self.station.get('Name', '')}",
290
+ end="\r\n",
291
+ file=file_descriptor,
292
+ )
293
+ print(
294
+ f"ADDRESS: {self.station.get('Street1', '')}",
295
+ end="\r\n",
296
+ file=file_descriptor,
297
+ )
298
+ print(
299
+ f"ADDRESS-CITY: {self.station.get('City', '')}",
300
+ end="\r\n",
301
+ file=file_descriptor,
302
+ )
303
+ print(
304
+ f"ADDRESS-STATE-PROVINCE: {self.station.get('State', '')}",
305
+ end="\r\n",
306
+ file=file_descriptor,
307
+ )
308
+ print(
309
+ f"ADDRESS-POSTALCODE: {self.station.get('Zip', '')}",
310
+ end="\r\n",
311
+ file=file_descriptor,
312
+ )
313
+ print(
314
+ f"ADDRESS-COUNTRY: {self.station.get('Country', '')}",
315
+ end="\r\n",
316
+ file=file_descriptor,
317
+ )
318
+ print(
319
+ f"EMAIL: {self.station.get('Email', '')}",
320
+ end="\r\n",
321
+ file=file_descriptor,
322
+ )
323
+ for contact in log:
324
+ the_date_and_time = contact.get("TS", "")
325
+ themode = contact.get("Mode", "")
326
+ if themode == "LSB" or themode == "USB":
327
+ themode = "PH"
328
+ frequency = str(int(contact.get("Freq", "0"))).rjust(5)
329
+
330
+ loggeddate = the_date_and_time[:10]
331
+ loggedtime = the_date_and_time[11:13] + the_date_and_time[14:16]
332
+ print(
333
+ f"QSO: {frequency} {themode} {loggeddate} {loggedtime} "
334
+ f"{contact.get('StationPrefix', '').ljust(13)} "
335
+ f"{str(contact.get('SentNr', '')).upper()} "
336
+ f"{contact.get('Call', '').ljust(13)} "
337
+ f"{str(contact.get('Name', '')).ljust(11)} "
338
+ f"{str(contact.get('Sect', '')).ljust(5)}",
339
+ end="\r\n",
340
+ file=file_descriptor,
341
+ )
342
+ print("END-OF-LOG:", end="\r\n", file=file_descriptor)
343
+ except IOError as exception:
344
+ logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
345
+ return
346
+
347
+
348
+ def recalculate_mults(self):
349
+ """Recalculates multipliers after change in logged qso."""
350
+
351
+ all_contacts = self.database.fetch_all_contacts_asc()
352
+ for contact in all_contacts:
353
+ time_stamp = contact.get("TS")
354
+ sect = contact.get("Sect", "")
355
+ band = contact.get("Band", "")
356
+ query = (
357
+ f"select count(*) as sect_count from dxlog where TS < '{time_stamp}' "
358
+ f"and Sect = '{sect}' "
359
+ f"and Band = '{band}' "
360
+ f"and ContestNR = {self.pref.get('contest', '1')};"
361
+ )
362
+ result = self.database.exec_sql(query)
363
+ count = result.get("sect_count", 1)
364
+ if count == 0 and contact.get("Points", 0) == 1 and sect != "DX":
365
+ contact["IsMultiplier1"] = 1
366
+ else:
367
+ contact["IsMultiplier1"] = 0
368
+ self.database.change_contact(contact)
369
+ cmd = {}
370
+ cmd["cmd"] = "UPDATELOG"
371
+ cmd["station"] = platform.node()
372
+ self.multicast_interface.send_as_json(cmd)