not1mm 24.9.14__py3-none-any.whl → 24.9.22__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.
@@ -0,0 +1,478 @@
1
+ """CQ World Wide DX CW plugin"""
2
+
3
+ # CQ Worldwide DX Contest, RTTY
4
+ # Status: Active
5
+ # Geographic Focus: Worldwide
6
+ # Participation: Worldwide
7
+ # Awards: Worldwide
8
+ # Mode: RTTY
9
+ # Bands: 80, 40, 20, 15, 10m
10
+ # Classes: Single Op All Band (High/Low/QRP)
11
+ # Single Op Single Band (High/Low/QRP)
12
+ # Single Op Assisted All Band (High/Low/QRP)
13
+ # Single Op Assisted Single Band (High/Low/QRP)
14
+ # Single Op Overlays: (Classic/Rookie/Youth)
15
+ # Multi-Single (High/Low)
16
+ # Multi-Two
17
+ # Multi-Multi
18
+ # Explorer
19
+ # Max power: HP: 1500 watts
20
+ # LP: 100 watts
21
+ # QRP: 5 watts
22
+ # Exchange: 48 States/Canada: RST + CQ Zone + (state/VE area)
23
+ # All Others: RST + CQ Zone
24
+ # Work stations: Once per band
25
+ # QSO Points: 1 point per QSO with same country
26
+ # 2 points per QSO with same continent
27
+ # 3 points per QSO with different continent
28
+ # Multipliers: W/VE Stations: Each US state/VE area once per band
29
+ # Each DXCC/WAE country once per band
30
+ # Each CQ zone once per band
31
+ # Score Calculation: Total score = total QSO points x total mults
32
+ # E-mail logs to: (none)
33
+ # Upload log at: https://www.cqwwrtty.com/logcheck/
34
+ # Mail logs to: (see rules)
35
+ # Find rules at: https://www.cqwwrtty.com/
36
+ # Cabrillo name: CQ-WW-RTTY
37
+
38
+
39
+ # pylint: disable=invalid-name, unused-argument, unused-variable, c-extension-no-member, unused-import
40
+
41
+ import datetime
42
+ import logging
43
+
44
+ from pathlib import Path
45
+
46
+ from PyQt6 import QtWidgets
47
+
48
+ from not1mm.lib.ham_utility import get_logged_band
49
+ from not1mm.lib.plugin_common import gen_adif, get_points
50
+ from not1mm.lib.version import __version__
51
+
52
+ logger = logging.getLogger(__name__)
53
+
54
+ ALTEREGO = None
55
+
56
+ EXCHANGE_HINT = "RST + CQ Zone + (state/VE area)"
57
+
58
+ name = "CQ WW RTTY"
59
+ cabrillo_name = "CQ-WW-RTTY"
60
+ mode = "RTTY" # CW SSB BOTH RTTY
61
+ # columns = [0, 1, 2, 3, 4, 5, 6, 15]
62
+ columns = [
63
+ "YYYY-MM-DD HH:MM:SS",
64
+ "Call",
65
+ "Freq",
66
+ "Snt",
67
+ "Rcv",
68
+ "SentNr",
69
+ "ZN",
70
+ "Exchange1",
71
+ "PTS",
72
+ ]
73
+
74
+ advance_on_space = [True, True, True, True, True]
75
+
76
+ # 1 once per contest, 2 work each band, 3 each band/mode, 4 no dupe checking
77
+ dupe_type = 2
78
+
79
+
80
+ def init_contest(self):
81
+ """setup plugin"""
82
+ set_tab_next(self)
83
+ set_tab_prev(self)
84
+ interface(self)
85
+ self.next_field = self.other_1
86
+
87
+
88
+ def interface(self):
89
+ """Setup user interface"""
90
+ self.field1.show()
91
+ self.field2.show()
92
+ self.field3.show()
93
+ self.field4.show()
94
+ self.snt_label.setText("SNT")
95
+ self.field1.setAccessibleName("RST Sent")
96
+ label = self.field3.findChild(QtWidgets.QLabel)
97
+ label.setText("CQ Zone")
98
+ self.field3.setAccessibleName("C Q Zone")
99
+ label = self.field4.findChild(QtWidgets.QLabel)
100
+ label.setText("State/Prov")
101
+ self.field4.setAccessibleName("U S State or Providence")
102
+
103
+
104
+ def reset_label(self):
105
+ """reset label after field cleared"""
106
+
107
+
108
+ def set_tab_next(self):
109
+ """Set TAB Advances"""
110
+ self.tab_next = {
111
+ self.callsign: self.field1.findChild(QtWidgets.QLineEdit),
112
+ self.field1.findChild(QtWidgets.QLineEdit): self.field2.findChild(
113
+ QtWidgets.QLineEdit
114
+ ),
115
+ self.field2.findChild(QtWidgets.QLineEdit): self.field3.findChild(
116
+ QtWidgets.QLineEdit
117
+ ),
118
+ self.field3.findChild(QtWidgets.QLineEdit): self.field4.findChild(
119
+ QtWidgets.QLineEdit
120
+ ),
121
+ self.field4.findChild(QtWidgets.QLineEdit): self.callsign,
122
+ }
123
+
124
+
125
+ def set_tab_prev(self):
126
+ """Set TAB Advances"""
127
+ self.tab_prev = {
128
+ self.callsign: self.field4.findChild(QtWidgets.QLineEdit),
129
+ self.field1.findChild(QtWidgets.QLineEdit): self.callsign,
130
+ self.field2.findChild(QtWidgets.QLineEdit): self.field1.findChild(
131
+ QtWidgets.QLineEdit
132
+ ),
133
+ self.field3.findChild(QtWidgets.QLineEdit): self.field2.findChild(
134
+ QtWidgets.QLineEdit
135
+ ),
136
+ self.field4.findChild(QtWidgets.QLineEdit): self.field3.findChild(
137
+ QtWidgets.QLineEdit
138
+ ),
139
+ }
140
+
141
+
142
+ def set_contact_vars(self):
143
+ """Contest Specific"""
144
+ self.contact["SNT"] = self.sent.text()
145
+ self.contact["RCV"] = self.receive.text()
146
+ self.contact["ZN"] = self.other_1.text()
147
+ self.contact["Exchange1"] = self.other_2.text()
148
+ self.contact["SentNr"] = self.contest_settings.get("SentExchange", 0)
149
+
150
+
151
+ def predupe(self):
152
+ """called after callsign entered"""
153
+
154
+
155
+ def prefill(self):
156
+ """Fill CQ Zone"""
157
+ if len(self.other_1.text()) == 0:
158
+ self.other_1.setText(str(self.contact.get("ZN", "")))
159
+
160
+
161
+ def points(self):
162
+ """Calc point"""
163
+ # QSO Points: 1 point per QSO with same country
164
+ # 2 points per QSO with same continent
165
+ # 3 points per QSO with different continent
166
+
167
+ result = self.cty_lookup(self.station.get("Call", ""))
168
+ if result:
169
+ for item in result.items():
170
+ mycountry = item[1].get("entity", "")
171
+ mycontinent = item[1].get("continent", "")
172
+ result = self.cty_lookup(self.contact.get("Call", ""))
173
+ if result:
174
+ for item in result.items():
175
+ entity = item[1].get("entity", "")
176
+ continent = item[1].get("continent", "")
177
+ if mycountry.upper() == entity.upper():
178
+ return 1
179
+ if mycontinent == continent:
180
+ return 2
181
+ else:
182
+ return 3
183
+ return 0
184
+
185
+
186
+ def show_mults(self):
187
+ """Return display string for mults"""
188
+
189
+ # Multipliers: W/VE Stations: Each US state/VE area once per band
190
+ # Each DXCC/WAE country once per band
191
+ # Each CQ zone once per band
192
+
193
+ result1 = self.database.fetch_zn_band_count()
194
+ result2 = self.database.fetch_country_band_count()
195
+ res3_query = f"select count(DISTINCT(Exchange1 || ':' || Band)) as spc_count from dxlog where ContestNR = {self.database.current_contest};"
196
+ result3 = self.database.exec_sql(res3_query)
197
+ if result1 and result2 and result3:
198
+ return int(result1.get("zb_count", 0)) + int(result2.get("cb_count", 0)) + int(result3.get("spc_count", 0))
199
+ return 0
200
+
201
+
202
+ def show_qso(self):
203
+ """Return qso count"""
204
+ result = self.database.fetch_qso_count()
205
+ if result:
206
+ return int(result.get("qsos", 0))
207
+ return 0
208
+
209
+
210
+ def calc_score(self):
211
+ """Return calculated score"""
212
+ result = self.database.fetch_points()
213
+ if result is not None:
214
+ score = result.get("Points", "0")
215
+ if score is None:
216
+ score = "0"
217
+ contest_points = int(score)
218
+ mults = show_mults(self)
219
+ return contest_points * mults
220
+ return 0
221
+
222
+
223
+ def adif(self):
224
+ """Call the generate ADIF function"""
225
+ gen_adif(self, cabrillo_name, "CQ-WW-RTTY")
226
+
227
+
228
+ def cabrillo(self):
229
+ """Generates Cabrillo file. Maybe."""
230
+ # https://www.cqwpx.com/cabrillo.htm
231
+ logger.debug("******Cabrillo*****")
232
+ logger.debug("Station: %s", f"{self.station}")
233
+ logger.debug("Contest: %s", f"{self.contest_settings}")
234
+ now = datetime.datetime.now()
235
+ date_time = now.strftime("%Y-%m-%d_%H-%M-%S")
236
+ filename = (
237
+ str(Path.home())
238
+ + "/"
239
+ + f"{self.station.get('Call', '').upper()}_{cabrillo_name}_{date_time}.log"
240
+ )
241
+ logger.debug("%s", filename)
242
+ log = self.database.fetch_all_contacts_asc()
243
+ try:
244
+ with open(filename, "w", encoding="ascii") as file_descriptor:
245
+ print("START-OF-LOG: 3.0", end="\r\n", file=file_descriptor)
246
+ print(
247
+ f"CREATED-BY: Not1MM v{__version__}",
248
+ end="\r\n",
249
+ file=file_descriptor,
250
+ )
251
+ print(
252
+ f"CONTEST: {cabrillo_name}",
253
+ end="\r\n",
254
+ file=file_descriptor,
255
+ )
256
+ if self.station.get("Club", ""):
257
+ print(
258
+ f"CLUB: {self.station.get('Club', '').upper()}",
259
+ end="\r\n",
260
+ file=file_descriptor,
261
+ )
262
+ print(
263
+ f"CALLSIGN: {self.station.get('Call','')}",
264
+ end="\r\n",
265
+ file=file_descriptor,
266
+ )
267
+ print(
268
+ f"LOCATION: {self.station.get('ARRLSection', '')}",
269
+ end="\r\n",
270
+ file=file_descriptor,
271
+ )
272
+ print(
273
+ f"CATEGORY-OPERATOR: {self.contest_settings.get('OperatorCategory','')}",
274
+ end="\r\n",
275
+ file=file_descriptor,
276
+ )
277
+ print(
278
+ f"CATEGORY-ASSISTED: {self.contest_settings.get('AssistedCategory','')}",
279
+ end="\r\n",
280
+ file=file_descriptor,
281
+ )
282
+ print(
283
+ f"CATEGORY-BAND: {self.contest_settings.get('BandCategory','')}",
284
+ end="\r\n",
285
+ file=file_descriptor,
286
+ )
287
+ print(
288
+ f"CATEGORY-MODE: {self.contest_settings.get('ModeCategory','')}",
289
+ end="\r\n",
290
+ file=file_descriptor,
291
+ )
292
+ print(
293
+ f"CATEGORY-TRANSMITTER: {self.contest_settings.get('TransmitterCategory','')}",
294
+ end="\r\n",
295
+ file=file_descriptor,
296
+ )
297
+ if self.contest_settings.get("OverlayCategory", "") != "N/A":
298
+ print(
299
+ f"CATEGORY-OVERLAY: {self.contest_settings.get('OverlayCategory','')}",
300
+ end="\r\n",
301
+ file=file_descriptor,
302
+ )
303
+ print(
304
+ f"GRID-LOCATOR: {self.station.get('GridSquare','')}",
305
+ end="\r\n",
306
+ file=file_descriptor,
307
+ )
308
+ print(
309
+ f"CATEGORY-POWER: {self.contest_settings.get('PowerCategory','')}",
310
+ end="\r\n",
311
+ file=file_descriptor,
312
+ )
313
+
314
+ print(
315
+ f"CLAIMED-SCORE: {calc_score(self)}",
316
+ end="\r\n",
317
+ file=file_descriptor,
318
+ )
319
+ ops = f"@{self.station.get('Call','')}"
320
+ list_of_ops = self.database.get_ops()
321
+ for op in list_of_ops:
322
+ ops += f", {op.get('Operator', '')}"
323
+ print(
324
+ f"OPERATORS: {ops}",
325
+ end="\r\n",
326
+ file=file_descriptor,
327
+ )
328
+ print(
329
+ f"NAME: {self.station.get('Name', '')}",
330
+ end="\r\n",
331
+ file=file_descriptor,
332
+ )
333
+ print(
334
+ f"ADDRESS: {self.station.get('Street1', '')}",
335
+ end="\r\n",
336
+ file=file_descriptor,
337
+ )
338
+ print(
339
+ f"ADDRESS-CITY: {self.station.get('City', '')}",
340
+ end="\r\n",
341
+ file=file_descriptor,
342
+ )
343
+ print(
344
+ f"ADDRESS-STATE-PROVINCE: {self.station.get('State', '')}",
345
+ end="\r\n",
346
+ file=file_descriptor,
347
+ )
348
+ print(
349
+ f"ADDRESS-POSTALCODE: {self.station.get('Zip', '')}",
350
+ end="\r\n",
351
+ file=file_descriptor,
352
+ )
353
+ print(
354
+ f"ADDRESS-COUNTRY: {self.station.get('Country', '')}",
355
+ end="\r\n",
356
+ file=file_descriptor,
357
+ )
358
+ print(
359
+ f"EMAIL: {self.station.get('Email', '')}",
360
+ end="\r\n",
361
+ file=file_descriptor,
362
+ )
363
+ for contact in log:
364
+ the_date_and_time = contact.get("TS", "")
365
+ themode = contact.get("Mode", "")
366
+ if themode == "LSB" or themode == "USB":
367
+ themode = "PH"
368
+ if themode.strip() == "RTTY":
369
+ themode = "RY"
370
+ frequency = str(int(contact.get("Freq", "0"))).rjust(5)
371
+
372
+ loggeddate = the_date_and_time[:10]
373
+ loggedtime = the_date_and_time[11:13] + the_date_and_time[14:16]
374
+ print(
375
+ f"QSO: {frequency} {themode} {loggeddate} {loggedtime} "
376
+ f"{contact.get('StationPrefix', '').ljust(13)} "
377
+ f"{str(contact.get('SNT', '')).ljust(3)} "
378
+ f"{str(contact.get('SentNr', '')).ljust(6)} "
379
+ f"{contact.get('Call', '').ljust(13)} "
380
+ f"{str(contact.get('RCV', '')).ljust(3)} "
381
+ f"{str(contact.get('ZN', '')).zfill(2)}",
382
+ f"{str(contact.get('Exchange1', '')).ljust(2)}",
383
+ end="\r\n",
384
+ file=file_descriptor,
385
+ )
386
+ print("END-OF-LOG:", end="\r\n", file=file_descriptor)
387
+ self.show_message_box(f"Cabrillo saved to: {filename}")
388
+ except IOError as exception:
389
+ logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
390
+ self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
391
+ return
392
+
393
+
394
+ def recalculate_mults(self):
395
+ """Recalculates multipliers after change in logged qso."""
396
+
397
+
398
+ def set_self(the_outie):
399
+ """..."""
400
+ globals()["ALTEREGO"] = the_outie
401
+
402
+
403
+ def ft8_handler(the_packet: dict):
404
+ """Process FT8 QSO packets
405
+ FT8
406
+ {
407
+ 'CALL': 'KE0OG',
408
+ 'GRIDSQUARE': 'DM10AT',
409
+ 'MODE': 'FT8',
410
+ 'RST_SENT': '',
411
+ 'RST_RCVD': '',
412
+ 'QSO_DATE': '20210329',
413
+ 'TIME_ON': '183213',
414
+ 'QSO_DATE_OFF': '20210329',
415
+ 'TIME_OFF': '183213',
416
+ 'BAND': '20M',
417
+ 'FREQ': '14.074754',
418
+ 'STATION_CALLSIGN': 'K6GTE',
419
+ 'MY_GRIDSQUARE': 'DM13AT',
420
+ 'CONTEST_ID': 'ARRL-FIELD-DAY',
421
+ 'SRX_STRING': '1D UT',
422
+ 'CLASS': '1D',
423
+ 'ARRL_SECT': 'UT'
424
+ }
425
+ FlDigi
426
+ {
427
+ 'FREQ': '7.029500',
428
+ 'CALL': 'DL2DSL',
429
+ 'MODE': 'RTTY',
430
+ 'NAME': 'BOB',
431
+ 'QSO_DATE': '20240904',
432
+ 'QSO_DATE_OFF': '20240904',
433
+ 'TIME_OFF': '212825',
434
+ 'TIME_ON': '212800',
435
+ 'RST_RCVD': '599',
436
+ 'RST_SENT': '599',
437
+ 'BAND': '40M',
438
+ 'COUNTRY': 'FED. REP. OF GERMANY',
439
+ 'CQZ': '14',
440
+ 'STX': '000',
441
+ 'STX_STRING': '1D ORG',
442
+ 'CLASS': '1D',
443
+ 'ARRL_SECT': 'DX',
444
+ 'TX_PWR': '0',
445
+ 'OPERATOR': 'K6GTE',
446
+ 'STATION_CALLSIGN': 'K6GTE',
447
+ 'MY_GRIDSQUARE': 'DM13AT',
448
+ 'MY_CITY': 'ANAHEIM, CA',
449
+ 'MY_STATE': 'CA'
450
+ }
451
+
452
+ """
453
+ logger.debug(f"{the_packet=}")
454
+ # {
455
+ # 'FREQ': '7.040000', 'CALL': 'K5TUX', 'MODE': 'RTTY', 'QSO_DATE': '20240916', 'QSO_DATE_OFF': '20240916',
456
+ # 'TIME_OFF': '235422', 'TIME_ON': '235100', 'RST_RCVD': '599', 'RST_SENT': '599', 'STATE': 'MO', 'BAND': '40M',
457
+ # 'COUNTRY': 'USA', 'CQZ': '3', 'STX': '000', 'STX_STRING': 'DM13', 'TX_PWR': '0', 'OPERATOR': 'K6GTE',
458
+ # 'STATION_CALLSIGN': 'K6GTE', 'MY_GRIDSQUARE': 'DM13AT', 'MY_CITY': 'ANAHEIM, CA', 'MY_STATE': 'CA'
459
+ # }
460
+ if ALTEREGO is not None:
461
+ ALTEREGO.callsign.setText(the_packet.get("CALL"))
462
+ ALTEREGO.contact["Call"] = the_packet.get("CALL", "")
463
+ ALTEREGO.contact["SNT"] = ALTEREGO.sent.text()
464
+ ALTEREGO.contact["RCV"] = ALTEREGO.receive.text()
465
+ ALTEREGO.contact["Exchange1"] = f"{the_packet.get("STATE", "")}".strip()
466
+ ALTEREGO.contact["ZN"] = the_packet.get("CQZ", "")
467
+ ALTEREGO.contact["Mode"] = the_packet.get("MODE", "ERR")
468
+ ALTEREGO.contact["Freq"] = round(float(the_packet.get("FREQ", "0.0")) * 1000, 2)
469
+ ALTEREGO.contact["QSXFreq"] = round(
470
+ float(the_packet.get("FREQ", "0.0")) * 1000, 2
471
+ )
472
+ ALTEREGO.contact["Band"] = get_logged_band(
473
+ str(int(float(the_packet.get("FREQ", "0.0")) * 1000000))
474
+ )
475
+ logger.debug(f"{ALTEREGO.contact=}")
476
+ ALTEREGO.other_1.setText(str(the_packet.get("CQZ", "ERR")))
477
+ ALTEREGO.other_2.setText(f"{the_packet.get("STATE", "")}".strip())
478
+ ALTEREGO.save_contact()
@@ -1,5 +1,39 @@
1
1
  """CQ World Wide DX SSB plugin"""
