Skip to content

Commit 4a3eca6

Browse files
committed
update app image
add preset description field minor tweak to TTY panel update recorder update recorder
1 parent 9ac80a0 commit 4a3eca6

11 files changed

Lines changed: 156 additions & 56 deletions

README.md

Lines changed: 20 additions & 17 deletions
Large diffs are not rendered by default.

RELEASE_NOTES.md

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

3+
### RELEASE 1.6.5
4+
5+
1. Add preset description entry field to Configuration Command Recorder import facility.
6+
1. Make TTY Presets dialog fully resizeable.
7+
38
### RELEASE 1.6.4
49

510
FIXES:
@@ -8,7 +13,7 @@ FIXES:
813

914
ENHANCEMENTS:
1015
1. Improve Base Station receiver configuration handling in the NTRIP Caster/Socket Server dialog.
11-
1. Add connected device descriptor to status bar (e.g. "u-blox ZED-F9P", "Unicore UM981S", "Septentrio mosaic-X5" or "Quectel LG290AG03"). **FYI** This is based on a series of query messages (*one for each enabled protocol*) sent approximately 3 seconds after the connection is started (*you may see 'unknown protocol' warnings in response to some of these messages; these can be ignored)*. Failing this, a generic descriptor is displayed on receipt of a message protocol unique to a particular manufacturer (*e.g. "u-blox" on receipt of a UBX message, "Unicore" on receipt of a UNI message, etc.*). Note that some (mainly older) devices may not return a meaningful descriptor, in which case "N/A" will be displayed.
16+
1. Add connected device descriptor to status bar (e.g. "u-blox ZED-F9P", "Unicore UM981S", "Septentrio mosaic-X5" or "Quectel LG290AG03"). **FYI** This is based on a poll of hardware information messages (*one for each enabled protocol*) sent approximately 3 seconds after the connection is started (*you may see 'unknown protocol' warnings in response to some of these messages; these can be ignored)*. Failing this, a generic descriptor is displayed on receipt of a message protocol unique to a particular manufacturer (*e.g. "u-blox" on receipt of a UBX message, "Unicore" on receipt of a UNI message, etc.*). Note that some (mainly older) devices may not return a meaningful descriptor, in which case "N/A" will be displayed. Note also that some receivers will not output hardware information or other status messages at low baud rates (< 38,400)
1217
1. Minor updates to serial port configuration panel (additional timeout values).
1318
1. Mininum pynmeagps version updated to v1.1.1.
1419

images/app.png

-763 KB
Loading

images/nmeaconfig_widget.png

17.5 KB
Loading

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ dependencies = [
5454
"Pillow>=9.0.0",
5555
"pygnssutils>=1.1.22",
5656
"pyunigps>=0.2.0",
57-
"pynmeagps>=1.1.1",
57+
"pynmeagps>=1.1.2",
5858
]
5959

6060
[project.scripts]

