PyFT8 4.0.0__tar.gz → 4.0.2__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyFT8
3
- Version: 4.0.0
3
+ Version: 4.0.2
4
4
  Summary: All-Python FT8 Transceiver with separable Transmitter and Receiver
5
5
  Author-email: G1OJS <g1ojs@yahoo.com>
6
6
  License-Expression: GPL-3.0-or-later
@@ -17,16 +17,18 @@ Requires-Dist: pyaudio
17
17
  Requires-Dist: paho-mqtt
18
18
  Dynamic: license-file
19
19
 
20
- # PyFT8m
21
- An FT8 Receiver, FT8 Transmitter, and GUI, written in three single & short Python files plus a tiny udp_comms file. The Receiver and Transmitter can be run standalone.
20
+ # PyFT8
21
+ An FT8 Receiver, FT8 Transmitter, and GUI, written in three single & short Python files plus a tiny udp_comms file. The Receiver and Transmitter can be run standalone.
22
+
23
+ Version 4.0.0 uses a tkinter-based GUI, a simplified receiver, and a simplified project structure. [PyFT8 v3.9.1](https://github.com/G1OJS/PyFT8/releases/tag/PyPi_v3.9.1) has the Matplotlib-based GUI with decodes overlaid on the waterfall.
22
24
 
23
- <img width="794" height="653" alt="Capture" src="https://github.com/user-attachments/assets/e53ab21f-4e98-4dfa-b521-9fbeecc9917b" />
25
+ <img width="901" height="669" alt="Capture" src="https://github.com/user-attachments/assets/28afcb1a-18cc-482a-b4c8-6c6359a7dde4" />
24
26
 
25
27
  ## Features
26
- As of version 1.1.1, the key features are:
28
+ As of version 4.0.0, the key features are:
27
29
  * Written entirely in Python
28
30
  * Implements LDPC and OSD decoding
29
- * Demonstrated by a Tkinter GUI
31
+ * Tkinter GUI
30
32
  * Receiver and Transmitter can be used standalone
31
33
  * Internal connections are via UDP (so e.g. alternative Receivers / Transmitters could be easily swapped in)
32
34
  * Rx and Tx of standard messages with optional /P and /R
@@ -52,20 +54,20 @@ That's an FT8 transmitter / receiver *application* in about 1100 lines of Python
52
54
  ## Installation and use
53
55
  To use it as a 'turnkey' transceiver, just install the project via pip:
54
56
  ```
55
- pip install PyFT8m
57
+ pip install PyFT8
56
58
  ```
57
59
  ... and then run the tk_gui either in a Python environment or by using the command:
58
60
  ```
59
- pyft8mgui
61
+ pyft8gui
60
62
  ```
61
- You might have to open a new command window after pip install so that the command 'pyft8mgui' is recognised. I haven't written too much of a step by step quide here, as the project is really intended for people who want to poke around and maybe modify the code. But hopefully even if you're new to Python or coding, you can have a look and work out how it's done.
63
+ You might have to open a new command window after pip install so that the command 'pyft8gui' is recognised. I haven't written too much of a step by step quide here, as the project is really intended for people who want to poke around and maybe modify the code. But hopefully even if you're new to Python or coding, you can have a look and work out how it's done.
62
64
 
63
65
  To control a rig's PTT and frequency, you'll need a copy of Hamlib's rigctl.exe.
64
66
 
65
67
  ## Hacking it
66
68
  The transmitter and receiver may be run independently from the GUI, as they communicate only via UDP (see below). For example, to run the receiver from Python,
67
69
  ```
68
- from PyFT8m import Receiver
70
+ from PyFT8 import Receiver
69
71
  rx = Receiver(output_type = 'print', input_keywords = 'Mic, CODEC')
70
72
  ```
71
73
  Or of course copy the receiver.py file, add this line at the bottom (minus the import), and hack away.
@@ -8,7 +8,7 @@ from PyFT8.receiver import Receiver
8
8
  from PyFT8.transmitter import Transmitter
9
9
  from PyFT8.udp_comms import UdpComms
10
10
 
11
- VERSION = "4.0.0"
11
+ VERSION = "4.0.2"
12
12
  PORTS = {'gui_to_rx': 2121, 'rx_to_gui':2122, 'gui_to_tx': 2123, 'tx_to_gui': 2124}
13
13
  HEARING_ME_WINDOW_SECS = 300
14
14
  MAX_CYCLETIME_TX_START = 3
@@ -19,7 +19,7 @@ class HearingMe:
19
19
  def __init__(self, my_call, my_grid):
20
20
  self.hearing_me = []
21
21
  self.my_call = my_call
22
- client_id = "PyFT8m_" + ''.join(random.choice('0123456789ABCDEF') for i in range(16))
22
+ client_id = "pyft8_" + ''.join(random.choice('0123456789ABCDEF') for i in range(16))
23
23
  mqttc = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id)
