not1mm 24.3.9__py3-none-any.whl → 24.3.19__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. not1mm/__main__.py +2 -4
  2. not1mm/data/new_contest.ui +11 -1
  3. not1mm/data/not1mm.html +46 -108
  4. not1mm/lib/database.py +14 -0
  5. not1mm/lib/plugin_common.py +29 -2
  6. not1mm/lib/version.py +1 -1
  7. not1mm/plugins/10_10_fall_cw.py +2 -0
  8. not1mm/plugins/10_10_spring_cw.py +2 -0
  9. not1mm/plugins/10_10_summer_phone.py +2 -0
  10. not1mm/plugins/10_10_winter_phone.py +2 -0
  11. not1mm/plugins/arrl_10m.py +2 -0
  12. not1mm/plugins/arrl_dx_cw.py +2 -0
  13. not1mm/plugins/arrl_dx_ssb.py +2 -0
  14. not1mm/plugins/arrl_field_day.py +2 -0
  15. not1mm/plugins/arrl_ss_cw.py +2 -0
  16. not1mm/plugins/arrl_ss_phone.py +2 -0
  17. not1mm/plugins/arrl_vhf_jan.py +2 -0
  18. not1mm/plugins/arrl_vhf_jun.py +2 -0
  19. not1mm/plugins/arrl_vhf_sep.py +2 -0
  20. not1mm/plugins/canada_day.py +2 -0
  21. not1mm/plugins/cq_160_cw.py +411 -0
  22. not1mm/plugins/cq_160_ssb.py +411 -0
  23. not1mm/plugins/cq_wpx_cw.py +2 -0
  24. not1mm/plugins/cq_wpx_ssb.py +2 -0
  25. not1mm/plugins/cq_ww_cw.py +2 -0
  26. not1mm/plugins/cq_ww_ssb.py +2 -0
  27. not1mm/plugins/cwt.py +2 -0
  28. not1mm/plugins/iaru_hf.py +2 -0
  29. not1mm/plugins/jidx_cw.py +2 -0
  30. not1mm/plugins/jidx_ph.py +2 -0
  31. not1mm/plugins/naqp_cw.py +2 -0
  32. not1mm/plugins/naqp_ssb.py +2 -0
  33. not1mm/plugins/phone_weekly_test.py +2 -0
  34. not1mm/plugins/stew_perry_topband.py +2 -0
  35. not1mm/plugins/winter_field_day.py +2 -0
  36. {not1mm-24.3.9.dist-info → not1mm-24.3.19.dist-info}/METADATA +7 -1
  37. {not1mm-24.3.9.dist-info → not1mm-24.3.19.dist-info}/RECORD +43 -40
  38. {not1mm-24.3.9.dist-info → not1mm-24.3.19.dist-info}/WHEEL +1 -1
  39. testing/detectdark.py +35 -0
  40. testing/test.py +13 -11
  41. {not1mm-24.3.9.dist-info → not1mm-24.3.19.dist-info}/LICENSE +0 -0
  42. {not1mm-24.3.9.dist-info → not1mm-24.3.19.dist-info}/entry_points.txt +0 -0
  43. {not1mm-24.3.9.dist-info → not1mm-24.3.19.dist-info}/top_level.txt +0 -0
not1mm/__main__.py CHANGED
@@ -1173,8 +1173,9 @@ class MainWindow(QtWidgets.QMainWindow):
1173
1173
  "[F1-F12]\tSend (CW or Voice) macros.\n"
1174
1174
  "[CTRL-G]\tTune to a spot matching partial text in the callsign\n"
1175
1175
  "\tentry field (CAT Required).\n"
1176
- "[CTRL-SHIFT-K] Open CW text input field.\n"
1176
+ "[CTRL-M]\tMark Callsign to the bandmap window to work later."
1177
1177
  "[CTRL-S]\tSpot Callsign to the cluster.\n"
1178
+ "[CTRL-SHIFT-K] Open CW text input field.\n"
1178
1179
  )
1179
1180
 
1180
1181
  def filepicker(self, action: str) -> str:
@@ -2477,8 +2478,6 @@ class MainWindow(QtWidgets.QMainWindow):
2477
2478
  stripped_text = text.strip().replace(" ", "")
2478
2479
  self.callsign.setText(stripped_text)
2479
2480
  self.callsign.setCursorPosition(position)
