not1mm 25.4.2__tar.gz → 25.4.5__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 (187) hide show
  1. {not1mm-25.4.2 → not1mm-25.4.5}/PKG-INFO +5 -3
  2. {not1mm-25.4.2 → not1mm-25.4.5}/README.md +4 -2
  3. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/new_contest.ui +5 -0
  4. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/ratewindow.ui +2 -2
  5. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lib/version.py +1 -1
  6. not1mm-25.4.5/not1mm/plugins/spdx.py +510 -0
  7. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/ratewindow.py +2 -2
  8. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm.egg-info/PKG-INFO +5 -3
  9. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm.egg-info/SOURCES.txt +1 -0
  10. {not1mm-25.4.2 → not1mm-25.4.5}/pyproject.toml +1 -1
  11. {not1mm-25.4.2 → not1mm-25.4.5}/LICENSE +0 -0
  12. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/__init__.py +0 -0
  13. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/__main__.py +0 -0
  14. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/bandmap.py +0 -0
  15. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/checkwindow.py +0 -0
  16. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/JetBrainsMono-ExtraLight.ttf +0 -0
  17. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/MASTER.SCP +0 -0
  18. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/about.ui +0 -0
  19. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/alpha bravo charlie delta.txt +0 -0
  20. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/bandmap.ui +0 -0
  21. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/check.png +0 -0
  22. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/checkwindow.ui +0 -0
  23. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/configuration.ui +0 -0
  24. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/contests.sql +0 -0
  25. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/cty.json +0 -0
  26. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/cwmacros.txt +0 -0
  27. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/donors.html +0 -0
  28. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/editcontact.ui +0 -0
  29. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/editmacro.ui +0 -0
  30. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/greendot.png +0 -0
  31. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/k6gte-not1mm.desktop +0 -0
  32. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/k6gte.not1mm-128.png +0 -0
  33. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/k6gte.not1mm-32.png +0 -0
  34. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/k6gte.not1mm-64.png +0 -0
  35. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/logwindow.ui +0 -0
  36. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/logwindowx.ui +0 -0
  37. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/main.ui +0 -0
  38. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/not1mm.html +0 -0
  39. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/opon.ui +0 -0
  40. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/0.wav +0 -0
  41. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/1.wav +0 -0
  42. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/2.wav +0 -0
  43. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/3.wav +0 -0
  44. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/4.wav +0 -0
  45. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/5.wav +0 -0
  46. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/6.wav +0 -0
  47. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/7.wav +0 -0
  48. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/73.wav +0 -0
  49. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/8.wav +0 -0
  50. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/9.wav +0 -0
  51. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/a.wav +0 -0
  52. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/again.wav +0 -0
  53. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/b.wav +0 -0
  54. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/c.wav +0 -0
  55. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/contest.wav +0 -0
  56. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/cq.wav +0 -0
  57. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/cq2.wav +0 -0
  58. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/d.wav +0 -0
  59. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/e.wav +0 -0
  60. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/f.wav +0 -0
  61. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/g.wav +0 -0
  62. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/h.wav +0 -0
  63. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/i.wav +0 -0
  64. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/j.wav +0 -0
  65. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/k.wav +0 -0
  66. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/k6gte.wav +0 -0
  67. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/l.wav +0 -0
  68. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/m.wav +0 -0
  69. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/mynumber.wav +0 -0
  70. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/n.wav +0 -0
  71. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/nil.wav +0 -0
  72. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/o.wav +0 -0
  73. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/p.wav +0 -0
  74. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/q.wav +0 -0
  75. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/r.wav +0 -0
  76. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/roger.wav +0 -0
  77. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/s.wav +0 -0
  78. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/space.wav +0 -0
  79. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/t.wav +0 -0
  80. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/thankyou.wav +0 -0
  81. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/thankyouqrz.wav +0 -0
  82. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/u.wav +0 -0
  83. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/v.wav +0 -0
  84. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/w.wav +0 -0
  85. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/x.wav +0 -0
  86. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/y.wav +0 -0
  87. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/yourcall.wav +0 -0
  88. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/phonetics/z.wav +0 -0
  89. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/pickcontest.ui +0 -0
  90. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/radio_green.png +0 -0
  91. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/radio_grey.png +0 -0
  92. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/radio_red.png +0 -0
  93. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/reddot.png +0 -0
  94. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/rttymacros.txt +0 -0
  95. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/settings.ui +0 -0
  96. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/splash.png +0 -0
  97. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/ssbmacros.txt +0 -0
  98. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/statistics.ui +0 -0
  99. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/data/vfo.ui +0 -0
  100. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/fsutils.py +0 -0
  101. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lib/__init__.py +0 -0
  102. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lib/about.py +0 -0
  103. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lib/cat_interface.py +0 -0
  104. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lib/cwinterface.py +0 -0
  105. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lib/database.py +0 -0
  106. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lib/edit_contact.py +0 -0
  107. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lib/edit_macro.py +0 -0
  108. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lib/edit_opon.py +0 -0
  109. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lib/edit_station.py +0 -0
  110. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lib/fldigi_sendstring.py +0 -0
  111. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lib/ft8_watcher.py +0 -0
  112. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lib/ham_utility.py +0 -0
  113. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lib/lookup.py +0 -0
  114. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lib/multicast.py +0 -0
  115. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lib/n1mm.py +0 -0
  116. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lib/new_contest.py +0 -0
  117. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lib/plugin_common.py +0 -0
  118. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lib/select_contest.py +0 -0
  119. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lib/settings.py +0 -0
  120. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lib/super_check_partial.py +0 -0
  121. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lib/versiontest.py +0 -0
  122. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/logwindow.py +0 -0
  123. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/lookupservice.py +0 -0
  124. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/10_10_fall_cw.py +0 -0
  125. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/10_10_spring_cw.py +0 -0
  126. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/10_10_summer_phone.py +0 -0
  127. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/10_10_winter_phone.py +0 -0
  128. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/__init__.py +0 -0
  129. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/arrl_10m.py +0 -0
  130. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/arrl_160m.py +0 -0
  131. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/arrl_dx_cw.py +0 -0
  132. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/arrl_dx_ssb.py +0 -0
  133. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/arrl_field_day.py +0 -0
  134. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/arrl_rtty_ru.py +0 -0
  135. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/arrl_ss_cw.py +0 -0
  136. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/arrl_ss_phone.py +0 -0
  137. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/arrl_vhf_jan.py +0 -0
  138. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/arrl_vhf_jun.py +0 -0
  139. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/arrl_vhf_sep.py +0 -0
  140. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/canada_day.py +0 -0
  141. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/cq_160_cw.py +0 -0
  142. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/cq_160_ssb.py +0 -0
  143. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/cq_wpx_cw.py +0 -0
  144. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/cq_wpx_rtty.py +0 -0
  145. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/cq_wpx_ssb.py +0 -0
  146. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/cq_ww_cw.py +0 -0
  147. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/cq_ww_rtty.py +0 -0
  148. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/cq_ww_ssb.py +0 -0
  149. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/cwt.py +0 -0
  150. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/darc_vhf.py +0 -0
  151. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/darc_xmas.py +0 -0
  152. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/ea_majistad_cw.py +0 -0
  153. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/ea_majistad_ssb.py +0 -0
  154. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/ea_rtty.py +0 -0
  155. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/general_logging.py +0 -0
  156. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/helvetia.py +0 -0
  157. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/iaru_fieldday_r1_cw.py +0 -0
  158. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/iaru_fieldday_r1_ssb.py +0 -0
  159. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/iaru_hf.py +0 -0
  160. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/icwc_mst.py +0 -0
  161. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/jidx_cw.py +0 -0
  162. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/jidx_ph.py +0 -0
  163. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/k1usn_sst.py +0 -0
  164. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/labre_rs_digi.py +0 -0
  165. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/lz-dx.py +0 -0
  166. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/naqp_cw.py +0 -0
  167. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/naqp_rtty.py +0 -0
  168. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/naqp_ssb.py +0 -0
  169. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/phone_weekly_test.py +0 -0
  170. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/raem.py +0 -0
  171. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/randomgram.py +0 -0
  172. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/ref_cw.py +0 -0
  173. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/ref_ssb.py +0 -0
  174. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/stew_perry_topband.py +0 -0
  175. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/weekly_rtty.py +0 -0
  176. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/plugins/winter_field_day.py +0 -0
  177. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/radio.py +0 -0
  178. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/rtc_service.py +0 -0
  179. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/statistics.py +0 -0
  180. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/test.py +0 -0
  181. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/vfo.py +0 -0
  182. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm/voice_keying.py +0 -0
  183. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm.egg-info/dependency_links.txt +0 -0
  184. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm.egg-info/entry_points.txt +0 -0
  185. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm.egg-info/requires.txt +0 -0
  186. {not1mm-25.4.2 → not1mm-25.4.5}/not1mm.egg-info/top_level.txt +0 -0
  187. {not1mm-25.4.2 → not1mm-25.4.5}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: not1mm