2
2
 
3
+ # CQ Worldwide DX Contest, SSB
4
+ # Status: Active
5
+ # Geographic Focus: Worldwide
6
+ # Participation: Worldwide
7
+ # Awards: Worldwide
8
+ # Mode: SSB
9
+ # Bands: 160, 80, 40, 20, 15, 10m
10
+ # Classes: Single Op All Band (QRP/Low/High)
11
+ # Single Op Single Band (QRP/Low/High)
12
+ # Single Op Assisted All Band (QRP/Low/High)
13
+ # Single Op Assisted Single Band (QRP/Low/High)
14
+ # Single Op Overlays: (Classic/Rookie/Youth)
15
+ # Multi-Single (Low/High)
16
+ # Multi-Two
17
+ # Multi-Multi
18
+ # Explorer
19
+ # Max power: HP: 1500 watts
20
+ # LP: 100 watts
21
+ # QRP: 5 watts
22
+ # Exchange: RS + CQ Zone No.
23
+ # Work stations: Once per band
24
+ # QSO Points: 0 points per QSO with same country (counts as mult)
25
+ # 1 point per QSO with different country same continent
26
+ # 2 points per QSO with different country same continent (NA)
27
+ # 3 points per QSO with different continent
28
+ # Multipliers: Each CQ zone once per band
29
+ # Each country once per band
30
+ # Score Calculation: Total score = total QSO points x total mults
31
+ # E-mail logs to: (none)
32
+ # Upload log at: https://www.cqww.com/logcheck/
33
+ # Mail logs to: (none)
34
+ # Find rules at: https://www.cqww.com/rules.htm
35
+ # Cabrillo name: CQ-WW-SSB
36
+
3
37
  # pylint: disable=invalid-name, unused-argument, unused-variable, c-extension-no-member, unused-import
