not1mm 24.11.24__tar.gz → 24.11.25__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.11.24 → not1mm-24.11.25}/PKG-INFO +28 -26
- {not1mm-24.11.24 → not1mm-24.11.25}/README.md +27 -25
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/cat_interface.py +2 -1
- not1mm-24.11.25/not1mm/lib/version.py +3 -0
- not1mm-24.11.25/not1mm/plugins/10_10_fall_cw.py +452 -0
- not1mm-24.11.25/not1mm/plugins/10_10_spring_cw.py +451 -0
- not1mm-24.11.25/not1mm/plugins/10_10_summer_phone.py +455 -0
- not1mm-24.11.25/not1mm/plugins/10_10_winter_phone.py +453 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/arrl_10m.py +110 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/arrl_vhf_jan.py +92 -1
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/arrl_vhf_jun.py +92 -1
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/arrl_vhf_sep.py +95 -1
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/cq_160_cw.py +94 -5
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/cq_160_ssb.py +94 -5
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/cq_ww_cw.py +14 -5
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/cq_ww_ssb.py +13 -5
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm.egg-info/PKG-INFO +28 -26
- {not1mm-24.11.24 → not1mm-24.11.25}/pyproject.toml +1 -1
- not1mm-24.11.24/not1mm/lib/version.py +0 -3
- not1mm-24.11.24/not1mm/plugins/10_10_fall_cw.py +0 -361
- not1mm-24.11.24/not1mm/plugins/10_10_spring_cw.py +0 -360
- not1mm-24.11.24/not1mm/plugins/10_10_summer_phone.py +0 -364
- not1mm-24.11.24/not1mm/plugins/10_10_winter_phone.py +0 -362
- {not1mm-24.11.24 → not1mm-24.11.25}/LICENSE +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/__init__.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/__main__.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/bandmap.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/checkwindow.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/JetBrainsMono-ExtraLight.ttf +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/MASTER.SCP +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/about.ui +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/alpha bravo charlie delta.txt +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/bandmap.ui +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/check.png +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/checkwindow.ui +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/configuration.ui +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/contests.sql +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/cty.json +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/cwmacros.txt +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/donors.html +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/editcontact.ui +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/editmacro.ui +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/greendot.png +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/k6gte-not1mm.desktop +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/k6gte.not1mm-128.png +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/k6gte.not1mm-32.png +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/k6gte.not1mm-64.png +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/logwindow.ui +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/logwindowx.ui +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/main.ui +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/new_contest.ui +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/not1mm.html +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/opon.ui +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/0.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/1.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/2.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/3.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/4.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/5.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/6.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/7.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/73.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/8.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/9.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/a.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/again.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/b.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/c.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/contest.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/cq.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/cq2.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/d.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/e.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/f.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/g.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/h.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/i.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/j.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/k.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/k6gte.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/l.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/m.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/mynumber.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/n.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/nil.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/o.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/p.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/q.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/r.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/roger.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/s.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/space.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/t.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/thankyou.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/thankyouqrz.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/u.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/v.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/w.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/x.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/y.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/yourcall.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/phonetics/z.wav +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/pickcontest.ui +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/radio_green.png +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/radio_grey.png +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/radio_red.png +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/reddot.png +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/rttymacros.txt +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/settings.ui +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/splash.png +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/ssbmacros.txt +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/data/vfo.ui +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/fsutils.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/__init__.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/about.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/cwinterface.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/database.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/edit_contact.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/edit_macro.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/edit_opon.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/edit_station.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/fldigi_sendstring.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/fldigi_watcher.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/ft8_watcher.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/ham_utility.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/lookup.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/multicast.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/n1mm.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/new_contest.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/plugin_common.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/select_contest.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/settings.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/super_check_partial.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lib/versiontest.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/logwindow.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/lookupservice.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/__init__.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/arrl_dx_cw.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/arrl_dx_ssb.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/arrl_field_day.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/arrl_rtty_ru.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/arrl_ss_cw.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/arrl_ss_phone.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/canada_day.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/cq_wpx_cw.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/cq_wpx_rtty.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/cq_wpx_ssb.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/cq_ww_rtty.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/cwt.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/darc_xmas.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/general_logging.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/helvetia.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/iaru_fieldday_r1_cw.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/iaru_fieldday_r1_ssb.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/iaru_hf.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/icwc_mst.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/jidx_cw.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/jidx_ph.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/k1usn_sst.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/lz-dx.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/naqp_cw.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/naqp_rtty.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/naqp_ssb.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/phone_weekly_test.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/raem.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/ref_cw.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/ref_ssb.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/stew_perry_topband.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/weekly_rtty.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/plugins/winter_field_day.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/radio.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/test.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/vfo.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm/voice_keying.py +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm.egg-info/SOURCES.txt +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm.egg-info/dependency_links.txt +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm.egg-info/entry_points.txt +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm.egg-info/requires.txt +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/not1mm.egg-info/top_level.txt +0 -0
- {not1mm-24.11.24 → not1mm-24.11.25}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: not1mm
|
3
|
-
Version: 24.11.
|
3
|
+
Version: 24.11.25
|
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
|
@@ -57,7 +57,7 @@ Requires-Dist: Levenshtein
|
|
57
57
|
- [Data and RTTY](#data-and-rtty)
|
58
58
|
- [Other not so supported contests](#other-not-so-supported-contests)
|
59
59
|
- [Our Code Contributors ✨](#our-code-contributors-)
|
60
|
-
- [List of should be working contests
|
60
|
+
- [List of should be working contests](#list-of-should-be-working-contests)
|
61
61
|
- [Recent Changes (Polishing the Turd)](#recent-changes-polishing-the-turd)
|
62
62
|
- [Flatpak](#flatpak)
|
63
63
|
- [Installation](#installation)
|
@@ -203,41 +203,43 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
|
|
203
203
|
<img src="https://contrib.rocks/image?repo=mbridak/not1mm" alt="Avatar icons for code contributors." />
|
204
204
|
</a>
|
205
205
|
|
206
|
-
## List of should be working contests
|
206
|
+
## List of should be working contests
|
207
207
|
|
208
|
-
-
|
208
|
+
- General Logging (There are better general loggers like QLog, KLog, CQRLog)
|
209
209
|
- 10 10 Fall CW
|
210
210
|
- 10 10 Spring CW
|
211
211
|
- 10 10 Summer Phone
|
212
212
|
- 10 10 Winter Phone
|
213
213
|
- ARRL 10M
|
214
|
-
-
|
215
|
-
-
|
216
|
-
-
|
214
|
+
- ARRL DX CW, SSB
|
215
|
+
- ARRL Field Day
|
216
|
+
- ARRL Sweepstakes CW, SSB
|
217
217
|
- ARRL VHF January, June, September
|
218
218
|
- CQ 160 CW, SSB
|
219
|
-
-
|
220
|
-
-
|
221
|
-
-
|
222
|
-
-
|
223
|
-
-
|
224
|
-
-
|
225
|
-
-
|
226
|
-
-
|
227
|
-
-
|
228
|
-
-
|
229
|
-
-
|
230
|
-
-
|
231
|
-
-
|
232
|
-
-
|
233
|
-
-
|
234
|
-
-
|
235
|
-
-
|
236
|
-
-
|
237
|
-
-
|
219
|
+
- CQ WPX CW, RTTY, SSB
|
220
|
+
- CQ World Wide CW, RTTY, SSB
|
221
|
+
- CWOps CWT
|
222
|
+
- DARC Xmas
|
223
|
+
- Helvetia
|
224
|
+
- IARU Fieldday R1 CW, SSB
|
225
|
+
- IARU HF
|
226
|
+
- ICWC MST
|
227
|
+
- Japan International DX CW, SSB
|
228
|
+
- K1USN Slow Speed Test
|
229
|
+
- LZ DX
|
230
|
+
- NAQP CW, RTTY, SSB
|
231
|
+
- Phone Weekly Test
|
232
|
+
- RAEM
|
233
|
+
- RAC Canada Day
|
234
|
+
- REF CW, SSB
|
235
|
+
- Stew Perry Topband
|
236
|
+
- Weekly RTTY
|
237
|
+
- Winter Field Day
|
238
238
|
|
239
239
|
## Recent Changes (Polishing the Turd)
|
240
240
|
|
241
|
+
- [24-22-15] Fix CQWW points, fix mode showing as RPRT.
|
242
|
+
- [24-11-24-1] Add ESM to CQ160, ARRL VHF, ARRL 10M, 10 10 contests.
|
241
243
|
- [24-11-24] Added ESM to IARU HF and FieldDay.
|
242
244
|
- [24-11-23] Made macros per contest.
|
243
245
|
- [24-11-21] Merged PR from alduhoo setting CW Speed via rigctld, Added ESM and call history support for General Logging.
|
@@ -26,7 +26,7 @@
|
|
26
26
|
- [Data and RTTY](#data-and-rtty)
|
27
27
|
- [Other not so supported contests](#other-not-so-supported-contests)
|
28
28
|
- [Our Code Contributors ✨](#our-code-contributors-)
|
29
|
-
- [List of should be working contests
|
29
|
+
- [List of should be working contests](#list-of-should-be-working-contests)
|
30
30
|
- [Recent Changes (Polishing the Turd)](#recent-changes-polishing-the-turd)
|
31
31
|
- [Flatpak](#flatpak)
|
32
32
|
- [Installation](#installation)
|
@@ -172,41 +172,43 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
|
|
172
172
|
<img src="https://contrib.rocks/image?repo=mbridak/not1mm" alt="Avatar icons for code contributors." />
|
173
173
|
</a>
|
174
174
|
|
175
|
-
## List of should be working contests
|
175
|
+
## List of should be working contests
|
176
176
|
|
177
|
-
-
|
177
|
+
- General Logging (There are better general loggers like QLog, KLog, CQRLog)
|
178
178
|
- 10 10 Fall CW
|
179
179
|
- 10 10 Spring CW
|
180
180
|
- 10 10 Summer Phone
|
181
181
|
- 10 10 Winter Phone
|
182
182
|
- ARRL 10M
|
183
|
-
-
|
184
|
-
-
|
185
|
-
-
|
183
|
+
- ARRL DX CW, SSB
|
184
|
+
- ARRL Field Day
|
185
|
+
- ARRL Sweepstakes CW, SSB
|
186
186
|
- ARRL VHF January, June, September
|
187
187
|
- CQ 160 CW, SSB
|
188
|
-
-
|
189
|
-
-
|
190
|
-
-
|
191
|
-
-
|
192
|
-
-
|
193
|
-
-
|
194
|
-
-
|
195
|
-
-
|
196
|
-
-
|
197
|
-
-
|
198
|
-
-
|
199
|
-
-
|
200
|
-
-
|
201
|
-
-
|
202
|
-
-
|
203
|
-
-
|
204
|
-
-
|
205
|
-
-
|
206
|
-
-
|
188
|
+
- CQ WPX CW, RTTY, SSB
|
189
|
+
- CQ World Wide CW, RTTY, SSB
|
190
|
+
- CWOps CWT
|
191
|
+
- DARC Xmas
|
192
|
+
- Helvetia
|
193
|
+
- IARU Fieldday R1 CW, SSB
|
194
|
+
- IARU HF
|
195
|
+
- ICWC MST
|
196
|
+
- Japan International DX CW, SSB
|
197
|
+
- K1USN Slow Speed Test
|
198
|
+
- LZ DX
|
199
|
+
- NAQP CW, RTTY, SSB
|
200
|
+
- Phone Weekly Test
|
201
|
+
- RAEM
|
202
|
+
- RAC Canada Day
|
203
|
+
- REF CW, SSB
|
204
|
+
- Stew Perry Topband
|
205
|
+
- Weekly RTTY
|
206
|
+
- Winter Field Day
|
207
207
|
|
208
208
|
## Recent Changes (Polishing the Turd)
|
209
209
|
|
210
|
+
- [24-22-15] Fix CQWW points, fix mode showing as RPRT.
|
211
|
+
- [24-11-24-1] Add ESM to CQ160, ARRL VHF, ARRL 10M, 10 10 contests.
|
210
212
|
- [24-11-24] Added ESM to IARU HF and FieldDay.
|
211
213
|
- [24-11-23] Made macros per contest.
|
212
214
|
- [24-11-21] Merged PR from alduhoo setting CW Speed via rigctld, Added ESM and call history support for General Logging.
|
@@ -337,7 +337,8 @@ class CAT:
|
|
337
337
|
self.rigctrlsocket.send(b"m\n")
|
338
338
|
mode = self.__get_serial_string()
|
339
339
|
mode = mode.strip().split()[0]
|
340
|
-
|
340
|
+
if mode == "RPRT":
|
341
|
+
return ""
|
341
342
|
return mode
|
342
343
|
except IndexError as exception:
|
343
344
|
logger.debug("%s", f"{exception}")
|
@@ -0,0 +1,452 @@
|
|
1
|
+
"""10 10 fall cw plugin"""
|
2
|
+
|
3
|
+
# pylint: disable=invalid-name, unused-argument, unused-variable, c-extension-no-member, unused-import
|
4
|
+
|
5
|
+
import datetime
|
6
|
+
import logging
|
7
|
+
from pathlib import Path
|
8
|
+
|
9
|
+
from PyQt6 import QtWidgets
|
10
|
+
|
11
|
+
from not1mm.lib.plugin_common import gen_adif, get_points
|
12
|
+
from not1mm.lib.version import __version__
|
13
|
+
|
14
|
+
logger = logging.getLogger(__name__)
|
15
|
+
|
16
|
+
EXCHANGE_HINT = "Name + 10-10# + SPC"
|
17
|
+
|
18
|
+
name = "10 10 FALL CW"
|
19
|
+
cabrillo_name = "10-10-FALL-CW"
|
20
|
+
mode = "CW" # CW SSB BOTH RTTY
|
21
|
+
# columns = [0, 1, 2, 3, 4, 5, 6, 15]
|
22
|
+
columns = [
|
23
|
+
"YYYY-MM-DD HH:MM:SS",
|
24
|
+
"Call",
|
25
|
+
"Freq",
|
26
|
+
"Snt",
|
27
|
+
"Rcv",
|
28
|
+
"SentNr",
|
29
|
+
"RcvNr",
|
30
|
+
"PTS",
|
31
|
+
]
|
32
|
+
|
33
|
+
# 1 once per contest, 2 work each band, 3 each band/mode, 4 no dupe checking
|
34
|
+
dupe_type = 1
|
35
|
+
|
36
|
+
|
37
|
+
def init_contest(self):
|
38
|
+
"""setup plugin"""
|
39
|
+
set_tab_next(self)
|
40
|
+
set_tab_prev(self)
|
41
|
+
interface(self)
|
42
|
+
self.next_field = self.other_2
|
43
|
+
|
44
|
+
|
45
|
+
def interface(self):
|
46
|
+
"""Setup user interface"""
|
47
|
+
self.field1.show()
|
48
|
+
self.field2.show()
|
49
|
+
self.field3.hide()
|
50
|
+
self.field4.show()
|
51
|
+
self.snt_label.setText("SNT")
|
52
|
+
self.field1.setAccessibleName("RST Sent")
|
53
|
+
# label = self.field4.findChild(QtWidgets.QLabel)
|
54
|
+
self.exch_label.setText("Name 1010# SPC")
|
55
|
+
self.field4.setAccessibleName("Name 10 10 # SPC")
|
56
|
+
|
57
|
+
|
58
|
+
def reset_label(self):
|
59
|
+
"""reset label after field cleared"""
|
60
|
+
|
61
|
+
|
62
|
+
def set_tab_next(self):
|
63
|
+
"""Set TAB Advances"""
|
64
|
+
self.tab_next = {
|
65
|
+
self.callsign: self.sent,
|
66
|
+
self.sent: self.receive,
|
67
|
+
self.receive: self.other_2,
|
68
|
+
self.other_1: self.callsign,
|
69
|
+
self.other_2: self.callsign,
|
70
|
+
}
|
71
|
+
|
72
|
+
|
73
|
+
def set_tab_prev(self):
|
74
|
+
"""Set TAB Advances"""
|
75
|
+
self.tab_prev = {
|
76
|
+
self.callsign: self.other_2,
|
77
|
+
self.sent: self.callsign,
|
78
|
+
self.receive: self.sent,
|
79
|
+
self.other_1: self.receive,
|
80
|
+
self.other_2: self.receive,
|
81
|
+
}
|
82
|
+
|
83
|
+
|
84
|
+
def validate(self):
|
85
|
+
"""doc"""
|
86
|
+
exchange = self.other_2.text().upper().split()
|
87
|
+
if len(exchange) == 3:
|
88
|
+
if exchange[0].isalpha() and exchange[1].isdigit() and exchange[2].isalpha():
|
89
|
+
return True
|
90
|
+
return False
|
91
|
+
|
92
|
+
|
93
|
+
def set_contact_vars(self):
|
94
|
+
"""Contest Specific"""
|
95
|
+
self.contact["SNT"] = self.sent.text()
|
96
|
+
self.contact["RCV"] = self.receive.text()
|
97
|
+
self.contact["NR"] = self.other_2.text().upper()
|
98
|
+
self.contact["SentNr"] = self.contest_settings.get("SentExchange", 0)
|
99
|
+
exchange = self.other_2.text().upper().split()
|
100
|
+
if len(exchange) == 3:
|
101
|
+
self.contact["Name"] = exchange[0]
|
102
|
+
self.contact["Comment"] = name
|
103
|
+
if validate(self) is False:
|
104
|
+
self.show_message_box("The exchange was invalid.")
|
105
|
+
|
106
|
+
|
107
|
+
def predupe(self):
|
108
|
+
"""called after callsign entered"""
|
109
|
+
|
110
|
+
|
111
|
+
def prefill(self):
|
112
|
+
"""Fill sentnr"""
|
113
|
+
self.other_1.setText(str(self.contest_settings.get("SentExchange", 0)))
|
114
|
+
|
115
|
+
|
116
|
+
def points(self):
|
117
|
+
"""Calc point"""
|
118
|
+
exchange = self.other_2.text().upper().split()
|
119
|
+
if len(exchange) == 3:
|
120
|
+
try:
|
121
|
+
tentennumber = exchange[1]
|
122
|
+
if int(tentennumber) > 0:
|
123
|
+
return 2
|
124
|
+
return 1
|
125
|
+
except ValueError:
|
126
|
+
...
|
127
|
+
return 0
|
128
|
+
|
129
|
+
|
130
|
+
def show_mults(self):
|
131
|
+
"""Return display string for mults"""
|
132
|
+
return 0
|
133
|
+
|
134
|
+
|
135
|
+
def show_qso(self):
|
136
|
+
"""Return qso count"""
|
137
|
+
result = self.database.fetch_qso_count()
|
138
|
+
if result:
|
139
|
+
return int(result.get("qsos", 0))
|
140
|
+
return 0
|
141
|
+
|
142
|
+
|
143
|
+
def calc_score(self):
|
144
|
+
"""Return calculated score"""
|
145
|
+
result = self.database.fetch_points()
|
146
|
+
if result is not None:
|
147
|
+
score = result.get("Points", "0")
|
148
|
+
if score is None:
|
149
|
+
score = "0"
|
150
|
+
contest_points = int(score)
|
151
|
+
return contest_points
|
152
|
+
return 0
|
153
|
+
|
154
|
+
|
155
|
+
def adif(self):
|
156
|
+
"""Call the generate ADIF function"""
|
157
|
+
gen_adif(self, cabrillo_name)
|
158
|
+
|
159
|
+
|
160
|
+
def output_cabrillo_line(line_to_output, ending, file_descriptor, file_encoding):
|
161
|
+
""""""
|
162
|
+
print(
|
163
|
+
line_to_output.encode(file_encoding, errors="ignore").decode(),
|
164
|
+
end=ending,
|
165
|
+
file=file_descriptor,
|
166
|
+
)
|
167
|
+
|
168
|
+
|
169
|
+
def cabrillo(self, file_encoding):
|
170
|
+
"""Generates Cabrillo file. Maybe."""
|
171
|
+
# https://www.cqwpx.com/cabrillo.htm
|
172
|
+
logger.debug("******Cabrillo*****")
|
173
|
+
logger.debug("Station: %s", f"{self.station}")
|
174
|
+
logger.debug("Contest: %s", f"{self.contest_settings}")
|
175
|
+
now = datetime.datetime.now()
|
176
|
+
date_time = now.strftime("%Y-%m-%d_%H-%M-%S")
|
177
|
+
filename = (
|
178
|
+
str(Path.home())
|
179
|
+
+ "/"
|
180
|
+
+ f"{self.station.get('Call', '').upper()}_{cabrillo_name}_{date_time}.log"
|
181
|
+
)
|
182
|
+
logger.debug("%s", filename)
|
183
|
+
log = self.database.fetch_all_contacts_asc()
|
184
|
+
try:
|
185
|
+
with open(filename, "w", encoding=file_encoding) as file_descriptor:
|
186
|
+
output_cabrillo_line(
|
187
|
+
"START-OF-LOG: 3.0",
|
188
|
+
"\r\n",
|
189
|
+
file_descriptor,
|
190
|
+
file_encoding,
|
191
|
+
)
|
192
|
+
output_cabrillo_line(
|
193
|
+
f"CREATED-BY: Not1MM v{__version__}",
|
194
|
+
"\r\n",
|
195
|
+
file_descriptor,
|
196
|
+
file_encoding,
|
197
|
+
)
|
198
|
+
output_cabrillo_line(
|
199
|
+
f"CONTEST: {cabrillo_name}",
|
200
|
+
"\r\n",
|
201
|
+
file_descriptor,
|
202
|
+
file_encoding,
|
203
|
+
)
|
204
|
+
if self.station.get("Club", ""):
|
205
|
+
output_cabrillo_line(
|
206
|
+
f"CLUB: {self.station.get('Club', '').upper()}",
|
207
|
+
"\r\n",
|
208
|
+
file_descriptor,
|
209
|
+
file_encoding,
|
210
|
+
)
|
211
|
+
output_cabrillo_line(
|
212
|
+
f"CALLSIGN: {self.station.get('Call','')}",
|
213
|
+
"\r\n",
|
214
|
+
file_descriptor,
|
215
|
+
file_encoding,
|
216
|
+
)
|
217
|
+
output_cabrillo_line(
|
218
|
+
f"LOCATION: {self.station.get('ARRLSection', '')}",
|
219
|
+
"\r\n",
|
220
|
+
file_descriptor,
|
221
|
+
file_encoding,
|
222
|
+
)
|
223
|
+
output_cabrillo_line(
|
224
|
+
f"CATEGORY-OPERATOR: {self.contest_settings.get('OperatorCategory','')}",
|
225
|
+
"\r\n",
|
226
|
+
file_descriptor,
|
227
|
+
file_encoding,
|
228
|
+
)
|
229
|
+
output_cabrillo_line(
|
230
|
+
f"CATEGORY-ASSISTED: {self.contest_settings.get('AssistedCategory','')}",
|
231
|
+
"\r\n",
|
232
|
+
file_descriptor,
|
233
|
+
file_encoding,
|
234
|
+
)
|
235
|
+
output_cabrillo_line(
|
236
|
+
f"CATEGORY-BAND: {self.contest_settings.get('BandCategory','')}",
|
237
|
+
"\r\n",
|
238
|
+
file_descriptor,
|
239
|
+
file_encoding,
|
240
|
+
)
|
241
|
+
output_cabrillo_line(
|
242
|
+
f"CATEGORY-MODE: {self.contest_settings.get('ModeCategory','')}",
|
243
|
+
"\r\n",
|
244
|
+
file_descriptor,
|
245
|
+
file_encoding,
|
246
|
+
)
|
247
|
+
output_cabrillo_line(
|
248
|
+
f"CATEGORY-TRANSMITTER: {self.contest_settings.get('TransmitterCategory','')}",
|
249
|
+
"\r\n",
|
250
|
+
file_descriptor,
|
251
|
+
file_encoding,
|
252
|
+
)
|
253
|
+
if self.contest_settings.get("OverlayCategory", "") != "N/A":
|
254
|
+
output_cabrillo_line(
|
255
|
+
f"CATEGORY-OVERLAY: {self.contest_settings.get('OverlayCategory','')}",
|
256
|
+
"\r\n",
|
257
|
+
file_descriptor,
|
258
|
+
file_encoding,
|
259
|
+
)
|
260
|
+
output_cabrillo_line(
|
261
|
+
f"GRID-LOCATOR: {self.station.get('GridSquare','')}",
|
262
|
+
"\r\n",
|
263
|
+
file_descriptor,
|
264
|
+
file_encoding,
|
265
|
+
)
|
266
|
+
output_cabrillo_line(
|
267
|
+
f"CATEGORY-POWER: {self.contest_settings.get('PowerCategory','')}",
|
268
|
+
"\r\n",
|
269
|
+
file_descriptor,
|
270
|
+
file_encoding,
|
271
|
+
)
|
272
|
+
|
273
|
+
output_cabrillo_line(
|
274
|
+
f"CLAIMED-SCORE: {calc_score(self)}",
|
275
|
+
"\r\n",
|
276
|
+
file_descriptor,
|
277
|
+
file_encoding,
|
278
|
+
)
|
279
|
+
ops = f"@{self.station.get('Call','')}"
|
280
|
+
list_of_ops = self.database.get_ops()
|
281
|
+
for op in list_of_ops:
|
282
|
+
ops += f", {op.get('Operator', '')}"
|
283
|
+
output_cabrillo_line(
|
284
|
+
f"OPERATORS: {ops}",
|
285
|
+
"\r\n",
|
286
|
+
file_descriptor,
|
287
|
+
file_encoding,
|
288
|
+
)
|
289
|
+
output_cabrillo_line(
|
290
|
+
f"NAME: {self.station.get('Name', '')}",
|
291
|
+
"\r\n",
|
292
|
+
file_descriptor,
|
293
|
+
file_encoding,
|
294
|
+
)
|
295
|
+
output_cabrillo_line(
|
296
|
+
f"ADDRESS: {self.station.get('Street1', '')}",
|
297
|
+
"\r\n",
|
298
|
+
file_descriptor,
|
299
|
+
file_encoding,
|
300
|
+
)
|
301
|
+
output_cabrillo_line(
|
302
|
+
f"ADDRESS-CITY: {self.station.get('City', '')}",
|
303
|
+
"\r\n",
|
304
|
+
file_descriptor,
|
305
|
+
file_encoding,
|
306
|
+
)
|
307
|
+
output_cabrillo_line(
|
308
|
+
f"ADDRESS-STATE-PROVINCE: {self.station.get('State', '')}",
|
309
|
+
"\r\n",
|
310
|
+
file_descriptor,
|
311
|
+
file_encoding,
|
312
|
+
)
|
313
|
+
output_cabrillo_line(
|
314
|
+
f"ADDRESS-POSTALCODE: {self.station.get('Zip', '')}",
|
315
|
+
"\r\n",
|
316
|
+
file_descriptor,
|
317
|
+
file_encoding,
|
318
|
+
)
|
319
|
+
output_cabrillo_line(
|
320
|
+
f"ADDRESS-COUNTRY: {self.station.get('Country', '')}",
|
321
|
+
"\r\n",
|
322
|
+
file_descriptor,
|
323
|
+
file_encoding,
|
324
|
+
)
|
325
|
+
output_cabrillo_line(
|
326
|
+
f"EMAIL: {self.station.get('Email', '')}",
|
327
|
+
"\r\n",
|
328
|
+
file_descriptor,
|
329
|
+
file_encoding,
|
330
|
+
)
|
331
|
+
for contact in log:
|
332
|
+
the_date_and_time = contact.get("TS", "")
|
333
|
+
themode = contact.get("Mode", "")
|
334
|
+
if themode == "LSB" or themode == "USB":
|
335
|
+
themode = "PH"
|
336
|
+
frequency = str(int(contact.get("Freq", "0"))).rjust(5)
|
337
|
+
|
338
|
+
loggeddate = the_date_and_time[:10]
|
339
|
+
loggedtime = the_date_and_time[11:13] + the_date_and_time[14:16]
|
340
|
+
output_cabrillo_line(
|
341
|
+
f"QSO: {frequency} {themode} {loggeddate} {loggedtime} "
|
342
|
+
f"{contact.get('StationPrefix', '').ljust(13)} "
|
343
|
+
f"{str(contact.get('SNT', '')).ljust(3)} "
|
344
|
+
f"{str(contact.get('SentNr', '')).ljust(6)} "
|
345
|
+
f"{contact.get('Call', '').ljust(13)} "
|
346
|
+
f"{str(contact.get('RCV', '')).ljust(3)} "
|
347
|
+
f"{str(contact.get('NR', '')).ljust(6)}",
|
348
|
+
"\r\n",
|
349
|
+
file_descriptor,
|
350
|
+
file_encoding,
|
351
|
+
)
|
352
|
+
output_cabrillo_line("END-OF-LOG:", "\r\n", file_descriptor, file_encoding)
|
353
|
+
self.show_message_box(f"Cabrillo saved to: {filename}")
|
354
|
+
except IOError as exception:
|
355
|
+
logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
|
356
|
+
self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
|
357
|
+
return
|
358
|
+
|
359
|
+
|
360
|
+
def recalculate_mults(self):
|
361
|
+
"""Recalculates multipliers after change in logged qso."""
|
362
|
+
|
363
|
+
|
364
|
+
def process_esm(self, new_focused_widget=None, with_enter=False):
|
365
|
+
"""ESM State Machine"""
|
366
|
+
|
367
|
+
# self.pref["run_state"]
|
368
|
+
|
369
|
+
# -----===== Assigned F-Keys =====-----
|
370
|
+
# self.esm_dict["CQ"]
|
371
|
+
# self.esm_dict["EXCH"]
|
372
|
+
# self.esm_dict["QRZ"]
|
373
|
+
# self.esm_dict["AGN"]
|
374
|
+
# self.esm_dict["HISCALL"]
|
375
|
+
# self.esm_dict["MYCALL"]
|
376
|
+
# self.esm_dict["QSOB4"]
|
377
|
+
|
378
|
+
# ----==== text fields ====----
|
379
|
+
# self.callsign
|
380
|
+
# self.sent
|
381
|
+
# self.receive
|
382
|
+
# self.other_1
|
383
|
+
# self.other_2
|
384
|
+
|
385
|
+
if new_focused_widget is not None:
|
386
|
+
self.current_widget = self.inputs_dict.get(new_focused_widget)
|
387
|
+
|
388
|
+
# print(f"checking esm {self.current_widget=} {with_enter=} {self.pref.get("run_state")=}")
|
389
|
+
|
390
|
+
for a_button in [
|
391
|
+
self.esm_dict["CQ"],
|
392
|
+
self.esm_dict["EXCH"],
|
393
|
+
self.esm_dict["QRZ"],
|
394
|
+
self.esm_dict["AGN"],
|
395
|
+
self.esm_dict["HISCALL"],
|
396
|
+
self.esm_dict["MYCALL"],
|
397
|
+
self.esm_dict["QSOB4"],
|
398
|
+
]:
|
399
|
+
if a_button is not None:
|
400
|
+
self.restore_button_color(a_button)
|
401
|
+
|
402
|
+
buttons_to_send = []
|
403
|
+
|
404
|
+
if self.pref.get("run_state"):
|
405
|
+
if self.current_widget == "callsign":
|
406
|
+
if len(self.callsign.text()) < 3:
|
407
|
+
self.make_button_green(self.esm_dict["CQ"])
|
408
|
+
buttons_to_send.append(self.esm_dict["CQ"])
|
409
|
+
elif len(self.callsign.text()) > 2:
|
410
|
+
self.make_button_green(self.esm_dict["HISCALL"])
|
411
|
+
self.make_button_green(self.esm_dict["EXCH"])
|
412
|
+
buttons_to_send.append(self.esm_dict["HISCALL"])
|
413
|
+
buttons_to_send.append(self.esm_dict["EXCH"])
|
414
|
+
|
415
|
+
elif self.current_widget in ["other_2"]:
|
416
|
+
if self.other_2.text() == "":
|
417
|
+
self.make_button_green(self.esm_dict["AGN"])
|
418
|
+
buttons_to_send.append(self.esm_dict["AGN"])
|
419
|
+
else:
|
420
|
+
self.make_button_green(self.esm_dict["QRZ"])
|
421
|
+
buttons_to_send.append(self.esm_dict["QRZ"])
|
422
|
+
buttons_to_send.append("LOGIT")
|
423
|
+
|
424
|
+
if with_enter is True and bool(len(buttons_to_send)):
|
425
|
+
for button in buttons_to_send:
|
426
|
+
if button:
|
427
|
+
if button == "LOGIT":
|
428
|
+
self.save_contact()
|
429
|
+
continue
|
430
|
+
self.process_function_key(button)
|
431
|
+
else:
|
432
|
+
if self.current_widget == "callsign":
|
433
|
+
if len(self.callsign.text()) > 2:
|
434
|
+
self.make_button_green(self.esm_dict["MYCALL"])
|
435
|
+
buttons_to_send.append(self.esm_dict["MYCALL"])
|
436
|
+
|
437
|
+
elif self.current_widget in ["other_2"]:
|
438
|
+
if self.other_2.text() == "":
|
439
|
+
self.make_button_green(self.esm_dict["AGN"])
|
440
|
+
buttons_to_send.append(self.esm_dict["AGN"])
|
441
|
+
else:
|
442
|
+
self.make_button_green(self.esm_dict["EXCH"])
|
443
|
+
buttons_to_send.append(self.esm_dict["EXCH"])
|
444
|
+
buttons_to_send.append("LOGIT")
|
445
|
+
|
446
|
+
if with_enter is True and bool(len(buttons_to_send)):
|
447
|
+
for button in buttons_to_send:
|
448
|
+
if button:
|
449
|
+
if button == "LOGIT":
|
450
|
+
self.save_contact()
|
451
|
+
continue
|
452
|
+
self.process_function_key(button)
|