2480
- results = self.mscp.super_check(stripped_text)
2481
- logger.debug(f"{results}")
2482
2481
 
2483
2482
  if " " in text:
2484
2483
  if stripped_text == "CW":
@@ -3013,7 +3012,6 @@ class MainWindow(QtWidgets.QMainWindow):
3013
3012
  None
3014
3013
  """
3015
3014
 
3016
- # https://www.cqwpx.com/cabrillo.htm
3017
3015
  logger.debug("******Cabrillo*****")
3018
3016
  self.contest.cabrillo(self)
3019
3017
 
@@ -262,6 +262,16 @@
262
262
  <string>CANADA DAY</string>
263
263
  </property>
264
264
  </item>
265
+ <item>
266
+ <property name="text">
267
+ <string>CQ 160 CW</string>
268
+ </property>
269
+ </item>
270
+ <item>
271
+ <property name="text">
272
+ <string>CQ 160 SSB</string>
273
+ </property>
274
+ </item>
265
275
  <item>
266
276
  <property name="text">
267
277
  <string>CQ WPX CW</string>
@@ -336,7 +346,7 @@
336
346
  </property>
337
347
  <property name="time">
338
348
  <time>
339
- <hour>0</hour>
349
+ <hour>16</hour>
340
350
  <minute>0</minute>
341
351
  <second>0</second>
342
352
  </time>
not1mm/data/not1mm.html CHANGED
@@ -152,23 +152,24 @@ figure figcaption {
152
152
  <div class="header"></div><div class="inner">
153
153
  <h2 id="toc_1">Not1MM</h2>
154
154
 
155
+ <p>The worlds #1 unfinished contest logger <sup>*According to my daughter Corinna.<sup></p>
155
156
 
156
157
  <h3 id="toc_1.1">What and why is Not1MM</h3>
157
158
 
158
- <p>Not1MM&#39;s interface is a blantent ripoff of N1MM.
159
+ <p>Not1MM&#39;s interface is a blatant ripoff of N1MM.
159
160
  It is NOT N1MM and any problem you have with this software should in no way reflect on their software.</p>
160
161
 
161
- <p>If you use Windows(tm) you should run away from this and use someother program.</p>
162
+ <p>If you use Windows(tm), you should run away from Not1MM and use someother program.</p>
162
163
 
163
- <p>I personally don&#39;t. While it may be possible to get N1MM working under Wine, I haven&#39;t checked, I&#39;d rather not have to jump thru the hoops.</p>
164
+ <p>I personally don&#39;t use Windows(tm). While it may be possible to get N1MM working under Wine, I haven&#39;t checked. I&#39;d rather not have to jump thru the hoops.</p>
164
165
 
165
166
  <p><strong>Currently this exists for my own personal amusement</strong>.
166
167
  Something to do in my free time.
167
- While I&#39;m not watching TV, Right vs Left political &#39;News&#39; programs, mind numbing &#39;Reality&#39; TV etc...</p>
168
+ While I&#39;m not watching TV, Right vs Left political &#39;News&#39; programs, mind numbing &#39;Reality&#39; shows etc...</p>
168
169
 
169
170
  <h3 id="toc_1.2">Current state</h3>
170
171
 
171
- <p>The current state is <q><strong>BETA</strong></q>. I&#39;ve used it for A few contests, and was able to work contacts and submit a cabrillo at the end. I&#39;m not a <q>Contester</q>. So I&#39;ll add contests as/if I work them. I&#39;m only one guy, so if you see a bug let me know. I don&#39;t do much of any Data or RTTY operating. This is why you don&#39;t see RTTY in the list of working contests. The Lord helps those who burn people at the... I mean who help themselves. Feel free to fill in that hole with a pull request.</p>
172
+ <p>The current state is <q><strong>BETA</strong></q>. I&#39;ve used it for a few contests, and was able to work contacts and submit a cabrillo at the end. I&#39;m not a <q>Contester</q>. So I&#39;ll add contests as/if I work them. I&#39;m only one guy, so if you see a bug let me know. I don&#39;t do much of any Data or RTTY operating. This is why you don&#39;t see RTTY in the list of working contests. The Lord helps those who burn people at the... I mean who help themselves. Feel free to fill in that hole with a pull request.</p>
172
173
 
173
174
  <h3 id="toc_1.4">List of should be working contests</h3>
174
175
 
@@ -178,11 +179,15 @@ While I&#39;m not watching TV, Right vs Left political &#39;News&#39; programs,
178
179
  <li>10 10 Spring CW</li>
179
180
  <li>10 10 Summer Phone</li>
180
181
  <li>10 10 Winter Phone</li>
182
+ <li>ARRL 10M</li>
181
183
  <li>ARRL DX CW</li>
182
184
  <li>ARRL DX SSB</li>
183
185
  <li>ARRL Field Day</li>
184
186
  <li>ARRL Sweepstakes CW</li>
185
187
  <li>ARRL Sweepstakes SSB</li>
188
+ <li>ARRL VHF January</li>
189
+ <li>ARRL VHF June</li>
190
+ <li>ARRL VHF September</li>
186
191
  <li>CQ WPX CW</li>
187
192
  <li>CQ WPX SSB</li>
188
193
  <li>CQ World Wide CW</li>
@@ -193,77 +198,22 @@ While I&#39;m not watching TV, Right vs Left political &#39;News&#39; programs,
193
198
  <li>Japan International DX SSB</li>
194
199
  <li>NAQP CW</li>
195
200
  <li>NAQP SSB</li>
201
+ <li>Phone Weekly Test</li>
196
202
  <li>RAC Canada Day</li>
203
+ <li>Stew Perry Topband</li>
204
+ <li>Winter Field Day</li>
197
205
  </ul>
198
206
 
199
207
  <h3 id="toc_1.5">Recent Changes</h3>
200
208
 
201
209
  <ul dir="auto">
202
- <li>[23-8-9] Add telnet matches to Check Window.</li>
203
- <li>[23-8-7] Control Remote Rig VFO with a bespoke USB VFO Knob.</li>
204
- <li>[23-8-6] Add parsing of local log to check window.</li>
205
- <li>[23-8-5] Add Check Window. Moved MASTER.SCP stuff to it&#39;s own class. Close sub windows when main app closes.</li>
210
+ <li>[24-3-9] Marked calls in the bandmap window colored Blue, until worked.</li>
211
+ <li>[24-3-7] Merged PR from @arodland for faster fuzzy SCP lookups.</li>
212
+ <li>[24-3-2-1] Added marking stations on the bandmap to work later with CTRL-M.</li>
213
+ <li>[24-3-2] Merged PR from @arodland for fuzzy SCP lookup.</li>
206
214
  </ul>
207
215
 
208
- <h3 id="toc_1.6">Installing from PyPi</h3>
209
-
210
- <h4 id="toc_1.6.1">Python and pip</h4>
211
-
212
- <p>This software is a Python package hosted on PyPi, and installable with the pip or pipx command. If this is your first exposure to pip you can get all the details from <a href="https://packaging.python.org/en/latest/tutorials/installing-packages/">The PyPA</a>. In short, most linux distros come with Python pre installed. If pip is not installed by default, you can usually load it through your package manager. For example <code>sudo apt install python3-pip</code> or <code>sudo dnf install python3-pip</code>.</p>
213
-
214
- <h4 id="toc_1.6.2">Installing with pip</h4>
215
-
216
- <p>I&#39;ve included what installation steps I took to install on fresh images of Ubuntu and Fedora below. YMMV.</p>
217
-
218
- <h5 id="toc_1.6.2.4">Ubuntu 22.04 LTS</h5>
219
-
220
- <pre><code class="language-bash">sudo apt update
221
- sudo apt upgrade
222
- sudo apt install -y libportaudio2 python3-pip python3-pyqt5 python3-numpy adwaita-qt
223
- pip install -U not1mm
224
- </code></pre>
225
-
226
- <h5 id="toc_1.6.2.4">Ubuntu 23.04</h5>
227
-
228
- <pre><code class="language-bash">sudo apt update
229
- sudo apt upgrade
230
- sudo apt install -y libportaudio2 adwaita-qt pipx
231
- pipx install not1mm
232
- pipx ensurepath
233
- </code></pre>
234
-
235
- <h5 id="toc_1.6.2.4">Fedora 38</h5>
236
-
237
- <pre><code class="language-bash">sudo dnf upgrade --refresh
238
- sudo dnf install python3-pip portaudio
239
- pip install not1mm
240
- </code></pre>
241
-
242
- <p>You can now open a new terminal and type <code>not1mm</code>. On it&#39;s first run, it may or may not install a lovely non AI generated
243
- icon, which you can later click on to launch the application.</p>
244
-
245
- <h4 id="toc_1.6.3">You may or may not get a warning message like</h4>
246
-
247
- <pre><code class="language-text">WARNING: The script not1mm is installed in &#39;/home/mbridak/.local/bin&#39; which is not on PATH.
248
- Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
249
- </code></pre>
250
-
251
- <p>If you do, just logout and back in, or reboot.</p>
252
-
253
- <h4 id="toc_1.6.4">Or this fan favorite</h4>
254
-
255
- <pre><code class="language-text">Warning: Ignoring XDG_SESSION_TYPE=wayland on Gnome. Use QT_QPA_PLATFORM=wayland to run on Wayland anyway.
256
- qt.qpa.plugin: Could not load the Qt platform plugin &quot;xcb&quot; in &quot;&quot; even though it was found.
257
- This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
258
- </code></pre>
259
-
260
- <p>To avoid this you can export an environment variable and launch the app like this:</p>
261
-
262
- <p><code>mbridak@vm:~$ export QT_QPA_PLATFORM=wayland; not1mm</code></p>
263
-
264
- <p>For a more permanent solution you can place the line <code>export QT_QPA_PLATFORM=wayland</code> in your home directories .bashrc file. Then after logging out and back in you should be able to launch it normally.</p>
265
-
266
- <h4 id="toc_1.6.5">Updating with pip/pipx</h4>
216
+ <h3 id="toc_1.6.5">Updating with pip/pipx</h3>
267
217
 
268
218
  <p>I&#39;ve been posting updates just about everyday. Sometimes multiple times a day. It&#39;s early days, so there is much to do. You can check for and install updates with <code>pip install -U not1mm</code> or if installed with pipx <code>pipx upgrade not1mm</code>.</p>
269
219
 
@@ -271,7 +221,7 @@ This application failed to start because no Qt platform plugin could be initiali
271
221
 
272
222
  <p>The audio library used, uses pipewire/portaudio. You may need to install portaudio. Ubuntu: <code>sudo apt install libportaudio2</code></p>
273
223
 
274
- <h4 id="toc_1.7.1">Dark mode on Ubuntu</h4>
224
+ <h3 id="toc_1.7.1">Dark mode on Ubuntu</h3>
275
225
 
276
226
  <p>I believe I figured out dark mode in Ubuntu and have it working on my shack PC that runs Ubuntu 22.04. The secret sauce seems to be installing adwaita-qt with apt, and setting an environment variable <code>QT_STYLE_OVERRIDE</code> to <code>Adwaita-Dark</code>. I set the environment variable in the start of the program if running on a Gnome platform. So you don&#39;t need to do that part.</p>
277
227
 
@@ -279,30 +229,6 @@ This application failed to start because no Qt platform plugin could be initiali
279
229
 
280
230
  <p>One side effect of Wayland is that we are not able to request for a window to regain or retain focus. So if you were to click on a spot in the bandmap window to tune to that spot, you would have to then click on the main window to continue entering contest data. I&#39;m aware of this, but I can not change it.</p>
281
231
 
282
- <h3 id="toc_1.9">Running from source</h3>
283
-
284
- <p>Since this is packaged for PyPi, if you want to work on your own source branch, after cloning from github you would:</p>
285
-
286
- <pre><code class="language-bash">pip install --upgrade pip
287
- pip install setuptools
288
- pip install build
289
- source rebuild.sh
290
- </code></pre>
291
-
292
- <p>from the root directory. This installs a build chain and a local editable copy of not1mm.</p>
293
-
294
- <p>There&#39;s two ways to launch the program from the local editable copy.</p>
295
-
296
- <p>You can either be in the root of the source directory and type:</p>
297
-
298
- <pre><code class="language-bash">python not1mm
299
- </code></pre>
300
-
301
- <p>or be in some other directory and just type:</p>
302
-
303
- <pre><code class="language-bash">not1mm
304
- </code></pre>
305
-
306
232
  <h3 id="toc_1.10">Various data file locations</h3>
307
233
 
308
234
  <h4 id="toc_1.10.1">Data</h4>
@@ -335,12 +261,6 @@ source rebuild.sh
335
261
 
336
262
  <p>After initial run of the program or creating a new database you will need to fill out the Station Settings dialog that will pop up.</p>
337
263
 
338
- <p>You can fill it out if you want to. You can leave our friends behind. &#39;Cause your friends don&#39;t fill, and if they don&#39;t fill. Well, they&#39;re no friends of mine.</p>
339
-
340
- <p>You can fill. You can fill. Everyone look at your keys.</p>
341
-
342
- <p><a href="https://www.youtube.com/watch?v=nM4okRvCg2g"><strong>I forgot my hat today</strong></a>.</p>
343
-
344
264
  <h4 id="toc_1.12.1">Changing station information</h4>
345
265
 
346
266
  <p>Station information can be changed any time by going to <code>File</code> &gt; <code>Station Settings</code> and editing the information.</p>
@@ -363,7 +283,7 @@ source rebuild.sh
363
283
 
364
284
  <p>The tabs for groups and n1mm are disabled and are for future expansion.</p>
365
285
 
366
- <h4 id="toc_1.16.1">Lookup</h4>
286
+ <<h4 id="toc_1.16.1">Lookup</h4>
367
287
 
368
288
  <p>For callsign lookup, Two services are supported. QRZ and HamQTH. They require a username and password, Enter it here.</p>
369
289
 
@@ -373,7 +293,7 @@ source rebuild.sh
373
293
 
374
294
  <h4 id="toc_1.16.3">CAT</h4>
375
295
 
376
- <p>Under the <code>CAT</code> TAB, you can choose either <code>rigctld</code> normally with an IP of <code>127.0.0.1</code> and a port of <code>4532</code>. Or <code>flrig</code>, IP normally of <code>127.0.0.1</code> and a port of <code>12345</code>. <code>None</code> is always an option, but is it really?</p>
296
+ <p>Under the <code>CAT</code> TAB, you can choose either <code>rigctld</code> normally with an IP of <code>127.0.0.1</code> and a port of <code>4532</code>. Or <code>flrig</code>, IP normally of <code>127.0.0.1</code> and a port of <code>12345</code>. <code>None</code> is always an option, but is it really? There&#39;s an onscreen icon for CAT status. Green good, Red bad, Grey neither.</p>
377
297
 
378
298
  <h4 id="toc_1.16.4">CW Keyer interface</h4>
379
299
 
@@ -389,11 +309,13 @@ source rebuild.sh
389
309
 
390
310
  <p>When entering IP and Ports, enter them with a colon &#39;:&#39; between them. You can enter multiple pairs on the same line if separated by a space &#39; &#39;.</p>
391
311
 
392
- <h3 id="toc_1.17">Hiding screen elements</h3>
312
+ <h4 id="toc_1.16.7">Bands</h4>
313
+
314
+ <p>You can define which bands appear in the main window. Those with checkmarks will appear. Those without will not.</p>
393
315
 
394
- <p>You can show or hide certain buttons/indicators by checking and unchecking their boxes under the view menu. You can then resize the screen to make it more compact.</p>
316
+ <h3 id="toc_1.17">Sending CW</h3>
395
317
 
396
- <p>The your choices will be remembered when you relaunch the program.</p>
318
+ <p>Other than sending CW by hand, you can also send predefined CW text messages by pressing F1 - F12. See next section on Editing macro keys. If you need to send something freeform, you can press CTRL-SHIFT-K, this will expose an entry field at the bottom of the window which you can type directly into. When you&#39;re done you can either press CTRL-SHIFT-K again, or press the Enter Key to close the field.</p>
397
319
 
398
320
  <h3 id="toc_1.18">Editing macro keys</h3>
399
321
 
@@ -529,9 +451,17 @@ source rebuild.sh
529
451
  <td>Spot Callsign to the cluster.</td>
530
452
  </tr>
531
453
  <tr>
454
+ <td>[CTRL-M]</td>
455
+ <td>Mark Callsign to the bandmap window to work later.</td>
456
+ </tr>
457
+ <tr>
532
458
  <td>[CTRL-G]</td>
533
459
  <td>Tune to a spot matching partial text in the callsign entry field (CAT Required).</td>
534
460
  </tr>
461
+ <tr>
462
+ <td>[CTRL-SHIFT-K]</td>
463
+ <td>Open CW text input field.</td>
464
+ </tr>
535
465
  </tbody>
536
466
  </table>
537
467
 
@@ -582,17 +512,23 @@ source rebuild.sh
582
512
  <li>Then... <code>Window</code>&gt;<code>VFO</code></li>
583
513
  </ol>
584
514
 
515
+ <p><img src="https://github.com/mbridak/not1mm/raw/master/pic/vfo.png" alt="VFO"></p>
516
+
585
517
  <h3 id="toc_1.26">Cabrillo</h3>
586
518
 
587
519
  <p>Click on <code>File</code> &gt; <code>Generate Cabrillo</code></p>
588
520
 
589
521
  <p>The file will be placed in your home directory. The name will be in the format of:</p>
590
522
 
591
- <p><code>StationCall</code>_<code>ContestName</code>.log</p>
523
+ <p><code>StationCall</code>_<code>ContestName</code>_<code>CurrentDate</code>_<code>CurrentTime</code>.log</p>
524
+
525
+ <p>So for me it would look like:</p>
592
526
 
593
- <p>So for me it would be:</p>
527
+ <p>K6GTE_CANADA-DAY_2023-09-04_07-47-05.log</p>
594
528
 
595
- <p>K6GTE_CQ-WPX-SSB.log</p>
529
+ <p>Look, a log <a href="https://www.youtube.com/watch?v=El41sHXck-E">eh</a>?</p>
530
+
531
+ <p><a href="https://www.youtube.com/watch?v=oMI23JJUpGE">This</a> outlines some differences between ARRL Field Day and Canada Day.</p>
596
532
 
597
533
  <h3 id="toc_1.27">ADIF</h3>
598
534
 
@@ -600,7 +536,7 @@ source rebuild.sh
600
536
 
601
537
  <p>Boom... ADIF</p>
602
538
 
603
- <p><code>StationCall</code>_<code>ContestName</code>.adi</p>
539
+ <p><code>StationCall</code>_<code>ContestName</code>_<code>Date</code>_<code>Time</code>.adi</p>
604
540
 
605
541
  <h3 id="toc_1.28">Dupe checking</h3>
606
542
 
@@ -616,6 +552,8 @@ source rebuild.sh
616
552
 
617
553
  <p>This was a pain in the tukus. There are so many elements to the exchange, and one input field aside from the callsign field. So I had to write sort of a &#39;parser&#39;. The parser moves over your input string following some basic rules and is re-evaluated with each keypress and the parsed result will be displayed in the label over the field. The exchange looks like <code>124 A K6GTE 17 ORG</code>, a Serial number, Precidence, Callsign, Year Licenced and Section. even though the callsign is given as part of the exchange, the callsign does not have to be entered and is pulled from the callsign field. If the exchange was entered as <code>124 A 17 ORG</code> you would see:</p>
618
554
 
555
+ <p><img src="https://github.com/mbridak/not1mm/raw/master/pic/ss_parser_1.png" alt="SS Parser Result"></p>
556
+
619
557
  <p>You can enter the serial number and precidence, or the year and section as pairs. For instance <code>124A 17ORG</code>. This would ensure the values get parsed correctly.</p>
620
558
 
621
559
  <p>You do not have to go back to correct typing. You can just tack the correct items to the end of the field and the older values will get overwritten. So if you entered <code>124A 17ORG Q</code>, the precidence will change from A to Q. If you need to change the serial number you must append the precidence to it, <code>125A</code>.</p>
not1mm/lib/database.py CHANGED
@@ -869,6 +869,20 @@ class DataBase:
869
869
  logger.debug("%s", exception)
870
870
  return {}
871
871
 
872
+ def fetch_mult1_count(self) -> dict:
873
+ """return QSO count"""
874
+ try:
875
+ with sqlite3.connect(self.database) as conn:
876
+ conn.row_factory = self.row_factory
877
+ cursor = conn.cursor()
878
+ cursor.execute(
879
+ f"select count(*) as count from dxlog where IsMultiplier1 = 1 and ContestNR = {self.current_contest};"
880
+ )
881
+ return cursor.fetchone()
882
+ except sqlite3.OperationalError as exception:
883
+ logger.debug("%s", exception)
884
+ return {}
885
+
872
886
  def fetch_qso_count(self) -> dict:
873
887
  """return QSO count"""
874
888
  try:
@@ -36,6 +36,8 @@ def gen_adif(self, cabrillo_name: str, contest_id=""):
36
36
  hisname = contact.get("Name", "")
37
37
  the_date_and_time = contact.get("TS", "")
38
38
  themode = contact.get("Mode", "")
39
+ if themode == "CWR":
40
+ themode = "CW"
39
41
  frequency = str(Decimal(str(contact.get("Freq", 0))) / 1000)
40
42
  band = get_adif_band(Decimal(str(contact.get("Freq", 0))) / 1000)
41
43
  sentrst = contact.get("SNT", "")
@@ -43,6 +45,7 @@ def gen_adif(self, cabrillo_name: str, contest_id=""):
43
45
  sentnr = str(contact.get("SentNr", "0"))
44
46
  rcvnr = str(contact.get("NR", "0"))
45
47
  grid = contact.get("GridSquare", "")
48
+ pfx = contact.get("CountryPrefix", "")
46
49
  comment = contact.get("Comment", "")
47
50
  loggeddate = the_date_and_time[:10]
48
51
  loggedtime = (
@@ -175,6 +178,19 @@ def gen_adif(self, cabrillo_name: str, contest_id=""):
175
178
  except TypeError:
176
179
  ...
177
180
 
181
+ # cabrillo_name = "CQ-160-CW"
182
+ try:
183
+ if cabrillo_name in ("CQ-160-CW", "CQ-160-SSB"):
184
+ rcv = f"{contact.get('Exchange1', '')}"
185
+ if len(rcv) > 1:
186
+ print(
187
+ f"<SRX_STRING:{len(rcv)}>{rcv.upper()}",
188
+ end="\r\n",
189
+ file=file_descriptor,
190
+ )
191
+ except TypeError:
192
+ ...
193
+
178
194
  try:
179
195
  if len(grid) > 1:
180
196
  print(
@@ -185,6 +201,16 @@ def gen_adif(self, cabrillo_name: str, contest_id=""):
185
201
  except TypeError:
186
202
  ...
187
203
 
204
+ try:
205
+ if len(pfx) > 0:
206
+ print(
207
+ f"<PFX:{len(pfx)}>{pfx}",
208
+ end="\r\n",
209
+ file=file_descriptor,
210
+ )
211
+ except TypeError:
212
+ ...
213
+
188
214
  try:
189
215
  if len(contest_id) > 1:
190
216
  print(
@@ -207,5 +233,6 @@ def gen_adif(self, cabrillo_name: str, contest_id=""):
207
233
 
208
234
  print("<EOR>", end="\r\n", file=file_descriptor)
209
235
  print("", end="\r\n", file=file_descriptor)
210
- except IOError:
211
- ...
236
+ self.show_message_box(f"ADIF saved to: {filename}")
237
+ except IOError as error:
238
+ self.show_message_box(f"Error saving ADIF file: {error}")
not1mm/lib/version.py CHANGED
@@ -1,3 +1,3 @@
1
1
  """It's the version"""
2
2
 
3
- __version__ = "24.3.9"
3
+ __version__ = "24.3.19"
@@ -331,8 +331,10 @@ def cabrillo(self):
331
331
  file=file_descriptor,
332
332
  )
333
333
  print("END-OF-LOG:", end="\r\n", file=file_descriptor)
334
+ self.show_message_box(f"Cabrillo saved to: {filename}")
334
335
  except IOError as exception:
335
336
  logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
337
+ self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
336
338
  return
337
339
 
338
340
 
@@ -331,8 +331,10 @@ def cabrillo(self):
331
331
  file=file_descriptor,
332
332
  )
333
333
  print("END-OF-LOG:", end="\r\n", file=file_descriptor)
334
+ self.show_message_box(f"Cabrillo saved to: {filename}")
334
335
  except IOError as exception:
335
336
  logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
337
+ self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
336
338
  return
337
339
 
338
340
 
@@ -332,8 +332,10 @@ def cabrillo(self):
332
332
  file=file_descriptor,
333
333
  )
334
334
  print("END-OF-LOG:", end="\r\n", file=file_descriptor)
335
+ self.show_message_box(f"Cabrillo saved to: {filename}")
335
336
  except IOError as exception:
336
337
  logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
338
+ self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
337
339
  return
338
340
 
339
341
 
@@ -332,8 +332,10 @@ def cabrillo(self):
332
332
  file=file_descriptor,
333
333
  )
334
334
  print("END-OF-LOG:", end="\r\n", file=file_descriptor)
335
+ self.show_message_box(f"Cabrillo saved to: {filename}")
335
336
  except IOError as exception:
336
337
  logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
338
+ self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
337
339
  return
338
340
 
339
341
 
@@ -414,8 +414,10 @@ def cabrillo(self):
414
414
  file=file_descriptor,
415
415
  )
416
416
  print("END-OF-LOG:", end="\r\n", file=file_descriptor)
417
+ self.show_message_box(f"Cabrillo saved to: {filename}")
417
418
  except IOError as exception:
418
419
  logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
420
+ self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
419
421
  return
420
422
 
421
423
 
@@ -356,8 +356,10 @@ def cabrillo(self):
356
356
  file=file_descriptor,
357
357
  )
358
358
  print("END-OF-LOG:", end="\r\n", file=file_descriptor)
359
+ self.show_message_box(f"Cabrillo saved to: {filename}")
359
360
  except IOError as exception:
360
361
  logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
362
+ self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
361
363
  return
362
364
 
363
365
 
@@ -356,8 +356,10 @@ def cabrillo(self):
356
356
  file=file_descriptor,
