not1mm 24.4.4.1__tar.gz → 24.4.9__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 (153) hide show
  1. {not1mm-24.4.4.1 → not1mm-24.4.9}/PKG-INFO +3 -1
  2. {not1mm-24.4.4.1 → not1mm-24.4.9}/README.md +2 -0
  3. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/__main__.py +33 -3
  4. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/checkwindow.py +1 -1
  5. not1mm-24.4.9/not1mm/lib/ft8_watcher.py +132 -0
  6. not1mm-24.4.9/not1mm/lib/version.py +3 -0
  7. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm.egg-info/PKG-INFO +3 -1
  8. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm.egg-info/SOURCES.txt +1 -0
  9. {not1mm-24.4.4.1 → not1mm-24.4.9}/pyproject.toml +1 -1
  10. not1mm-24.4.4.1/not1mm/lib/version.py +0 -3
  11. {not1mm-24.4.4.1 → not1mm-24.4.9}/LICENSE +0 -0
  12. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/__init__.py +0 -0
  13. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/bandmap.py +0 -0
  14. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/JetBrainsMono-Regular.ttf +0 -0
  15. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/MASTER.SCP +0 -0
  16. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/about.ui +0 -0
  17. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/alpha bravo charlie delta.txt +0 -0
  18. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/bandmap.ui +0 -0
  19. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/check.png +0 -0
  20. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/checkwindow.ui +0 -0
  21. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/configuration.ui +0 -0
  22. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/contests.sql +0 -0
  23. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/cty.json +0 -0
  24. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/cwmacros.txt +0 -0
  25. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/donors.html +0 -0
  26. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/editcontact.ui +0 -0
  27. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/editmacro.ui +0 -0
  28. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/greendot.png +0 -0
  29. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/k6gte-not1mm.desktop +0 -0
  30. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/k6gte.not1mm-128.png +0 -0
  31. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/k6gte.not1mm-32.png +0 -0
  32. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/k6gte.not1mm-64.png +0 -0
  33. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/logwindow.ui +0 -0
  34. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/logwindowx.ui +0 -0
  35. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/main.ui +0 -0
  36. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/new_contest.ui +0 -0
  37. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/not1mm.html +0 -0
  38. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/opon.ui +0 -0
  39. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/0.wav +0 -0
  40. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/1.wav +0 -0
  41. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/2.wav +0 -0
  42. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/3.wav +0 -0
  43. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/4.wav +0 -0
  44. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/5.wav +0 -0
  45. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/6.wav +0 -0
  46. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/7.wav +0 -0
  47. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/73.wav +0 -0
  48. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/8.wav +0 -0
  49. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/9.wav +0 -0
  50. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/a.wav +0 -0
  51. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/again.wav +0 -0
  52. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/b.wav +0 -0
  53. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/c.wav +0 -0
  54. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/contest.wav +0 -0
  55. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/cq.wav +0 -0
  56. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/d.wav +0 -0
  57. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/e.wav +0 -0
  58. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/f.wav +0 -0
  59. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/g.wav +0 -0
  60. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/h.wav +0 -0
  61. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/i.wav +0 -0
  62. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/j.wav +0 -0
  63. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/k.wav +0 -0
  64. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/k6gte.wav +0 -0
  65. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/l.wav +0 -0
  66. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/m.wav +0 -0
  67. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/mynumber.wav +0 -0
  68. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/n.wav +0 -0
  69. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/nil.wav +0 -0
  70. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/o.wav +0 -0
  71. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/p.wav +0 -0
  72. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/q.wav +0 -0
  73. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/r.wav +0 -0
  74. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/roger.wav +0 -0
  75. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/s.wav +0 -0
  76. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/space.wav +0 -0
  77. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/t.wav +0 -0
  78. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/thankyou.wav +0 -0
  79. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/thankyouqrz.wav +0 -0
  80. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/u.wav +0 -0
  81. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/v.wav +0 -0
  82. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/w.wav +0 -0
  83. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/x.wav +0 -0
  84. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/y.wav +0 -0
  85. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/yourcall.wav +0 -0
  86. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/phonetics/z.wav +0 -0
  87. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/pickcontest.ui +0 -0
  88. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/radio_green.png +0 -0
  89. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/radio_grey.png +0 -0
  90. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/radio_red.png +0 -0
  91. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/reddot.png +0 -0
  92. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/settings.ui +0 -0
  93. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/ssbmacros.txt +0 -0
  94. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/data/vfo.ui +0 -0
  95. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/fsutils.py +0 -0
  96. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/lib/__init__.py +0 -0
  97. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/lib/about.py +0 -0
  98. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/lib/cat_interface.py +0 -0
  99. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/lib/cwinterface.py +0 -0
  100. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/lib/database.py +0 -0
  101. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/lib/edit_contact.py +0 -0
  102. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/lib/edit_macro.py +0 -0
  103. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/lib/edit_opon.py +0 -0
  104. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/lib/edit_station.py +0 -0
  105. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/lib/ham_utility.py +0 -0
  106. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/lib/lookup.py +0 -0
  107. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/lib/multicast.py +0 -0
  108. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/lib/n1mm.py +0 -0
  109. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/lib/new_contest.py +0 -0
  110. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/lib/plugin_common.py +0 -0
  111. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/lib/select_contest.py +0 -0
  112. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/lib/settings.py +0 -0
  113. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/lib/super_check_partial.py +0 -0
  114. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/lib/versiontest.py +0 -0
  115. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/logwindow.py +0 -0
  116. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/10_10_fall_cw.py +0 -0
  117. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/10_10_spring_cw.py +0 -0
  118. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/10_10_summer_phone.py +0 -0
  119. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/10_10_winter_phone.py +0 -0
  120. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/__init__.py +0 -0
  121. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/arrl_10m.py +0 -0
  122. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/arrl_dx_cw.py +0 -0
  123. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/arrl_dx_ssb.py +0 -0
  124. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/arrl_field_day.py +0 -0
  125. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/arrl_rtty_ru.py +0 -0
  126. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/arrl_ss_cw.py +0 -0
  127. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/arrl_ss_phone.py +0 -0
  128. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/arrl_vhf_jan.py +0 -0
  129. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/arrl_vhf_jun.py +0 -0
  130. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/arrl_vhf_sep.py +0 -0
  131. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/canada_day.py +0 -0
  132. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/cq_160_cw.py +0 -0
  133. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/cq_160_ssb.py +0 -0
  134. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/cq_wpx_cw.py +0 -0
  135. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/cq_wpx_ssb.py +0 -0
  136. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/cq_ww_cw.py +0 -0
  137. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/cq_ww_ssb.py +0 -0
  138. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/cwt.py +0 -0
  139. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/general_logging.py +0 -0
  140. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/iaru_hf.py +0 -0
  141. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/jidx_cw.py +0 -0
  142. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/jidx_ph.py +0 -0
  143. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/naqp_cw.py +0 -0
  144. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/naqp_ssb.py +0 -0
  145. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/phone_weekly_test.py +0 -0
  146. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/stew_perry_topband.py +0 -0
  147. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/plugins/winter_field_day.py +0 -0
  148. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm/vfo.py +0 -0
  149. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm.egg-info/dependency_links.txt +0 -0
  150. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm.egg-info/entry_points.txt +0 -0
  151. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm.egg-info/requires.txt +0 -0
  152. {not1mm-24.4.4.1 → not1mm-24.4.9}/not1mm.egg-info/top_level.txt +0 -0
  153. {not1mm-24.4.4.1 → not1mm-24.4.9}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: not1mm