24
24
  mqttc._on_connect = lambda c,u,f,r,p: c.subscribe(f"pskr/filter/v2/+/FT8/+/+/{my_grid}/#")
25
25
  mqttc._on_message = lambda c,u,m: self._process_message(m)
@@ -208,7 +208,7 @@ class Gui:
208
208
  self.mute_decodes_until = 0
209
209
  self._do_each_second()
210
210
  self._update_pskr_uploader()
211
- self._update_pskr_uploader()
211
+ self._send_waterfall_row()
212
212
  self.qso_dict = {'cyclestart_string': '', 'fHz':'0', 'dt':'0', 'decode_info':'', 'msg_tuple':('','',''),
213
213
  'call':self.config['station']['call'], 'grid':self.config['station']['grid'], 'my_snr':'-30',
214
214
  'their_call':'', 'their_grid':'', 'their_snr':'-30'}
@@ -261,7 +261,7 @@ class Gui:
261
261
  self.pskr_upload = None
262
262
  if self.config.has_section('pskreporter'):
263
263
  if self.config['pskreporter']['upload'] == 'Y':
264
- self.pskr_upload = PSKR_upload(self.config['station']['call'], self.config['station']['grid'], "PyFT8m")
264
+ self.pskr_upload = PSKR_upload(self.config['station']['call'], self.config['station']['grid'], f"pyft8 v{VERSION}")
265
265
  self.rig_base_command = None
266
266
  if self.config.has_section('rig_control'):
267
267
  cfg_keys = ['rigctl', 'model', 'port', 'baud_rate']
@@ -485,7 +485,7 @@ class Gui:
485
485
  if self.running:
486
486
  self.root.after(60000, self._update_pskr_uploader)
487
487
 
488
- def _update_pskr_uploader(self):
488
+ def _send_waterfall_row(self):
489
489
  if self.waterfall_vals is None:
490
490
  self.waterfall_vals = self.waterfall_new_vals
491
491
  if self.waterfall_vals is not None:
@@ -499,7 +499,7 @@ class Gui:
499
499
  xys = [x1, 100, x1, 0, x2, 0, x2, 100]
500
500
  self.waterfall_canvas.coords(self.waterfall_tx_freq, xys)
501
501
  if self.running:
502
- self.waterfall_canvas.after(250, self._update_pskr_uploader)
502
+ self.waterfall_canvas.after(250, self._send_waterfall_row)
503
503
 
504
504
  def _call_cq(self):
505
505
  self._queue_transmit(f"CQ {self.config['station']['call']} {self.config['station']['grid']}")
@@ -543,7 +543,7 @@ class Gui:
543
543
 
544
544
  def get_config(config_folder):
545
545
  config = configparser.ConfigParser()
546
- ini_file = f"{config_folder}/PyFT8m.ini"
546
+ ini_file = f"{config_folder}/pyft8.ini"
547
547
  if not os.path.exists(ini_file):
548
548
  resp = input(f"No config file found at {ini_file}\nWould you like to create one (Y/N)? ")
549
549
  if resp.upper() !="Y":
@@ -558,10 +558,10 @@ def get_config(config_folder):
558
558
  config['rig_control'] = {'rigctl':'C:/Program Files/hamlib-w64-4.7.2/bin/rigctl.exe', 'port': 'COM4', 'baud_rate':9600, 'model':3070}
559
559
  config['soundcard'] = {'transmit':'Speak, CODEC', 'receive':'Mic, CODEC'}
560
560
  config['pskreporter'] = {'upload':'Y'}
