not1mm 24.12.3__tar.gz → 24.12.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.
- {not1mm-24.12.3 → not1mm-24.12.5}/PKG-INFO +20 -24
- {not1mm-24.12.3 → not1mm-24.12.5}/README.md +19 -23
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/__main__.py +40 -5
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/configuration.ui +70 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/new_contest.ui +5 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/database.py +17 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/plugin_common.py +63 -1
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/settings.py +22 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/version.py +1 -1
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lookupservice.py +2 -2
- not1mm-24.12.5/not1mm/plugins/arrl_160m.py +543 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/cq_ww_cw.py +14 -1
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/cwt.py +21 -1
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/icwc_mst.py +21 -1
- not1mm-24.12.5/not1mm/rtc_service.py +80 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm.egg-info/PKG-INFO +20 -24
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm.egg-info/SOURCES.txt +2 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/pyproject.toml +1 -1
- {not1mm-24.12.3 → not1mm-24.12.5}/LICENSE +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/__init__.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/bandmap.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/checkwindow.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/JetBrainsMono-ExtraLight.ttf +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/MASTER.SCP +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/about.ui +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/alpha bravo charlie delta.txt +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/bandmap.ui +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/check.png +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/checkwindow.ui +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/contests.sql +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/cty.json +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/cwmacros.txt +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/donors.html +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/editcontact.ui +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/editmacro.ui +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/greendot.png +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/k6gte-not1mm.desktop +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/k6gte.not1mm-128.png +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/k6gte.not1mm-32.png +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/k6gte.not1mm-64.png +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/logwindow.ui +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/logwindowx.ui +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/main.ui +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/not1mm.html +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/opon.ui +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/0.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/1.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/2.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/3.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/4.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/5.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/6.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/7.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/73.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/8.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/9.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/a.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/again.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/b.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/c.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/contest.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/cq.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/cq2.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/d.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/e.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/f.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/g.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/h.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/i.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/j.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/k.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/k6gte.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/l.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/m.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/mynumber.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/n.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/nil.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/o.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/p.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/q.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/r.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/roger.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/s.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/space.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/t.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/thankyou.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/thankyouqrz.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/u.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/v.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/w.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/x.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/y.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/yourcall.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/phonetics/z.wav +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/pickcontest.ui +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/radio_green.png +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/radio_grey.png +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/radio_red.png +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/reddot.png +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/rttymacros.txt +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/settings.ui +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/splash.png +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/ssbmacros.txt +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/data/vfo.ui +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/fsutils.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/__init__.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/about.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/cat_interface.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/cwinterface.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/edit_contact.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/edit_macro.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/edit_opon.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/edit_station.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/fldigi_sendstring.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/fldigi_watcher.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/ft8_watcher.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/ham_utility.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/lookup.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/multicast.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/n1mm.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/new_contest.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/select_contest.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/super_check_partial.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/lib/versiontest.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/logwindow.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/10_10_fall_cw.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/10_10_spring_cw.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/10_10_summer_phone.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/10_10_winter_phone.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/__init__.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/arrl_10m.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/arrl_dx_cw.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/arrl_dx_ssb.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/arrl_field_day.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/arrl_rtty_ru.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/arrl_ss_cw.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/arrl_ss_phone.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/arrl_vhf_jan.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/arrl_vhf_jun.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/arrl_vhf_sep.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/canada_day.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/cq_160_cw.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/cq_160_ssb.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/cq_wpx_cw.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/cq_wpx_rtty.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/cq_wpx_ssb.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/cq_ww_rtty.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/cq_ww_ssb.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/darc_xmas.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/general_logging.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/helvetia.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/iaru_fieldday_r1_cw.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/iaru_fieldday_r1_ssb.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/iaru_hf.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/jidx_cw.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/jidx_ph.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/k1usn_sst.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/lz-dx.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/naqp_cw.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/naqp_rtty.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/naqp_ssb.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/phone_weekly_test.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/raem.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/ref_cw.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/ref_ssb.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/stew_perry_topband.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/weekly_rtty.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/plugins/winter_field_day.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/radio.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/test.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/vfo.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm/voice_keying.py +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm.egg-info/dependency_links.txt +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm.egg-info/entry_points.txt +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm.egg-info/requires.txt +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/not1mm.egg-info/top_level.txt +0 -0
- {not1mm-24.12.3 → not1mm-24.12.5}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: not1mm
|
3
|
-
Version: 24.12.
|
3
|
+
Version: 24.12.5
|
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
|
@@ -238,6 +238,9 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
|
|
238
238
|
|
239
239
|
## Recent Changes (Polishing the Turd)
|
240
240
|
|
241
|
+
- [24-12-5] Add 'real time' score posting to external sites.
|
242
|
+
- [24-12-4] Merged PR from @alduhoo Add STATION_CALLSIGN field to ADIF output
|
243
|
+
- [24-12-3-1] Adding ARRL 160
|
241
244
|
- [24-12-3] Add button to bandmap to delete marked spots.
|
242
245
|
|
243
246
|
See [CHANGELOG.md](CHANGELOG.md) for prior changes.
|
@@ -531,7 +534,7 @@ You can fill. You can fill. Everyone look at your keys.
|
|
531
534
|
|
532
535
|
### Changing station information
|
533
536
|
|
534
|
-
Station information can be changed any time by going
|
537
|
+
Station information can be changed any time by going to
|
535
538
|
`File` > `Station Settings` and editing the information.
|
536
539
|
|
537
540
|
## Selecting a contest (It's REQUIRED Russ)
|
@@ -584,10 +587,7 @@ onscreen icon for CAT status. Green good, Red bad, Grey neither.
|
|
584
587
|
|
585
588
|
Under the `CW` TAB, There are three options. `cwdaemon`, which normally uses IP
|
586
589
|
`127.0.0.1`port `6789`. `pywinkeyer` which normally uses IP `127.0.0.1` port `8000` and
|
587
|
-
`CAT` which if your radio supports it, sends Morse characters via rigctld.
|
588
|
-
as I can tell rigctld does not support setting the radios internal keyer speed. So
|
589
|
-
the CW speed control widget will not be functional and you'd need to control the
|
590
|
-
keyer speed thru the radios interface.
|
590
|
+
`CAT` which if your radio supports it, sends Morse characters via rigctld.
|
591
591
|
|
592
592
|
### Cluster
|
593
593
|
|
@@ -615,27 +615,21 @@ appear. Those without will not.
|
|
615
615
|
|
616
616
|
### Options
|
617
617
|
|
618
|
-
On the Options TAB you can
|
619
|
-
Select whether or not to use Call History info.
|
618
|
+
On the Options TAB you can:
|
620
619
|
|
621
|
-
|
620
|
+
- Select to use Enter Sends Message (ESM), and configure it's function keys.
|
621
|
+
- Select whether or not to use Call History info.
|
622
622
|
|
623
|
-
|
624
|
-
|
625
|
-
**Digital modes only working for:**
|
623
|
+

|
626
624
|
|
627
|
-
-
|
628
|
-
- ARRL VHF
|
629
|
-
- Weekly RTTY
|
630
|
-
- CQ WW DX RTTY
|
631
|
-
- CQ WPX RTTY
|
625
|
+
## Logging WSJT-X FT8/FT4/ETC and FLDIGI RTTY contacts
|
632
626
|
|
633
627
|
not1mm listens for WSJT-X UDP traffic on the Multicast address 224.0.0.1:2237.
|
634
628
|
No setup is needed to be done on not1mm's side. That's good because I'm lazy.
|
635
629
|
|
636
630
|
not1mm polls for fldigi QSOs via it's XMLRPC interface. It does this in a rather stupid
|
637
631
|
way. It just keeps asking what was the last QSO and compares it to the previous response.
|
638
|
-
If it's different, it's new.
|
632
|
+
If it's different, it's new.
|
639
633
|
|
640
634
|
The F1-F12 function keys be sent to fldigi via XMLRPC. Fldigi will be placed into TX
|
641
635
|
mode, the message will be sent and a ^r will be tacked onto the end to place it back into
|
@@ -648,18 +642,20 @@ Generic Contest. Make sure the Text Capture Order field says CALL EXCHANGE.
|
|
648
642
|
## Sending CW
|
649
643
|
|
650
644
|
Other than sending CW by hand, you can also send predefined CW text messages by
|
651
|
-
pressing F1 - F12. See next section on Editing macro keys.
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
645
|
+
pressing F1 - F12. See next section on Editing macro keys.
|
646
|
+
|
647
|
+
If you need to send something freeform, you can press `CTRL-SHIFT-K`, this will
|
648
|
+
expose an entry field at the bottom of the window which you can type directly into.
|
649
|
+
When you're done you can either press CTRL-SHIFT-K again, or press the Enter Key to
|
650
|
+
close the field.
|
656
651
|
|
657
652
|
## Editing macro keys
|
658
653
|
|
659
654
|
To edit the macros, choose `File` > `Edit Macros`. This will open your systems
|
660
655
|
registered text editor with current macros loaded. When your done just save the
|
661
656
|
file and close the editor. The file loaded to edit, CW, SSB or RTTY, will be
|
662
|
-
determined by your current operating mode.
|
657
|
+
determined by your current operating mode and contest. Each contest gets it's own
|
658
|
+
copy of the macros.
|
663
659
|
|
664
660
|
After editing and saving the macro file. You can force the logger to reload the
|
665
661
|
macro file by toggeling between `Run` and `S&P` states.
|
@@ -207,6 +207,9 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
|
|
207
207
|
|
208
208
|
## Recent Changes (Polishing the Turd)
|
209
209
|
|
210
|
+
- [24-12-5] Add 'real time' score posting to external sites.
|
211
|
+
- [24-12-4] Merged PR from @alduhoo Add STATION_CALLSIGN field to ADIF output
|
212
|
+
- [24-12-3-1] Adding ARRL 160
|
210
213
|
- [24-12-3] Add button to bandmap to delete marked spots.
|
211
214
|
|
212
215
|
See [CHANGELOG.md](CHANGELOG.md) for prior changes.
|
@@ -500,7 +503,7 @@ You can fill. You can fill. Everyone look at your keys.
|
|
500
503
|
|
501
504
|
### Changing station information
|
502
505
|
|
503
|
-
Station information can be changed any time by going
|
506
|
+
Station information can be changed any time by going to
|
504
507
|
`File` > `Station Settings` and editing the information.
|
505
508
|
|
506
509
|
## Selecting a contest (It's REQUIRED Russ)
|
@@ -553,10 +556,7 @@ onscreen icon for CAT status. Green good, Red bad, Grey neither.
|
|
553
556
|
|
554
557
|
Under the `CW` TAB, There are three options. `cwdaemon`, which normally uses IP
|
555
558
|
`127.0.0.1`port `6789`. `pywinkeyer` which normally uses IP `127.0.0.1` port `8000` and
|
556
|
-
`CAT` which if your radio supports it, sends Morse characters via rigctld.
|
557
|
-
as I can tell rigctld does not support setting the radios internal keyer speed. So
|
558
|
-
the CW speed control widget will not be functional and you'd need to control the
|
559
|
-
keyer speed thru the radios interface.
|
559
|
+
`CAT` which if your radio supports it, sends Morse characters via rigctld.
|
560
560
|
|
561
561
|
### Cluster
|
562
562
|
|
@@ -584,27 +584,21 @@ appear. Those without will not.
|
|
584
584
|
|
585
585
|
### Options
|
586
586
|
|
587
|
-
On the Options TAB you can
|
588
|
-
Select whether or not to use Call History info.
|
587
|
+
On the Options TAB you can:
|
589
588
|
|
590
|
-
|
589
|
+
- Select to use Enter Sends Message (ESM), and configure it's function keys.
|
590
|
+
- Select whether or not to use Call History info.
|
591
591
|
|
592
|
-
|
593
|
-
|
594
|
-
**Digital modes only working for:**
|
592
|
+

