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.
- {pyft8-4.0.0 → pyft8-4.0.2}/PKG-INFO +12 -10
- {pyft8-4.0.0 → pyft8-4.0.2}/PyFT8/tk_gui.py +9 -9
- {pyft8-4.0.0 → pyft8-4.0.2}/PyFT8/udp_comms.py +1 -1
- {pyft8-4.0.0 → pyft8-4.0.2}/PyFT8.egg-info/PKG-INFO +12 -10
- {pyft8-4.0.0 → pyft8-4.0.2}/README.md +11 -9
- {pyft8-4.0.0 → pyft8-4.0.2}/pyproject.toml +1 -1
- {pyft8-4.0.0 → pyft8-4.0.2}/LICENSE +0 -0
- {pyft8-4.0.0 → pyft8-4.0.2}/PyFT8/__init__.py +0 -0
- {pyft8-4.0.0 → pyft8-4.0.2}/PyFT8/receiver.py +0 -0
- {pyft8-4.0.0 → pyft8-4.0.2}/PyFT8/transmitter.py +0 -0
- {pyft8-4.0.0 → pyft8-4.0.2}/PyFT8.egg-info/SOURCES.txt +0 -0
- {pyft8-4.0.0 → pyft8-4.0.2}/PyFT8.egg-info/dependency_links.txt +0 -0
- {pyft8-4.0.0 → pyft8-4.0.2}/PyFT8.egg-info/entry_points.txt +0 -0
- {pyft8-4.0.0 → pyft8-4.0.2}/PyFT8.egg-info/requires.txt +0 -0
- {pyft8-4.0.0 → pyft8-4.0.2}/PyFT8.egg-info/top_level.txt +0 -0
- {pyft8-4.0.0 → pyft8-4.0.2}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PyFT8
|
|
3
|
-
Version: 4.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
|
-
#
|
|
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="
|
|
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
|
|
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
|
-
*
|
|
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
|
|
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
|
-
|
|
61
|
+
pyft8gui
|
|
60
62
|
```
|
|
61
|
-
You might have to open a new command window after pip install so that the command '
|
|
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
|
|
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.
|
|
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 = "
|
|
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.
|
|
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'], "
|
|
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
|
|
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.
|
|
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}/
|
|
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}/
|
|
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
|
|
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
|
|
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.
|
|
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
|
-
#
|
|
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="
|
|
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
|
|
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
|
-
*
|
|
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
|
|
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
|
-
|
|
61
|
+
pyft8gui
|
|
60
62
|
```
|
|
61
|
-
You might have to open a new command window after pip install so that the command '
|
|
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
|
|
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
|
-
#
|
|
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="
|
|
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
|
|
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
|
-
*
|
|
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
|
|
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
|
-
|
|
42
|
+
pyft8gui
|
|
41
43
|
```
|
|
42
|
-
You might have to open a new command window after pip install so that the command '
|
|
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
|
|
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.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|