357
357
  )
358
358
  print("END-OF-LOG:", end="\r\n", file=file_descriptor)
359
+ self.show_message_box(f"Cabrillo saved to: {filename}")
359
360
  except IOError as exception:
360
361
  logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
362
+ self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
361
363
  return
362
364
 
363
365
 
@@ -308,8 +308,10 @@ def cabrillo(self):
308
308
  file=file_descriptor,
309
309
  )
310
310
  print("END-OF-LOG:", end="\r\n", file=file_descriptor)
311
+ self.show_message_box(f"Cabrillo saved to: {filename}")
311
312
  except IOError as exception:
312
313
  logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
314
+ self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
313
315
  return
314
316
 
315
317
 
@@ -346,8 +346,10 @@ def cabrillo(self):
346
346
  file=file_descriptor,
347
347
  )
348
348
  print("END-OF-LOG:", end="\r\n", file=file_descriptor)
349
+ self.show_message_box(f"Cabrillo saved to: {filename}")
349
350
  except IOError as exception:
350
351
  logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
352
+ self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
351
353
  return
352
354
 
353
355
 
@@ -346,8 +346,10 @@ def cabrillo(self):
346
346
  file=file_descriptor,
347
347
  )
348
348
  print("END-OF-LOG:", end="\r\n", file=file_descriptor)
349
+ self.show_message_box(f"Cabrillo saved to: {filename}")
349
350
  except IOError as exception:
350
351
  logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
352
+ self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
351
353
  return
352
354
 
353
355
 
@@ -390,8 +390,10 @@ def cabrillo(self):
390
390
  file=file_descriptor,
391
391
  )
392
392
  print("END-OF-LOG:", end="\r\n", file=file_descriptor)
393
+ self.show_message_box(f"Cabrillo saved to: {filename}")
393
394
  except IOError as exception:
394
395
  logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
396
+ self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
395
397
  return
396
398
 
397
399
 
@@ -358,8 +358,10 @@ def cabrillo(self):
358
358
  file=file_descriptor,
359
359
  )
360
360
  print("END-OF-LOG:", end="\r\n", file=file_descriptor)
361
+ self.show_message_box(f"Cabrillo saved to: {filename}")
361
362
  except IOError as exception:
362
363
  logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
364
+ self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
363
365
  return
364
366
 
365
367
 
@@ -358,8 +358,10 @@ def cabrillo(self):
358
358
  file=file_descriptor,
359
359
  )
360
360
  print("END-OF-LOG:", end="\r\n", file=file_descriptor)
361
+ self.show_message_box(f"Cabrillo saved to: {filename}")
361
362
  except IOError as exception:
362
363
  logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
364
+ self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
363
365
  return
364
366
 
365
367
 
@@ -388,8 +388,10 @@ def cabrillo(self):
388
388
  file=file_descriptor,
389
389
  )
390
390
  print("END-OF-LOG:", end="\r\n", file=file_descriptor)
391
+ self.show_message_box(f"Cabrillo saved to: {filename}")
391
392
  except IOError as exception:
392
393
  logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
394
+ self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
393
395
  return
394
396
 
395
397