561
- config['logging'] = {'logfile': f"{config_folder}/PyFT8m.adi"}
561
+ config['logging'] = {'logfile': f"{config_folder}/pyft8.adi"}
562
562
  with open(ini_file, 'w') as f:
563
563
  config.write(f)
564
- print(f"Wrote default config to {ini_file}. Please open and edit to add bands, frequencies and preferences and re-launch PyFT8m.")
564
+ print(f"Wrote default config to {ini_file}. Please open and edit to add bands, frequencies and preferences and re-launch pyft8.")
565
565
  sys.exit()
566
566
  #print(f"Reading config from {ini_file}")
567
567
  config.read(ini_file)
@@ -23,7 +23,7 @@ class UdpComms:
23
23
  try:
24
24
  self.sock_listen.bind(('', self.ports['listen']))
25
25
  except:
26
- print("Couldn't open upd socket - is PyFT8m already running?")
26
+ print("Couldn't open upd socket - is PyFT8 already running?")
27
27
  return
28
28
  threading.Thread(target = self._listen, daemon = True).start()
29
29
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyFT8
3
- Version: 4.0.0
3
+ Version: 4.0.2
4
4
  Summary: All-Python FT8 Transceiver with separable Transmitter and Receiver
5
5
  Author-email: G1OJS <g1ojs@yahoo.com>
6
6
  License-Expression: GPL-3.0-or-later
@@ -17,16 +17,18 @@ Requires-Dist: pyaudio
17
17
  Requires-Dist: paho-mqtt
18
18
  Dynamic: license-file
19
19
 
