Skip to content

Commit 9929038

Browse files
authored
Merge pull request #203 from semuconsulting/RC-1.5.11
Rc 1.5.11
2 parents 3713a0b + 803d7a0 commit 9929038

36 files changed

+828
-1008
lines changed

.github/workflows/checkpr.yml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ jobs:
1717
with:
1818
python-version: ${{ matrix.python-version }}
1919
- name: Install deploy dependencies
20-
run: pip install .[deploy]
21-
- name: Install test dependencies
22-
run: pip install .[test]
20+
run: pip install --group deploy
2321
- name: Install code dependencies
2422
run: pip install .
2523
- name: Lint with pylint

.github/workflows/main.yml

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,12 @@ jobs:
1919
with:
2020
python-version: ${{ matrix.python-version }}
2121
- name: Install deploy dependencies
22-
run: |
23-
pip install .[deploy]
24-
- name: Install test dependencies
25-
run: |
26-
pip install .[test]
22+
run: pip install --group deploy
2723
- name: Install code dependencies
28-
run: |
29-
pip install .
24+
run: pip install .
3025
- name: Lint with pylint
31-
run: |
32-
pylint -E src
26+
run: pylint -E src
3327
- name: Security vulnerability analysis with bandit
34-
run: |
35-
bandit -c pyproject.toml -r -lll .
28+
run: bandit -c pyproject.toml -r -lll .
3629
- name: Test with pytest
37-
run: |
38-
pytest
30+
run: pytest

.vscode/settings.json

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,20 @@
11
{
22
"python.testing.pytestEnabled": true,
3-
"python.testing.unittestEnabled": false,
3+
"python.terminal.activateEnvironment": true,
44
"editor.formatOnSave": true,
5-
"modulename": "pygpsclient",
6-
"distname": "pygpsclient",
7-
"python.defaultInterpreterPath": "python3",
5+
"modulename": "${workspaceFolderBasename}",
6+
"distname": "${workspaceFolderBasename}",
7+
//"venv": "${env:UserProfile}/pygpsclient",
8+
"venv": "${env:HOME}/pygpsclient",
9+
"python.testing.pytestArgs": [
10+
"tests"
11+
],
12+
"C_Cpp.copilotHover": "disabled",
13+
"chat.agent.enabled": false,
14+
"chat.commandCenter.enabled": false,
15+
"chat.notifyWindowOnConfirmation": false,
16+
"telemetry.feedback.enabled": false,
17+
"python.analysis.addHoverSummaries": false,
18+
"python-envs.defaultEnvManager": "ms-python.python:venv",
19+
"python-envs.pythonProjects": [],
820
}

.vscode/tasks.json

Lines changed: 65 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,29 @@
11
{
22
// See https://go.microsoft.com/fwlink/?LinkId=733558
33
// for the documentation about the tasks.json format
4-
// These Python project tasks assume you have installed and configured:
5-
// build, wheel, black, pylint, pytest, pytest-cov, Sphinx, sphinx-rtd-theme
6-
// Use the Update Toolchain task to install the necessary packages.
4+
//
5+
// This VSCode development workflow is intended to work on
6+
// MacOS, Linux and Windows (with Powershell>=5.1).
7+
//
8+
// Use the Install Deploy Dependencies tasks to install the necessary
9+
// build and test packages into the system environment.
10+
//
11+
// Use the Create Venv task to create a virtual environment in the
12+
// designated directory. Select this environment using Select
13+
// Interpreter to auto-activate it via New Terminal.
14+
//
15+
// Remember to include any global Python bin (Scripts on Windows) in PATH.
716
"version": "2.0.0",
817
"tasks": [
918
{
10-
"label": "Install Dependencies",
19+
"label": "Create Venv",
1120
"type": "process",
1221
"command": "${config:python.defaultInterpreterPath}",
1322
"args": [
1423
"-m",
15-
"pip",
16-
"install",
17-
"--upgrade",
18-
"setuptools",
19-
"build",
20-
"wheel",
21-
"black",
22-
"pylint",
23-
"pytest",
24-
"pytest-cov",
25-
"isort",
26-
"bandit",
27-
"Sphinx",
28-
"sphinx-rtd-theme"
24+
"venv",
25+
"${config:venv}",
26+
//"--system-site-packages"
2927
],
3028
"problemMatcher": []
3129
},
@@ -48,6 +46,19 @@
4846
},
4947
"problemMatcher": []
5048
},
49+
{
50+
"label": "Install Deploy Dependencies",
51+
"type": "process",
52+
"command": "${config:python.defaultInterpreterPath}",
53+
"args": [
54+
"-m",
55+
"pip",
56+
"install",
57+
"--group",
58+
"deploy"
59+
],
60+
"problemMatcher": []
61+
},
5162
{
5263
"label": "Clean",
5364
"type": "shell",
@@ -58,22 +69,16 @@
5869
"dist",
5970
"htmlcov",
6071
"docs/_build",
61-
"${config:modulename}.egg-info"
72+
"${config:modulename}.egg-info",
6273
],
6374
"windows": {
64-
"command": "Get-ChildItem",
75+
"command": "rm",
6576
"args": [
77+
"-R",
6678
"-Path",
67-
"build\\,",
68-
"dist\\,",
69-
"docs\\_build,",
70-
"${config:modulename}.egg-info",
71-
"-Recurse",
72-
"|",
73-
"Remove-Item",
74-
"-Recurse",
75-
"-Confirm:$false",
76-
"-Force"
79+
"'src/${config:modulename}.egg-info','build','dist','htmlcov','docs/_build'",
80+
"-ErrorAction",
81+
"SilentlyContinue" // doesn't work! - stops on exit code 1 anyway
7782
]
7883
},
7984
"options": {
@@ -126,37 +131,49 @@
126131
"-c",
127132
"pyproject.toml",
128133
"-r",
129-
"--exit-zero",
130134
"."
131135
],
132136
"problemMatcher": []
133137
},
134138
{
135-
"label": "Build",
139+
"label": "Test",
136140
"type": "process",
137141
"command": "${config:python.defaultInterpreterPath}",
138142
"args": [
139143
"-m",
140-
"build",
141-
".",
142-
"--wheel",
143-
"--sdist"
144+
"pytest"
144145
],
145146
"problemMatcher": [],
146147
"group": {
147-
"kind": "build",
148+
"kind": "test",
148149
"isDefault": true
149150
}
150151
},
151152
{
152-
"label": "Test",
153+
"label": "Build",
153154
"type": "process",
154155
"command": "${config:python.defaultInterpreterPath}",
155156
"args": [
156157
"-m",
157-
"pytest"
158+
"build",
159+
".",
160+
"--wheel",
161+
"--sdist",
158162
],
159-
"problemMatcher": []
163+
"problemMatcher": [],
164+
"dependsOrder": "sequence",
165+
"dependsOn": [
166+
"Clean",
167+
"Security",
168+
"Sort Imports",
169+
"Format",
170+
"Pylint",
171+
"Test",
172+
],
173+
"group": {
174+
"kind": "build",
175+
"isDefault": true
176+
}
160177
},
161178
{
162179
"label": "Sphinx",
@@ -193,7 +210,7 @@
193210
"problemMatcher": []
194211
},
195212
{
196-
"label": "Sphinx Deploy to S3",
213+
"label": "Sphinx Deploy to S3", // needs AWS credentials
197214
"type": "process",
198215
"command": "aws",
199216
"args": [
@@ -210,48 +227,28 @@
210227
"problemMatcher": []
211228
},
212229
{
213-
"label": "Install Wheel",
214-
"type": "shell",
230+
"label": "Install Locally",
231+
"type": "process",
215232
"command": "${config:python.defaultInterpreterPath}",
216233
"args": [
217234
"-m",
218235
"pip",
219236
"install",
220-
"--user",
237+
"--upgrade",
221238
"--force-reinstall",
222-
"*.whl"
239+
"--find-links=${workspaceFolder}/dist",
240+
"${workspaceFolderBasename}",
241+
// "--target",
242+
// "${config:venv}/Lib/site-packages"
223243
],
224244
"options": {
225245
"cwd": "dist"
226246
},
227-
"problemMatcher": []
228-
},
229-
{
230-
"label": "Install Locally",
231-
"type": "shell",
232-
"command": "${config:python.defaultInterpreterPath}",
233-
"args": [
234-
"-m",
235-
"pip",
236-
"install",
237-
//"--user",
238-
"--force-reinstall",
239-
"*.whl"
240-
],
241247
"dependsOrder": "sequence",
242248
"dependsOn": [
243-
"Clean",
244-
"Security",
245-
"Sort Imports",
246-
"Format",
247-
"Pylint",
248-
"Test",
249249
"Build",
250250
"Sphinx HTML"
251251
],
252-
"options": {
253-
"cwd": "dist"
254-
},
255252
"problemMatcher": []
256253
}
257254
]

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,8 @@ The facility can be accessed by clicking ![SPARTN Client button](https://github.
418418
419419
2. L-BAND Correction (D9* Receiver):
420420
421+
**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`.
422+
421423
- SPARTN L-Band correction receiver e.g. u-blox NEO-D9S.
422424
- [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).
423425
- Subscription to L-Band location service e.g. u-blox / Thingstream PointPerfect, which should provide the following details:
@@ -453,6 +455,7 @@ The facility can be accessed by clicking ![SPARTN Client button](https://github.
453455

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

458+
1. **NOTE** This panel is only available if json configuration setting `lband_enabled_b` is set to `1`.
456459
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).
457460
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.
458461
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.
@@ -634,7 +637,9 @@ For further details, refer to the `pygnssutils` homepage at [https://github.com/
634637
sudo apt-get install build-essential libssl-dev libffi-dev python3-dev pkg-config
635638
```
636639
637-
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*).
640+
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*).
641+
642+
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.
638643
639644
---
640645
## <a name="license">License</a>

RELEASE_NOTES.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,20 @@
11
# PyGPSClient Release Notes
22

3+
### RELEASE 1.5.11
4+
5+
FIXES:
6+
7+
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.
8+
1. Fix minor bugs in GPX Viewer custom map handling.
9+
10+
ENHANCEMENTS:
11+
12+
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).
13+
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.
14+
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.
15+
1. Allow datalogging and track recording to be enabled or disabled while connected (previously only available while disconnected).
16+
1. Update minimum pyubx2, pysbf2 and pygnssutils versions to take onboard latest fixes and enhancements.
17+
318
### RELEASE 1.5.10
419

520
FIXES:
@@ -632,7 +647,7 @@ ENHANCEMENTS:
632647
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.
633648
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.
634649
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.
635-
4. The new panel can be enabled or disabled using the `ENABLE_CFG_OTHER` boolean in `globals.py`.
650+
4. The new panel can be enabled or disabled using the `ENABLE_CFG_LEGACY` boolean in `globals.py`.
636651

637652
### RELEASE v1.3.7
638653

docs/modules.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
pygpsclient
1+
PyGPSClient
22
===========
33

44
.. toctree::
55
:maxdepth: 4
66

7-
pygpsclient
7+
PyGPSClient

0 commit comments

Comments
 (0)