src/pygpsclient/_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@
88
:license: BSD 3-Clause
99
"""
1010

11-
__version__ = "1.6.4"
11+
__version__ = "1.6.5"

src/pygpsclient/dialog_state.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ def __init__(self):
9797
DLGTTTY: {
9898
CLASS: TTYPresetDialog,
9999
DLG: None,
100-
RESIZE: False,
100+
RESIZE: True,
101101
},
102102
DLGTRECORD: {
103103
CLASS: RecorderDialog,

src/pygpsclient/init_presets.py

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,41 @@
6262
"Poll UART1/2 Baudrates, CFG, CFG-VALGET, 000000000100524001005340, 2",
6363
],
6464
"nmeapresets_l": [
65-
"Quectel Restore Factory Defaults CONFIRM; P; QTMRESTOREPAR; ; 1",
66-
"Quectel Save Configuration to NVM CONFIRM; P; QTMSAVEPAR; ; 1",
67-
"Quectel HOT restart CONFIRM; P; QTMHOT; ; 1",
68-
"Quectel WARM restart CONFIRM; P; QTMWARM; ; 1",
69-
"Quectel COLD restart CONFIRM; P; QTMCOLD; ; 1",
70-
"Quectel System Reset and Reboot CONFIRM; P; QTMSRR; ; 1",
71-
"Quectel Check Hardware Version; P; QTMVERNO; ; 2",
72-
"Quectel Start GNSS; P; QTMGNSSSTART; ; 1",
73-
"Quectel Stop GNSS; P; QTMGNSSSTOP; ; 1",
65+
"Quectel LG* Restore Factory Defaults CONFIRM; P; QTMRESTOREPAR; ; 1",
66+
"Quectel LG* Save Configuration to NVM CONFIRM; P; QTMSAVEPAR; ; 1",
67+
"Quectel LG* HOT restart CONFIRM; P; QTMHOT; ; 1",
68+
"Quectel LG* WARM restart CONFIRM; P; QTMWARM; ; 1",
69+
"Quectel LG* COLD restart CONFIRM; P; QTMCOLD; ; 1",
70+
"Quectel LG* System Reset and Reboot CONFIRM; P; QTMSRR; ; 1",
71+
"Quectel LG* Check Hardware Version; P; QTMVERNO; ; 2",
72+
"Quectel LG* Start GNSS; P; QTMGNSSSTART; ; 1",
73+
"Quectel LG* Stop GNSS; P; QTMGNSSSTOP; ; 1",
74+
"Quectel LG* Set current UART baudrate to 115200; P; QTMCFGUART; W,115200; 1",
75+
"Quectel LG* Set current UART baudrate to 460800; P; QTMCFGUART; W,460800; 1",
76+
"Quectel LG* Set Fix Rate to 1 Hz CONFIRM; P; QTMCFGFIXRATE; W,1000; 1; P; QTMSAVEPAR; ; 1; P; QTMSRR; ; 1",
77+
"Quectel LG* Set Fix Rate to 5 Hz CONFIRM; P; QTMCFGFIXRATE; W,200; 1; P; QTMSAVEPAR; ; 1; P; QTMSRR; ; 1",
78+
"Quectel LG* Set Fix Rate to 10 Hz CONFIRM; P; QTMCFGFIXRATE; W,100; 1; P; QTMSAVEPAR; ; 1; P; QTMSRR; ; 1",
79+
"Quectel LG* Set Base Mode Survey-In; P; QTMCFGRCVRMODE; W,2; 1; P; QTMCFGSVIN; W,1,60,3000,0.0,0.0,0.0; 1; P; QTMCFGMSGRATE; W,PQTMSVINSTATUS,1,1; 1; P; QTMSAVEPAR; ; 1; P; QTMSRR; ; 1",
80+
"Quectel LG* Set Base Mode Fixed; P; QTMCFGRCVRMODE; W,2; 1; P; QTMCFGSVIN; W,2,0,0,-2213540.321087019,-4577229.071167925,3838042.2419518335; 1; P; QTMSAVEPAR; ; 1; P; QTMSRR; ; 1",
81+
"Quectel LG* Set Rover Mode; P; QTMCFGRCVRMODE; W,1; 1; P; QTMSAVEPAR; ; 1; P; QTMSRR; ; 1",
82+
"Quectel LG* Enable SVIN Status message; P; QTMCFGMSGRATE; W,PQTMSVINSTATUS,1,1; 1",
83+
"Quectel LG* Disable SVIN Status message; P; QTMCFGMSGRATE; W,PQTMSVINSTATUS,0,1; 1",
84+
"Quectel LG* Set PQTMPVT message rate to 1; P; QTMCFGMSGRATE; W,PQTMPVT,1,1; 1",
85+
"Quectel LG* Enable all QTM PVT outputs; 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",
86+
"Quectel LG* Enable all QTM outputs; P; QTMCFGMSGRATE; W,PQTMANTENNASTATUS,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGAIC,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGANTDELTA,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGANTINF,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGBLD,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGCNST,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGDR,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGDRHOT,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGDRRTD,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGEINSMSG,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGELETHD,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGFIXRATE,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGGEOFENCE,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGGEOFENCE_DIS,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGGEOFENCE_POLY,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGGEOSEP,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGIMUINT,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGIMUTC,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGLA,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGLAM,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGMSGRATE,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGMSGRATE_NOVER,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGMSGRATE_INTF,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGMSGRATE_INTFNOVER,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGNAVMODE,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGNMEADP,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGNMEATID,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGODO,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGPPS,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGPROT,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGRCVRMODE,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGRSID,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGRTCM,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGRTK,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGRTKSRCTYPE,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGSAT,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGSAT_LOW,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGSBAS,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGSIGGRP,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGSIGNAL,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGSIGNAL2,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGSTATICHOLD,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGSVIN,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGUART,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGVEHMOT,1,1; 1; P; QTMCFGMSGRATE; W,PQTMCFGWN,1,1; 1; P; QTMCFGMSGRATE; W,PQTMDEBUGON,1,1; 1; P; QTMCFGMSGRATE; W,PQTMDEBUGOFF,1,1; 1; P; QTMCFGMSGRATE; W,PQTMDOP,1,1; 1; P; QTMCFGMSGRATE; W,PQTMDRCAL,1,1; 1; P; QTMCFGMSGRATE; W,PQTMDRCLR,1,1; 1; P; QTMCFGMSGRATE; W,PQTMDRPVA,1,1; 1; P; QTMCFGMSGRATE; W,PQTMDRSAVE,1,1; 1; P; QTMCFGMSGRATE; W,PQTMEOE,1,1; 1; P; QTMCFGMSGRATE; W,PQTMEPE,1,1; 1; P; QTMCFGMSGRATE; W,PQTMGEOFENCESTATUS,1,1; 1; P; QTMCFGMSGRATE; W,PQTMGETUTC,1,1; 1; P; QTMCFGMSGRATE; W,PQTMGNSSSTART,1,1; 1; P; QTMCFGMSGRATE; W,PQTMGNSSSTOP,1,1; 1; P; QTMCFGMSGRATE; W,PQTMGPS,1,1; 1; P; QTMCFGMSGRATE; W,PQTMJAMMINGSTATUS,1,1; 1; P; QTMCFGMSGRATE; W,PQTMIMU,1,1; 1; P; QTMCFGMSGRATE; W,PQTMIMUTYPE,1,1; 1; P; QTMCFGMSGRATE; W,PQTMINS,1,1; 1; P; QTMCFGMSGRATE; W,PQTMLS,1,1; 1; P; QTMCFGMSGRATE; W,PQTMNAV,1,1; 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,PQTMQVER,1,1; 1; P; QTMCFGMSGRATE; W,PQTMRESETODO,1,1; 1; P; QTMCFGMSGRATE; W,PQTMRESTOREPAR,1,1; 1; P; QTMCFGMSGRATE; W,PQTMSAVEPAR,1,1; 1; P; QTMCFGMSGRATE; W,PQTMSENMSG,1,1; 1; P; QTMCFGMSGRATE; W,PQTMSN,1,1; 1; P; QTMCFGMSGRATE; W,PQTMSTD,1,1; 1; P; QTMCFGMSGRATE; W,PQTMSVINSTATUS,1,1; 1; P; QTMCFGMSGRATE; W,PQTMTAR,1,1; 1; P; QTMCFGMSGRATE; W,PQTMTXT,1,1; 1; P; QTMCFGMSGRATE; W,PQTMUNIQID,1,1; 1; P; QTMCFGMSGRATE; W,PQTMVEHATT,1,1; 1; P; QTMCFGMSGRATE; W,PQTMVEHMOT,1,1; 1; P; QTMCFGMSGRATE; W,PQTMVEHMSG,1,1; 1; P; QTMCFGMSGRATE; W,PQTMVEL,1,1; 1; P; QTMCFGMSGRATE; W,PQTMVER,1,1; 1; P; QTMCFGMSGRATE; W,PQTMVERNO,1,1; 1",
87+
"Quectel LG* Poll all QTM outputs; P; QTMCFGAIC; R; 2; P; QTMCFGANTDELTA; R; 2; P; QTMCFGANTINF; R; 2; P; QTMCFGBLD; R; 2; P; QTMCFGCNST; R; 2; P; QTMCFGDR; R; 2; P; QTMCFGELETHD; R; 2; P; QTMCFGFIXRATE; R; 2; P; QTMCFGGEOFENCE; R,0; 2; P; QTMCFGGEOSEP; R; 2; P; QTMCFGIMUINT; R; 2; P; QTMCFGLA; R; 2; P; QTMCFGLAM; R; 2; P; QTMCFGMSGRATE; R,; 2; P; QTMCFGMSGRATE_NOVER; ; 2; P; QTMCFGMSGRATE_INTF; ; 2; P; QTMCFGMSGRATE_INTFNOVER; ; 2; P; QTMCFGNAVMODE; R; 2; P; QTMCFGNMEADP; R; 2; P; QTMCFGNMEATID; R; 2; P; QTMCFGODO; R; 2; P; QTMCFGPPS; R,0; 2; P; QTMCFGPROT; R,0,0; 2; P; QTMCFGRCVRMODE; R; 2; P; QTMCFGRSID; R; 2; P; QTMCFGRTCM; R; 2; P; QTMCFGRTK; R; 2; P; QTMCFGRTKSRCTYPE; R; 2; P; QTMCFGSAT; R,0,; 2; P; QTMCFGSBAS; R; 2; P; QTMCFGSIGGRP; R; 2; P; QTMCFGSIGNAL; R; 2; P; QTMCFGSIGNAL2; R; 2; P; QTMCFGSTATICHOLD; R; 2; P; QTMCFGSVIN; R; 2; P; QTMCFGUART_CURR; ; 2; P; QTMCFGUART; R; 2; P; QTMCFGVEHMOT; R; 2; P; QTMCFGWN; R; 2; P; QTMGETUTC; ; 2; P; QTMQVER; 0; 2; P; QTMSN; ; 2; P; QTMUNIQID; ; 2; P; QTMVEHATT; ; 2; P; QTMVERNO; ; 2",
88+
"Quectel LG* Enable OGC RAW-PPPB2B output;P; QTMCFGMSGRATE; W,1,1,0AB2,1,1;1",
89+
"Quectel LG* Enable OGC RAW-QZSSL6 output;P; QTMCFGMSGRATE; W,1,1,0AB6,1,1;1",
90+
"Quectel LG* Enable OGC RAW-HASE6 output;P; QTMCFGMSGRATE; W,1,1,0AE6,1,1;1",
91+
"Quectel LC* Restore Factory Defaults CONFIRM; P; AIR007; ; 1",
92+
"Quectel LC* Save Configuration to NVM CONFIRM; P; AIR513; ; 1",
93+
"Quectel LC* HOT restart CONFIRM; P; AIR004; ; 1",
94+
"Quectel LC* WARM restart CONFIRM; P; AIR005; ; 1",
95+
"Quectel LC* COLD restart CONFIRM; P; AIR006; ; 1",
96+
"Quectel LC* Set UART1 baudrate to 115200; P; AIR864; 0,0,115200; 1; P; AIR513; ; 1",
97+
"Quectel LC* Set UART1 baudrate to 460800; P; AIR864; 0,0,460800; 1; P; AIR513; ; 1",
98+
"Quectel LC* Poll UART1 baudrate; P; AIR865; 0,0; 2",
99+
"Quectel LC* Set common fix rate; P; AIR050; 1000; 1",
74100
],
75101
"ttypresets_l": [
76102
"Septentrio X5 Initialise Command Mode; SSSSSSSSSS",

src/pygpsclient/nmea_handler.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -404,9 +404,9 @@ def _process_QTMVERNO(self, data: NMEAMessage):
404404
"""
405405

406406
self.__app.gnss_status.version_data["swversion"] = "N/A"
407-
self.__app.gnss_status.version_data["hwversion"] = f"Quectel {data.verstr}"
407+
self.__app.gnss_status.version_data["hwversion"] = f"Quectel {data.verstr[0:8]}"
408408
self.__app.gnss_status.version_data["fwversion"] = (
409-
f"{data.builddate}-{data.buildtime}"
409+
f"{data.verstr[8:]} {data.builddate}-{data.buildtime}"
410410
)
411411
self.__app.gnss_status.version_data["romversion"] = NA
412412
self.__app.gnss_status.version_data["gnss"] = NA

src/pygpsclient/recorder_dialog.py

Lines changed: 74 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,19 @@
2121
from datetime import datetime
2222
from threading import Event, Thread
2323
from time import sleep
24-
from tkinter import CENTER, EW, NSEW, Button, Frame, Label, TclError, W, filedialog
24+
from tkinter import (
25+
CENTER,
26+
EW,
27+
NSEW,
28+
Button,
29+
Entry,
30+
Frame,
31+
Label,
32+
StringVar,
33+
TclError,
34+
W,
35+
filedialog,
36+
)
2537

2638
from PIL import Image, ImageTk
2739
from pynmeagps import NMEAMessage
@@ -59,7 +71,7 @@
5971
UNDO,
6072
)
6173
from pygpsclient.helpers import nmea2preset, set_filename, tty2preset, ubx2preset
62-
from pygpsclient.strings import DLGTRECORD, SAVETITLE
74+
from pygpsclient.strings import DLGTRECORD, NA, SAVETITLE
6375
from pygpsclient.toplevel_dialog import ToplevelDialog
6476

6577
CFG = b"\x06"
@@ -72,6 +84,7 @@
7284
TTYONLY = 0
7385
VALSET = b"\x8a"
7486
VALGET = b"\x8b"
87+
SAVE = chr(0x1F4BE)
7588

7689

7790
class RecorderDialog(ToplevelDialog):
@@ -101,14 +114,17 @@ def __init__(self, app, *args, **kwargs):
101114
self._img_stop = ImageTk.PhotoImage(Image.open(ICON_STOP))
102115
self._img_record = ImageTk.PhotoImage(Image.open(ICON_RECORD))
103116
self._img_import = ImageTk.PhotoImage(Image.open(ICON_IMPORT))
117+
self._img_importconfirm = ImageTk.PhotoImage(Image.open(ICON_SEND))
104118
self._img_undo = ImageTk.PhotoImage(Image.open(ICON_UNDO))
105119
self._img_delete = ImageTk.PhotoImage(Image.open(ICON_DELETE))
120+
self._importdesc = StringVar()
106121
self._rec_status = STOP
107122
self._configfile = None
108123
self._stop_event = Event()
109124
self._bg = self.cget("bg") # default background color
110125
self._configfile = None
111126
self._configpath = None
127+
self._save_to_preset = False
112128

113129
self._body()
114130
self._do_layout()
@@ -191,6 +207,11 @@ def _body(self):
191207
self._lbl_activity = Label(
192208
self._frm_body, text="", anchor=CENTER, bg=BGCOL, fg=FGCOL
193209
)
210+
self._ent_import = Entry(
211+
self._frm_body,
212+
textvariable=self._importdesc,
213+
relief="sunken",
214+
)
194215

195216
def _do_layout(self):
196217
"""
@@ -206,7 +227,9 @@ def _do_layout(self):
206227
self._btn_undo.grid(column=5, row=0, ipadx=3, ipady=3, sticky=W)
207228
self._btn_delete.grid(column=6, row=0, ipadx=3, ipady=3, sticky=W)
208229
self._lbl_memory.grid(column=7, row=0, ipadx=3, ipady=3, sticky=W)
209-
self._lbl_activity.grid(column=0, row=2, columnspan=7, padx=3, sticky=EW)
230+
self._lbl_activity.grid(
231+
column=0, row=2, columnspan=8, pady=5, padx=3, sticky=EW
232+
)
210233

211234
cols, rows = self.grid_size()
212235
for i in range(cols):
@@ -230,6 +253,8 @@ def _reset(self):
230253
self._rec_status = STOP if self.__app.recording else RECORD
231254
self._on_record()
232255
self.update_count()
256+
self._ent_import.grid_forget()
257+
self._save_to_preset = False
233258

234259
def _set_configfile_path(self, ext: str = "bin") -> tuple:
235260
"""
@@ -378,7 +403,7 @@ def _on_load_txt(self, fname: str) -> int:
378403

379404
def _on_save(self):
380405
"""
381-
Save commands from in-memory recording to file.
406+
Save commands from in-memory recording to file or preset.
382407
"""
383408

