AFCOM 1.9.1__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 (45) hide show
  1. afcom-1.9.1/AFCOM.egg-info/PKG-INFO +359 -0
  2. afcom-1.9.1/AFCOM.egg-info/SOURCES.txt +43 -0
  3. afcom-1.9.1/AFCOM.egg-info/dependency_links.txt +1 -0
  4. afcom-1.9.1/AFCOM.egg-info/entry_points.txt +2 -0
  5. afcom-1.9.1/AFCOM.egg-info/requires.txt +2 -0
  6. afcom-1.9.1/AFCOM.egg-info/top_level.txt +2 -0
  7. afcom-1.9.1/LICENSE +674 -0
  8. afcom-1.9.1/MANIFEST.in +6 -0
  9. afcom-1.9.1/PKG-INFO +359 -0
  10. afcom-1.9.1/README.md +324 -0
  11. afcom-1.9.1/pyproject.toml +3 -0
  12. afcom-1.9.1/requirements.txt +2 -0
  13. afcom-1.9.1/setup.cfg +4 -0
  14. afcom-1.9.1/setup.py +72 -0
  15. afcom-1.9.1/src/__init__.py +21 -0
  16. afcom-1.9.1/src/actions.py +178 -0
  17. afcom-1.9.1/src/ansi.py +105 -0
  18. afcom-1.9.1/src/app.py +45 -0
  19. afcom-1.9.1/src/constants.py +96 -0
  20. afcom-1.9.1/src/main_window.py +498 -0
  21. afcom-1.9.1/src/serial_ports.py +82 -0
  22. afcom-1.9.1/src/serial_worker.py +82 -0
  23. afcom-1.9.1/src/settings_dialog.py +55 -0
  24. afcom-1.9.1/src/settings_store.py +64 -0
  25. afcom-1.9.1/src/theme.py +217 -0
  26. afcom-1.9.1/src/translations.py +128 -0
  27. afcom-1.9.1/src/ui_loader.py +95 -0
  28. afcom-1.9.1/src/ui_main.py +27 -0
  29. afcom-1.9.1/test/test_main.py +117 -0
  30. afcom-1.9.1/ui/__init__.py +6 -0
  31. afcom-1.9.1/ui/build_ui.py +78 -0
  32. afcom-1.9.1/ui/config.ui +310 -0
  33. afcom-1.9.1/ui/help.py +59 -0
  34. afcom-1.9.1/ui/help.ui +66 -0
  35. afcom-1.9.1/ui/icon.ico +0 -0
  36. afcom-1.9.1/ui/main_window.py +436 -0
  37. afcom-1.9.1/ui/main_window.ui +636 -0
  38. afcom-1.9.1/ui/resource/chevron-down.svg +4 -0
  39. afcom-1.9.1/ui/resource/chevron-up.svg +4 -0
  40. afcom-1.9.1/ui/resource/play.svg +1 -0
  41. afcom-1.9.1/ui/resources.qrc +7 -0
  42. afcom-1.9.1/ui/resources_rc.py +564 -0
  43. afcom-1.9.1/ui/settings.py +137 -0
  44. afcom-1.9.1/ui/settings.ui +187 -0
  45. afcom-1.9.1/ui/theme.qss +488 -0
@@ -0,0 +1,359 @@
1
+ Metadata-Version: 2.4
2
+ Name: AFCOM
3
+ Version: 1.9.1
4
+ Summary: AFCOM - a PySide6 serial communication GUI client.
5
+ Home-page: https://github.com/mcagriaksoy/Serial-Communication-GUI-Program
6
+ Author: Mehmet Cagri Aksoy
7
+ Project-URL: Source, https://github.com/mcagriaksoy/Serial-Communication-GUI-Program
8
+ Project-URL: Releases, https://github.com/mcagriaksoy/Serial-Communication-GUI-Program/releases
9
+ Project-URL: Bug Tracker, https://github.com/mcagriaksoy/Serial-Communication-GUI-Program/issues
10
+ Classifier: Development Status :: 5 - Production/Stable
11
+ Classifier: Environment :: X11 Applications :: Qt
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Topic :: Terminals :: Serial
20
+ Requires-Python: >=3.9
21
+ Description-Content-Type: text/markdown
22
+ License-File: LICENSE
23
+ Requires-Dist: PySide6>=6.6
24
+ Requires-Dist: pyserial>=3.5
25
+ Dynamic: author
26
+ Dynamic: classifier
27
+ Dynamic: description
28
+ Dynamic: description-content-type
29
+ Dynamic: home-page
30
+ Dynamic: license-file
31
+ Dynamic: project-url
32
+ Dynamic: requires-dist
33
+ Dynamic: requires-python
34
+ Dynamic: summary
35
+
36
+ # AFCOM Client
37
+
38
+ <p align="center">
39
+ <img src="img/icon.png" width="120" alt="AFCOM Client logo">
40
+ </p>
41
+
42
+ <h3 align="center">A fast, cross-platform serial (COM port) terminal for Windows, Linux and macOS.</h3>
43
+
44
+ <p align="center">
45
+ <a href="https://github.com/mcagriaksoy/Serial-Communication-GUI-Program/releases/latest">
46
+ <img src="https://img.shields.io/github/v/release/mcagriaksoy/Serial-Communication-GUI-Program?sort=semver&color=2f81f7&label=release" alt="Latest release">
47
+ </a>
48
+ <a href="https://pypi.org/project/AFCOM/">
49
+ <img src="https://img.shields.io/pypi/v/AFCOM?color=2f81f7&label=PyPI" alt="PyPI version">
50
+ </a>
51
+ <a href="#license">
52
+ <img src="https://img.shields.io/badge/license-GPL--3.0-2f81f7" alt="GPL-3.0 license">
53
+ </a>
54
+ <a href="https://github.com/mcagriaksoy/Serial-Communication-GUI-Program/actions/workflows/release.yml">
55
+ <img src="https://img.shields.io/github/actions/workflow/status/mcagriaksoy/Serial-Communication-GUI-Program/release.yml?label=build" alt="Build status">
56
+ </a>
57
+ <a href="https://github.com/mcagriaksoy/Serial-Communication-GUI-Program/issues">
58
+ <img src="https://img.shields.io/github/issues/mcagriaksoy/Serial-Communication-GUI-Program" alt="Issues">
59
+ </a>
60
+ </p>
61
+
62
+ <p align="center">
63
+ <a href="https://github.com/mcagriaksoy/Serial-Communication-GUI-Program/releases/latest">
64
+ <img src="https://img.shields.io/badge/Download-Windows_installer-2f81f7?style=for-the-badge&logo=windows" alt="Download for Windows">
65
+ </a>
66
+ <a href="https://pypi.org/project/AFCOM/">
67
+ <img src="https://img.shields.io/badge/Install_from-PyPI-2f81f7?style=for-the-badge&logo=pypi&logoColor=white" alt="Install from PyPI">
68
+ </a>
69
+ </p>
70
+
71
+ ![AFCOM Client main window](img/screenshot-dark.png)
72
+
73
+ **AFCOM** is a desktop serial communication client for talking to
74
+ microcontrollers, sensors, modems, development boards and any other device that
75
+ exposes a serial interface. Scan ports, configure every common line setting,
76
+ watch incoming data with ANSI colours, and send commands — all from a clean
77
+ native Qt interface.
78
+
79
+ > Formerly known as **Serial Communication GUI Program**.
80
+
81
+ ## Highlights
82
+
83
+ - **Cross-platform** — Windows, Linux and macOS; automatic COM/tty port discovery.
84
+ - **Complete serial configuration** — baud rate, data bits, parity, stop bits, flow control, timeout and line ending.
85
+ - **Real terminal** — scrollable output with ANSI colour support and optional timestamps.
86
+ - **Live statistics** — RX/TX byte counters and connected-device details.
87
+ - **Comfortable sending** — multi-line input, Enter to send, configurable CR/LF handling.
88
+ - **Save your logs** — write terminal output to a text file at any time.
89
+ - **Make it yours** — dark/light themes, English/Turkish UI, terminal font and size.
90
+ - **Distraction-free mode** — Basic View hides the configuration panel.
91
+ - **No telemetry, no account, no cloud** — everything runs locally.
92
+
93
+ ## Screenshots
94
+
95
+ | Dark theme | Light theme |
96
+ | --- | --- |
97
+ | ![AFCOM dark theme](img/screenshot-dark.png) | ![AFCOM light theme](img/screenshot-light.png) |
98
+
99
+ | Preferences | Basic View |
100
+ | --- | --- |
101
+ | ![AFCOM preferences](img/screenshot-preferences.png) | ![AFCOM basic view](img/screenshot-basic-view.png) |
102
+
103
+ <p align="center">
104
+ <img src="img/screenshot-turkish.png" alt="AFCOM Turkish interface" width="820">
105
+ <br>
106
+ <em>English and Turkish interfaces are included.</em>
107
+ </p>
108
+
109
+ ## Install
110
+
111
+ ### Windows (recommended)
112
+
113
+ Download the latest build from
114
+ [**GitHub Releases**](https://github.com/mcagriaksoy/Serial-Communication-GUI-Program/releases/latest):
115
+
116
+ | File | Description |
117
+ | --- | --- |
118
+ | `AFCOM_Client_v1.9.1_win64_setup.exe` | Per-user installer — Start Menu shortcut, optional desktop shortcut, clean uninstall |
119
+ | `AFCOM_v1.9.1_portable_win64.exe` | Portable single-file executable — no installation required |
120
+
121
+ The installer does **not** require administrator rights. Windows 10 or newer is
122
+ recommended; Windows 11 is fully supported.
123
+
124
+ ### PyPI (Windows, Linux and macOS)
125
+
126
+ ```bash
127
+ pip install afcom
128
+ afcom
129
+ ```
130
+
131
+ `AFCOM` is a pure-Python package. On Linux you may need the system Qt/Tk
132
+ libraries that ship with your distribution; PySide6 wheels bundle Qt itself.
133
+
134
+ ### Run from source
135
+
136
+ Requirements: **Python 3.10+**, `pip`, and a virtual environment.
137
+
138
+ ```bash
139
+ git clone https://github.com/mcagriaksoy/Serial-Communication-GUI-Program.git
140
+ cd Serial-Communication-GUI-Program
141
+
142
+ python3 -m venv .venv
143
+ source .venv/bin/activate # Windows: .venv\Scripts\activate
144
+ python -m pip install --upgrade pip
145
+ pip install -r requirements.txt
146
+
147
+ python main.py
148
+ ```
149
+
150
+ On Linux, if the application cannot create a window, install the usual Qt/X11
151
+ runtime packages for your distribution (for example `libxcb-cursor0` on recent
152
+ Debian/Ubuntu releases).
153
+
154
+ ## Quick start
155
+
156
+ 1. Connect your device and click **⟳ Scan ports**.
157
+ 2. Select the port and match the serial settings to your device.
158
+ 3. Click **CONNECT**. The status dot turns green when the port is open.
159
+ 4. Type a command in the send box and press **Enter** (or click **Send**).
160
+ 5. Incoming data appears in the terminal. Use **File → Save As…** to keep a log.
161
+
162
+ ### Serial settings
163
+
164
+ | Setting | Options / notes |
165
+ | --- | --- |
166
+ | Baud rate | 110 … 921600 (115200 is selected by default) |
167
+ | Data bits | 5, 6, 7, 8 |
168
+ | Parity | None, Even, Odd, Mark, Space |
169
+ | Stop bits | 1, 1.5, 2 |
170
+ | Flow control | None, XON/XOFF, RTS/CTS, DSR/DTR |
171
+ | Timeout | 0.1 – 5 seconds |
172
+ | Line ending | None, LF, CR, CRLF (appended when sending) |
173
+
174
+ If you are unsure about your device's settings, start with **115200 8-N-1, no
175
+ flow control** — the most common configuration for development boards.
176
+
177
+ ### Keyboard shortcuts
178
+
179
+ | Shortcut | Action |
180
+ | --- | --- |
181
+ | `Enter` in the send box | Send the current data |
182
+ | `Ctrl+Enter` | Send (from the Send button shortcut) |
183
+ | `Ctrl+A` | Select all terminal text |
184
+ | `Ctrl+C` | Copy selected terminal text |
185
+
186
+ ## Using the terminal
187
+
188
+ - **ANSI colours** are rendered, so coloured firmware logs remain readable.
189
+ - **Timestamps** can be enabled in **Settings → Preferences** to prefix received lines.
190
+ - **Clear** empties the on-screen terminal; **Edit → Clear Buffers** also clears the send box.
191
+ - **Connection → Reset Terminal** clears both buffers and resets the RX/TX counters.
192
+ - **View → Basic View** hides the side panel for a wider terminal.
193
+ - **Help → Check for Updates** compares your version with the latest GitHub tag.
194
+ - Preferences are stored per user:
195
+ - Windows: `%APPDATA%\AFCOM\settings.json`
196
+ - macOS: `~/Library/Application Support/AFCOM/settings.json`
197
+ - Linux: `~/.config/afcom/settings.json`
198
+
199
+ ## Troubleshooting
200
+
201
+ **No ports are listed.** Reconnect the device, install its USB-serial driver
202
+ (CH340, CP210x, FTDI, etc.) and click **Scan ports** again. On Linux, make sure
203
+ your user is in the `dialout` group:
204
+
205
+ ```bash
206
+ sudo usermod -aG dialout "$USER"
207
+ # log out and back in, then reconnect the device
208
+ ```
209
+
210
+ **The port is busy.** Close any other terminal application using the device.
211
+ Only one program can own a serial port at a time.
212
+
213
+ **Garbled or missing output.** The baud rate, data bits, parity or stop bits do
214
+ not match the device. Check the device documentation and reconnect.
215
+
216
+ **Connection drops unexpectedly.** Some adapters are sensitive to flow control.
217
+ Try **Flow: None**, a longer timeout, or a different USB cable/port.
218
+
219
+ **`pip install afcom` installs an old version.** Upgrade explicitly:
220
+
221
+ ```bash
222
+ python -m pip install --upgrade afcom
223
+ ```
224
+
225
+ ## Development
226
+
227
+ ### Project structure
228
+
229
+ ```text
230
+ main.py Application entry point
231
+ src/
232
+ app.py QApplication bootstrap
233
+ main_window.py Main window controller
234
+ serial_worker.py Background serial reader (QThread)
235
+ serial_ports.py Cross-platform port discovery
236
+ settings_store.py JSON preferences
237
+ settings_dialog.py Preferences dialog
238
+ theme.py Adwaita-inspired light/dark palettes
239
+ translations.py English / Turkish strings
240
+ actions.py Menu actions (save, about, help, updates)
241
+ ansi.py ANSI colour → HTML
242
+ ui_loader.py Loads / regenerates Qt Designer UI modules
243
+ constants.py Metadata, paths and defaults
244
+ ui/
245
+ *.ui Qt Designer layouts (source of truth)
246
+ theme.qss Central stylesheet template
247
+ build_ui.py Regenerate the Python UI modules
248
+ test/ pytest unit tests
249
+ installer/afcom.iss Inno Setup installer script
250
+ scripts/build_windows.py PyInstaller release build helper
251
+ ```
252
+
253
+ The `ui/*.ui` files are the single source of truth. Edit them in Qt Designer
254
+ (or manually) and regenerate the Python modules with:
255
+
256
+ ```bash
257
+ python ui/build_ui.py
258
+ ```
259
+
260
+ At startup the application also regenerates any `.ui` file that is newer than
261
+ its generated `.py` equivalent, so you normally do not need to run this by hand.
262
+
263
+ ### Tests
264
+
265
+ ```bash
266
+ pip install -r requirements.txt pytest
267
+ pytest test/
268
+ ```
269
+
270
+ ### Build a standalone executable
271
+
272
+ ```bash
273
+ pip install -r requirements.txt pyinstaller
274
+ pyinstaller main.spec
275
+ ```
276
+
277
+ For the versioned Windows release build:
278
+
279
+ ```bash
280
+ python scripts/build_windows.py
281
+ # -> dist/AFCOM_v<version>_portable_win64.exe
282
+ ```
283
+
284
+ On Windows, compile the installer with Inno Setup after the portable build:
285
+
286
+ ```powershell
287
+ ISCC.exe /DVersion=1.9.1 `
288
+ /DSourceExe=dist\AFCOM_v1.9.1_portable_win64.exe `
289
+ /DOutputDir=release-artifacts installer\afcom.iss
290
+ ```
291
+
292
+ ## Releasing
293
+
294
+ Releases are driven by version tags. The single source of truth is
295
+ `APP_VERSION` in [`src/constants.py`](src/constants.py), and it must match the
296
+ tag without the leading `v`.
297
+
298
+ ```bash
299
+ # 1. Bump APP_VERSION, commit and push master
300
+ git add -A
301
+ git commit -m "Release v1.9.1"
302
+ git push origin master
303
+
304
+ # 2. Tag the same commit and push the tag
305
+ git tag v1.9.1
306
+ git push origin v1.9.1
307
+ ```
308
+
309
+ Pushing a `v*` tag runs two GitHub Actions workflows:
310
+
311
+ - **[`release.yml`](.github/workflows/release.yml)** — verifies the tag, builds
312
+ the Windows portable executable with PyInstaller and the per-user installer
313
+ with Inno Setup, then publishes both to a GitHub Release.
314
+ - **[`publish-pypi.yml`](.github/workflows/publish-pypi.yml)** — builds the
315
+ sdist/wheel and publishes **AFCOM** to PyPI with Trusted Publishing (OIDC).
316
+ If the version already exists on PyPI, publishing is skipped safely.
317
+
318
+ Every released executable receives a signed **build-provenance attestation**:
319
+
320
+ ```bash
321
+ gh attestation verify AFCOM_v1.9.1_portable_win64.exe \
322
+ --repo mcagriaksoy/Serial-Communication-GUI-Program
323
+ ```
324
+
325
+ ## Compatibility
326
+
327
+ | Platform | Installer / executable | PyPI package | Source |
328
+ | --- | --- | --- | --- |
329
+ | Windows 10/11 (x64) | ✅ portable + installer | ✅ | ✅ |
330
+ | Linux (x64) | — | ✅ `pip install afcom` | ✅ |
331
+ | macOS (Intel/Apple Silicon) | — | ✅ `pip install afcom` | ✅ |
332
+
333
+ Serial hardware support depends on the operating system drivers. Common USB
334
+ adapters (CH340, CP210x, FTDI, PL2303) work through their standard drivers.
335
+
336
+ ## Contributing
337
+
338
+ Contributions, bug reports and feature requests are welcome.
339
+
340
+ - Report bugs via [GitHub Issues](https://github.com/mcagriaksoy/Serial-Communication-GUI-Program/issues)
341
+ - Open a pull request with a clear description and keep the existing code style
342
+ - Run `pytest test/` before submitting
343
+
344
+ ## License
345
+
346
+ Released under the [GNU General Public License v3.0](LICENSE) by
347
+ [@mcagriaksoy](https://github.com/mcagriaksoy).
348
+
349
+ AFCOM uses Qt for Python (PySide6), licensed under LGPLv3.
350
+
351
+ ## Support the project
352
+
353
+ <a href="https://www.buymeacoffee.com/mcagriaksoy">
354
+ <img src="https://img.shields.io/badge/-buy_me_a_coffee-gray?logo=buy-me-a-coffee" alt="Buy Me A Coffee">
355
+ </a>
356
+
357
+ ---
358
+
359
+ <p align="center">Made for engineers, makers and anyone who still loves a good serial port.</p>
@@ -0,0 +1,43 @@
1
+ LICENSE
2
+ MANIFEST.in
3
+ README.md
4
+ pyproject.toml
5
+ requirements.txt
6
+ setup.py
7
+ AFCOM.egg-info/PKG-INFO
8
+ AFCOM.egg-info/SOURCES.txt
9
+ AFCOM.egg-info/dependency_links.txt
10
+ AFCOM.egg-info/entry_points.txt
11
+ AFCOM.egg-info/requires.txt
12
+ AFCOM.egg-info/top_level.txt
13
+ src/__init__.py
14
+ src/actions.py
15
+ src/ansi.py
16
+ src/app.py
17
+ src/constants.py
18
+ src/main_window.py
19
+ src/serial_ports.py
20
+ src/serial_worker.py
21
+ src/settings_dialog.py
22
+ src/settings_store.py
23
+ src/theme.py
24
+ src/translations.py
25
+ src/ui_loader.py
26
+ src/ui_main.py
27
+ test/test_main.py
28
+ ui/__init__.py
29
+ ui/build_ui.py
30
+ ui/config.ui
31
+ ui/help.py
32
+ ui/help.ui
33
+ ui/icon.ico
34
+ ui/main_window.py
35
+ ui/main_window.ui
36
+ ui/resources.qrc
37
+ ui/resources_rc.py
38
+ ui/settings.py
39
+ ui/settings.ui
40
+ ui/theme.qss
41
+ ui/resource/chevron-down.svg
42
+ ui/resource/chevron-up.svg
43
+ ui/resource/play.svg
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ afcom = src.app:run
@@ -0,0 +1,2 @@
1
+ PySide6>=6.6
2
+ pyserial>=3.5
@@ -0,0 +1,2 @@
1
+ src
2
+ ui