66from math import log2
77from os import PathLike
88from pathlib import Path
9- from typing import Any , BinaryIO , Callable , Iterable , Mapping , Optional , Protocol , Union
9+ from typing import Callable , Iterable , Mapping , Optional , Protocol , Union
1010
1111from numpy import dtype
1212from pandas import DataFrame , Series
1313from pandas ._typing import Axes
1414
15- from harp .io import MessageType , parse , read
15+ from harp .io import MessageType , read
1616from harp .model import BitMask , GroupMask , Model , PayloadMember , Register
1717from harp .schema import read_schema
18- from harp .typing import BufferLike
18+ from harp .typing import _BufferLike , _FileLike
1919
2020
2121@dataclass
2222class _ReaderParams :
23- path : Path
23+ base_path : Path
2424 epoch : Optional [datetime ] = None
2525 keep_type : bool = False
2626
2727
2828class _ReadRegister (Protocol ):
2929 def __call__ (
3030 self ,
31- file : Optional [Union [str , bytes , PathLike [Any ], BinaryIO ]] = None ,
32- epoch : Optional [datetime ] = None ,
33- keep_type : bool = False ,
34- ) -> DataFrame : ...
35-
36-
37- class _ParseRegister (Protocol ):
38- def __call__ (
39- self ,
40- buffer : BufferLike ,
31+ file_or_buf : Optional [Union [_FileLike , _BufferLike ]] = None ,
4132 epoch : Optional [datetime ] = None ,
4233 keep_type : bool = False ,
4334 ) -> DataFrame : ...
@@ -46,17 +37,14 @@ def __call__(
4637class RegisterReader :
4738 register : Register
4839 read : _ReadRegister
49- parse : _ParseRegister
5040
5141 def __init__ (
5242 self ,
5343 register : Register ,
5444 read : _ReadRegister ,
55- parse : _ParseRegister ,
5645 ) -> None :
5746 self .register = register
5847 self .read = read
59- self .parse = parse
6048
6149
6250class RegisterMap (UserDict [str , RegisterReader ]):
@@ -180,16 +168,16 @@ def parser(df: DataFrame):
180168
181169def _create_register_reader (register : Register , params : _ReaderParams ):
182170 def reader (
183- file : Optional [Union [str , bytes , PathLike [ Any ], BinaryIO ]] = None ,
171+ file_or_buf : Optional [Union [_FileLike , _BufferLike ]] = None ,
184172 columns : Optional [Axes ] = None ,
185173 epoch : Optional [datetime ] = params .epoch ,
186174 keep_type : bool = params .keep_type ,
187175 ):
188- if file is None :
189- file = f"{ params .path } _{ register .address } .bin"
176+ if file_or_buf is None :
177+ file_or_buf = f"{ params .base_path } _{ register .address } .bin"
190178
191179 data = read (
192- file ,
180+ file_or_buf ,
193181 address = register .address ,
194182 dtype = dtype (register .type ),
195183 length = register .length ,
@@ -202,46 +190,23 @@ def reader(
202190 return reader
203191
204192
205- def _create_register_parser (register : Register , params : _ReaderParams ):
206- def parser (
207- buffer : BufferLike ,
208- columns : Optional [Axes ] = None ,
209- epoch : Optional [datetime ] = params .epoch ,
210- keep_type : bool = params .keep_type ,
211- ):
212- return parse (
213- buffer ,
214- address = register .address ,
215- dtype = dtype (register .type ),
216- length = register .length ,
217- columns = columns ,
218- epoch = epoch ,
219- keep_type = keep_type ,
220- )
221-
222- return parser
223-
224-
225193def _create_register_handler (device : Model , name : str , params : _ReaderParams ):
226194 register = device .registers [name ]
227195 reader = _create_register_reader (register , params )
228- parser = _create_register_parser (register , params )
229196
230197 if register .maskType is not None :
231198 key = register .maskType .root
232199 bitMask = None if device .bitMasks is None else device .bitMasks .get (key )
233200 if bitMask is not None :
234201 bitmask_parser = _create_bitmask_parser (bitMask )
235202 reader = _compose_parser (bitmask_parser , reader , params )
236- parser = _compose_parser (bitmask_parser , parser , params )
237- return RegisterReader (register , reader , parser )
203+ return RegisterReader (register , reader )
238204
239205 groupMask = None if device .groupMasks is None else device .groupMasks .get (key )
240206 if groupMask is not None :
241207 groupmask_parser = _create_groupmask_parser (name , groupMask )
242208 reader = _compose_parser (groupmask_parser , reader , params )
243- parser = _compose_parser (groupmask_parser , parser , params )
244- return RegisterReader (register , reader , parser )
209+ return RegisterReader (register , reader )
245210
246211 if register .payloadSpec is not None :
247212 member_parsers = [
@@ -253,17 +218,15 @@ def payload_parser(df: DataFrame):
253218 return DataFrame ({n : f (df ) for n , f in member_parsers }, index = df .index )
254219
255220 reader = _compose_parser (payload_parser , reader , params )
256- parser = _compose_parser (payload_parser , parser , params )
257- return RegisterReader (register , reader , parser )
221+ return RegisterReader (register , reader )
258222
259223 columns = (
260224 [name ]
261225 if register .length is None or register .length == 1
262226 else [f"{ name } _{ i } " for i in range (register .length )]
263227 )
264228 reader = partial (reader , columns = columns )
265- parser = partial (parser , columns = columns )
266- return RegisterReader (register , reader , parser )
229+ return RegisterReader (register , reader )
267230
268231
269232def create_reader (
0 commit comments