384409
if self._rec_status == RECORD:
@@ -388,6 +413,10 @@ def _on_save(self):
388413
self.status_label = ("Nothing to save", ERRCOL)
389414
return
390415

416+
if self._save_to_preset: # saving to preset section of json config
417+
self._on_import_confirm()
418+
return
419+
391420
ext = "tty" if self.__app.recording_type == TTYONLY else "bin"
392421
fname, self._configfile = self._set_configfile_path(ext)
393422
if self._configfile is None: # user cancelled
@@ -470,27 +499,45 @@ def _on_import(self):
470499
"""
471500

472501
if self._rec_status == RECORD:
502+
self.status_label = ("Stop recording first", ERRCOL)
473503
return
474504

475505
if len(self.__app.recorded_commands) == 0:
476506
self.status_label = ("Nothing to import", ERRCOL)
477507
return
478508

509+
self.status_label = (
510+
f"Enter preset description, then click Save {SAVE}",
511+
INFOCOL,
512+
)
513+
self._importdesc.set(self._get_preset_desc())
514+
self._lbl_activity.grid_forget()
515+
self._ent_import.grid(column=0, row=2, columnspan=8, padx=3, sticky=EW)
516+
self._save_to_preset = True
517+
self.update()
518+
519+
def _on_import_confirm(self):
520+
"""
521+
Confirm save to preset.
522+
"""
523+
479524
try:
480-
now = f'Recorded commands {datetime.now().strftime("%Y-%m-%d_%H:%M:%S")}'
525+
desc = self._importdesc.get().replace(";", " ").replace(",", " ")
526+
if desc == "":
527+
desc = self._get_preset_desc()
481528
if isinstance(self.__app.recorded_commands[0], UBXMessage):
482529
self.__app.configuration.get("ubxpresets_l").append(
483-
ubx2preset(self.__app.recorded_commands, now)
530+
ubx2preset(self.__app.recorded_commands, desc)
484531
)
485532
typ = "UBX"
486533
elif isinstance(self.__app.recorded_commands[0], NMEAMessage):
487534
self.__app.configuration.get("nmeapresets_l").append(
488-
nmea2preset(self.__app.recorded_commands, now)
535+
nmea2preset(self.__app.recorded_commands, desc)
489536
)
490537
typ = "NMEA"
491538
else: # tty
492539
self.__app.configuration.get("ttypresets_l").append(
493-
tty2preset(self.__app.recorded_commands, now)
540+
tty2preset(self.__app.recorded_commands, desc)
494541
)
495542
typ = "TTY"
496543

@@ -504,6 +551,13 @@ def _on_import(self):
504551
ERRCOL,
505552
)
506553

554+
self._lbl_activity.grid(
555+
column=0, row=2, columnspan=7, pady=5, padx=3, sticky=EW
556+
)
557+
self._ent_import.grid_forget()
558+
self.update()
559+
self._save_to_preset = False
560+
507561
def _on_undo(self):
508562
"""
509563
Remove last record from in-memory recording.
@@ -581,3 +635,15 @@ def _flash_record(self, stop: Event):
581635
self._lbl_activity.config(text="", fg=FGCOL, bg=BGCOL)
582636
except TclError: # if dialog closed without stopping recording
583637
pass
638+
639+
def _get_preset_desc(self) -> str:
640+
"""
641+
Get default preset description.
642+
643+
:return: description
644+
:rtype: str
645+
"""
646+
647+
dev = self.__app.gnss_status.version_data["hwversion"]
648+
dev = "Unknown device" if dev == NA else dev.replace(";", " ").replace(",", " ")
649+
return f'{dev} {datetime.now().strftime("%Y-%m-%d_%H:%M:%S")}'

0 commit comments

Comments
 (0)