3
- Version: 24.4.4.1
3
+ Version: 24.4.9
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
@@ -177,6 +177,8 @@ I wish to thank those who've contributed to the project.
177
177
 
178
178
  ## Recent Changes
179
179
 
180
+ - [24-4-9] Fixed Checkwindow not showing calls from logged contacts.
181
+ - [24-4-7] Added FT8Watcher class to prep for FT8 support.
180
182
  - [24-4-4-1] Made docking widgets open state persistent.
181
183
  - [24-4-4] Added per-contest echange hint when adding new contest.
182
184
  - [24-4-2] Migrated to PyQt6. I'm sure there are broken things.
@@ -145,6 +145,8 @@ I wish to thank those who've contributed to the project.
145
145
 
146
146
  ## Recent Changes
147
147
 
148
+ - [24-4-9] Fixed Checkwindow not showing calls from logged contacts.
149
+ - [24-4-7] Added FT8Watcher class to prep for FT8 support.
148
150
  - [24-4-4-1] Made docking widgets open state persistent.
149
151
  - [24-4-4] Added per-contest echange hint when adding new contest.
150
152
  - [24-4-2] Migrated to PyQt6. I'm sure there are broken things.
@@ -62,6 +62,7 @@ from not1mm.lib.select_contest import SelectContest
62
62
  from not1mm.lib.settings import Settings