4
38
 
5
39
  import datetime
not1mm/test.py CHANGED
@@ -1,4 +1,4 @@
1
- import xmltodict
1
+ # import xmltodict
2
2
 
3
3
  # import xmlrpc.client
4
4
 
@@ -8,6 +8,21 @@ import xmltodict
8
8
  # response = server.log.add_record(adif)
9
9
 
10
10
 
11
- xml = '<?xml version="1.0"?>\n<HamQTH version="2.8" xmlns="https://www.hamqth.com">\n <search>\n <callsign>K6GTE</callsign>\n <nick>Mike</nick>\n <qth>Anaheim</qth>\n <country>United States</country>\n <adif>291</adif>\n <itu>6</itu>\n <cq>3</cq>\n <grid>DM13AT</grid>\n <adr_name>Michael C Bridak</adr_name>\n <adr_street1>2854 W Bridgeport Ave</adr_street1>\n <adr_city>Anaheim</adr_city>\n <adr_zip>92804</adr_zip>\n <adr_country>United States</adr_country>\n <adr_adif>291</adr_adif>\n <us_state>CA</us_state>\n <us_county>Orange</us_county>\n <lotw>Y</lotw>\n <qsldirect>Y</qsldirect>\n <qsl>?</qsl>\n <eqsl>N</eqsl>\n <email>michael.bridak@gmail.com</email>\n <birth_year>1967</birth_year>\n <lic_year>2017</lic_year>\n <latitude>33.81</latitude>\n <longitude>-117.97</longitude>\n <continent>NA</continent>\n <utc_offset>-8</utc_offset>\n <picture>https://www.hamqth.com/userfiles/k/k6/k6gte/_header/header.jpg?ver=3</picture>\n </search>\n</HamQTH>'
12
- result = xmltodict.parse(xml)
13
- print(f"{result=}")
11
+ # xml = '<?xml version="1.0"?>\n<HamQTH version="2.8" xmlns="https://www.hamqth.com">\n <search>\n <callsign>K6GTE</callsign>\n <nick>Mike</nick>\n <qth>Anaheim</qth>\n <country>United States</country>\n <adif>291</adif>\n <itu>6</itu>\n <cq>3</cq>\n <grid>DM13AT</grid>\n <adr_name>Michael C Bridak</adr_name>\n <adr_street1>2854 W Bridgeport Ave</adr_street1>\n <adr_city>Anaheim</adr_city>\n <adr_zip>92804</adr_zip>\n <adr_country>United States</adr_country>\n <adr_adif>291</adr_adif>\n <us_state>CA</us_state>\n <us_county>Orange</us_county>\n <lotw>Y</lotw>\n <qsldirect>Y</qsldirect>\n <qsl>?</qsl>\n <eqsl>N</eqsl>\n <email>michael.bridak@gmail.com</email>\n <birth_year>1967</birth_year>\n <lic_year>2017</lic_year>\n <latitude>33.81</latitude>\n <longitude>-117.97</longitude>\n <continent>NA</continent>\n <utc_offset>-8</utc_offset>\n <picture>https://www.hamqth.com/userfiles/k/k6/k6gte/_header/header.jpg?ver=3</picture>\n </search>\n</HamQTH>'
12
+ # result = xmltodict.parse(xml)
13
+
14
+ import xmlrpc.client
15
+
16
+ target = "http://127.0.0.1:7362"
17
+ payload = "Hello^r"
18
+ response = ""
19
+
20
+ try:
21
+ server = xmlrpc.client.ServerProxy(target)
22
+ response = server.logbook.last_record()
23
+ response = server.main.tx()
24
+ response = server.text.add_tx(payload)
25
+ except ConnectionRefusedError:
26
+ ...
27
+
28
+ print(f"{response=}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: not1mm
3
- Version: 24.9.14
3
+ Version: 24.9.22
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
@@ -209,6 +209,7 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
209
209
  - CQ WPX CW
210
210
  - CQ WPX SSB
211
211
  - CQ World Wide CW
212
+ - CQ World Wide RTTY
212
213
  - CQ World Wide SSB
213
214
  - CWOps CWT
214
215
  - Helvetia
@@ -229,6 +230,8 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
229
230
 
230
231
  ## Recent Changes
231
232
 
233
+ - [24-9-22] Merged in changes for CQ WW RTTY
234
+ - [24-9-15] Fixing an ARRL VHF Cabrillo format error.
232
235
  - [24-9-14] BugFix. Starting lookups fail init if no settings.
233
236
  - [24-9-12] Fixed WSJT-X MFSK submodes FT4 Q65.
234
237
  - [24-9-11-2] Removed all the sketchy threaded call lookups. They're now implimented as a multicast service.