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.
- {not1mm-24.9.3 → not1mm-24.9.6}/PKG-INFO +19 -8
- {not1mm-24.9.3 → not1mm-24.9.6}/README.md +18 -7
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/__main__.py +48 -20
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/new_contest.ui +6 -1
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/database.py +2 -2
- not1mm-24.9.6/not1mm/lib/fldigi_watcher.py +32 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/ft8_watcher.py +5 -1
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/plugin_common.py +1 -1
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/version.py +1 -1
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/arrl_field_day.py +31 -7
- not1mm-24.9.6/not1mm/plugins/weekly_rtty.py +442 -0
- not1mm-24.9.6/not1mm/test.py +6 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm.egg-info/PKG-INFO +19 -8
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm.egg-info/SOURCES.txt +2 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/pyproject.toml +1 -1
- not1mm-24.9.3/not1mm/test.py +0 -10
- {not1mm-24.9.3 → not1mm-24.9.6}/LICENSE +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/__init__.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/bandmap.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/checkwindow.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/JetBrainsMono-Regular.ttf +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/MASTER.SCP +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/about.ui +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/alpha bravo charlie delta.txt +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/bandmap.ui +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/check.png +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/checkwindow.ui +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/configuration.ui +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/contests.sql +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/cty.json +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/cwmacros.txt +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/donors.html +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/editcontact.ui +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/editmacro.ui +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/greendot.png +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/k6gte-not1mm.desktop +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/k6gte.not1mm-128.png +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/k6gte.not1mm-32.png +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/k6gte.not1mm-64.png +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/logwindow.ui +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/logwindowx.ui +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/main.ui +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/not1mm.html +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/opon.ui +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/0.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/1.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/2.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/3.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/4.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/5.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/6.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/7.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/73.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/8.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/9.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/a.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/again.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/b.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/c.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/contest.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/cq.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/d.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/e.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/f.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/g.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/h.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/i.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/j.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/k.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/k6gte.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/l.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/m.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/mynumber.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/n.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/nil.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/o.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/p.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/q.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/r.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/roger.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/s.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/space.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/t.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/thankyou.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/thankyouqrz.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/u.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/v.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/w.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/x.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/y.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/yourcall.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/phonetics/z.wav +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/pickcontest.ui +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/radio_green.png +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/radio_grey.png +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/radio_red.png +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/reddot.png +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/settings.ui +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/splash.png +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/ssbmacros.txt +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/data/vfo.ui +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/fsutils.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/__init__.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/about.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/cat_interface.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/cwinterface.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/edit_contact.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/edit_macro.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/edit_opon.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/edit_station.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/ham_utility.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/lookup.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/multicast.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/n1mm.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/new_contest.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/playsound.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/select_contest.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/settings.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/super_check_partial.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/lib/versiontest.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/logwindow.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/10_10_fall_cw.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/10_10_spring_cw.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/10_10_summer_phone.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/10_10_winter_phone.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/__init__.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/arrl_10m.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/arrl_dx_cw.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/arrl_dx_ssb.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/arrl_rtty_ru.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/arrl_ss_cw.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/arrl_ss_phone.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/arrl_vhf_jan.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/arrl_vhf_jun.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/arrl_vhf_sep.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/canada_day.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/cq_160_cw.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/cq_160_ssb.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/cq_wpx_cw.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/cq_wpx_ssb.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/cq_ww_cw.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/cq_ww_ssb.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/cwt.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/general_logging.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/helvetia.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/iaru_hf.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/icwc_mst.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/jidx_cw.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/jidx_ph.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/k1usn_sst.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/naqp_cw.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/naqp_ssb.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/phone_weekly_test.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/ref_cw.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/stew_perry_topband.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/plugins/winter_field_day.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/radio.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/vfo.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm/voice_keying.py +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm.egg-info/dependency_links.txt +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm.egg-info/entry_points.txt +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm.egg-info/requires.txt +0 -0
- {not1mm-24.9.3 → not1mm-24.9.6}/not1mm.egg-info/top_level.txt +0 -0
- {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
|
+
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
|
173
|
-
the
|
174
|
-
|
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
|

|
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
|
142
|
-
the
|
143
|
-
|
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
|

|
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(
|
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
|
579
|
+
def fldigi_qso(self, result: str):
|
570
580
|
"""
|
571
|
-
|
581
|
+
gets called when there is a new fldigi qso logged.
|
572
582
|
|
573
583
|
{
|
574
|
-
'
|
575
|
-
'
|
576
|
-
'MODE': '
|
577
|
-
'
|
578
|
-
'
|
579
|
-
'
|
580
|
-
'
|
581
|
-
'
|
582
|
-
'
|
583
|
-
'
|
584
|
-
'
|
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
|
-
'
|
588
|
-
'
|
589
|
-
'CLASS': '1D',
|
590
|
-
'ARRL_SECT': 'UT'
|
605
|
+
'MY_CITY': 'ANAHEIM, CA',
|
606
|
+
'MY_STATE': 'CA'
|
591
607
|
}
|
592
608
|
|
593
609
|
"""
|
594
|
-
|
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
|
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
|
-
|
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(
|
@@ -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
|
-
|
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()
|