|
595
593
|
|
596
|
-
-
|
597
|
-
- ARRL VHF
|
598
|
-
- Weekly RTTY
|
599
|
-
- CQ WW DX RTTY
|
600
|
-
- CQ WPX RTTY
|
594
|
+
## Logging WSJT-X FT8/FT4/ETC and FLDIGI RTTY contacts
|
601
595
|
|
602
596
|
not1mm listens for WSJT-X UDP traffic on the Multicast address 224.0.0.1:2237.
|
603
597
|
No setup is needed to be done on not1mm's side. That's good because I'm lazy.
|
604
598
|
|
605
599
|
not1mm polls for fldigi QSOs via it's XMLRPC interface. It does this in a rather stupid
|
606
600
|
way. It just keeps asking what was the last QSO and compares it to the previous response.
|
607
|
-
If it's different, it's new.
|
601
|
+
If it's different, it's new.
|
608
602
|
|
609
603
|
The F1-F12 function keys be sent to fldigi via XMLRPC. Fldigi will be placed into TX
|
610
604
|
mode, the message will be sent and a ^r will be tacked onto the end to place it back into
|
@@ -617,18 +611,20 @@ Generic Contest. Make sure the Text Capture Order field says CALL EXCHANGE.
|
|
617
611
|
## Sending CW
|
618
612
|
|
619
613
|
Other than sending CW by hand, you can also send predefined CW text messages by
|
620
|
-
pressing F1 - F12. See next section on Editing macro keys.
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
614
|
+
pressing F1 - F12. See next section on Editing macro keys.
|
615
|
+
|
616
|
+
If you need to send something freeform, you can press `CTRL-SHIFT-K`, this will
|
617
|
+
expose an entry field at the bottom of the window which you can type directly into.
|
618
|
+
When you're done you can either press CTRL-SHIFT-K again, or press the Enter Key to
|
619
|
+
close the field.
|
625
620
|
|
626
621
|
## Editing macro keys
|
627
622
|
|
628
623
|
To edit the macros, choose `File` > `Edit Macros`. This will open your systems
|
629
624
|
registered text editor with current macros loaded. When your done just save the
|
630
625
|
file and close the editor. The file loaded to edit, CW, SSB or RTTY, will be
|
631
|
-
determined by your current operating mode.
|
626
|
+
determined by your current operating mode and contest. Each contest gets it's own
|
627
|
+
copy of the macros.
|
632
628
|
|
633
629
|
After editing and saving the macro file. You can force the logger to reload the
|
634
630
|
macro file by toggeling between `Run` and `S&P` states.
|
@@ -77,6 +77,7 @@ from not1mm.vfo import VfoWindow
|
|
77
77
|
from not1mm.radio import Radio
|
78
78
|
from not1mm.voice_keying import Voice
|
79
79
|
from not1mm.lookupservice import LookupService
|
80
|
+
from not1mm.rtc_service import RTCService
|
80
81
|
|
81
82
|
poll_time = datetime.datetime.now()
|
82
83
|
|
@@ -102,6 +103,11 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
102
103
|
"multicast_group": "239.1.1.1",
|
103
104
|
"multicast_port": 2239,
|
104
105
|
"interface_ip": "0.0.0.0",
|
106
|
+
"send_rtc_scores": False,
|
107
|
+
"rtc_url": "",
|
108
|
+
"rtc_user": "",
|
109
|
+
"rtc_pass": "",
|
110
|
+
"rtc_interval": 2,
|
105
111
|
"send_n1mm_packets": False,
|
106
112
|
"n1mm_station_name": "20M CW Tent",
|
107
113
|
"n1mm_operator": "Bernie",
|
@@ -156,7 +162,6 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
156
162
|
opon_dialog = None
|
157
163
|
dbname = fsutils.USER_DATA_PATH, "/ham.db"
|
158
164
|
radio_state = {}
|
159
|
-
rig_control = None
|
160
165
|
worked_list = {}
|
161
166
|
cw_entry_visible = False
|
162
167
|
last_focus = None
|
@@ -170,6 +175,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
170
175
|
radio_thread = QThread()
|
171
176
|
voice_thread = QThread()
|
172
177
|
fldigi_thread = QThread()
|
178
|
+
rtc_thread = QThread()
|
173
179
|
|
174
180
|
fldigi_watcher = None
|
175
181
|
rig_control = None
|
@@ -179,6 +185,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
179
185
|
vfo_window = None
|
180
186
|
lookup_service = None
|
181
187
|
fldigi_util = None
|
188
|
+
rtc_service = None
|
182
189
|
|
183
190
|
current_widget = None
|
184
191
|
|
@@ -712,7 +719,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
712
719
|
)
|
713
720
|
|
714
721
|
def load_call_history(self) -> None:
|
715
|
-
""""""
|
722
|
+
"""Display filepicker and load chosen call history file."""
|
716
723
|
filename = self.filepicker("other")
|
717
724
|
if filename:
|
718
725
|
self.database.create_callhistory_table()
|
@@ -755,13 +762,13 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
755
762
|
self.show_message_box(f"{err}")
|
756
763
|
|
757
764
|
def on_focus_changed(self, new):
|
758
|
-
""""""
|
765
|
+
"""Called when text entry focus has changed."""
|
759
766
|
if self.use_esm:
|
760
767
|
if hasattr(self.contest, "process_esm"):
|
761
768
|
self.contest.process_esm(self, new_focused_widget=new)
|
762
769
|
|
763
770
|
def make_button_green(self, the_button: QtWidgets.QPushButton) -> None:
|
764
|
-
"""
|
771
|
+
"""Takes supplied QPushButton object and turns it green."""
|
765
772
|
if the_button is not None:
|
766
773
|
pal = QPalette()
|
767
774
|
pal.isCopyOf(self.current_palette)
|
@@ -2457,7 +2464,10 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
2457
2464
|
self.worked_list = self.database.get_calls_and_bands()
|
2458
2465
|
self.send_worked_list()
|
2459
2466
|
self.clearinputs()
|
2460
|
-
|
2467
|
+
if self.pref.get("send_rtc_scores", False):
|
2468
|
+
if hasattr(self.contest, "online_score_xml"):
|
2469
|
+
if self.rtc_service is not None:
|
2470
|
+
self.rtc_service.xml = self.contest.online_score_xml(self)
|
2461
2471
|
cmd = {}
|
2462
2472
|
cmd["cmd"] = "UPDATELOG"
|
2463
2473
|
if self.log_window:
|
@@ -2898,6 +2908,25 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
2898
2908
|
self.setDarkMode(False)
|
2899
2909
|
self.actionDark_Mode_2.setChecked(False)
|
2900
2910
|
|
2911
|
+
try:
|
2912
|
+
if self.rtc_thread.isRunning():
|
2913
|
+
self.rtc_service.time_to_quit = True
|
2914
|
+
self.rtc_thread.quit()
|
2915
|
+
self.rtc_thread.wait(1000)
|
2916
|
+
|
2917
|
+
except (RuntimeError, AttributeError):
|
2918
|
+
...
|
2919
|
+
|
2920
|
+
self.rtc_service = None
|
2921
|
+
|
2922
|
+
if self.pref.get("send_rtc_scores", False):
|
2923
|
+
self.rtc_service = RTCService()
|
2924
|
+
self.rtc_service.moveToThread(self.rtc_thread)
|
2925
|
+
self.rtc_thread.started.connect(self.rtc_service.run)
|
2926
|
+
self.rtc_thread.finished.connect(self.rtc_service.deleteLater)
|
2927
|
+
# self.rtc_service.poll_callback.connect(self.rtc_result)
|
2928
|
+
self.rtc_thread.start()
|
2929
|
+
|
2901
2930
|
try:
|
2902
2931
|
if self.radio_thread.isRunning():
|
2903
2932
|
self.rig_control.time_to_quit = True
|
@@ -3046,6 +3075,12 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
3046
3075
|
self.esm_dict["MYCALL"] = fkey_dict.get(self.pref.get("esm_mycall", "DISABLED"))
|
3047
3076
|
self.esm_dict["QSOB4"] = fkey_dict.get(self.pref.get("esm_qsob4", "DISABLED"))
|
3048
3077
|
|
3078
|
+
self.send_rtc_scores = self.pref.get("send_rtc_scores", False)
|
3079
|
+
self.rtc_url = self.pref.get("rtc_url", "")
|
3080
|
+
self.rtc_user = self.pref.get("rtc_user", "")
|
3081
|
+
self.rtc_pass = self.pref.get("rtc_pass", "")
|
3082
|
+
self.rtc_interval = self.pref.get("rtc_interval", 2)
|
3083
|
+
|
3049
3084
|
def dark_mode_state_changed(self) -> None:
|
3050
3085
|
"""Called when the Dark Mode menu state is changed."""
|
3051
3086
|
self.pref["darkmode"] = self.actionDark_Mode_2.isChecked()
|
@@ -2173,6 +2173,76 @@
|
|
2173
2173
|
</property>
|
2174
2174
|
</widget>
|
2175
2175
|
</item>
|
2176
|
+
<item>
|
2177
|
+
<widget class="Line" name="line">
|
2178
|
+
<property name="orientation">
|
2179
|
+
<enum>Qt::Horizontal</enum>
|
2180
|
+
</property>
|
2181
|
+
</widget>
|
2182
|
+
</item>
|
2183
|
+
<item>
|
2184
|
+
<widget class="QCheckBox" name="send_rtc_scores">
|
2185
|
+
<property name="text">
|
2186
|
+
<string>Use RTC score reporting</string>
|
2187
|
+
</property>
|
2188
|
+
</widget>
|
2189
|
+
</item>
|
2190
|
+
<item>
|
2191
|
+
<widget class="QComboBox" name="rtc_url">
|
2192
|
+
<item>
|
2193
|
+
<property name="text">
|
2194
|
+
<string>https://hamscore.com/postxml/</string>
|
2195
|
+
</property>
|
2196
|
+
</item>
|
2197
|
+
<item>
|
2198
|
+
<property name="text">
|
2199
|
+
<string>https://contestonlinescore.com/post/</string>
|
2200
|
+
</property>
|
2201
|
+
</item>
|
2202
|
+
<item>
|
2203
|
+
<property name="text">
|
2204
|
+
<string>http://contest.run</string>
|
2205
|
+
</property>
|
2206
|
+
</item>
|
2207
|
+
</widget>
|
2208
|
+
</item>
|
2209
|
+
<item>
|
2210
|
+
<widget class="QLineEdit" name="rtc_user">
|
2211
|
+
<property name="placeholderText">
|
2212
|
+
<string>username</string>
|
2213
|
+
</property>
|
2214
|
+
</widget>
|
2215
|
+
</item>
|
2216
|
+
<item>
|
2217
|
+
<widget class="QLineEdit" name="rtc_pass">
|
2218
|
+
<property name="echoMode">
|
2219
|
+
<enum>QLineEdit::EchoMode::Password</enum>
|
2220
|
+
</property>
|
2221
|
+
<property name="placeholderText">
|
2222
|
+
<string>password</string>
|
2223
|
+
</property>
|
2224
|
+
</widget>
|
2225
|
+
</item>
|
2226
|
+
<item>
|
2227
|
+
<widget class="QLabel" name="label_28">
|
2228
|
+
<property name="text">
|
2229
|
+
<string>Score posting interval (minutes)</string>
|
2230
|
+
</property>
|
2231
|
+
<property name="alignment">
|
2232
|
+
<set>Qt::AlignCenter</set>
|
2233
|
+
</property>
|
2234
|
+
</widget>
|
2235
|
+
</item>
|
2236
|
+
<item>
|
2237
|
+
<widget class="QLineEdit" name="rtc_interval">
|
2238
|
+
<property name="text">
|
2239
|
+
<string>2</string>
|
2240
|
+
</property>
|
2241
|
+
<property name="alignment">
|
2242
|
+
<set>Qt::AlignCenter</set>
|
2243
|
+
</property>
|
2244
|
+
</widget>
|
2245
|
+
</item>
|
2176
2246
|
<item>
|
2177
2247
|
<spacer name="verticalSpacer_8">
|
2178
2248
|
<property name="orientation">
|
@@ -695,6 +695,23 @@ class DataBase:
|
|
695
695
|
logger.debug("%s", exception)
|
696
696
|
return {}
|
697
697
|
|
698
|
+
def fetch_exchange1_unique_count(self) -> dict:
|
699
|
+
"""
|
700
|
+
Fetch count of unique countries
|
701
|
+
{exch1_count: count}
|
702
|
+
"""
|
703
|
+
try:
|
704
|
+
with sqlite3.connect(self.database) as conn:
|
705
|
+
conn.row_factory = self.row_factory
|
706
|
+
cursor = conn.cursor()
|
707
|
+
cursor.execute(
|
708
|
+
f"select count(DISTINCT(Exchange1)) as exch1_count from dxlog where Exchange1 != '' and ContestNR = {self.current_contest};"
|
709
|
+
)
|
710
|
+
return cursor.fetchone()
|
711
|
+
except sqlite3.OperationalError as exception:
|
712
|
+
logger.debug("%s", exception)
|
713
|
+
return {}
|
714
|
+
|
698
715
|
def fetch_arrldx_country_band_count(self) -> dict:
|
699
716
|
"""
|
700
717
|
returns dict with count of unique NR.
|
@@ -4,6 +4,58 @@ import datetime
|
|
4
4
|
from decimal import Decimal
|
5
5
|
from pathlib import Path
|
6
6
|
from not1mm.lib.ham_utility import get_adif_band
|
7
|
+
from not1mm.lib.version import __version__
|
8
|
+
|
9
|
+
|
10
|
+
def online_score_xml(self):
|
11
|
+
"""generate online xml"""
|
12
|
+
|
13
|
+
mults = self.contest.get_mults(self)
|
14
|
+
the_mults = ""
|
15
|
+
for thing in mults:
|
16
|
+
the_mults += (
|
17
|
+
f'<mult band="total" mode="ALL" type="{thing}">{mults.get(thing,0)}</mult>'
|
18
|
+
)
|
19
|
+
|
20
|
+
the_points = self.contest.just_points(self)
|
21
|
+
|
22
|
+
the_date_time = datetime.datetime.now(datetime.timezone.utc).isoformat(" ")[:19]
|
23
|
+
assisted = self.contest_settings.get("AssistedCategory", "")
|
24
|
+
bands = self.contest_settings.get("BandCategory", "")
|
25
|
+
modes = self.contest_settings.get("ModeCategory", "")
|
26
|
+
xmiter = self.contest_settings.get("TransmitterCategory", "")
|
27
|
+
ops = self.contest_settings.get("OperatorCategory", "")
|
28
|
+
overlay = self.contest_settings.get("OverlayCategory", "")
|
29
|
+
power = self.contest_settings.get("PowerCategory", "")
|
30
|
+
|
31
|
+
the_xml = (
|
32
|
+
'<?xml version="1.0"?>'
|
33
|
+
"<dynamicresults>"
|
34
|
+
f"<contest>{self.contest.cabrillo_name}</contest>"
|
35
|
+
f'<call>{self.station.get("Call", "")}</call>'
|
36
|
+
# <ops>NR9Q</ops>
|
37
|
+
f'<class power="{power}" assisted = "{assisted}" transmitter="{xmiter}" ops="{ops}" bands="{bands}" mode="{modes}" overlay="{overlay}"></class>'
|
38
|
+
f"<club>{self.station.get('Club', '').upper()}</club>"
|
39
|
+
"<soft>Not1MM</soft>"
|
40
|
+
f"<version>{__version__}</version>"
|
41
|
+
"<qth>"
|
42
|
+
# <dxcccountry>K</dxcccountry>
|
43
|
+
f"<cqzone>{self.station.get('CQZone','')}</cqzone>"
|
44
|
+
f"<iaruzone>{self.station.get('IARUZone','')}</iaruzone>"
|
45
|
+
f"<arrlsection>{self.station.get('ARRLSection', '')}</arrlsection>"
|
46
|
+
f"<stprvoth>{self.station.get('State','')}</stprvoth>"
|
47
|
+
f"<grid6>{self.station.get('GridSquare','')}</grid6>"
|
48
|
+
"</qth>"
|
49
|
+
"<breakdown>"
|
50
|
+
f'<qso band="total" mode="ALL">{self.contest.show_qso(self)}</qso>'
|
51
|
+
f"{the_mults}"
|
52
|
+
f'<point band="total" mode="ALL">{the_points}</point>'
|
53
|
+
"</breakdown>"
|
54
|
+
f"<score>{self.contest.calc_score(self)}</score>"
|
55
|
+
f"<timestamp>{the_date_time}</timestamp>"
|
56
|
+
"</dynamicresults>"
|
57
|
+
)
|
58
|
+
return the_xml
|
7
59
|
|
8
60
|
|
9
61
|
def get_points(self):
|
@@ -21,10 +73,11 @@ def gen_adif(self, cabrillo_name: str, contest_id=""):
|
|
21
73
|
"""
|
22
74
|
now = datetime.datetime.now()
|
23
75
|
date_time = now.strftime("%Y-%m-%d_%H-%M-%S")
|
76
|
+
station_callsign = self.station.get('Call', '').upper()
|
24
77
|
filename = (
|
25
78
|
str(Path.home())
|
26
79
|
+ "/"
|
27
|
-
+ f"{
|
80
|
+
+ f"{station_callsign}_{cabrillo_name}_{date_time}.adi"
|
28
81
|
)
|
29
82
|
log = self.database.fetch_all_contacts_asc()
|
30
83
|
try:
|
@@ -71,6 +124,15 @@ def gen_adif(self, cabrillo_name: str, contest_id=""):
|
|
71
124
|
except TypeError:
|
72
125
|
...
|
73
126
|
|
127
|
+
try:
|
128
|
+
print(
|
129
|
+
f"<STATION_CALLSIGN:{len(station_callsign)}>{station_callsign}",
|
130
|
+
end="\r\n",
|
131
|
+
file=file_descriptor,
|
132
|
+
)
|
133
|
+
except TypeError:
|
134
|
+
...
|
135
|
+
|
74
136
|
try:
|
75
137
|
print(
|
76
138
|
f"<CALL:{len(hiscall)}>{hiscall.upper()}",
|
@@ -41,6 +41,19 @@ class Settings(QtWidgets.QDialog):
|
|
41
41
|
def setup(self):
|
42
42
|
"""setup dialog"""
|
43
43
|
|
44
|
+
self.send_rtc_scores.setChecked(
|
45
|
+
bool(self.preference.get("send_rtc_scores", False))
|
46
|
+
)
|
47
|
+
|
48
|
+
value = self.preference.get("rtc_url", "")
|
49
|
+
index = self.rtc_url.findText(value)
|
50
|
+
if index != -1:
|
51
|
+
self.rtc_url.setCurrentIndex(index)
|
52
|
+
|
53
|
+
self.rtc_user.setText(str(self.preference.get("rtc_user", "")))
|
54
|
+
self.rtc_pass.setText(str(self.preference.get("rtc_pass", "")))
|
55
|
+
self.rtc_interval.setText(str(self.preference.get("rtc_interval", "2")))
|
56
|
+
|
44
57
|
self.use_call_history.setChecked(
|
45
58
|
bool(self.preference.get("use_call_history", False))
|
46
59
|
)
|
@@ -195,6 +208,15 @@ class Settings(QtWidgets.QDialog):
|
|
195
208
|
"""
|
196
209
|
Write preferences to json file.
|
197
210
|
"""
|
211
|
+
self.preference["send_rtc_scores"] = self.send_rtc_scores.isChecked()
|
212
|
+
self.preference["rtc_url"] = self.rtc_url.currentText()
|
213
|
+
self.preference["rtc_user"] = self.rtc_user.text()
|
214
|
+
self.preference["rtc_pass"] = self.rtc_pass.text()
|
215
|
+
try:
|
216
|
+
self.preference["rtc_interval"] = int(self.rtc_interval.text())
|
217
|
+
except ValueError:
|
218
|
+
self.preference["rtc_interval"] = 2
|
219
|
+
|
198
220
|
self.preference["use_call_history"] = self.use_call_history.isChecked()
|
199
221
|
self.preference["use_esm"] = self.use_esm.isChecked()
|
200
222
|
self.preference["esm_cq"] = self.esm_cq.currentText()
|
@@ -3,8 +3,8 @@
|
|
3
3
|
not1mm Contest logger
|
4
4
|
Email: michael.bridak@gmail.com
|
5
5
|
GPL V3
|
6
|
-
Class:
|
7
|
-
Purpose:
|
6
|
+
Class: LookupService
|
7
|
+
Purpose: Lookup callsigns with online services.
|
8
8
|
"""
|
9
9
|
|
10
10
|
# pylint: disable=unused-import, c-extension-no-member, no-member, invalid-name, too-many-lines
|