Skip to content

Commit 99caaf3

Browse files
authored
Merge pull request #183 from semuconsulting/RC-1.5.5
RC 1.5.5
2 parents dd6a8bb + 62f1b39 commit 99caaf3

31 files changed

+1139
-252
lines changed

README.md

+46-35
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
[Installation](#installation) |
66
[Instructions](#instructions) |
77
[UBX Configuration](#ubxconfig) |
8+
[NMEA Configuration](#nmeaconfig) |
89
[NTRIP Client](#ntripconfig) |
910
[SPARTN Client](#spartnconfig) |
1011
[Socket Server / NTRIP Caster](#socketserver) |
@@ -23,6 +24,7 @@ PyGPSClient is a free, open-source, multi-platform graphical GNSS/GPS testing, d
2324
* Provides [NTRIP](#ntripconfig) and [SPARTN](#spartnconfig) client facilities.
2425
* Can serve as an [NTRIP base station](#basestation) with a compatible receiver (e.g. ZED-F9P).
2526
* While not intended to be a direct replacement, the application supports most of the UBX configuration functionality in u-blox's Windows-only [u-center ©](https://www.u-blox.com/en/product/u-center) tool (*only public-domain features are supported*).
27+
* Also supports proprietary NMEA configuration functionality for Quectel LG290P and compatible devices.
2628

2729
![full app screenshot ubx](https://github.com/semuconsulting/PyGPSClient/blob/master/images/app.png?raw=true)
2830

@@ -286,6 +288,8 @@ You will need to logout and login for the launcher to take effect.
286288
1. [Socket Server / NTRIP Caster](#socketserver) facility with two modes of operation: (a) open, unauthenticated Socket Server or (b) NTRIP Caster (mountpoint = `pygnssutils`).
287289
1. [UBX Configuration Dialog](#ubxconfig), with the ability to send a variety of UBX CFG configuration commands to u-blox GNSS devices. This includes the facility to add **user-defined commands or command sequences** - see instructions under [user-defined presets](#userdefined) below. To display the UBX Configuration Dialog (*only functional when connected to a UBX GNSS device via serial port*), click
288290
![gear icon](https://github.com/semuconsulting/PyGPSClient/blob/master/src/pygpsclient/resources/iconmonstr-gear-2-24.png?raw=true), or go to Menu..Options..UBX Configuration Dialog.
291+
1. [NMEA Configuration Dialog](#nmeaconfig), with the ability to send a variety of NMEA PQTM* configuration commands to Quectel LG290P GNSS devices. This includes the facility to add **user-defined commands or command sequences** - see instructions under [user-defined presets](#userdefined) below. To display the NMEA Configuration Dialog (*only functional when connected to a compatible GNSS device via serial port*), click
292+
![gear icon](https://github.com/semuconsulting/PyGPSClient/blob/master/src/pygpsclient/resources/iconmonstr-gear-2-24-brown.png?raw=true), or go to Menu..Options..NMEA Configuration Dialog.
289293
1. [NTRIP Client](#ntripconfig) facility with the ability to connect to a specified NTRIP caster, parse the incoming RTCM3 or SPARTN data and feed this data to a compatible GNSS receiver (*requires an Internet connection and access to an NTRIP caster and local mountpoint*). To display the NTRIP Client Configuration Dialog, click
290294
![ntrip icon](https://github.com/semuconsulting/PyGPSClient/blob/master/src/pygpsclient/resources/iconmonstr-antenna-4-24.png?raw=true), or go to Menu..Options..NTRIP Configuration Dialog.
291295
1. [SPARTN Client](#spartnconfig) facility with the ability to configure an IP or L-Band SPARTN Correction source and SPARTN-compatible GNSS receiver (e.g. ZED-F9P) and pass the incoming correction data to the GNSS receiver (*requires an Internet connection and access to a SPARTN location service*). To display the SPARTN Client Configuration Dialog, click ![spartn icon](https://github.com/semuconsulting/PyGPSClient/blob/master/src/pygpsclient/resources/iconmonstr-antenna-3-24.png?raw=true), or go to Menu..Options..SPARTN Configuration Dialog.
@@ -326,7 +330,7 @@ The UBX Configuration Dialog currently provides the following UBX configuration
326330
1. Solution Rate panel (CFG-RATE) sets navigation solution interval in ms (e.g. 1000 = 1/second) and measurement ratio (ratio between the number of measurements and the number of navigation solutions, e.g. 5 = five measurements per navigation solution).
327331
1. For each of the panels above, clicking anywhere in the panel background will refresh the displayed information with the current configuration.
328332
1. Message Rate panel (CFG-MSG) sets message rates per port for UBX and NMEA messages. Message rate is relative to navigation solution frequency e.g. a message rate of '4' means 'every 4th navigation solution' (higher = less frequent).
329-
1. Generic configuration panel (CFG-*) providing structured updates for a range of legacy CFG- configuration commands for pre-Generation 9+ devices. Note: 'X' (byte) type attributes can be entered as integers or hexadecimal strings e.g. 522125312 or 0x1f1f0000.
333+
1. Dynamic configuration panel providing structured updates for a range of legacy CFG-* configuration commands for pre-Generation 9+ devices. Note: 'X' (byte) type attributes can be entered as integers or hexadecimal strings e.g. 522125312 or 0x1f1f0000.
330334
1. Configuration Interface widget (CFG-VALSET, CFG-VALDEL and CFG-VALGET) queries and sets configuration for [Generation 9+ devices](https://github.com/semuconsulting/pyubx2#configinterface) e.g. NEO-M9, ZED-F9P, etc.
331335
1. Preset Commands widget supports a variety of preset and user-defined commands - see [user defined presets](#userdefined). The port checkboxes (USB, UART1, etc.) determine which device port(s) any preset message rate commands apply to (_assuming the selected ports are physically implemented on the device_). The selected port(s) may be saved as configuration parameter `defaultport_s` e.g. "USB,UART1".
332336
@@ -339,6 +343,27 @@ warning ![warning icon](https://github.com/semuconsulting/PyGPSClient/blob/maste
339343
**Note:**
340344
* The UBX protocol does not support synchronous command acknowledgement or unique confirmation IDs. Asynchronous command and poll acknowledgements and responses can take several seconds at high message transmission rates, or be discarded altogether if the device's transmit buffer is full (*txbuff-alloc error*). To ensure timely responses, try increasing the baud rate and/or temporarily reducing transmitted message rates using the configuration commands provided.
341345
* A warning icon (typically accompanied by an ACK-NAK response) is usually an indication that one or more of the commands sent is not supported by your receiver.
346+
---
347+
## <a name="nmeaconfig">NMEA Configuration Facilities</a>
348+
349+
![nmeaconfig widget screenshot](/images/nmeaconfig_widget.png?raw=true)
350+
351+
**Pre-Requisites:**
352+
353+
- Receiver capable of being configured via proprietary NMEA sentences, connected to the workstation via USB or UART port. At time of writing, the only supported GNSS receiver type is the Quectel LG290P, via PQTM* sentences, but additional types may be supported in the underlying NMEA parser library [pynmeagps](https://github.com/semuconsulting/pynmeagps) in later releases.
354+
355+
**Instructions:**
356+
357+
The NMEA Configuration Dialog currently provides the following NMEA configuration panels:
358+
1. Version panel shows current device hardware/firmware versions (*via PQTMVERNO polls*).
359+
1. Dynamic configuration panel providing structured updates for supported receivers e.g. the Quectel LG290P via PQTM* sentences.
360+
1. Preset Commands widget supports a variety of preset and user-defined commands - see [user defined presets](#userdefined).
361+
362+
An icon to the right of each 'SEND'
363+
![send icon](https://github.com/semuconsulting/PyGPSClient/blob/master/src/pygpsclient/resources/iconmonstr-arrow-12-24.png?raw=true) button indicates the confirmation status of the configuration command;
364+
(pending i.e. awaiting confirmation ![pending icon](https://github.com/semuconsulting/PyGPSClient/blob/master/src/pygpsclient/resources/iconmonstr-time-6-24.png?raw=true),
365+
confirmed ![confirmed icon](https://github.com/semuconsulting/PyGPSClient/blob/master/src/pygpsclient/resources/iconmonstr-check-mark-8-24.png?raw=true) or
366+
warning ![warning icon](https://github.com/semuconsulting/PyGPSClient/blob/master/src/pygpsclient/resources/iconmonstr-warning-1-24.png?raw=true)).
342367
343368
---
344369
## <a name="ntripconfig">NTRIP Client Facilities</a>
@@ -547,45 +572,31 @@ that this is a User variable rather than a System/Global variable.
547572
---
548573
## <a name="userdefined">User Defined Presets</a>
549574
550-
The UBX Configuration Dialog includes the facility to send user-defined UBX configuration messages or message sequences to the receiver. These can be set up by adding
551-
appropriate comma-delimited message descriptions and payload definitions to the `"ubxpresets_l":` list in your json configuration file (see example provided). The message definition comprises a free-format text description (*avoid embedded commas*)
552-
followed by one or more [pyubx2 UBXMessage constructors](https://pypi.org/project/pyubx2/), i.e.
553-
1. message class as a string e.g. `CFG` (must be a valid class from [pyubx2.UBX_CLASSES](https://github.com/semuconsulting/pyubx2/blob/master/src/pyubx2/ubxtypes_core.py#L89))
554-
2. message id as a string e.g. `CFG-MSG` (must be a valid id from [pyubx2.UBX_MSGIDS](https://github.com/semuconsulting/pyubx2/blob/master/src/pyubx2/ubxtypes_core.py#L121))
555-
3. payload as a hexadecimal string e.g. `f004010100010100` (leave blank for null payloads e.g. most POLL messages)
556-
4. mode as an integer (`1` = SET, `2` = POLL)
575+
The UBX and NMEA Configuration Dialogs include the facility to send user-defined configuration messages or message sequences to a compatible receiver. These can be set up by adding
576+
appropriate comma- or semicolon-delimited message descriptions and payload definitions to the `"ubxpresets_l":`or `"nmeapresets_l":` lists in your json configuration file (see [example provided](https://github.com/semuconsulting/PyGPSClient/blob/master/pygpsclient.json#L158)). The message definition comprises a free-format text description (*avoid embedded commas or semi-colons*) followed by one or more pyubx2 (UBX) or pynmeagps (NMEA) message constructors, e,g.
557577
558-
(payload as hex string can be obtained from a `UBXMessage` created using the [pyubx2 library](https://pypi.org/project/pyubx2/) thus: ```msg.payload.hex()```)
578+
- UBX - `<description>, <message class>, <message id>, <payload as hexadecimal string>, <msgmode>`
579+
- NMEA - `<description>; <talker>; <message id>; <payload as comma-separated string>; <msgmode>`
559580
560-
Multiple commands can be concatenated on a single line. Illustrative examples are shown below:
581+
The `pygpsclient.ubx2preset()` and `pygpsclient.nmea2preset()` helper functions may be used to convert a `UBXMessage` or `NMEAMessage` object into a preset string suitable for copying and pasting into the `"ubxpresents_l":` or `"nmeapresets_l":` JSON configuration sections:
561582
583+
```python
584+
from pygpsclient import ubx2preset, nmea2preset
585+
from pyubx2 import UBXMessage
586+
from pynmeagps import NMEAMessage, SET
587+
588+
ubx = UBXMessage("CFG", "CFG-MSG", SET, msgClass=0x01, msgID=0x03, rateUART1=1)
589+
print(ubx2preset(ubx, "Configure NAV-STATUS Message Rate on ZED-F9P"))
590+
591+
nmea = NMEAMessage("P", "QTMCFGUART", SET, baudrate=460800)
592+
print(nmea2preset(nmea, "Configure UART baud rate on LG290P"))
562593
```
563-
"ubxpresets_l": [
564-
"Force HOT Reset (!!! Will require reconnection !!!), CFG, CFG-RST, 00000000, 1",
565-
"Force WARM Reset (!!! Will require reconnection !!!), CFG, CFG-RST, 00010000, 1",
566-
"Force COLD Reset (!!! Will require reconnection !!!), CFG, CFG-RST, ffff0000, 1",
567-
"Stop GNSS, CFG, CFG-RST, 00000800, 1",
568-
"Start GNSS, CFG, CFG-RST, 00000900, 1",
569-
"Enable NMEA UBX00 & UBX03 sentences, CFG, CFG-MSG, f100010100010100, 1, CFG, CFG-MSG, f103010100010100, 1",
570-
"Poll NEO-9 UART1/2 baud rates, CFG, CFG-VALGET, 000000000100524001005340, 2",
571-
"Poll NEO-9 Message Rates, CFG, CFG-VALGET, 00000000ffff9120, 2, CFG, CFG-VALGET, 00004000ffff9120, 2, CFG, CFG-VALGET, 00008000ffff9120, 2",
572-
"Set ZED-F9P RTCM3 MSGOUT Basestation, CFG, CFG-VALSET, 00010000c002912001cf02912001d4029120011b03912001d902912001060391200101039120018403912001, 1",
573-
"Set ZED-F9P to Survey-In Timing Mode Basestation, CFG, CFG-VALSET, 0001000001000320011100034070110100100003405a0000008b00912001, 1",
574-
"Poll Receiver Software Version, MON, MON-VER, , 2",
575-
"Poll Datum, CFG, CFG-DAT, , 2",
576-
"Poll GNSS config, CFG, CFG-GNSS, , 2",
577-
"Poll NMEA config, CFG, CFG-NMEA, , 2",
578-
"Poll Satellite-based Augmentation, CFG, CFG-SBAS, , 2",
579-
"Poll Receiver Management, CFG, CFG-RXM, , 2",
580-
"Poll RXM-SPARTN-KEY, RXM, RXM-SPARTN-KEY, , 2",
581-
"Poll RXM-COR, RXM, RXM-COR, , 2",
582-
"Poll Navigation Mode, CFG, CFG-NAV5, , 2",
583-
"Poll Expert Navigation mode, CFG, CFG-NAVX5, , 2",
584-
"Poll Geofencing, CFG, CFG-GEOFENCE, , 2",
585-
"Poll Timepulse, CFG, CFG-TP5, , 2",
586-
"Set NEO-M8T Timepulse to 8 MHz, CFG, CFG-TP5, 000100003200000000127a0000127a003200000032000000000000006f000000, 1",
587-
]
588594
```
595+
Configure NAV-STATUS Message Rate on ZED-F9P, CFG, CFG-MSG, 0103000100000000, 1
596+
Configure UART baud rate on LG290P; P; QTMCFGUART; W,460800; 1
597+
```
598+
599+
Multiple commands can be concatenated on a single line. Illustrative examples are shown in the sample [pygpsclient.json](https://github.com/semuconsulting/PyGPSClient/blob/master/pygpsclient.json#L158) file.
589600

590601
---
591602
## <a name="cli">Command Line Utilities</a>

RELEASE_NOTES.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# PyGPSClient Release Notes
22

3+
### RELEASE 1.5.5
4+
5+
1. Add new NMEA Configuration panel, complementing and (partly) mirroring the existing UBX Configuration panel. The NMEA configuration panel supports GNSS receivers which can be configured via proprietary NMEA sentences. Currently the only supported receiver is the Quectel LG290P (or other command-compatible Quectel receivers). See [README](https://github.com/semuconsulting/PyGPSClient?tab=readme-ov-file#nmeaconfig) for details. User-defined preset NMEA commands may be added via the `nmeapresets_l` section of the PyGPSClient *.json configuration file.
6+
1. Two new helper functions added `ubx2preset()` and `nmea2preset()`, to assist users in converting `UBXMessage` or `NMEAMessage` objects into strings which can be copied-and-pasted into the relevant sections of the *.json configuration file (`ubxpresets_l` and `nmeapresets_l`). See [README](https://github.com/semuconsulting/PyGPSClient?tab=readme-ov-file#userdefined) for details.
7+
38
### RELEASE 1.5.4
49

510
1. Fix issue with GUI update facility not working for virtual environments.

docs/pygpsclient.rst

+32-16
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,14 @@ pygpsclient.dialog\_state module
6060
:show-inheritance:
6161
:undoc-members:
6262

63+
pygpsclient.dynamic\_config\_frame module
64+
-----------------------------------------
65+
66+
.. automodule:: pygpsclient.dynamic_config_frame
67+
:members:
68+
:show-inheritance:
69+
:undoc-members:
70+
6371
pygpsclient.file\_handler module
6472
--------------------------------
6573

@@ -100,6 +108,14 @@ pygpsclient.graphview\_frame module
100108
:show-inheritance:
101109
:undoc-members:
102110

111+
pygpsclient.hardware\_info\_frame module
112+
----------------------------------------
113+
114+
.. automodule:: pygpsclient.hardware_info_frame
115+
:members:
116+
:show-inheritance:
117+
:undoc-members:
118+
103119
pygpsclient.helpers module
104120
--------------------------
105121

@@ -140,6 +156,14 @@ pygpsclient.menu\_bar module
140156
:show-inheritance:
141157
:undoc-members:
142158

159+
pygpsclient.nmea\_config\_dialog module
160+
---------------------------------------
161+
162+
.. automodule:: pygpsclient.nmea_config_dialog
163+
:members:
164+
:show-inheritance:
165+
:undoc-members:
166+
143167
pygpsclient.nmea\_handler module
144168
--------------------------------
145169

@@ -148,6 +172,14 @@ pygpsclient.nmea\_handler module
148172
:show-inheritance:
149173
:undoc-members:
150174

175+
pygpsclient.nmea\_preset\_frame module
176+
--------------------------------------
177+
178+
.. automodule:: pygpsclient.nmea_preset_frame
179+
:members:
180+
:show-inheritance:
181+
:undoc-members:
182+
151183
pygpsclient.ntrip\_client\_dialog module
152184
----------------------------------------
153185

@@ -316,14 +348,6 @@ pygpsclient.ubx\_config\_dialog module
316348
:show-inheritance:
317349
:undoc-members:
318350

319-
pygpsclient.ubx\_dynamic\_frame module
320-
--------------------------------------
321-
322-
.. automodule:: pygpsclient.ubx_dynamic_frame
323-
:members:
324-
:show-inheritance:
325-
:undoc-members:
326-
327351
pygpsclient.ubx\_handler module
328352
-------------------------------
329353

@@ -332,14 +356,6 @@ pygpsclient.ubx\_handler module
332356
:show-inheritance:
333357
:undoc-members:
334358

335-
pygpsclient.ubx\_info\_frame module
336-
-----------------------------------
337-
338-
.. automodule:: pygpsclient.ubx_info_frame
339-
:members:
340-
:show-inheritance:
341-
:undoc-members:
342-
343359
pygpsclient.ubx\_msgrate\_frame module
344360
--------------------------------------
345361

images/nmeaconfig_widget.png

906 KB
Loading

pygpsclient.json

+42
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,48 @@
189189
"Limit UBX GNSS to GLONASS only, CFG, CFG-GNSS, 0020200700081000000001010101030000000101020408000000010103081000000001010400080000000103050003000000010506080E0001000101, 1",
190190
"Set UBX GNSS to ALL, CFG, CFG-GNSS, 0020200700081000010001010101030001000101020408000000010103081000000001010400080000000103050003000100010506080E0001000101, 1",
191191
],
192+
"nmeapresets_l": [
193+
"RESTORE FACTORY DEFAULTS; P; QTMRESTOREPAR; ; 1",
194+
"Save configuration to non-volatile memory; P; QTMSAVEPAR; ; 1",
195+
"Hot restart; P; QTMHOT; ; 1",
196+
"Warm restart; P; QTMWARM; ; 1",
197+
"Cold restart; P; QTMCOLD; ; 1",
198+
"System Reset and Reboot; P; QTMSRR; ; 1",
199+
"Check Hardware Version; P; QTMVERNO; ; 2",
200+
"Check UniqueID; P; QTMUNIQID; ; 1",
201+
"Start GNSS; P; QTMGNSSSTART; ; 1",
202+
"Stop GNSS; P; QTMGNSSSTOP; ; 1",
203+
"Enable Debug; P; QTMDEBUGON; ; 1",
204+
"Disable Debug; P; QTMDEBUGOFF; ; 1",
205+
"Set Fix Rate to 1 Hz; P; QTMCFGFIXRATE; W,1000; 1",
206+
"Set Fix Rate to 5 Hz; P; QTMCFGFIXRATE; W,200; 1",
207+
"Set Fix Rate to 10 Hz; P; QTMCFGFIXRATE; W,100; 1",
208+
"Set current UART baudrate to 460800; P; QTMCFGUART; W,460800; 1",
209+
"Set UART2 baudrate to 115200; P; QTMCFGUART; W,2,115200; 1",
210+
"Configure current UART; P; QTMCFGUART; W,460800,8,0,1,0; 1",
211+
"Configure UART2; P; QTMCFGUART; W,2,115200,8,0,0,0; 1",
212+
"Set PQTMPVT message rate to 1; P; QTMCFGMSGRATE; W,PQTMPVT,1,1; 1",
213+
"Enable all PQTM* output messages; P; QTMCFGMSGRATE; W,PQTMDOP,1,1; 1; P; QTMCFGMSGRATE; W,PQTMEPE,1,2; 1; P; QTMCFGMSGRATE; W,PQTMODO,1,1; 1; P; QTMCFGMSGRATE; W,PQTMPL,1,1; 1; P; QTMCFGMSGRATE; W,PQTMPVT,1,1; 1; P; QTMCFGMSGRATE; W,PQTMVEL,1,1; 1",
214+
"Reset Odometer; P; QTMRESETODO; ; 1",
215+
"Configure Constellations; P; QTMCFGCNST; W,1,1,1,1,0,0; 1",
216+
"Set Reference Station ID to 1024; P; QTMCFGRSID; W,1024; 1",
217+
"Set Protocol Masks; P; QTMCFGPROT; W,1,1,00000005,00000005; 1",
218+
"Set NMEA Precision; P; QTMCFGNMEADP; W,3,8,3,2,3,2; 1",
219+
"Set Odometer Initial Distance to 10.5; P; QTMCFGODO; W,1,10.5; 1",
220+
"Configure PPS (Pulse Per Second); P; QTMCFGPPS; W,1,1,100,1,1,0; 1",
221+
"Disable PPS; P; QTMCFGPPS; W,1,0; 1",
222+
"Set Receiver Mode to 1 (Rover); P; QTMCFGRCVRMODE; W,1; 1",
223+
"Configure RTCM; P; QTMCFGRTCM; W,4,0,-90,07,06,1,0; 1",
224+
"Set RTK Mode; P; QTMCFGRTK; W,1,1; 1",
225+
"Configure Satellite Masks (Low); P; QTMCFGSAT; W,1,1,FFFFFFFF; 1",
226+
"Configure Satellite Masks (Low and High); P; QTMCFGSAT; W,4,1,BFFCBFFF,1C003FFF; 1",
227+
"Configure Signal Masks; P; QTMCFGSIGNAL; W,7,3,F,3F,7,1; 1",
228+
"Set Survey-In Mode; P; QTMCFGSVIN; W,1,3600,1.2,-2519265.0514,4849534.9045,3277834.6432; 1",
229+
"Poll Geofence configuration; P; QTMCFGGEOFENCE; R,0; 1; P; QTMCFGGEOFENCE; R,1; 1; P; QTMCFGGEOFENCE; R,2; 1; P; QTMCFGGEOFENCE; R,3; 1",
230+
"Configure Geofence (Circle); P; QTMCFGGEOFENCE; W,0,1,0,0,31.451248,117.451245,100.5; 1",
231+
"Configure Geofence (Polygon); P; QTMCFGGEOFENCE; W,0,1,0,3,31.451248,117.451245,100.5,12.36,85.24,118.72,56.45,140.13; 1",
232+
"Disable Geofence; P; QTMCFGGEOFENCE; W,0,0; 1"
233+
],
192234
"usermaps_l": [
193235
[
194236
"/home/myuser/maps/mymap01.tif",

0 commit comments

Comments
 (0)