63
63
  from not1mm.lib.version import __version__
64
64
  from not1mm.lib.versiontest import VersionTest
65
+ from not1mm.lib.ft8_watcher import FT8Watcher
65
66
 
66
67
  import not1mm.fsutils as fsutils
67
68
  from not1mm.logwindow import LogWindow
@@ -199,6 +200,8 @@ class MainWindow(QtWidgets.QMainWindow):
199
200
  self.leftdot.hide()
200
201
  self.rightdot.hide()
201
202
  self.n1mm = N1MM()
203
+ self.ft8 = FT8Watcher()
204
+ self.ft8.set_callback(self.ft8_result)
202
205
  self.mscp = SCP(fsutils.APP_DATA_PATH)
203
206
  self.next_field = self.other_2
204
207
  self.dupe_indicator.hide()
@@ -461,7 +464,7 @@ class MainWindow(QtWidgets.QMainWindow):
461
464
  }
462
465
 
463
466
  self.setWindowIcon(
464
- QtGui.QIcon(str(fsutils.APP_DATA_PATH / "k6gte.not1mm-64.png"))
467
+ QtGui.QIcon(str(fsutils.APP_DATA_PATH / "k6gte.not1mm-32.png"))
465
468
  )
466
469
  self.readpreferences()
467
470
  self.dbname = fsutils.USER_DATA_PATH / self.pref.get(
@@ -525,6 +528,33 @@ class MainWindow(QtWidgets.QMainWindow):
525
528
  "You can udate to the current version by using:\npip install -U not1mm"
526
529
  )
527
530
 
531
+ def ft8_result(self, result: dict):
532
+ """
533
+ Callback for ft8 watcher
534
+
535
+ {
536
+ 'CALL': 'KE0OG',
537
+ 'GRIDSQUARE': 'DM10AT',
538
+ 'MODE': 'FT8',
539
+ 'RST_SENT': '',
540
+ 'RST_RCVD': '',
541
+ 'QSO_DATE': '20210329',
542
+ 'TIME_ON': '183213',
543
+ 'QSO_DATE_OFF': '20210329',
544
+ 'TIME_OFF': '183213',
545
+ 'BAND': '20M',
546
+ 'FREQ': '14.074754',
547
+ 'STATION_CALLSIGN': 'K6GTE',
548
+ 'MY_GRIDSQUARE': 'DM13AT',
549
+ 'CONTEST_ID': 'ARRL-FIELD-DAY',
550
+ 'SRX_STRING': '1D UT',
551
+ 'CLASS': '1D',
552
+ 'ARRL_SECT': 'UT'
553
+ }
554
+
555
+ """
556
+ print(f"{result=}")
557
+
528
558
  def setDarkMode(self, dark):
529
559
  """testing"""
530
560
 
@@ -3422,8 +3452,8 @@ logging.basicConfig(
3422
3452
  logging.StreamHandler(),
3423
3453
  ],
3424
3454
  )
3425
- logging.getLogger("PyQt5.uic.uiparser").setLevel("INFO")
3426
- logging.getLogger("PyQt5.uic.properties").setLevel("INFO")
3455
+ logging.getLogger("PyQt6.uic.uiparser").setLevel("INFO")
3456
+ logging.getLogger("PyQt6.uic.properties").setLevel("INFO")
3427
3457
  app = QtWidgets.QApplication(sys.argv)
3428
3458
  families = load_fonts_from_dir(os.fspath(fsutils.APP_DATA_PATH))
3429
3459
  logger.info(f"font families {families}")
@@ -62,7 +62,7 @@ class CheckWindow(QDockWidget):
62
62
  self.multicast_interface = Multicast(
63
63
  self.pref.get("multicast_group", "239.1.1.1"),
64
64
  self.pref.get("multicast_port", 2239),
65
- self.pref.get("interface_ip", "0,0,0,0"),
65
+ self.pref.get("interface_ip", "0.0.0.0"),
66
66
  )
67
67
  self.multicast_interface.ready_read_connect(self.watch_udp)
68
68
 
@@ -0,0 +1,132 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ WSJT-x UDP Packet Watcher
4
+ Email: michael.bridak@gmail.com
5
+ https://github.com/mbridak/not1mm
6
+ GPL V3
7
+ """
8
+
9
+ from PyQt6 import QtNetwork
10
+
11
+ # import struct
12
+
13
+
14
+ class FT8Watcher:
15
+ """Main Window"""
16
+
17
+ datadict = {}
18
+
19
+ def __init__(self, *args, **kwargs):
20
+ """Initialize"""
21
+ super().__init__(*args, **kwargs)
22
+ self.callback = None
23
+ self.udp_socket = QtNetwork.QUdpSocket()
24
+ self.udp_socket.bind(QtNetwork.QHostAddress.SpecialAddress.LocalHost, 2237)
25
+ self.udp_socket.readyRead.connect(self.on_udp_socket_ready_read)
26
+
27
+ def set_callback(self, callback):
28
+ """Set callback"""
29
+ self.callback = callback
30
+
31
+ @staticmethod
32
+ def getint(bytestring):
33
+ """
34
+ Returns an int from a bigendian signed 4 byte string
35
+ """
36
+ return int.from_bytes(bytestring, byteorder="big", signed=True)
37
+
38
+ @staticmethod
39
+ def getuint(bytestring):
40
+ """
41
+ Returns an int from a bigendian unsigned 4 byte string
42
+ """
43
+ return int.from_bytes(bytestring, byteorder="big", signed=False)
44
+
45
+ @staticmethod
46
+ def getbool(bytestring):
47
+ """
48
+ Returns a bool from a 1 byte string
49
+ """
50
+ return bool.from_bytes(bytestring, byteorder="big", signed=False)
51
+
52
+ def getvalue(self, item):
53
+ """I don't remember what this does."""
54
+ if item in self.datadict:
55
+ return self.datadict[item]
56
+ return "NOT_FOUND"
57
+
58
+ def on_udp_socket_ready_read(self):
59
+ """
60
+ This will process incomming UDP log packets from WSJT-X.
61
+ I Hope...
62
+ """
63
+ self.datadict = {}
64
+ datagram, sender_host, sender_port_number = self.udp_socket.readDatagram(
65
+ self.udp_socket.pendingDatagramSize()
66
+ )
67
+ # print("%s %s %s", sender_host, sender_port_number, datagram)
68
+
69
+ if datagram[0:4] != b"\xad\xbc\xcb\xda":
70
+ return # bail if no wsjt-x magic number
71
+ version = self.getuint(datagram[4:8])
72
+ packettype = self.getuint(datagram[8:12])
73
+ uniquesize = self.getint(datagram[12:16])
74
+ unique = datagram[16 : 16 + uniquesize].decode()
75
+ payload = datagram[16 + uniquesize :]
76
+
77
+ if packettype == 0: # Heartbeat
78
+ hbmaxschema = self.getuint(payload[0:4])
79
+ hbversion_len = self.getint(payload[4:8])
80
+ hbversion = payload[8 : 8 + hbversion_len].decode()
81
+ print(
82
+ f"heartbeat: sv:{version} p:{packettype} "
83
+ f"u:{unique}: ms:{hbmaxschema} av:{hbversion}"
84
+ )
85
+ return
86
+
87
+ if packettype == 1: # Status
88
+ ...
89
+ # [dialfreq] = struct.unpack(">Q", payload[0:8])
90
+ # modelen = self.getint(payload[8:12])
91
+ # mode = payload[12 : 12 + modelen].decode()
92
+ # payload = payload[12 + modelen :]
93
+ # dxcalllen = self.getint(payload[0:4])
94
+ # dxcall = payload[4 : 4 + dxcalllen].decode()
95
+ # print(
96
+ # "Status: sv:%s p:%s u:%s df:%s m:%s dxc:%s",
97
+ # version,
98
+ # packettype,
99
+ # unique,
100
+ # dialfreq,
101
+ # mode,
102
+ # dxcall,
103
+ # )
104
+
105
+ # if f"{dxcall}{self.band}{self.mode}" in self.dupdict:
106
+ # self.ft8dupe = f"{dxcall} {self.band}M {self.mode} FT8 Dupe!"
107
+ return
108
+
109
+ if packettype == 2: # Decode commented out because we really don't care
110
+ return
111
+
112
+ if packettype != 12:
113
+ return # bail if not logged ADIF
114
+ # if log packet it will contain this nugget.
115
+ gotcall = datagram.find(b"<call:")
116
+ if gotcall != -1:
117
+ datagram = datagram[gotcall:] # strip everything else
118
+ else:
119
+ return # Otherwise we don't want to bother with this packet
120
+
121
+ data = datagram.decode()
122
+ splitdata = data.upper().split("<")
123
+
124
+ for data in splitdata:
125
+ if data:
126
+ tag = data.split(":")
127
+ if tag == ["EOR>"]:
128
+ break
129
+ self.datadict[tag[0]] = tag[1].split(">")[1].strip()
130
+
131
+ if self.callback:
132
+ self.callback(self.datadict)
@@ -0,0 +1,3 @@
1
+ """It's the version"""
2
+
3
+ __version__ = "24.4.9"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: not1mm
3
- Version: 24.4.4.1
3
+ Version: 24.4.9
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
@@ -177,6 +177,8 @@ I wish to thank those who've contributed to the project.
177
177
 
178
178
  ## Recent Changes
179
179
 
180
+ - [24-4-9] Fixed Checkwindow not showing calls from logged contacts.
181
+ - [24-4-7] Added FT8Watcher class to prep for FT8 support.
180
182
  - [24-4-4-1] Made docking widgets open state persistent.
181
183
  - [24-4-4] Added per-contest echange hint when adding new contest.
182
184
  - [24-4-2] Migrated to PyQt6. I'm sure there are broken things.
@@ -104,6 +104,7 @@ not1mm/lib/edit_contact.py
104
104
  not1mm/lib/edit_macro.py
105
105
  not1mm/lib/edit_opon.py
106
106
  not1mm/lib/edit_station.py
107
+ not1mm/lib/ft8_watcher.py
107
108
  not1mm/lib/ham_utility.py
108
109
  not1mm/lib/lookup.py
109
110
  not1mm/lib/multicast.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "not1mm"
7
- version = "24.4.4.1"
7
+ version = "24.4.9"
8
8
  description = "NOT1MM Logger"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -1,3 +0,0 @@
1
- """It's the version"""
2
-
3
- __version__ = "24.4.4.1"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes