Skip to content

Commit c64db07

Browse files
committed
Added DNA GET and PUT commands
1 parent b8a8200 commit c64db07

File tree

3 files changed

+251
-1
lines changed

3 files changed

+251
-1
lines changed

src/geocompy/data.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,25 @@ def parseenum(value: str) -> _E:
153153
return parseenum
154154

155155

156+
def gsiword(
157+
wi: int,
158+
data: str,
159+
*,
160+
info: str = "",
161+
negative: bool = False,
162+
gsi16: bool = False
163+
) -> str:
164+
data = data.zfill(16 if gsi16 else 8)
165+
sign = "-" if negative else "+"
166+
info = f"{info:.4s}"
167+
if len(info) < 4:
168+
wistr = f"{str(wi):.3s}"
169+
else:
170+
wistr = f"{str(wi):.2s}"
171+
padding = "." * (6 - len(wistr) - len(info))
172+
return f"{wistr}{padding}{info}{sign}{data:.8s} "
173+
174+
156175
class AngleUnit(Enum):
157176
"""
158177
Angle measurement units to indicate the unit of an :class:`Angle`

src/geocompy/dna/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
DNAErrors
2121
)
2222
from .settings import DNASettings
23+
from .measurements import DNAMeasurements
2324

2425

2526
_T = TypeVar("_T")
@@ -49,6 +50,7 @@ def __init__(
4950
):
5051
super().__init__(connection, logger)
5152
self.settings: DNASettings = DNASettings(self)
53+
self.measurements: DNAMeasurements = DNAMeasurements(self)
5254

5355
def setrequest(
5456
self,
@@ -109,7 +111,7 @@ def putrequest(
109111
wordindex: int,
110112
word: str
111113
) -> GsiOnlineResponse[bool]:
112-
cmd = f"PUT/{word:s} "
114+
cmd = f"PUT/{word:s}"
113115
comment = ""
114116
try:
115117
answer = self._conn.exchange1(cmd)

src/geocompy/dna/measurements.py

Lines changed: 229 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,229 @@
1+
from __future__ import annotations
2+
3+
from datetime import time, datetime
4+
5+
from .. import (
6+
GsiOnlineSubsystem,
7+
GsiOnlineResponse
8+
)
9+
from ..data import gsiword
10+
11+
12+
class DNAMeasurements(GsiOnlineSubsystem):
13+
def get_point_id(self) -> GsiOnlineResponse[str | None]:
14+
return self._getrequest(
15+
"M",
16+
11,
17+
lambda v: v.strip().split("+")[1].lstrip("0")
18+
)
19+
20+
def set_point_id(
21+
self,
22+
ptid: str
23+
) -> GsiOnlineResponse[bool]:
24+
wi = 11
25+
word = gsiword(wi, ptid)
26+
27+
return self._putrequest(
28+
wi,
29+
word
30+
)
31+
32+
def get_note(self) -> GsiOnlineResponse[str | None]:
33+
return self._getrequest(
34+
"M",
35+
71,
36+
lambda v: v.strip().split("+")[1].lstrip("0")
37+
)
38+
39+
def set_note(
40+
self,
41+
note: str
42+
) -> GsiOnlineResponse[bool]:
43+
wi = 71
44+
word = gsiword(wi, note)
45+
46+
return self._putrequest(
47+
wi,
48+
word
49+
)
50+
51+
def get_time(self) -> GsiOnlineResponse[time | None]:
52+
def parsetime(value: str) -> time:
53+
return time(
54+
int(value[-6:-4]),
55+
int(value[-4:-2]),
56+
int(value[-2:])
57+
)
58+
59+
return self._getrequest(
60+
"I",
61+
560,
62+
parsetime
63+
)
64+
65+
def set_time(
66+
self,
67+
value: time
68+
) -> GsiOnlineResponse[bool]:
69+
wi = 560
70+
word = gsiword(
71+
wi,
72+
f"{value.hour:02d}{value.minute:02d}{value.second:02d}",
73+
info="6"
74+
)
75+
76+
return self._putrequest(
77+
wi,
78+
word
79+
)
80+
81+
def get_date(self) -> GsiOnlineResponse[tuple[int, int] | None]:
82+
def parsedate(value: str) -> tuple[int, int]:
83+
return int(value[-6:-4]), int(value[-4:-2])
84+
85+
return self._getrequest(
86+
"I",
87+
561,
88+
parsedate
89+
)
90+
91+
def set_date(
92+
self,
93+
month: int,
94+
day: int
95+
) -> GsiOnlineResponse[bool]:
96+
wi = 561
97+
word = gsiword(
98+
wi,
99+
f"{month:02d}{day:02d}00",
100+
info="6"
101+
)
102+
103+
return self._putrequest(
104+
wi,
105+
word
106+
)
107+
108+
def get_year(self) -> GsiOnlineResponse[int | None]:
109+
return self._getrequest(
110+
"I",
111+
562,
112+
lambda v: int(v.lstrip("0"))
113+
)
114+
115+
def set_year(
116+
self,
117+
year: int
118+
) -> GsiOnlineResponse[bool]:
119+
wi = 562
120+
word = gsiword(
121+
wi,
122+
str(year)
123+
)
124+
125+
return self._putrequest(
126+
wi,
127+
word
128+
)
129+
130+
def get_distance(self) -> GsiOnlineResponse[float | None]:
131+
def parsedist(value: str) -> float:
132+
data = float(value.strip()[6:])
133+
unit = int(value[5])
134+
match unit:
135+
case 0 | 1:
136+
data /= 1000
137+
case 6 | 7:
138+
data /= 10000
139+
case 8:
140+
data /= 100000
141+
142+
return data
143+
144+
return self._getrequest(
145+
"M",
146+
32,
147+
parsedist
148+
)
149+
150+
def get_reading(self) -> GsiOnlineResponse[float | None]:
151+
def parsereading(value: str) -> float:
152+
data = float(value.strip()[6:])
153+
unit = int(value[5])
154+
match unit:
155+
case 0 | 1:
156+
data /= 1000
157+
case 6 | 7:
158+
data /= 10000
159+
case 8:
160+
data /= 100000
161+
162+
return data
163+
164+
return self._getrequest(
165+
"M",
166+
330,
167+
parsereading
168+
)
169+
170+
def get_temperature(self) -> GsiOnlineResponse[int | None]:
171+
return self._getrequest(
172+
"M",
173+
95,
174+
lambda v: int(v.strip()[6:])
175+
)
176+
177+
def get_serialnumber(self) -> GsiOnlineResponse[str | None]:
178+
return self._getrequest(
179+
"I",
180+
12,
181+
str
182+
)
183+
184+
def get_instrument_type(self) -> GsiOnlineResponse[str | None]:
185+
return self._getrequest(
186+
"I",
187+
13,
188+
str
189+
)
190+
191+
def get_full_date(self) -> GsiOnlineResponse[datetime | None]:
192+
def parsedate(value: str) -> datetime:
193+
value = value.strip()
194+
return datetime(
195+
int(value[-4:]),
196+
int(value[-6:-4]),
197+
int(value[-8:-6])
198+
)
199+
200+
return self._getrequest(
201+
"I",
202+
17,
203+
parsedate
204+
)
205+
206+
def get_day_time(self) -> GsiOnlineResponse[tuple[int, int, time] | None]:
207+
def parse(value: str) -> tuple[int, int, time]:
208+
value = value.strip()
209+
return (
210+
int(value[-8:-6]),
211+
int(value[-6:-4]),
212+
time(
213+
int(value[-4:-2]),
214+
int(value[-2:])
215+
)
216+
)
217+
218+
return self._getrequest(
219+
"I",
220+
19,
221+
parse
222+
)
223+
224+
def get_software_version(self) -> GsiOnlineResponse[str | None]:
225+
return self._getrequest(
226+
"I",
227+
599,
228+
str
229+
)

0 commit comments

Comments
 (0)