not1mm 24.9.3__tar.gz → 24.9.6__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 (164) hide show
  1. {not1mm-24.9.3 → not1mm-24.9.6}/PKG-INFO +19 -8
  2. {not1mm-24.9.3 → not1mm-24.9.6}/README.md +18 -7
  3. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/__main__.py +48 -20
  4. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/new_contest.ui +6 -1
  5. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/database.py +2 -2
  6. not1mm-24.9.6/not1mm/lib/fldigi_watcher.py +32 -0
  7. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/ft8_watcher.py +5 -1
  8. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/plugin_common.py +1 -1
  9. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/version.py +1 -1
  10. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/arrl_field_day.py +31 -7
  11. not1mm-24.9.6/not1mm/plugins/weekly_rtty.py +442 -0
  12. not1mm-24.9.6/not1mm/test.py +6 -0
  13. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm.egg-info/PKG-INFO +19 -8
  14. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm.egg-info/SOURCES.txt +2 -0
  15. {not1mm-24.9.3 → not1mm-24.9.6}/pyproject.toml +1 -1
  16. not1mm-24.9.3/not1mm/test.py +0 -10
  17. {not1mm-24.9.3 → not1mm-24.9.6}/LICENSE +0 -0
  18. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/__init__.py +0 -0
  19. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/bandmap.py +0 -0
  20. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/checkwindow.py +0 -0
  21. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/JetBrainsMono-Regular.ttf +0 -0
  22. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/MASTER.SCP +0 -0
  23. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/about.ui +0 -0
  24. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/alpha bravo charlie delta.txt +0 -0
  25. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/bandmap.ui +0 -0
  26. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/check.png +0 -0
  27. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/checkwindow.ui +0 -0
  28. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/configuration.ui +0 -0
  29. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/contests.sql +0 -0
  30. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/cty.json +0 -0
  31. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/cwmacros.txt +0 -0
  32. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/donors.html +0 -0
  33. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/editcontact.ui +0 -0
  34. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/editmacro.ui +0 -0
  35. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/greendot.png +0 -0
  36. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/k6gte-not1mm.desktop +0 -0
  37. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/k6gte.not1mm-128.png +0 -0
  38. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/k6gte.not1mm-32.png +0 -0
  39. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/k6gte.not1mm-64.png +0 -0
  40. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/logwindow.ui +0 -0
  41. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/logwindowx.ui +0 -0
  42. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/main.ui +0 -0
  43. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/not1mm.html +0 -0
  44. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/opon.ui +0 -0
  45. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/0.wav +0 -0
  46. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/1.wav +0 -0
  47. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/2.wav +0 -0
  48. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/3.wav +0 -0
  49. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/4.wav +0 -0
  50. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/5.wav +0 -0
  51. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/6.wav +0 -0
  52. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/7.wav +0 -0
  53. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/73.wav +0 -0
  54. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/8.wav +0 -0
  55. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/9.wav +0 -0
  56. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/a.wav +0 -0
  57. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/again.wav +0 -0
  58. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/b.wav +0 -0
  59. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/c.wav +0 -0
  60. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/contest.wav +0 -0
  61. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/cq.wav +0 -0
  62. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/d.wav +0 -0
  63. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/e.wav +0 -0
  64. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/f.wav +0 -0
  65. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/g.wav +0 -0
  66. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/h.wav +0 -0
  67. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/i.wav +0 -0
  68. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/j.wav +0 -0
  69. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/k.wav +0 -0
  70. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/k6gte.wav +0 -0
  71. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/l.wav +0 -0
  72. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/m.wav +0 -0
  73. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/mynumber.wav +0 -0
  74. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/n.wav +0 -0
  75. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/nil.wav +0 -0
  76. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/o.wav +0 -0
  77. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/p.wav +0 -0
  78. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/q.wav +0 -0
  79. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/r.wav +0 -0
  80. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/roger.wav +0 -0
  81. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/s.wav +0 -0
  82. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/space.wav +0 -0
  83. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/t.wav +0 -0
  84. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/thankyou.wav +0 -0
  85. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/thankyouqrz.wav +0 -0
  86. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/u.wav +0 -0
  87. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/v.wav +0 -0
  88. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/w.wav +0 -0
  89. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/x.wav +0 -0
  90. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/y.wav +0 -0
  91. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/yourcall.wav +0 -0
  92. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/z.wav +0 -0
  93. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/pickcontest.ui +0 -0
  94. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/radio_green.png +0 -0
  95. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/radio_grey.png +0 -0
  96. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/radio_red.png +0 -0
  97. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/reddot.png +0 -0
  98. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/settings.ui +0 -0
  99. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/splash.png +0 -0
  100. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/ssbmacros.txt +0 -0
  101. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/vfo.ui +0 -0
  102. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/fsutils.py +0 -0
  103. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/__init__.py +0 -0
  104. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/about.py +0 -0
  105. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/cat_interface.py +0 -0
  106. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/cwinterface.py +0 -0
  107. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/edit_contact.py +0 -0
  108. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/edit_macro.py +0 -0
  109. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/edit_opon.py +0 -0
  110. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/edit_station.py +0 -0
  111. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/ham_utility.py +0 -0
  112. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/lookup.py +0 -0
  113. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/multicast.py +0 -0
  114. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/n1mm.py +0 -0
  115. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/new_contest.py +0 -0
  116. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/playsound.py +0 -0
  117. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/select_contest.py +0 -0
  118. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/settings.py +0 -0
  119. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/super_check_partial.py +0 -0
  120. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/versiontest.py +0 -0
  121. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/logwindow.py +0 -0
  122. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/10_10_fall_cw.py +0 -0
  123. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/10_10_spring_cw.py +0 -0
  124. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/10_10_summer_phone.py +0 -0
  125. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/10_10_winter_phone.py +0 -0
  126. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/__init__.py +0 -0
  127. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/arrl_10m.py +0 -0
  128. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/arrl_dx_cw.py +0 -0
  129. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/arrl_dx_ssb.py +0 -0
  130. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/arrl_rtty_ru.py +0 -0
  131. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/arrl_ss_cw.py +0 -0
  132. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/arrl_ss_phone.py +0 -0
  133. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/arrl_vhf_jan.py +0 -0
  134. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/arrl_vhf_jun.py +0 -0
  135. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/arrl_vhf_sep.py +0 -0
  136. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/canada_day.py +0 -0
  137. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/cq_160_cw.py +0 -0
  138. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/cq_160_ssb.py +0 -0
  139. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/cq_wpx_cw.py +0 -0
  140. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/cq_wpx_ssb.py +0 -0
  141. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/cq_ww_cw.py +0 -0
  142. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/cq_ww_ssb.py +0 -0
  143. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/cwt.py +0 -0
  144. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/general_logging.py +0 -0
  145. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/helvetia.py +0 -0
  146. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/iaru_hf.py +0 -0
  147. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/icwc_mst.py +0 -0
  148. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/jidx_cw.py +0 -0
  149. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/jidx_ph.py +0 -0
  150. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/k1usn_sst.py +0 -0
  151. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/naqp_cw.py +0 -0
  152. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/naqp_ssb.py +0 -0
  153. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/phone_weekly_test.py +0 -0
  154. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/ref_cw.py +0 -0
  155. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/stew_perry_topband.py +0 -0
  156. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/winter_field_day.py +0 -0
  157. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/radio.py +0 -0
  158. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/vfo.py +0 -0
  159. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/voice_keying.py +0 -0
  160. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm.egg-info/dependency_links.txt +0 -0
  161. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm.egg-info/entry_points.txt +0 -0
  162. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm.egg-info/requires.txt +0 -0
  163. {not1mm-24.9.3 → not1mm-24.9.6}/not1mm.egg-info/top_level.txt +0 -0
  164. {not1mm-24.9.3 → not1mm-24.9.6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: not1mm
3
- Version: 24.9.3
3
+ Version: 24.9.6
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
@@ -100,7 +100,7 @@ Requires-Dist: Levenshtein
100
100
  - [Cluster](#cluster)
101
101
  - [N1MM Packets](#n1mm-packets)
102
102
  - [Bands](#bands)
103
- - [Logging WSJT-X FT8/FT4 contacts](#logging-wsjt-x-ft8ft4-contacts)
103
+ - [Logging WSJT-X FT8/FT4 and FLDIGI RTTY contacts](#logging-wsjt-x-ft8ft4-and-fldigi-rtty-contacts)
104
104
  - [Sending CW](#sending-cw)
105
105
  - [Editing macro keys](#editing-macro-keys)
106
106
  - [Macro substitutions](#macro-substitutions)
@@ -169,9 +169,9 @@ when the program craps the bed. I'm only one guy, so if you see a bug let me kno
169
169
 
170
170
  ### Data and RTTY
171
171
 
172
- I don't do much of any digital or RTTY operating. This is why you don't see RTTY in
173
- the list of working contests. The Lord helps those who burn people at the... I
174
- mean, who help themselves. Feel free to fill in that hole with a pull request.
172
+ I've recently added portions of code to watch for WSTJ-X and fldigi QSOs. I've added
173
+ the Weekly RTTY Test, So RTTY could be tested. Also added FT8/4 and RTTY to ARRL Field
174
+ Day. Praying that it works. I'll add more details later.
175
175
 
176
176
  ### Other not so supported contests
177
177
 
@@ -222,10 +222,13 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
222
222
  - Phone Weekly Test
223
223
  - RAC Canada Day
224
224
  - Stew Perry Topband
225
+ - Weekly RTTY
225
226
  - Winter Field Day
226
227
 
227
228
  ## Recent Changes
228
229
 
230
+ - [24-9-6] Added the Weekly RTTY
231
+ - [24-9-5] Added FlDigi support for Field Day.
229
232
  - [24-9-3] Added WSJT-X FT8 mode contacts to ARRL Field Day.
230
233
 
231
234
  See [CHANGELOG.md](CHANGELOG.md) for prior changes.
@@ -603,12 +606,20 @@ appear. Those without will not.
603
606
 
604
607
  ![Bands Configuration Screen](https://github.com/mbridak/not1mm/raw/master/pic/configure_bands.png)
605
608
 
606
- ## Logging WSJT-X FT8/FT4 contacts
609
+ ## Logging WSJT-X FT8/FT4 and FLDIGI RTTY contacts
607
610
 
608
- **Currently only working for ARRL Field Day.**
611
+ **FT8/FT4 Currently only working for ARRL Field Day.**
609
612
 
610
613
  not1mm listens for WSJT-X UDP traffic on the default localhost:2237. No setup is
611
- needed to be done on not1mm's side.
614
+ needed to be done on not1mm's side. That's good because I'm lazy.
615
+
616
+ not1mm polls for fldigi QSOs via it's XMLRPC interface. It does this in a rather stupid
617
+ way. It just keeps asking what was the last QSO and compares it to the previous response.
618
+ If it's different, it's new. I've added the Weekly RTTY Test so this can be tested.
619
+
620
+ Unlike WSJT, fldigi needs to be setup for this to work. The XMLRPC interface needs to be
621
+ active. And in fldigi's config dialog go to CONTESTS -> General -> CONTEST and select
622
+ Generic Contest. Make sure the Text Capture Order field says CALL EXCHANGE.
612
623
 
613
624
  ## Sending CW
614
625
 
@@ -69,7 +69,7 @@
69
69
  - [Cluster](#cluster)
70
70
  - [N1MM Packets](#n1mm-packets)
71
71
  - [Bands](#bands)
72
- - [Logging WSJT-X FT8/FT4 contacts](#logging-wsjt-x-ft8ft4-contacts)
72
+ - [Logging WSJT-X FT8/FT4 and FLDIGI RTTY contacts](#logging-wsjt-x-ft8ft4-and-fldigi-rtty-contacts)
73
73
  - [Sending CW](#sending-cw)
74
74
  - [Editing macro keys](#editing-macro-keys)
75
75
  - [Macro substitutions](#macro-substitutions)
@@ -138,9 +138,9 @@ when the program craps the bed. I'm only one guy, so if you see a bug let me kno
138
138
 
139
139
  ### Data and RTTY
140
140
 
141
- I don't do much of any digital or RTTY operating. This is why you don't see RTTY in
142
- the list of working contests. The Lord helps those who burn people at the... I
143
- mean, who help themselves. Feel free to fill in that hole with a pull request.
141
+ I've recently added portions of code to watch for WSTJ-X and fldigi QSOs. I've added
142
+ the Weekly RTTY Test, So RTTY could be tested. Also added FT8/4 and RTTY to ARRL Field
143
+ Day. Praying that it works. I'll add more details later.
144
144
 
145
145
  ### Other not so supported contests
146
146
 
@@ -191,10 +191,13 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
191
191
  - Phone Weekly Test
192
192
  - RAC Canada Day
193
193
  - Stew Perry Topband
194
+ - Weekly RTTY
194
195
  - Winter Field Day
195
196
 
196
197
  ## Recent Changes
197
198
 
199
+ - [24-9-6] Added the Weekly RTTY
200
+ - [24-9-5] Added FlDigi support for Field Day.
198
201
  - [24-9-3] Added WSJT-X FT8 mode contacts to ARRL Field Day.
199
202
 
200
203
  See [CHANGELOG.md](CHANGELOG.md) for prior changes.
@@ -572,12 +575,20 @@ appear. Those without will not.
572
575
 
573
576
  ![Bands Configuration Screen](https://github.com/mbridak/not1mm/raw/master/pic/configure_bands.png)
574
577
 
575
- ## Logging WSJT-X FT8/FT4 contacts
578
+ ## Logging WSJT-X FT8/FT4 and FLDIGI RTTY contacts
576
579
 
577
- **Currently only working for ARRL Field Day.**
580
+ **FT8/FT4 Currently only working for ARRL Field Day.**
578
581
 
579
582
  not1mm listens for WSJT-X UDP traffic on the default localhost:2237. No setup is
580
- needed to be done on not1mm's side.
583
+ needed to be done on not1mm's side. That's good because I'm lazy.
584
+
585
+ not1mm polls for fldigi QSOs via it's XMLRPC interface. It does this in a rather stupid
586
+ way. It just keeps asking what was the last QSO and compares it to the previous response.
587
+ If it's different, it's new. I've added the Weekly RTTY Test so this can be tested.
588
+
589
+ Unlike WSJT, fldigi needs to be setup for this to work. The XMLRPC interface needs to be
590
+ active. And in fldigi's config dialog go to CONTESTS -> General -> CONTEST and select
591
+ Generic Contest. Make sure the Text Capture Order field says CALL EXCHANGE.
581
592
 
582
593
  ## Sending CW
583
594
 
@@ -67,6 +67,7 @@ from not1mm.lib.settings import Settings
67
67
  from not1mm.lib.version import __version__
68
68
  from not1mm.lib.versiontest import VersionTest
69
69
  from not1mm.lib.ft8_watcher import FT8Watcher
70
+ from not1mm.lib.fldigi_watcher import FlDigiWatcher
70
71
 
71
72
  import not1mm.fsutils as fsutils
72
73
  from not1mm.logwindow import LogWindow
@@ -163,7 +164,9 @@ class MainWindow(QtWidgets.QMainWindow):
163
164
 
164
165
  radio_thread = QThread()
165
166
  voice_thread = QThread()
167
+ fldigi_thread = QThread()
166
168
 
169
+ fldigi_watcher = None
167
170
  rig_control = None
168
171
  log_window = None
169
172
  check_window = None
@@ -193,7 +196,7 @@ class MainWindow(QtWidgets.QMainWindow):
193
196
  self.rightdot.hide()
194
197
  self.n1mm = N1MM()
195
198
  self.ft8 = FT8Watcher()
196
- self.ft8.set_callback(self.ft8_result)
199
+ self.ft8.set_callback(None)
197
200
  self.mscp = SCP(fsutils.APP_DATA_PATH)
198
201
  self.next_field = self.other_2
199
202
  self.dupe_indicator.hide()
@@ -507,6 +510,13 @@ class MainWindow(QtWidgets.QMainWindow):
507
510
  | QtWidgets.QDockWidget.DockWidgetFeature.DockWidgetMovable
508
511
  )
509
512
 
513
+ self.fldigi_watcher = FlDigiWatcher()
514
+ self.fldigi_watcher.moveToThread(self.fldigi_thread)
515
+ self.fldigi_thread.started.connect(self.fldigi_watcher.run)
516
+ self.fldigi_thread.finished.connect(self.fldigi_watcher.deleteLater)
517
+ self.fldigi_watcher.poll_callback.connect(self.fldigi_qso)
518
+ self.fldigi_thread.start()
519
+
510
520
  self.log_window = LogWindow()
511
521
  self.log_window.setObjectName("log-window")
512
522
  if os.environ.get("WAYLAND_DISPLAY"):
@@ -566,32 +576,50 @@ class MainWindow(QtWidgets.QMainWindow):
566
576
  "You can udate to the current version by using:\npip install -U not1mm"
567
577
  )
568
578
 
569
- def ft8_result(self, result: dict):
579
+ def fldigi_qso(self, result: str):
570
580
  """
571
- Callback for ft8 watcher
581
+ gets called when there is a new fldigi qso logged.
572
582
 
573
583
  {
574
- 'CALL': 'KE0OG',
575
- 'GRIDSQUARE': 'DM10AT',
576
- 'MODE': 'FT8',
577
- 'RST_SENT': '',
578
- 'RST_RCVD': '',
579
- 'QSO_DATE': '20210329',
580
- 'TIME_ON': '183213',
581
- 'QSO_DATE_OFF': '20210329',
582
- 'TIME_OFF': '183213',
583
- 'BAND': '20M',
584
- 'FREQ': '14.074754',
584
+ 'FREQ': '7.029500',
585
+ 'CALL': 'DL2DSL',
586
+ 'MODE': 'RTTY',
587
+ 'NAME': 'BOB',
588
+ 'QSO_DATE': '20240904',
589
+ 'QSO_DATE_OFF': '20240904',
590
+ 'TIME_OFF': '212825',
591
+ 'TIME_ON': '212800',
592
+ 'RST_RCVD': '599',
593
+ 'RST_SENT': '599',
594
+ 'BAND': '40M',
595
+ 'COUNTRY': 'FED. REP. OF GERMANY',
596
+ 'CQZ': '14',
597
+ 'STX': '000',
598
+ 'STX_STRING': '1D ORG',
599
+ 'CLASS': '1D',
600
+ 'ARRL_SECT': 'DX',
601
+ 'TX_PWR': '0',
602
+ 'OPERATOR': 'K6GTE',
585
603
  'STATION_CALLSIGN': 'K6GTE',
586
604
  'MY_GRIDSQUARE': 'DM13AT',
587
- 'CONTEST_ID': 'ARRL-FIELD-DAY',
588
- 'SRX_STRING': '1D UT',
589
- 'CLASS': '1D',
590
- 'ARRL_SECT': 'UT'
605
+ 'MY_CITY': 'ANAHEIM, CA',
606
+ 'MY_STATE': 'CA'
591
607
  }
592
608
 
593
609
  """
594
- print(f"{result=}")
610
+
611
+ datadict = {}
612
+ splitdata = result.upper().strip().split("<")
613
+ for data in splitdata:
614
+ if data:
615
+ tag = data.split(":")
616
+ if tag == ["EOR>"]:
617
+ break
618
+ datadict[tag[0]] = tag[1].split(">")[1].strip()
619
+ logger.debug(f"{datadict=}")
620
+ if hasattr(self.contest, "ft8_handler"):
621
+ self.contest.set_self(self)
622
+ self.contest.ft8_handler(datadict)
595
623
 
596
624
  def setDarkMode(self, setdarkmode=False) -> None:
597
625
  """Forces a darkmode palette."""
@@ -1908,7 +1936,7 @@ class MainWindow(QtWidgets.QMainWindow):
1908
1936
  " "
1909
1937
  )[:19]
1910
1938
  self.contact["Call"] = self.callsign.text()
1911
- if self.contact.get("Mode") not in ("FT8", "FT4"):
1939
+ if self.contact.get("Mode") not in ("FT8", "FT4", "RTTY"):
1912
1940
  self.contact["Freq"] = round(
1913
1941
  float(self.radio_state.get("vfoa", 0.0)) / 1000, 2
1914
1942
  )
@@ -347,6 +347,11 @@
347
347
  <string>STEW PERRY TOPBAND</string>
348
348
  </property>
349
349
  </item>
350
+ <item>
351
+ <property name="text">
352
+ <string>WEEKLY RTTY</string>
353
+ </property>
354
+ </item>
350
355
  <item>
351
356
  <property name="text">
352
357
  <string>WINTER FIELD DAY</string>
@@ -841,7 +846,7 @@
841
846
  <enum>Qt::Horizontal</enum>
842
847
  </property>
843
848
  <property name="standardButtons">
844
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
849
+ <set>QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok</set>
845
850
  </property>
846
851
  <property name="centerButtons">
847
852
  <bool>true</bool>
@@ -663,8 +663,8 @@ class DataBase:
663
663
  logger.debug("%s", exception)
664
664
  return {}
665
665
 
666
- def fetch_call_exists(self, call) -> dict:
667
- """returns a dict key of nr_count"""
666
+ def fetch_call_exists(self, call: str) -> dict:
667
+ """returns a dict key of call_count"""
668
668
  try:
669
669
  with sqlite3.connect(self.database) as conn:
670
670
  conn.row_factory = self.row_factory
@@ -0,0 +1,32 @@
1
+ import xmlrpc.client
2
+ from PyQt6.QtCore import QObject, pyqtSignal, QThread, QEventLoop
3
+
4
+
5
+ class FlDigiWatcher(QObject):
6
+ """fldigi watcher"""
7
+
8
+ poll_callback = pyqtSignal(str)
9
+ time_to_quit = False
10
+
11
+ def __init__(self):
12
+ super().__init__()
13
+ ...
14
+
15
+ self.target = "http://127.0.0.1:7362"
16
+ self.payload = ""
17
+ self.response = ""
18
+
19
+ def run(self):
20
+ while not self.time_to_quit:
21
+ try:
22
+ server = xmlrpc.client.ServerProxy(self.target)
23
+ self.response = server.logbook.last_record()
24
+ except OSError:
25
+ continue
26
+ if self.payload != self.response:
27
+ self.payload = self.response
28
+ try:
29
+ self.poll_callback.emit(self.payload)
30
+ except QEventLoop:
31
+ ...
32
+ QThread.msleep(100)
@@ -6,10 +6,14 @@ https://github.com/mbridak/not1mm
6
6
  GPL V3
7
7
  """
8
8
 
9
+ import logging
10
+
9
11
  from PyQt6 import QtNetwork
10
12
 
11
13
  import struct
12
14
 
15
+ logger = logging.getLogger(__name__)
16
+
13
17
 
14
18
  class FT8Watcher:
15
19
  """Main Window"""
@@ -64,7 +68,7 @@ class FT8Watcher:
64
68
  datagram, sender_host, sender_port_number = self.udp_socket.readDatagram(
65
69
  self.udp_socket.pendingDatagramSize()
66
70
  )
67
- # print("%s %s %s", sender_host, sender_port_number, datagram)
71
+ logger.debug(f"{datagram=}")
68
72
 
69
73
  if datagram[0:4] != b"\xad\xbc\xcb\xda":
70
74
  return # bail if no wsjt-x magic number
@@ -172,7 +172,7 @@ def gen_adif(self, cabrillo_name: str, contest_id=""):
172
172
  file=file_descriptor,
173
173
  )
174
174
  # ------------CQ 160---------------
175
- elif cabrillo_name in ("CQ-160-CW", "CQ-160-SSB"):
175
+ elif cabrillo_name in ("CQ-160-CW", "CQ-160-SSB", "WEEKLY-RTTY"):
176
176
  rcv = f"{contact.get('Exchange1', '')}"
177
177
  if len(rcv) > 1:
178
178
  print(
@@ -1,3 +1,3 @@
1
1
  """It's the version"""
2
2
 
3
- __version__ = "24.9.3"
3
+ __version__ = "24.9.6"
@@ -296,9 +296,9 @@ def cabrillo(self):
296
296
  for contact in log:
297
297
  the_date_and_time = contact.get("TS", "")
298
298
  themode = contact.get("Mode", "")
299
- if themode in ("LSB", "USB"):
299
+ if themode in ("LSB", "USB", "FM"):
300
300
  themode = "PH"
301
- if themode in ("FT8", "FT4"):
301
+ if themode in ("FT8", "FT4", "RTTY"):
302
302
  themode = "DG"
303
303
  frequency = str(int(contact.get("Freq", "0"))).rjust(5)
304
304
 
@@ -333,7 +333,7 @@ def set_self(the_outie):
333
333
 
334
334
  def ft8_handler(the_packet: dict):
335
335
  """Process FT8 QSO packets
336
-
336
+ FT8
337
337
  {
338
338
  'CALL': 'KE0OG',
339
339
  'GRIDSQUARE': 'DM10AT',
@@ -353,12 +353,36 @@ def ft8_handler(the_packet: dict):
353
353
  'CLASS': '1D',
354
354
  'ARRL_SECT': 'UT'
355
355
  }
356
+ FlDigi
357
+ {
358
+ 'FREQ': '7.029500',
359
+ 'CALL': 'DL2DSL',
360
+ 'MODE': 'RTTY',
361
+ 'NAME': 'BOB',
362
+ 'QSO_DATE': '20240904',
363
+ 'QSO_DATE_OFF': '20240904',
364
+ 'TIME_OFF': '212825',
365
+ 'TIME_ON': '212800',
366
+ 'RST_RCVD': '599',
367
+ 'RST_SENT': '599',
368
+ 'BAND': '40M',
369
+ 'COUNTRY': 'FED. REP. OF GERMANY',
370
+ 'CQZ': '14',
371
+ 'STX': '000',
372
+ 'STX_STRING': '1D ORG',
373
+ 'CLASS': '1D',
374
+ 'ARRL_SECT': 'DX',
375
+ 'TX_PWR': '0',
376
+ 'OPERATOR': 'K6GTE',
377
+ 'STATION_CALLSIGN': 'K6GTE',
378
+ 'MY_GRIDSQUARE': 'DM13AT',
379
+ 'MY_CITY': 'ANAHEIM, CA',
380
+ 'MY_STATE': 'CA'
381
+ }
356
382
 
357
383
  """
358
- print(f"{the_packet=}")
359
-
384
+ logger.debug(f"{the_packet=}")
360
385
  if ALTEREGO is not None:
361
-
362
386
  ALTEREGO.callsign.setText(the_packet.get("CALL"))
363
387
  ALTEREGO.contact["Call"] = the_packet.get("CALL", "")
364
388
  ALTEREGO.contact["SNT"] = ALTEREGO.sent.text()
@@ -373,7 +397,7 @@ def ft8_handler(the_packet: dict):
373
397
  ALTEREGO.contact["Band"] = get_logged_band(
374
398
  str(int(float(the_packet.get("FREQ", "0.0")) * 1000000))
375
399
  )
400
+ logger.debug(f"{ALTEREGO.contact=}")
376
401
  ALTEREGO.other_1.setText(the_packet.get("CLASS", "ERR"))
377
402
  ALTEREGO.other_2.setText(the_packet.get("ARRL_SECT", "ERR"))
378
- print(f"\n{ALTEREGO.contact=}\n")
379
403
  ALTEREGO.save_contact()