22from math import log2
33from os import PathLike
44from functools import partial
5+ from numpy import dtype
56from pandas import DataFrame , Series
67from typing import Any , BinaryIO , Iterable , Callable , Optional , Union
78from pandas ._typing import Axes
89from harp .model import BitMask , GroupMask , Model , PayloadMember , Register
910from harp .io import read
11+ from harp .schema import read_schema
1012
1113_camel_to_snake_regex = re .compile (r"(?<!^)(?=[A-Z])" )
1214
1315
1416class RegisterReader :
1517 register : Register
16- read : Callable [[str ], DataFrame ]
18+ read : Callable [[Union [ str , bytes , PathLike [ Any ], BinaryIO ] ], DataFrame ]
1719
1820 def __init__ (
1921 self ,
@@ -89,14 +91,14 @@ def _create_payloadmember_parser(device: Model, member: PayloadMember):
8991 if offset is None :
9092 offset = 0
9193
92- shift = None
94+ shift = 0
9395 if member .mask is not None :
9496 shift = _mask_shift (member .mask )
9597
9698 lookup = None
9799 if member .maskType is not None :
98100 key = member .maskType .root
99- groupMask = device .groupMasks .get (key )
101+ groupMask = None if device . groupMasks is None else device .groupMasks .get (key )
100102 if groupMask is not None :
101103 lookup = _create_groupmask_lookup (groupMask )
102104
@@ -109,7 +111,7 @@ def parser(df: DataFrame):
109111 if member .mask is not None :
110112 series = series & member .mask
111113 if shift > 0 :
112- series = Series (series .values >> shift , series .index )
114+ series = Series (series .values >> shift , series .index ) # type: ignore
113115 if is_boolean :
114116 series = series != 0
115117 elif lookup is not None :
@@ -126,7 +128,7 @@ def reader(
126128 data = read (
127129 file ,
128130 address = register .address ,
129- dtype = register .type ,
131+ dtype = dtype ( register .type ) ,
130132 length = register .length ,
131133 columns = columns ,
132134 )
@@ -141,13 +143,13 @@ def _create_register_parser(device: Model, name: str):
141143
142144 if register .maskType is not None :
143145 key = register .maskType .root
144- bitMask = device .bitMasks .get (key )
146+ bitMask = None if device . bitMasks is None else device .bitMasks .get (key )
145147 if bitMask is not None :
146148 parser = _create_bitmask_parser (bitMask )
147149 reader = _compose (parser , reader )
148150 return RegisterReader (register , reader )
149151
150- groupMask = device .groupMasks .get (key )
152+ groupMask = None if device . groupMasks is None else device .groupMasks .get (key )
151153 if groupMask is not None :
152154 parser = _create_groupmask_parser (name , groupMask )
153155 reader = _compose (parser , reader )
@@ -170,7 +172,8 @@ def parser(df: DataFrame):
170172 return RegisterReader (register , reader )
171173
172174
173- def create_reader (device : Model ):
175+ def create_reader (file : Union [str , PathLike ], include_common_registers : bool = True ):
176+ device = read_schema (file , include_common_registers )
174177 reg_readers = {
175178 name : _create_register_parser (device , name ) for name in device .registers .keys ()
176179 }
0 commit comments