not1mm 23.3.24.1__tar.gz → 23.3.27__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. {not1mm-23.3.24.1 → not1mm-23.3.27}/PKG-INFO +12 -1
  2. {not1mm-23.3.24.1 → not1mm-23.3.27}/README.md +11 -0
  3. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/__main__.py +24 -131
  4. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/main.ui +6 -0
  5. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/database.py +24 -0
  6. not1mm-23.3.27/not1mm/lib/version.py +2 -0
  7. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/logwindow.py +0 -0
  8. not1mm-23.3.27/not1mm/plugins/cq_wpx_cw.py +389 -0
  9. not1mm-23.3.27/not1mm/plugins/cq_wpx_ssb.py +389 -0
  10. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm.egg-info/PKG-INFO +12 -1
  11. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm.egg-info/SOURCES.txt +1 -0
  12. {not1mm-23.3.24.1 → not1mm-23.3.27}/pyproject.toml +1 -1
  13. not1mm-23.3.24.1/not1mm/lib/version.py +0 -2
  14. not1mm-23.3.24.1/not1mm/plugins/cq_wpx_ssb.py +0 -158
  15. {not1mm-23.3.24.1 → not1mm-23.3.27}/LICENSE +0 -0
  16. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/__init__.py +0 -0
  17. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/Combinear.qss +0 -0
  18. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/JetBrainsMono-Regular.ttf +0 -0
  19. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/MASTER.SCP +0 -0
  20. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/check.png +0 -0
  21. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/contests.sql +0 -0
  22. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/cty.json +0 -0
  23. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/cwmacros.txt +0 -0
  24. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/editcontact.ui +0 -0
  25. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/editmacro.ui +0 -0
  26. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/greendot.png +0 -0
  27. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/k6gte-not1mm.desktop +0 -0
  28. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/k6gte.not1mm-128.png +0 -0
  29. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/k6gte.not1mm-32.png +0 -0
  30. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/k6gte.not1mm-64.png +0 -0
  31. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/logwindow.ui +0 -0
  32. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/opon.ui +0 -0
  33. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/reddot.png +0 -0
  34. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/settings.ui +0 -0
  35. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/data/use_qrz_dialog.ui +0 -0
  36. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/__init__.py +0 -0
  37. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/cat_interface.py +0 -0
  38. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/cwinterface.py +0 -0
  39. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/edit_contact.py +0 -0
  40. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/edit_macro.py +0 -0
  41. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/edit_opon.py +0 -0
  42. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/edit_settings.py +0 -0
  43. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/ham_utility.py +0 -0
  44. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/lookup.py +0 -0
  45. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/multicast.py +0 -0
  46. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/n1mm.py +0 -0
  47. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/lib/qrz_dialog.py +0 -0
  48. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/plugins/__init__.py +0 -0
  49. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/plugins/arrl_dx_cw.py +0 -0
  50. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/plugins/arrl_dx_phone.py +0 -0
  51. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/plugins/arrl_field_day.py +0 -0
  52. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/plugins/arrl_rtty_ru.py +0 -0
  53. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/plugins/arrl_ss_cw.py +0 -0
  54. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/plugins/arrl_ss_phone.py +0 -0
  55. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/plugins/cqww_dx_cw.py +0 -0
  56. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/plugins/cqww_dx_ssb.py +0 -0
  57. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/plugins/general_logging.py +0 -0
  58. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/plugins/winter_field_day.py +0 -0
  59. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm/test.py +0 -0
  60. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm.egg-info/dependency_links.txt +0 -0
  61. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm.egg-info/entry_points.txt +0 -0
  62. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm.egg-info/requires.txt +0 -0
  63. {not1mm-23.3.24.1 → not1mm-23.3.27}/not1mm.egg-info/top_level.txt +0 -0
  64. {not1mm-23.3.24.1 → not1mm-23.3.27}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: not1mm
3
- Version: 23.3.24.1
3
+ Version: 23.3.27
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
@@ -40,6 +40,7 @@ License-File: LICENSE
40
40
  - [Log Display](#log-display)
41
41
  - [Editing a contact](#editing-a-contact)
42
42
  - [Cabrillo](#cabrillo)
43
+ - [ADIF](#adif)
43
44
  - [Dupe checking](#dupe-checking)
44
45
  - [CAT](#cat)
45
46
 
@@ -70,6 +71,8 @@ Feature complete.
70
71
 
71
72
  ## Changes of note
72
73
 
74
+ - [23-3-27] Fix cursor behaviour when editing text in callsign field.
75
+ - [23-3-25] Fix minimum call length. Fix cabrillo tag. Add adif output.
73
76
  - [23-3-24] Added dupe checking. Added CAT check for flrig or rigctld. Added online flag for flrig.
74
77
  - [23-3-23] Added most of Cabrillo generation. Plan to test it this weekends CQ WPX SSB.
75
78
  - [23-3-22] Add prefill of serial nr. set OP call on startup. Set IsMultiplier1 new unique wpx. Add OP and contest name to window title. and stuff.
@@ -192,6 +195,14 @@ So for me it would be:
192
195
 
193
196
  K6GTE_CQ-WPX-SSB.log
194
197
 
198
+ ## ADIF
199
+
200
+ `File` > `Generate ADIF`
201
+
202
+ Boom... ADIF
203
+
204
+ `StationCall`_`ContestName`.adi
205
+
195
206
  ## Dupe checking
196
207
 
197
208
  Added dupe checking. Big Red 'Dupe' will appear if it's a dupe...
@@ -21,6 +21,7 @@
21
21
  - [Log Display](#log-display)
22
22
  - [Editing a contact](#editing-a-contact)
23
23
  - [Cabrillo](#cabrillo)
24
+ - [ADIF](#adif)
24
25
  - [Dupe checking](#dupe-checking)
25
26
  - [CAT](#cat)
26
27
 
@@ -51,6 +52,8 @@ Feature complete.
51
52
 
52
53
  ## Changes of note
53
54
 
55
+ - [23-3-27] Fix cursor behaviour when editing text in callsign field.
56
+ - [23-3-25] Fix minimum call length. Fix cabrillo tag. Add adif output.
54
57
  - [23-3-24] Added dupe checking. Added CAT check for flrig or rigctld. Added online flag for flrig.
55
58
  - [23-3-23] Added most of Cabrillo generation. Plan to test it this weekends CQ WPX SSB.
56
59
  - [23-3-22] Add prefill of serial nr. set OP call on startup. Set IsMultiplier1 new unique wpx. Add OP and contest name to window title. and stuff.
@@ -173,6 +176,14 @@ So for me it would be:
173
176
 
174
177
  K6GTE_CQ-WPX-SSB.log
175
178
 
179
+ ## ADIF
180
+
181
+ `File` > `Generate ADIF`
182
+
183
+ Boom... ADIF
184
+
185
+ `StationCall`_`ContestName`.adi
186
+
176
187
  ## Dupe checking
177
188
 
178
189
  Added dupe checking. Big Red 'Dupe' will appear if it's a dupe...
@@ -206,6 +206,7 @@ class MainWindow(QtWidgets.QMainWindow):
206
206
  self.actionPreferences.triggered.connect(self.preference_selected)
207
207
  self.actionQRZ_Settings.triggered.connect(self.qrz_preference_selected)
208
208
  self.actionGenerate_Cabrillo.triggered.connect(self.generate_cabrillo)
209
+ self.actionGenerate_ADIF.triggered.connect(self.generate_adif)
209
210
  self.actionLog_Window.triggered.connect(self.launch_log_window)
210
211
  self.radioButton_run.clicked.connect(self.run_sp_buttons_clicked)
211
212
  self.radioButton_sp.clicked.connect(self.run_sp_buttons_clicked)
@@ -511,7 +512,7 @@ class MainWindow(QtWidgets.QMainWindow):
511
512
  def save_contact(self):
512
513
  """Save to db"""
513
514
  logger.debug("saving")
514
- if len(self.callsign.text()) < 4:
515
+ if len(self.callsign.text()) < 3:
515
516
  return
516
517
  if not any(char.isdigit() for char in self.callsign.text()):
517
518
  return
@@ -662,7 +663,7 @@ class MainWindow(QtWidgets.QMainWindow):
662
663
 
663
664
  def select_contest(self):
664
665
  """Load contest"""
665
- self.contest = doimp("cq_wpx_ssb")
666
+ self.contest = doimp("cq_wpx_cw")
666
667
  logger.debug("Loaded Contest Name = %s", self.contest.name)
667
668
  self.contest.init_contest(self)
668
669
 
@@ -983,10 +984,12 @@ class MainWindow(QtWidgets.QMainWindow):
983
984
  """Called when text in the callsign field has changed"""
984
985
  text = self.callsign.text()
985
986
  text = text.upper()
986
- stripped_text = text.strip()
987
+ position = self.callsign.cursorPosition()
988
+ stripped_text = text.strip().replace(" ", "")
987
989
  self.callsign.setText(stripped_text)
990
+ self.callsign.setCursorPosition(position)
988
991
 
989
- if text[-1:] == " ":
992
+ if " " in text:
990
993
  if stripped_text == "CW":
991
994
  self.setmode("CW")
992
995
  self.radio_state["mode"] = "CW"
@@ -1112,9 +1115,18 @@ class MainWindow(QtWidgets.QMainWindow):
1112
1115
  """Checks if a callsign is a dupe on current band/mode."""
1113
1116
  band = float(get_logged_band(str(self.radio_state.get("vfoa", 0.0))))
1114
1117
  mode = self.radio_state.get("mode", "")
1115
- debugline = f"Call: {call} Band: {band} Mode: {mode}"
1118
+ debugline = (
1119
+ f"Call: {call} Band: {band} Mode: {mode} Dupetype: {self.contest.dupe_type}"
1120
+ )
1116
1121
  logger.debug("%s", debugline)
1117
- result = self.database.check_dupe_on_band_mode(call, band, mode)
1122
+ if self.contest.dupe_type == 1:
1123
+ result = self.database.check_dupe(call)
1124
+ if self.contest.dupe_type == 2:
1125
+ result = self.database.check_dupe_on_band(call, band)
1126
+ if self.contest.dupe_type == 3:
1127
+ result = self.database.check_dupe_on_band_mode(call, band, mode)
1128
+ if self.contest.dupe_type == 4:
1129
+ result = {"isdupe": False}
1118
1130
  debugline = f"{result}"
1119
1131
  logger.debug("%s", debugline)
1120
1132
  return result.get("isdupe", False)
@@ -1232,135 +1244,16 @@ class MainWindow(QtWidgets.QMainWindow):
1232
1244
  self.F12.setText(f"F12: {self.fkeys['F12'][0]}")
1233
1245
  self.F12.setToolTip(self.fkeys["F12"][1])
1234
1246
 
1247
+ def generate_adif(self):
1248
+ """Generate ADIF"""
1249
+ logger.debug("******ADIF*****")
1250
+ self.contest.adif(self)
1251
+
1235
1252
  def generate_cabrillo(self):
1236
1253
  """Generates Cabrillo file. Maybe."""
1237
1254
  # https://www.cqwpx.com/cabrillo.htm
1238
1255
  logger.debug("******Cabrillo*****")
1239
- filename = (
1240
- str(Path.home())
1241
- + "/"
1242
- + f"{self.pref.get('callsign').upper()}_{self.contest.cabrillo_name}.log"
1243
- )
1244
- logger.debug("%s", filename)
1245
- # self.infobox.setTextColor(QtGui.QColor(211, 215, 207))
1246
- # self.infobox.insertPlainText(f"Saving cabrillo to: {filename}")
1247
- # app.processEvents()
1248
- # bonuses = 0
1249
- log = self.database.fetch_all_contacts_asc()
1250
- # catpower = ""
1251
- try:
1252
- with open(filename, "w", encoding="ascii") as file_descriptor:
1253
- print("START-OF-LOG: 3.0", end="\r\n", file=file_descriptor)
1254
- print(
1255
- f"CREATED-BY: Not1MM v{__version__}",
1256
- end="\r\n",
1257
- file=file_descriptor,
1258
- )
1259
- print(
1260
- f"CONTEST: {self.contest.cabrillo_name}",
1261
- end="\r\n",
1262
- file=file_descriptor,
1263
- )
1264
- print(
1265
- f"CALLSIGN: {self.pref.get('callsign','')}",
1266
- end="\r\n",
1267
- file=file_descriptor,
1268
- )
1269
- print(
1270
- f"LOCATION: {self.pref.get('section', '')}",
1271
- end="\r\n",
1272
- file=file_descriptor,
1273
- )
1274
- # print(
1275
- # f"ARRL-SECTION: {self.pref.get('section', '')}",
1276
- # end="\r\n",
1277
- # file=file_descriptor,
1278
- # )
1279
- print(
1280
- f"CATEGORY: {None}",
1281
- end="\r\n",
1282
- file=file_descriptor,
1283
- )
1284
- print("CATEGORY-POWER: ", end="\r\n", file=file_descriptor)
1285
-
1286
- print(
1287
- f"CLAIMED-SCORE: {self.contest.calc_score(self)}",
1288
- end="\r\n",
1289
- file=file_descriptor,
1290
- )
1291
- print(
1292
- "OPERATORS: ",
1293
- end="\r\n",
1294
- file=file_descriptor,
1295
- )
1296
- print(
1297
- f"NAME: {self.pref.get('name', '')}",
1298
- end="\r\n",
1299
- file=file_descriptor,
1300
- )
1301
- print(
1302
- f"ADDRESS: {self.pref.get('address1', '')}",
1303
- end="\r\n",
1304
- file=file_descriptor,
1305
- )
1306
- print(
1307
- f"ADDRESS-CITY: {self.pref.get('city', '')}",
1308
- end="\r\n",
1309
- file=file_descriptor,
1310
- )
1311
- print(
1312
- f"ADDRESS-STATE: {self.pref.get('state', '')}",
1313
- end="\r\n",
1314
- file=file_descriptor,
1315
- )
1316
- print(
1317
- f"ADDRESS-POSTALCODE: {self.pref.get('zip', '')}",
1318
- end="\r\n",
1319
- file=file_descriptor,
1320
- )
1321
- print(
1322
- f"ADDRESS-COUNTRY: {self.pref.get('country', '')}",
1323
- end="\r\n",
1324
- file=file_descriptor,
1325
- )
1326
- print(
1327
- f"EMAIL: {self.pref.get('email', '')}",
1328
- end="\r\n",
1329
- file=file_descriptor,
1330
- )
1331
- for contact in log:
1332
- # hiscall = contact.get("Call", "")
1333
- # hisclass = contact.get("class")
1334
- # hissection = contact.get("section")
1335
- the_date_and_time = contact.get("TS", "")
1336
- # band = contact.get("Band", "")
1337
- mode = contact.get("Mode", "")
1338
- if mode == "LSB" or mode == "USB":
1339
- mode = "PH"
1340
- frequency = str(int(contact.get("Freq", "0"))).rjust(5)
1341
-
1342
- loggeddate = the_date_and_time[:10]
1343
- loggedtime = the_date_and_time[11:13] + the_date_and_time[14:16]
1344
- print(
1345
- f"QSO: {frequency} {mode} {loggeddate} {loggedtime} "
1346
- f"{contact.get('StationPrefix', '').ljust(13)} "
1347
- f"{str(contact.get('SNT', '')).ljust(3)} "
1348
- f"{str(contact.get('SentNr', '')).ljust(6)} "
1349
- f"{contact.get('Call', '').ljust(13)} "
1350
- f"{str(contact.get('RCV', '')).ljust(3)} "
1351
- f"{str(contact.get('NR', '')).ljust(6)}",
1352
- end="\r\n",
1353
- file=file_descriptor,
1354
- )
1355
- print("END-OF-LOG:", end="\r\n", file=file_descriptor)
1356
- except IOError as exception:
1357
- logger.critical(
1358
- "cabrillo: IO error: %s, writing to %s", exception, filename
1359
- )
1360
- # self.infobox.insertPlainText(" Failed\n\n")
1361
- # app.processEvents()
1362
- return
1363
- # self.infobox.insertPlainText(" Done\n\n")
1256
+ self.contest.cabrillo(self)
1364
1257
 
1365
1258
 
1366
1259
  def load_fonts_from_dir(directory: str) -> set:
@@ -789,6 +789,7 @@
789
789
  <addaction name="actionQRZ_Settings"/>
790
790
  <addaction name="actionConnection_Settings"/>
791
791
  <addaction name="actionGenerate_Cabrillo"/>
792
+ <addaction name="actionGenerate_ADIF"/>
792
793
  </widget>
793
794
  <widget class="QMenu" name="menuHelp">
794
795
  <property name="title">
@@ -930,6 +931,11 @@
930
931
  <string>Log Window</string>
931
932
  </property>
932
933
  </action>
934
+ <action name="actionGenerate_ADIF">
935
+ <property name="text">
936
+ <string>Generate ADIF</string>
937
+ </property>
938
+ </action>
933
939
  </widget>
934
940
  <resources/>
935
941
  <connections/>
@@ -370,6 +370,30 @@ class DataBase:
370
370
  )
371
371
  return cursor.fetchone()
372
372
 
373
+ def check_dupe_on_band(self, call, band) -> dict:
374
+ """Checks if a call is dupe on band/mode"""
375
+ with sqlite3.connect(self.database) as conn:
376
+ conn.row_factory = self.row_factory
377
+ cursor = conn.cursor()
378
+ print(
379
+ f"select count(*) as isdupe from dxlog where Call = '{call}' and Band = '{band}';"
380
+ )
381
+ cursor.execute(
382
+ f"select count(*) as isdupe from dxlog where Call = '{call}' and Band = '{band}';"
383
+ )
384
+ return cursor.fetchone()
385
+
386
+ def check_dupe(self, call) -> dict:
387
+ """Checks if a call is dupe on band/mode"""
388
+ with sqlite3.connect(self.database) as conn:
389
+ conn.row_factory = self.row_factory
390
+ cursor = conn.cursor()
391
+ print(f"select count(*) as isdupe from dxlog where Call = '{call}';")
392
+ cursor.execute(
393
+ f"select count(*) as isdupe from dxlog where Call = '{call}';"
394
+ )
395
+ return cursor.fetchone()
396
+
373
397
  def fetch_points(self) -> dict:
374
398
  """return points"""
375
399
  with sqlite3.connect(self.database) as conn:
@@ -0,0 +1,2 @@
1
+ """It's the version"""
2
+ __version__ = "23.3.27"
File without changes