Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions .github/workflows/checkpr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,7 @@ jobs:
with:
python-version: ${{ matrix.python-version }}
- name: Install deploy dependencies
run: pip install .[deploy]
- name: Install test dependencies
run: pip install .[test]
run: pip install --group deploy
- name: Install code dependencies
run: pip install .
- name: Lint with pylint
Expand Down
18 changes: 5 additions & 13 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,20 +19,12 @@ jobs:
with:
python-version: ${{ matrix.python-version }}
- name: Install deploy dependencies
run: |
pip install .[deploy]
- name: Install test dependencies
run: |
pip install .[test]
run: pip install --group deploy
- name: Install code dependencies
run: |
pip install .
run: pip install .
- name: Lint with pylint
run: |
pylint -E src
run: pylint -E src
- name: Security vulnerability analysis with bandit
run: |
bandit -c pyproject.toml -r -lll .
run: bandit -c pyproject.toml -r -lll .
- name: Test with pytest
run: |
pytest
run: pytest
20 changes: 16 additions & 4 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,20 @@
{
"python.testing.pytestEnabled": true,
"python.testing.unittestEnabled": false,
"python.terminal.activateEnvironment": true,
"editor.formatOnSave": true,
"modulename": "pygpsclient",
"distname": "pygpsclient",
"python.defaultInterpreterPath": "python3",
"modulename": "${workspaceFolderBasename}",
"distname": "${workspaceFolderBasename}",
//"venv": "${env:UserProfile}/pygpsclient",
"venv": "${env:HOME}/pygpsclient",
"python.testing.pytestArgs": [
"tests"
],
"C_Cpp.copilotHover": "disabled",
"chat.agent.enabled": false,
"chat.commandCenter.enabled": false,
"chat.notifyWindowOnConfirmation": false,
"telemetry.feedback.enabled": false,
"python.analysis.addHoverSummaries": false,
"python-envs.defaultEnvManager": "ms-python.python:venv",
"python-envs.pythonProjects": [],
}
133 changes: 65 additions & 68 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
@@ -1,31 +1,29 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
// These Python project tasks assume you have installed and configured:
// build, wheel, black, pylint, pytest, pytest-cov, Sphinx, sphinx-rtd-theme
// Use the Update Toolchain task to install the necessary packages.
//
// This VSCode development workflow is intended to work on
// MacOS, Linux and Windows (with Powershell>=5.1).
//
// Use the Install Deploy Dependencies tasks to install the necessary
// build and test packages into the system environment.
//
// Use the Create Venv task to create a virtual environment in the
// designated directory. Select this environment using Select
// Interpreter to auto-activate it via New Terminal.
//
// Remember to include any global Python bin (Scripts on Windows) in PATH.
"version": "2.0.0",
"tasks": [
{
"label": "Install Dependencies",
"label": "Create Venv",
"type": "process",
"command": "${config:python.defaultInterpreterPath}",
"args": [
"-m",
"pip",
"install",
"--upgrade",
"setuptools",
"build",
"wheel",
"black",
"pylint",
"pytest",
"pytest-cov",
"isort",
"bandit",
"Sphinx",
"sphinx-rtd-theme"
"venv",
"${config:venv}",
//"--system-site-packages"
],
"problemMatcher": []
},
Expand All @@ -48,6 +46,19 @@
},
"problemMatcher": []
},
{
"label": "Install Deploy Dependencies",
"type": "process",
"command": "${config:python.defaultInterpreterPath}",
"args": [
"-m",
"pip",
"install",
"--group",
"deploy"
],
"problemMatcher": []
},
{
"label": "Clean",
"type": "shell",
Expand All @@ -58,22 +69,16 @@
"dist",
"htmlcov",
"docs/_build",
"${config:modulename}.egg-info"
"${config:modulename}.egg-info",
],
"windows": {
"command": "Get-ChildItem",
"command": "rm",
"args": [
"-R",
"-Path",
"build\\,",
"dist\\,",
"docs\\_build,",
"${config:modulename}.egg-info",
"-Recurse",
"|",
"Remove-Item",
"-Recurse",
"-Confirm:$false",
"-Force"
"'src/${config:modulename}.egg-info','build','dist','htmlcov','docs/_build'",
"-ErrorAction",
"SilentlyContinue" // doesn't work! - stops on exit code 1 anyway
]
},
"options": {
Expand Down Expand Up @@ -126,37 +131,49 @@
"-c",
"pyproject.toml",
"-r",
"--exit-zero",
"."
],
"problemMatcher": []
},
{
"label": "Build",
"label": "Test",
"type": "process",
"command": "${config:python.defaultInterpreterPath}",
"args": [
"-m",
"build",
".",
"--wheel",
"--sdist"
"pytest"
],
"problemMatcher": [],
"group": {
"kind": "build",
"kind": "test",
"isDefault": true
}
},
{
"label": "Test",
"label": "Build",
"type": "process",
"command": "${config:python.defaultInterpreterPath}",
"args": [
"-m",
"pytest"
"build",
".",
"--wheel",
"--sdist",
],
"problemMatcher": []
"problemMatcher": [],
"dependsOrder": "sequence",
"dependsOn": [
"Clean",
"Security",
"Sort Imports",
"Format",
"Pylint",
"Test",
],
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "Sphinx",
Expand Down Expand Up @@ -193,7 +210,7 @@
"problemMatcher": []
},
{
"label": "Sphinx Deploy to S3",
"label": "Sphinx Deploy to S3", // needs AWS credentials
"type": "process",
"command": "aws",
"args": [
Expand All @@ -210,48 +227,28 @@
"problemMatcher": []
},
{
"label": "Install Wheel",
"type": "shell",
"label": "Install Locally",
"type": "process",
"command": "${config:python.defaultInterpreterPath}",
"args": [
"-m",
"pip",
"install",
"--user",
"--upgrade",
"--force-reinstall",
"*.whl"
"--find-links=${workspaceFolder}/dist",
"${workspaceFolderBasename}",
// "--target",
// "${config:venv}/Lib/site-packages"
],
"options": {
"cwd": "dist"
},
"problemMatcher": []
},
{
"label": "Install Locally",
"type": "shell",
"command": "${config:python.defaultInterpreterPath}",
"args": [
"-m",
"pip",
"install",
//"--user",
"--force-reinstall",
"*.whl"
],
"dependsOrder": "sequence",
"dependsOn": [
"Clean",
"Security",
"Sort Imports",
"Format",
"Pylint",
"Test",
"Build",
"Sphinx HTML"
],
"options": {
"cwd": "dist"
},
"problemMatcher": []
}
]
Expand Down
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,8 @@ The facility can be accessed by clicking ![SPARTN Client button](https://github.

2. L-BAND Correction (D9* Receiver):

**NB** Note that u-blox [discontinued their PointPerfect SPARTN L-Band service](https://portal.u-blox.com/s/question/0D5Oj00000uB53GKAS/suspension-of-european-pointperfect-lband-spartn-service) in the European region in March 2025 and Worldwide in June 2025. The SPARTN L-Band configuration panel is now disabled by default, though the panel can still be used for other generic L-Band modem configuration purposes and can be re-enabled by setting json configuration parameter `lband_enabled_b` to `1`.

- SPARTN L-Band correction receiver e.g. u-blox NEO-D9S.
- [Suitable Inmarsat L-band antenna](https://www.amazon.com/RTL-SDR-Blog-1525-1637-Inmarsat-Iridium/dp/B07WGWZS1D) and good satellite reception on regional frequency (NB: standard GNSS antenna may not be suitable).
- Subscription to L-Band location service e.g. u-blox / Thingstream PointPerfect, which should provide the following details:
Expand Down Expand Up @@ -453,6 +455,7 @@ The facility can be accessed by clicking ![SPARTN Client button](https://github.

### L-Band Correction Configuration (D9*)

1. **NOTE** This panel is only available if json configuration setting `lband_enabled_b` is set to `1`.
1. To connect to the Correction receiver, select the receiver's port from the SPARTN dialog's Serial Port listbox and click ![connect icon](https://github.com/semuconsulting/PyGPSClient/blob/master/src/pygpsclient/resources/usbport-1-24.png?raw=true). To disconnect, click ![disconnect icon](https://github.com/semuconsulting/PyGPSClient/blob/master/src/pygpsclient/resources/iconmonstr-media-control-50-24.png?raw=true).
1. Select the required Output Port - this is the port used to connect the Correction receiver to the GNSS receiver e.g. UART2 or I2C.
1. If both Correction and GNSS receivers are connected to the same PyGPSClient workstation (e.g. via separate USB ports), it is possible to run the utility in Output Port = 'Passthough' mode, whereby the output data from the Correction receiver (UBX `RXM-PMP` messages) will be automatically passed through to the GNSS receiver by PyGPSClient, without the need to connect the two externally.
Expand Down Expand Up @@ -634,7 +637,9 @@ For further details, refer to the `pygnssutils` homepage at [https://github.com/
sudo apt-get install build-essential libssl-dev libffi-dev python3-dev pkg-config
```

2. The [latest official Python 3.13 installers](https://docs.python.org/3/howto/free-threading-python.html) include the option to disable the standard [Python Global Interpreter Lock (GIL)](https://realpython.com/python-gil/) and allow threads to run concurrently. Whilst the core PyGPSClient packages run fine in this mode (*and some marginal performance improvements may be seen on multi-core machines*), installing PyGPSClient using pip under the "No-GIL" `python3.13t` executable currently fails due to missing cryptography dependencies (*Warning: CPython 3.13t at /Users/user/pygpsclient_nogil/bin/python3 does not yet support abi3 so the build artifacts will be version-specific* *warning: [email protected]: Could not find directory of OpenSSL installation*).
2. The [latest official Python 3.13 installers](https://docs.python.org/3/howto/free-threading-python.html) include the option to disable the standard [Python Global Interpreter Lock (GIL)](https://realpython.com/python-gil/) and allow threads to run concurrently. Whilst the core PyGPSClient packages run fine in this mode (*and some marginal performance improvements may be seen on multi-core machines*), installing PyGPSClient using pip under the "No-GIL" `python3.13t` executable currently fails due to missing cryptography dependencies (*Warning: CPython 3.13t at /Users/user/pygpsclient_nogil/bin/python3 does not yet support abi3 so the build artifacts will be version-specific* *warning: [email protected]: Could not find directory of OpenSSL installation*).

3. u-blox [discontinued their PointPerfect SPARTN L-Band service](https://portal.u-blox.com/s/question/0D5Oj00000uB53GKAS/suspension-of-european-pointperfect-lband-spartn-service) in the European region in March 2025. As a result, PyGPSClient maintainers based in this region are no longer able to test this functionality against live data.

---
## <a name="license">License</a>
Expand Down
17 changes: 16 additions & 1 deletion RELEASE_NOTES.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
# PyGPSClient Release Notes

### RELEASE 1.5.11

FIXES:

1. Clarify interpretation of SPARTN decryption basedate integer values in *.json configuration file; `-1` signifies 'use current datetime' (`basedate=None`); `0` signifies 'use gnssTimeTag from incoming SPARTN data stream' (`basedate=pyspartn.TIMEBASE`); any other integer value represents an explicit gnssTimeTag value.
1. Fix minor bugs in GPX Viewer custom map handling.

ENHANCEMENTS:

1. Make all Toplevel dialogs scrollable and resizeable, depending on effective screen resolution. Applies to: UBX Config, NMEA Config, NTRIP Client, SPARTN Client, Display GPX Track, Import Custom Map, TTY Commands. This allows the dialogs to be usable on low resolution screens( 600 <= width <= 1024 pixels).
1. Make SPARTN L-Band configuration panel optional - disabled by default (*ublox PointPerfect SPARTN L-Band service was discontinued in May 2025, though the panel can still be used for other generic L-Band modem configuration purposes*). Panel can be re-enabled by setting lband_enabled_b to 1.
1. Make `cryptography` library dependency optional (*it is only required to decrypt encrypted MQTT SPARTN payloads*). If the `cryptography` library is not installed, the "Decode SPARTN in console" option will be greyed out in the SPARTN MQTT Client dialog.
1. Allow datalogging and track recording to be enabled or disabled while connected (previously only available while disconnected).
1. Update minimum pyubx2, pysbf2 and pygnssutils versions to take onboard latest fixes and enhancements.

### RELEASE 1.5.10

FIXES:
Expand Down Expand Up @@ -632,7 +647,7 @@ ENHANCEMENTS:
1. New CFG-* Other Configuration command panel added to UBX Configuration panel. Provides structured inputs for a range of legacy CFG commands. **NB:** For Generation 9+ devices, legacy CFG commands are deprecated in favour of the CFG-VALGET/SET/DEL Configuration Interface commands in the adjacent panel.
2. When a legacy CFG command is selected from the CFG-* listbox, a POLL request is sent to the device to retrieve the current settings; these are then used to populate a series of dynamically generated Entry widgets. The user can amend the values as required and send the updated set of values as a SET message to the device. After sending, the current values will be polled again to confirm the update has taken place. **NB:** this mechanism is dependent on receiving timely POLL responses. Note caveats in README re. optimising POLL response performance.
3. For the time being, there are a few constraints with regard to updating certain CFG types, but these will hopefully be addressed in a future update as and when time permits. The `pyubx2` library which underpins`PyGPSClient` fully supports *ALL* CFG-* commands.
4. The new panel can be enabled or disabled using the `ENABLE_CFG_OTHER` boolean in `globals.py`.
4. The new panel can be enabled or disabled using the `ENABLE_CFG_LEGACY` boolean in `globals.py`.

### RELEASE v1.3.7

Expand Down
4 changes: 2 additions & 2 deletions docs/modules.rst
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
pygpsclient
PyGPSClient
===========

.. toctree::
:maxdepth: 4

pygpsclient
PyGPSClient
Loading