20
- # PyFT8m
21
- An FT8 Receiver, FT8 Transmitter, and GUI, written in three single & short Python files plus a tiny udp_comms file. The Receiver and Transmitter can be run standalone.
20
+ # PyFT8
21
+ An FT8 Receiver, FT8 Transmitter, and GUI, written in three single & short Python files plus a tiny udp_comms file. The Receiver and Transmitter can be run standalone.
22
+
23
+ Version 4.0.0 uses a tkinter-based GUI, a simplified receiver, and a simplified project structure. [PyFT8 v3.9.1](https://github.com/G1OJS/PyFT8/releases/tag/PyPi_v3.9.1) has the Matplotlib-based GUI with decodes overlaid on the waterfall.
22
24
 
23
- <img width="794" height="653" alt="Capture" src="https://github.com/user-attachments/assets/e53ab21f-4e98-4dfa-b521-9fbeecc9917b" />
25
+ <img width="901" height="669" alt="Capture" src="https://github.com/user-attachments/assets/28afcb1a-18cc-482a-b4c8-6c6359a7dde4" />
24
26
 
25
27
  ## Features
26
- As of version 1.1.1, the key features are:
28
+ As of version 4.0.0, the key features are:
27
29
  * Written entirely in Python
28
30
  * Implements LDPC and OSD decoding
29
- * Demonstrated by a Tkinter GUI
31
+ * Tkinter GUI
30
32
  * Receiver and Transmitter can be used standalone
31
33
  * Internal connections are via UDP (so e.g. alternative Receivers / Transmitters could be easily swapped in)
32
34
  * Rx and Tx of standard messages with optional /P and /R
@@ -52,20 +54,20 @@ That's an FT8 transmitter / receiver *application* in about 1100 lines of Python
52
54
  ## Installation and use
53
55
  To use it as a 'turnkey' transceiver, just install the project via pip:
54
56
  ```
55
- pip install PyFT8m
57
+ pip install PyFT8
56
58
  ```
57
59
  ... and then run the tk_gui either in a Python environment or by using the command:
58
60
  ```
59
- pyft8mgui
61
+ pyft8gui
60
62
  ```
61
- You might have to open a new command window after pip install so that the command 'pyft8mgui' is recognised. I haven't written too much of a step by step quide here, as the project is really intended for people who want to poke around and maybe modify the code. But hopefully even if you're new to Python or coding, you can have a look and work out how it's done.
63
+ You might have to open a new command window after pip install so that the command 'pyft8gui' is recognised. I haven't written too much of a step by step quide here, as the project is really intended for people who want to poke around and maybe modify the code. But hopefully even if you're new to Python or coding, you can have a look and work out how it's done.
62
64
 
63
65
  To control a rig's PTT and frequency, you'll need a copy of Hamlib's rigctl.exe.
64
66
 
65
67
  ## Hacking it
66
68
  The transmitter and receiver may be run independently from the GUI, as they communicate only via UDP (see below). For example, to run the receiver from Python,
67
69
  ```
68
- from PyFT8m import Receiver
70
+ from PyFT8 import Receiver
69
71
  rx = Receiver(output_type = 'print', input_keywords = 'Mic, CODEC')
70
72
  ```
71
73
  Or of course copy the receiver.py file, add this line at the bottom (minus the import), and hack away.
@@ -1,13 +1,15 @@
1
- # PyFT8m
2
- An FT8 Receiver, FT8 Transmitter, and GUI, written in three single & short Python files plus a tiny udp_comms file. The Receiver and Transmitter can be run standalone.
1
+ # PyFT8
2
+ An FT8 Receiver, FT8 Transmitter, and GUI, written in three single & short Python files plus a tiny udp_comms file. The Receiver and Transmitter can be run standalone.
3
+
4
+ Version 4.0.0 uses a tkinter-based GUI, a simplified receiver, and a simplified project structure. [PyFT8 v3.9.1](https://github.com/G1OJS/PyFT8/releases/tag/PyPi_v3.9.1) has the Matplotlib-based GUI with decodes overlaid on the waterfall.
3
5
 
4
- <img width="794" height="653" alt="Capture" src="https://github.com/user-attachments/assets/e53ab21f-4e98-4dfa-b521-9fbeecc9917b" />
6
+ <img width="901" height="669" alt="Capture" src="https://github.com/user-attachments/assets/28afcb1a-18cc-482a-b4c8-6c6359a7dde4" />
5
7
 
6
8
  ## Features
7
- As of version 1.1.1, the key features are:
9
+ As of version 4.0.0, the key features are:
8
10
  * Written entirely in Python
9
11
  * Implements LDPC and OSD decoding
10
- * Demonstrated by a Tkinter GUI
12
+ * Tkinter GUI
11
13
  * Receiver and Transmitter can be used standalone
12
14
  * Internal connections are via UDP (so e.g. alternative Receivers / Transmitters could be easily swapped in)
13
15
  * Rx and Tx of standard messages with optional /P and /R
@@ -33,20 +35,20 @@ That's an FT8 transmitter / receiver *application* in about 1100 lines of Python
33
35
  ## Installation and use
34
36
  To use it as a 'turnkey' transceiver, just install the project via pip:
35
37
  ```
36
- pip install PyFT8m
38
+ pip install PyFT8
37
39
  ```
38
40
  ... and then run the tk_gui either in a Python environment or by using the command:
39
41
  ```
40
- pyft8mgui
42
+ pyft8gui
41
43
  ```
42
- You might have to open a new command window after pip install so that the command 'pyft8mgui' is recognised. I haven't written too much of a step by step quide here, as the project is really intended for people who want to poke around and maybe modify the code. But hopefully even if you're new to Python or coding, you can have a look and work out how it's done.
44
+ You might have to open a new command window after pip install so that the command 'pyft8gui' is recognised. I haven't written too much of a step by step quide here, as the project is really intended for people who want to poke around and maybe modify the code. But hopefully even if you're new to Python or coding, you can have a look and work out how it's done.
43
45
 
44
46
  To control a rig's PTT and frequency, you'll need a copy of Hamlib's rigctl.exe.
45
47
 
46
48
  ## Hacking it
47
49
  The transmitter and receiver may be run independently from the GUI, as they communicate only via UDP (see below). For example, to run the receiver from Python,
48
50
  ```
49
- from PyFT8m import Receiver
51
+ from PyFT8 import Receiver
50
52
  rx = Receiver(output_type = 'print', input_keywords = 'Mic, CODEC')
51
53
  ```
52
54
  Or of course copy the receiver.py file, add this line at the bottom (minus the import), and hack away.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "PyFT8"
3
- version = "4.0.0"
3
+ version = "4.0.2"
4
4
  license = "GPL-3.0-or-later"
5
5
 
6
6
  authors = [
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes