@@ -233,6 +233,8 @@ class protocol_settings:
233
233
settings : dict [str , str ]
234
234
''' default settings provided by protocol json '''
235
235
236
+ byteorder : str = "big"
237
+
236
238
def __init__ (self , protocol : str , settings_dir : str = 'protocols' ):
237
239
self .protocol = protocol
238
240
self .settings_dir = settings_dir
@@ -266,6 +268,9 @@ def __init__(self, protocol : str, settings_dir : str = 'protocols'):
266
268
else :
267
269
self .transport = "modbus_rtu"
268
270
271
+ if "byteorder" in self .settings : #handle byte order for ints n stuff
272
+ self .byteorder = self .settings ["byteorder" ]
273
+
269
274
270
275
for registry_type in Registry_Type :
271
276
self .load_registry_map (registry_type )
@@ -321,13 +326,13 @@ def load__json(self, file : str = '', settings_dir : str = ''):
321
326
322
327
def load__registry (self , path , registry_type : Registry_Type = Registry_Type .INPUT ) -> list [registry_map_entry ]:
323
328
registry_map : list [registry_map_entry ] = []
324
- register_regex = re .compile (r'(?P<register>(?:0?x[\dA-Z ]+|[\d]+))\.(b(?P<bit>x?\d{1,2})|(?P<byte>x?\d{1,2}))' )
329
+ register_regex = re .compile (r'(?P<register>(?:0?x[\da-z ]+|[\d]+))\.(b(?P<bit>x?\d{1,2})|(?P<byte>x?\d{1,2}))' )
325
330
326
331
data_type_regex = re .compile (r'(?P<datatype>\w+)\.(?P<length>\d+)' )
327
332
328
- range_regex = re .compile (r'(?P<reverse>r|)(?P<start>(?:0?x[\dA-Z ]+|[\d]+))[\-~](?P<end>(?:0?x[\dA-Z ]+|[\d]+))' )
333
+ range_regex = re .compile (r'(?P<reverse>r|)(?P<start>(?:0?x[\da-z ]+|[\d]+))[\-~](?P<end>(?:0?x[\da-z ]+|[\d]+))' )
329
334
ascii_value_regex = re .compile (r'(?P<regex>^\[.+\]$)' )
330
- list_regex = re .compile (r'\s*(?:(?P<range_start>(?:0?x[\dA-Z ]+|[\d]+))-(?P<range_end>(?:0?x[\dA-Z ]+|[\d]+))|(?P<element>[^,\s][^,]*?))\s*(?:,|$)' )
335
+ list_regex = re .compile (r'\s*(?:(?P<range_start>(?:0?x[\da-z ]+|[\d]+))-(?P<range_end>(?:0?x[\da-z ]+|[\d]+))|(?P<element>[^,\s][^,]*?))\s*(?:,|$)' )
331
336
332
337
333
338
if not os .path .exists (path ): #return empty is file doesnt exist.
@@ -471,6 +476,7 @@ def determine_delimiter(first_row) -> str:
471
476
register : int = - 1
472
477
register_bit : int = 0
473
478
register_byte : int = - 1
479
+ row ['register' ] = row ['register' ].lower () #ensure is all lower case
474
480
match = register_regex .search (row ['register' ])
475
481
if match :
476
482
register = strtoint (match .group ('register' ))
@@ -685,13 +691,13 @@ def process_register_bytes(self, registry : dict[int,bytes], entry : registry_ma
685
691
register = register [:entry .data_type_size ]
686
692
687
693
if entry .data_type == Data_Type .UINT :
688
- value = int .from_bytes (register [:4 ], byteorder = 'big' , signed = False )
694
+ value = int .from_bytes (register [:4 ], byteorder = self . byteorder , signed = False )
689
695
elif entry .data_type == Data_Type .INT :
690
- value = int .from_bytes (register [:4 ], byteorder = 'big' , signed = True )
696
+ value = int .from_bytes (register [:4 ], byteorder = self . byteorder , signed = True )
691
697
elif entry .data_type == Data_Type .USHORT :
692
- value = int .from_bytes (register [:2 ], byteorder = 'big' , signed = False )
698
+ value = int .from_bytes (register [:2 ], byteorder = self . byteorder , signed = False )
693
699
elif entry .data_type == Data_Type .SHORT :
694
- value = int .from_bytes (register [:2 ], byteorder = 'big' , signed = True )
700
+ value = int .from_bytes (register [:2 ], byteorder = self . byteorder , signed = True )
695
701
elif entry .data_type == Data_Type ._16BIT_FLAGS or entry .data_type == Data_Type ._8BIT_FLAGS or entry .data_type == Data_Type ._32BIT_FLAGS :
696
702
#16 bit flags
697
703
start_bit : int = 0
@@ -704,7 +710,7 @@ def process_register_bytes(self, registry : dict[int,bytes], entry : registry_ma
704
710
#handle custom sizes, less than 1 register
705
711
end_bit = flag_size + start_bit
706
712
707
- if entry .documented_name + '_codes' in self .protocolSettings . codes :
713
+ if entry .documented_name + '_codes' in self .codes :
708
714
flags : list [str ] = []
709
715
for i in range (start_bit , end_bit ): # Iterate over each bit position (0 to 15)
710
716
byte = i // 8
@@ -713,8 +719,8 @@ def process_register_bytes(self, registry : dict[int,bytes], entry : registry_ma
713
719
# Check if the i-th bit is set
714
720
if (val >> bit ) & 1 :
715
721
flag_index = "b" + str (i )
716
- if flag_index in self .protocolSettings . codes [entry .documented_name + '_codes' ]:
717
- flags .append (self .protocolSettings . codes [entry .documented_name + '_codes' ][flag_index ])
722
+ if flag_index in self .codes [entry .documented_name + '_codes' ]:
723
+ flags .append (self .codes [entry .documented_name + '_codes' ][flag_index ])
718
724
719
725
value = "," .join (flags )
720
726
else :
@@ -766,6 +772,22 @@ def process_register_bytes(self, registry : dict[int,bytes], entry : registry_ma
766
772
except UnicodeDecodeError as e :
767
773
print ("UnicodeDecodeError:" , e )
768
774
775
+ #apply unit mod
776
+ if entry .unit_mod != float (1 ):
777
+ value = value * entry .unit_mod
778
+
779
+ #apply codes
780
+ if (entry .data_type != Data_Type ._16BIT_FLAGS and
781
+ entry .documented_name + '_codes' in self .codes ):
782
+ try :
783
+ cleanval = str (int (value ))
784
+
785
+ if cleanval in self .codes [entry .documented_name + '_codes' ]:
786
+ value = self .codes [entry .documented_name + '_codes' ][cleanval ]
787
+ except :
788
+ #do nothing; try is for intval
789
+ value = value
790
+
769
791
return value
770
792
771
793
@@ -859,7 +881,7 @@ def process_register_ushort(self, registry : dict[int, int], entry : registry_ma
859
881
bit_index = entry .register_bit
860
882
value = (registry [entry .register ] >> bit_index ) & bit_mask
861
883
elif entry .data_type == Data_Type .ASCII :
862
- value = registry [entry .register ].to_bytes ((16 + 7 ) // 8 , byteorder = 'big' ) #convert to ushort to bytes
884
+ value = registry [entry .register ].to_bytes ((16 + 7 ) // 8 , byteorder = self . byteorder ) #convert to ushort to bytes
863
885
try :
864
886
value = value .decode ("utf-8" ) #convert bytes to ascii
865
887
except UnicodeDecodeError as e :
0 commit comments