3
- Version: 25.4.2
3
+ Version: 25.4.5
4
4
  Summary: NOT1MM Logger
5
5
  Author-email: Michael Bridak <michael.bridak@gmail.com>
6
6
  License: GPL-3.0-or-later
@@ -39,7 +39,7 @@ Dynamic: license-file
39
39
 
40
40
  [![PyPI](https://img.shields.io/pypi/v/not1mm)](https://pypi.org/project/not1mm/)
41
41
  [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
42
- [![Python: 3.10+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
42
+ [![Python: 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
43
43
  [![Made With:PyQt6](https://img.shields.io/badge/Made%20with-PyQt6-blue)](https://pypi.org/project/PyQt6/)
44
44
  [![Code Maturity:Snot Nosed](https://img.shields.io/badge/Code%20Maturity-Snot%20Nosed-red)](https://xkcd.com/1695/)
45
45
  [![PyPI - Downloads](https://img.shields.io/pypi/dm/not1mm)](https://pypi.org/project/not1mm/)
@@ -247,6 +247,7 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
247
247
 
248
248
  ## Recent Changes
249
249
 
250
+ - [25-4-5] Add SPDX.
250
251
  - [25-4-2] Add some tool tips to bandmap and main. Updated Zoom buttons on bandmap. Updated minimum Python version to 3.10.
251
252
  - [25-4-1] Fix: statistics window not populating when initially activated from the window menu. Removed unused code chucks. Removed some unused and hidden visual elements.
252
253
 
@@ -658,7 +659,8 @@ pressing F1 - F12. See next section on Editing macro keys.
658
659
 
659
660
  If you press `SHIFT-F1` The Auto CQ mode will be activated and the F1 macro will be resent
660
661
  after each Auto CQ Delay interval has passed. The delay can be changed by going to the
661
- `Options` TAB in the Configuration dialog.
662
+ `Options` TAB in the Configuration dialog. If you are in S&P mode, you will be automatically
663
+ switched into RUN mode.
662
664
 
663
665
  The auto CQ can be cancelled by either typing in the call sign field, or by pressing ESC.
664
666
 
@@ -7,7 +7,7 @@
7
7
 
8
8
  [![PyPI](https://img.shields.io/pypi/v/not1mm)](https://pypi.org/project/not1mm/)
9
9
  [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
10
- [![Python: 3.10+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
10
+ [![Python: 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
11
11
  [![Made With:PyQt6](https://img.shields.io/badge/Made%20with-PyQt6-blue)](https://pypi.org/project/PyQt6/)
12
12
  [![Code Maturity:Snot Nosed](https://img.shields.io/badge/Code%20Maturity-Snot%20Nosed-red)](https://xkcd.com/1695/)
13
13
  [![PyPI - Downloads](https://img.shields.io/pypi/dm/not1mm)](https://pypi.org/project/not1mm/)
@@ -215,6 +215,7 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
215
215
 
216
216
  ## Recent Changes
217
217
 
218
+ - [25-4-5] Add SPDX.
218
219
  - [25-4-2] Add some tool tips to bandmap and main. Updated Zoom buttons on bandmap. Updated minimum Python version to 3.10.
219
220
  - [25-4-1] Fix: statistics window not populating when initially activated from the window menu. Removed unused code chucks. Removed some unused and hidden visual elements.
220
221
 
@@ -626,7 +627,8 @@ pressing F1 - F12. See next section on Editing macro keys.
626
627
 
627
628
  If you press `SHIFT-F1` The Auto CQ mode will be activated and the F1 macro will be resent
628
629
  after each Auto CQ Delay interval has passed. The delay can be changed by going to the
629
- `Options` TAB in the Configuration dialog.
630
+ `Options` TAB in the Configuration dialog. If you are in S&P mode, you will be automatically
631
+ switched into RUN mode.
630
632
 
631
633
  The auto CQ can be cancelled by either typing in the call sign field, or by pressing ESC.
632
634
 
@@ -432,6 +432,11 @@
432
432
  <string>REF SSB</string>
433
433
  </property>
434
434
  </item>
435
+ <item>
436
+ <property name="text">
437
+ <string>SPDX</string>
438
+ </property>
439
+ </item>
435
440
  <item>
436
441
  <property name="text">
437
442
  <string>STEW PERRY TOPBAND</string>
@@ -309,7 +309,7 @@
309
309
  <item row="2" column="0">
310
310
  <widget class="QLabel" name="label_18">
311
311
  <property name="text">
312
- <string> Hour Run QSO:</string>
312
+ <string> Hour Run QSO:</string>
313
313
  </property>
314
314
  <property name="alignment">
315
315
  <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
@@ -335,7 +335,7 @@
335
335
  <item row="3" column="0">
336
336
  <widget class="QLabel" name="label_17">
337
337
  <property name="text">
338
- <string> Hour S&amp;P QSO:</string>
338
+ <string> Hour S&amp;P QSO:</string>
339
339
  </property>
340
340
  <property name="alignment">
341
341
  <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
@@ -1,3 +1,3 @@
1
1
  """It's the version"""
2
2
 
3
- __version__ = "25.4.2"
3
+ __version__ = "25.4.5"
@@ -0,0 +1,510 @@
1
+ """rac canada day"""
2
+
3
+ # pylint: disable=invalid-name, unused-argument, unused-variable, c-extension-no-member, unused-import
4
+
5
+ import datetime
6
+ import logging
7
+
8
+ from pathlib import Path
9
+
10
+ from PyQt6 import QtWidgets
11
+
12
+ from not1mm.lib.plugin_common import gen_adif, get_points, online_score_xml
13
+ from not1mm.lib.version import __version__
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+ EXCHANGE_HINT = "Province/Territory"
18
+
19
+ name = "SPDX"
20
+ cabrillo_name = "SPDX"
21
+ mode = "BOTH" # CW SSB BOTH RTTY
22
+
23
+ columns = [
24
+ "YYYY-MM-DD HH:MM:SS",
25
+ "Call",
26
+ "Freq",
27
+ "Snt",
28
+ "Rcv",
29
+ "SentNr",
30
+ "RcvNr",
31
+ "PTS",
32
+ ]
33
+
34
+ advance_on_space = [True, True, True, True, True]
35
+
36
+ # 1 once per contest, 2 work each band, 3 each band/mode, 4 no dupe checking
37
+ dupe_type = 3
38
+
39
+
40
+ def init_contest(self):
41
+ """setup plugin"""
42
+ set_tab_next(self)
43
+ set_tab_prev(self)
44
+ interface(self)
45
+ self.next_field = self.other_2
46
+
47
+
48
+ def interface(self):
49
+ """Setup user interface"""
50
+ self.field1.show()
51
+ self.field2.show()
52
+ self.field3.show()
53
+ self.field4.show()
54
+ self.snt_label.setText("SNT")
55
+ self.field1.setAccessibleName("RST Sent")
56
+ self.other_label.setText("SentNR")
57
+ self.field3.setAccessibleName("Sent Number")
58
+ self.exch_label.setText("Prov or SN")
59
+ self.field4.setAccessibleName("Province or Serial Number")
60
+
61
+
62
+ def reset_label(self):
63
+ """reset label after field cleared"""
64
+
65
+
66
+ def set_tab_next(self):
67
+ """Set TAB Advances"""
68
+ self.tab_next = {
69
+ self.callsign: self.sent,
70
+ self.sent: self.receive,
71
+ self.receive: self.other_1,
72
+ self.other_1: self.other_2,
73
+ self.other_2: self.callsign,
74
+ }
75
+
76
+
77
+ def set_tab_prev(self):
78
+ """Set TAB Advances"""
79
+ self.tab_prev = {
80
+ self.callsign: self.other_2,
81
+ self.sent: self.callsign,
82
+ self.receive: self.sent,
83
+ self.other_1: self.receive,
84
+ self.other_2: self.other_1,
85
+ }
86
+
87
+
88
+ def validate(self):
89
+ """doc"""
90
+ return True
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.other_1.text()
99
+
100
+
101
+ def predupe(self):
102
+ """called after callsign entered"""
103
+
104
+
105
+ def prefill(self):
106
+ """Fill sentnr"""
107
+ result = self.database.get_serial()
108
+ serial_nr = str(result.get("serial_nr", "1")).zfill(3)
109
+ if serial_nr == "None":
110
+ serial_nr = "001"
111
+
112
+ exchange = self.contest_settings.get("SentExchange", "").replace("#", serial_nr)
113
+ if len(self.other_1.text()) == 0:
114
+ self.other_1.setText(exchange)
115
+
116
+
117
+ def points(self):
118
+ """Calc point"""
119
+
120
+ if self.contact_is_dupe > 0:
121
+ return 0
122
+
123
+ # For Polish stations: A QSO with a DX station (outside Europe) is 3 points,
124
+ # a QSO with a station in Europe is 1 point.
125
+ # Contacts between Polish stations: 0 points.
126
+
127
+ # For foreign stations: 3 points for every contact with a Polish station.
128
+
129
+ mycountry = ""
130
+ hiscountry = ""
131
+ hiscontinent = ""
132
+
133
+ result = self.cty_lookup(self.station.get("Call", ""))
134
+ if result:
135
+ for item in result.items():
136
+ mycountry = item[1].get("entity", "")
137
+
138
+ result = self.cty_lookup(self.contact.get("Call", ""))
139
+ if result:
140
+ for item in result.items():
141
+ hiscountry = item[1].get("entity", "")
142
+ hiscontinent = item[1].get("continent", "")
143
+
144
+ if mycountry == "Poland":
145
+ if hiscountry == "Poland":
146
+ return 0
147
+ if hiscontinent == "EU":
148
+ return 1
149
+ return 3
150
+ else:
151
+ if hiscountry == "Poland":
152
+ return 3
153
+ return 0
154
+
155
+
156
+ def show_mults(self):
157
+ """Return display string for mults"""
158
+
159
+ sql = (
160
+ "select count(DISTINCT(NR || ':' || Band || ':' || Mode)) as mult_count from dxlog "
161
+ "where ContestNR = {self.database.current_contest} and typeof(NR) = 'text';"
162
+ )
163
+ result = self.database.exec_sql(sql)
164
+ if result:
165
+ return result.get("mult_count", 0)
166
+ return 0
167
+
168
+
169
+ def show_qso(self):
170
+ """Return qso count"""
171
+ result = self.database.fetch_qso_count()
172
+ if result:
173
+ return int(result.get("qsos", 0))
174
+ return 0
175
+
176
+
177
+ def calc_score(self):
178
+ """Return calculated score"""
179
+ mults = show_mults(self)
180
+ result = self.database.fetch_points()
181
+ if result is not None:
182
+ score = result.get("Points", "0")
183
+ if score is None:
184
+ score = "0"
185
+ if int(mults) > 0:
186
+ contest_points = int(score) * int(mults)
187
+ return contest_points
188
+ contest_points = int(score)
189
+ return contest_points
190
+ return 0
191
+
192
+
193
+ def adif(self):
194
+ """Call the generate ADIF function"""
195
+ gen_adif(self, cabrillo_name, "RAC-CANADA-DAY")
196
+
197
+
198
+ def output_cabrillo_line(line_to_output, ending, file_descriptor, file_encoding):
199
+ """"""
200
+ print(
201
+ line_to_output.encode(file_encoding, errors="ignore").decode(),
202
+ end=ending,
203
+ file=file_descriptor,
204
+ )
205
+
206
+
207
+ def cabrillo(self, file_encoding):
208
+ """Generates Cabrillo file. Maybe."""
209
+ # https://www.cqwpx.com/cabrillo.htm
210
+ logger.debug("******Cabrillo*****")
211
+ logger.debug("Station: %s", f"{self.station}")
212
+ logger.debug("Contest: %s", f"{self.contest_settings}")
213
+ now = datetime.datetime.now()
214
+ date_time = now.strftime("%Y-%m-%d_%H-%M-%S")
215
+ filename = (
216
+ str(Path.home())
217
+ + "/"
218
+ + f"{self.station.get('Call', '').upper()}_{cabrillo_name}_{date_time}.log"
219
+ )
220
+ logger.debug("%s", filename)
221
+ log = self.database.fetch_all_contacts_asc()
222
+ try:
223
+ with open(filename, "w", encoding=file_encoding, newline="") as file_descriptor:
224
+ output_cabrillo_line(
225
+ "START-OF-LOG: 3.0",
226
+ "\r\n",
227
+ file_descriptor,
228
+ file_encoding,
229
+ )
230
+ output_cabrillo_line(
231
+ f"CREATED-BY: Not1MM v{__version__}",
232
+ "\r\n",
233
+ file_descriptor,
234
+ file_encoding,
235
+ )
236
+ output_cabrillo_line(
237
+ f"CONTEST: {cabrillo_name}",
238
+ "\r\n",
239
+ file_descriptor,
240
+ file_encoding,
241
+ )
242
+ if self.station.get("Club", ""):
243
+ output_cabrillo_line(
244
+ f"CLUB: {self.station.get('Club', '').upper()}",
245
+ "\r\n",
246
+ file_descriptor,
247
+ file_encoding,
248
+ )
249
+ output_cabrillo_line(
250
+ f"CALLSIGN: {self.station.get('Call','')}",
251
+ "\r\n",
252
+ file_descriptor,
253
+ file_encoding,
254
+ )
255
+ output_cabrillo_line(
256
+ f"LOCATION: {self.station.get('ARRLSection', '')}",
257
+ "\r\n",
258
+ file_descriptor,
259
+ file_encoding,
260
+ )
261
+ output_cabrillo_line(
262
+ f"CATEGORY-OPERATOR: {self.contest_settings.get('OperatorCategory','')}",
263
+ "\r\n",
264
+ file_descriptor,
265
+ file_encoding,
266
+ )
267
+ output_cabrillo_line(
268
+ f"CATEGORY-ASSISTED: {self.contest_settings.get('AssistedCategory','')}",
269
+ "\r\n",
270
+ file_descriptor,
271
+ file_encoding,
272
+ )
273
+ output_cabrillo_line(
274
+ f"CATEGORY-BAND: {self.contest_settings.get('BandCategory','')}",
275
+ "\r\n",
276
+ file_descriptor,
277
+ file_encoding,
278
+ )
279
+ mode = self.contest_settings.get("ModeCategory", "")
280
+ if mode in ["SSB+CW", "SSB+CW+DIGITAL"]:
281
+ mode = "MIXED"
282
+ output_cabrillo_line(
283
+ f"CATEGORY-MODE: {mode}",
284
+ "\r\n",
285
+ file_descriptor,
286
+ file_encoding,
287
+ )
288
+ output_cabrillo_line(
289
+ f"CATEGORY-TRANSMITTER: {self.contest_settings.get('TransmitterCategory','')}",
290
+ "\r\n",
291
+ file_descriptor,
292
+ file_encoding,
293
+ )
294
+ if self.contest_settings.get("OverlayCategory", "") != "N/A":
295
+ output_cabrillo_line(
296
+ f"CATEGORY-OVERLAY: {self.contest_settings.get('OverlayCategory','')}",
297
+ "\r\n",
298
+ file_descriptor,
299
+ file_encoding,
300
+ )
301
+ output_cabrillo_line(
302
+ f"GRID-LOCATOR: {self.station.get('GridSquare','')}",
303
+ "\r\n",
304
+ file_descriptor,
305
+ file_encoding,
306
+ )
307
+ output_cabrillo_line(
308
+ f"CATEGORY-POWER: {self.contest_settings.get('PowerCategory','')}",
309
+ "\r\n",
310
+ file_descriptor,
311
+ file_encoding,
312
+ )
313
+
314
+ output_cabrillo_line(
315
+ f"CLAIMED-SCORE: {calc_score(self)}",
316
+ "\r\n",
317
+ file_descriptor,
318
+ file_encoding,
319
+ )
320
+ ops = f"@{self.station.get('Call','')}"
321
+ list_of_ops = self.database.get_ops()
322
+ for op in list_of_ops:
323
+ ops += f", {op.get('Operator', '')}"
324
+ output_cabrillo_line(
325
+ f"OPERATORS: {ops}",
326
+ "\r\n",
327
+ file_descriptor,
328
+ file_encoding,
329
+ )
330
+ output_cabrillo_line(
331
+ f"NAME: {self.station.get('Name', '')}",
332
+ "\r\n",
333
+ file_descriptor,
334
+ file_encoding,
335
+ )
336
+ output_cabrillo_line(
337
+ f"ADDRESS: {self.station.get('Street1', '')}",
338
+ "\r\n",
339
+ file_descriptor,
340
+ file_encoding,
341
+ )
342
+ output_cabrillo_line(
343
+ f"ADDRESS-CITY: {self.station.get('City', '')}",
344
+ "\r\n",
345
+ file_descriptor,
346
+ file_encoding,
347
+ )
348
+ output_cabrillo_line(
349
+ f"ADDRESS-STATE-PROVINCE: {self.station.get('State', '')}",
350
+ "\r\n",
351
+ file_descriptor,
352
+ file_encoding,
353
+ )
354
+ output_cabrillo_line(
355
+ f"ADDRESS-POSTALCODE: {self.station.get('Zip', '')}",
356
+ "\r\n",
357
+ file_descriptor,
358
+ file_encoding,
359
+ )
360
+ output_cabrillo_line(
361
+ f"ADDRESS-COUNTRY: {self.station.get('Country', '')}",
362
+ "\r\n",
363
+ file_descriptor,
364
+ file_encoding,
365
+ )
366
+ output_cabrillo_line(
367
+ f"EMAIL: {self.station.get('Email', '')}",
368
+ "\r\n",
369
+ file_descriptor,
370
+ file_encoding,
371
+ )
372
+ for contact in log:
373
+ the_date_and_time = contact.get("TS", "")
374
+ themode = contact.get("Mode", "")
375
+ if themode == "LSB" or themode == "USB":
376
+ themode = "PH"
377
+ frequency = str(int(contact.get("Freq", "0"))).rjust(5)
378
+
379
+ loggeddate = the_date_and_time[:10]
380
+ loggedtime = the_date_and_time[11:13] + the_date_and_time[14:16]
381
+ output_cabrillo_line(
382
+ f"QSO: {frequency} {themode} {loggeddate} {loggedtime} "
383
+ f"{contact.get('StationPrefix', '').ljust(13)} "
384
+ f"{str(contact.get('SNT', '')).ljust(3)} "
385
+ f"{str(contact.get('SentNr', '')).ljust(6)} "
386
+ f"{contact.get('Call', '').ljust(13)} "
387
+ f"{str(contact.get('RCV', '')).ljust(3)} "
388
+ f"{str(contact.get('NR', '')).ljust(6)}",
389
+ "\r\n",
390
+ file_descriptor,
391
+ file_encoding,
392
+ )
393
+ output_cabrillo_line("END-OF-LOG:", "\r\n", file_descriptor, file_encoding)
394
+ self.show_message_box(f"Cabrillo saved to: {filename}")
395
+ except IOError as exception:
396
+ logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
397
+ self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
398
+ return
399
+
400
+
401
+ def recalculate_mults(self):
402
+ """Recalculates multipliers after change in logged qso."""
403
+
404
+
405
+ def process_esm(self, new_focused_widget=None, with_enter=False):
406
+ """ESM State Machine"""
407
+
408
+ # self.pref["run_state"]
409
+
410
+ # -----===== Assigned F-Keys =====-----
411
+ # self.esm_dict["CQ"]
412
+ # self.esm_dict["EXCH"]
413
+ # self.esm_dict["QRZ"]
414
+ # self.esm_dict["AGN"]
415
+ # self.esm_dict["HISCALL"]
416
+ # self.esm_dict["MYCALL"]
417
+ # self.esm_dict["QSOB4"]
418
+
419
+ # ----==== text fields ====----
420
+ # self.callsign
421
+ # self.sent
422
+ # self.receive
423
+ # self.other_1
424
+ # self.other_2
425
+
426
+ if new_focused_widget is not None:
427
+ self.current_widget = self.inputs_dict.get(new_focused_widget)
428
+
429
+ for a_button in [
430
+ self.esm_dict["CQ"],
431
+ self.esm_dict["EXCH"],
432
+ self.esm_dict["QRZ"],
433
+ self.esm_dict["AGN"],
434
+ self.esm_dict["HISCALL"],
435
+ self.esm_dict["MYCALL"],
436
+ self.esm_dict["QSOB4"],
437
+ ]:
438
+ if a_button is not None:
439
+ self.restore_button_color(a_button)
440
+
441
+ buttons_to_send = []
442
+
443
+ if self.pref.get("run_state"):
444
+ if self.current_widget == "callsign":
445
+ if len(self.callsign.text()) < 3:
446
+ self.make_button_green(self.esm_dict["CQ"])
447
+ buttons_to_send.append(self.esm_dict["CQ"])
448
+ elif len(self.callsign.text()) > 2:
449
+ self.make_button_green(self.esm_dict["HISCALL"])
450
+ self.make_button_green(self.esm_dict["EXCH"])
451
+ buttons_to_send.append(self.esm_dict["HISCALL"])
452
+ buttons_to_send.append(self.esm_dict["EXCH"])
453
+
454
+ elif self.current_widget in ["other_1", "other_2"]:
455
+ if self.other_1.text() == "" or self.other_2.text() == "":
456
+ self.make_button_green(self.esm_dict["AGN"])
457
+ buttons_to_send.append(self.esm_dict["AGN"])
458
+ else:
459
+ self.make_button_green(self.esm_dict["QRZ"])
460
+ buttons_to_send.append(self.esm_dict["QRZ"])
461
+ buttons_to_send.append("LOGIT")
462
+
463
+ if with_enter is True and bool(len(buttons_to_send)):
464
+ for button in buttons_to_send:
465
+ if button:
466
+ if button == "LOGIT":
467
+ self.save_contact()
468
+ continue
469
+ self.process_function_key(button)
470
+ else:
471
+ if self.current_widget == "callsign":
472
+ if len(self.callsign.text()) > 2:
473
+ self.make_button_green(self.esm_dict["MYCALL"])
474
+ buttons_to_send.append(self.esm_dict["MYCALL"])
475
+
476
+ elif self.current_widget in ["other_1", "other_2"]:
477
+ if self.other_1.text() == "" or self.other_2.text() == "":
478
+ self.make_button_green(self.esm_dict["AGN"])
479
+ buttons_to_send.append(self.esm_dict["AGN"])
480
+ else:
481
+ self.make_button_green(self.esm_dict["EXCH"])
482
+ buttons_to_send.append(self.esm_dict["EXCH"])
483
+ buttons_to_send.append("LOGIT")
484
+
485
+ if with_enter is True and bool(len(buttons_to_send)):
486
+ for button in buttons_to_send:
487
+ if button:
488
+ if button == "LOGIT":
489
+ self.save_contact()
490
+ continue
491
+ self.process_function_key(button)
492
+
493
+
494
+ def get_mults(self):
495
+ """"""
496
+
497
+ mults = {}
498
+ mults["state"] = show_mults(self)
499
+ return mults
500
+
501
+
502
+ def just_points(self):
503
+ """"""
504
+ result = self.database.fetch_points()
505
+ if result is not None:
506
+ score = result.get("Points", "0")
507
+ if score is None:
508
+ score = "0"
509
+ return int(score)
510
+ return 0
@@ -160,11 +160,11 @@ class RateWindow(QDockWidget):
160
160
  ...
161
161
 
162
162
  # Get rate for the current hour
163
- query = f"SELECT strftime('%Y-%m-%d %H:00:00','now') as limit_stamp, strftime('%H:00:00','now') as current_hour, count(*) as items FROM DXLOG where ContestNR = {self.database.current_contest} and datetime(TS) > limit_stamp;"
163
+ query = f"SELECT strftime('%Y-%m-%d %H:00:00','now') as limit_stamp, strftime('%H00','now') as current_hour, count(*) as items FROM DXLOG where ContestNR = {self.database.current_contest} and datetime(TS) > limit_stamp;"
164
164
  result = self.database.exec_sql(query)
165
165
 
166
166
  self.since_lasthour_label.setText(
167
- f"Since {result.get('current_hour', '00:00:00')}z:"
167
+ f"Since {result.get('current_hour', '0000')}z:"
168
168
  )
169
169
  self.since_lasthour.setText(f"{result.get('items', '0')} QSO")
170
170
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: not1mm
3
- Version: 25.4.2
3
+ Version: 25.4.5
4
4
  Summary: NOT1MM Logger
5
5
  Author-email: Michael Bridak <michael.bridak@gmail.com>
6
6
  License: GPL-3.0-or-later
@@ -39,7 +39,7 @@ Dynamic: license-file
39
39
 
40
40
  [![PyPI](https://img.shields.io/pypi/v/not1mm)](https://pypi.org/project/not1mm/)
41
41
  [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
42
- [![Python: 3.10+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
42
+ [![Python: 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
43
43
  [![Made With:PyQt6](https://img.shields.io/badge/Made%20with-PyQt6-blue)](https://pypi.org/project/PyQt6/)
44
44
  [![Code Maturity:Snot Nosed](https://img.shields.io/badge/Code%20Maturity-Snot%20Nosed-red)](https://xkcd.com/1695/)
45
45
  [![PyPI - Downloads](https://img.shields.io/pypi/dm/not1mm)](https://pypi.org/project/not1mm/)
@@ -247,6 +247,7 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
247
247
 
248
248
  ## Recent Changes
249
249
 
250
+ - [25-4-5] Add SPDX.
250
251
  - [25-4-2] Add some tool tips to bandmap and main. Updated Zoom buttons on bandmap. Updated minimum Python version to 3.10.
251
252
  - [25-4-1] Fix: statistics window not populating when initially activated from the window menu. Removed unused code chucks. Removed some unused and hidden visual elements.
252
253
 
@@ -658,7 +659,8 @@ pressing F1 - F12. See next section on Editing macro keys.
658
659
 
659
660
  If you press `SHIFT-F1` The Auto CQ mode will be activated and the F1 macro will be resent
660
661
  after each Auto CQ Delay interval has passed. The delay can be changed by going to the
661
- `Options` TAB in the Configuration dialog.
662
+ `Options` TAB in the Configuration dialog. If you are in S&P mode, you will be automatically
663
+ switched into RUN mode.
662
664
 
663
665
  The auto CQ can be cancelled by either typing in the call sign field, or by pressing ESC.
664
666
 
@@ -179,6 +179,7 @@ not1mm/plugins/raem.py
179
179
  not1mm/plugins/randomgram.py
180
180
  not1mm/plugins/ref_cw.py
181
181
  not1mm/plugins/ref_ssb.py
182
+ not1mm/plugins/spdx.py
182
183
  not1mm/plugins/stew_perry_topband.py
183
184
  not1mm/plugins/weekly_rtty.py
184
185
  not1mm/plugins/winter_field_day.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "not1mm"
7
- version = "25.4.2"
7
+ version = "25.4.5"
8
8
  description = "NOT1MM Logger"
9
9
  license = { text = "GPL-3.0-or-later" }
10
10
  readme = "README.md"
File without changes
File without changes
File without changes