@@ -188,6 +188,7 @@ class registry_map_entry:
188188 register_bit : int
189189 register_byte : int
190190 ''' byte offset for canbus ect... '''
191+
191192 variable_name : str
192193 documented_name : str
193194 unit : str
@@ -208,6 +209,9 @@ class registry_map_entry:
208209 data_type_size : int = - 1
209210 ''' for non-fixed size types like ASCII'''
210211
212+ data_byteorder : str = ''
213+ ''' entry specific byte order little | big | '' '''
214+
211215 read_command : bytes = None
212216 ''' for transports/protocols that require sending a command ontop of "register" '''
213217
@@ -512,16 +516,30 @@ def process_row(row):
512516
513517 #region data type
514518 data_type = Data_Type .USHORT
515-
516519 data_type_len : int = - 1
520+ data_byteorder : str = ''
517521 #optional row, only needed for non-default data types
518522 if "data type" in row and row ["data type" ]:
523+ data_type_str : str = ''
524+
519525 matches = data_type_regex .search (row ["data type" ])
520526 if matches :
521527 data_type_len = int (matches .group ("length" ))
522- data_type = Data_Type . fromString ( matches .group ("datatype" ) )
528+ data_type_str = matches .group ("datatype" )
523529 else :
524- data_type = Data_Type .fromString (row ["data type" ])
530+ data_type_str = row ["data type" ]
531+
532+ #check if datatype specifies byteorder
533+ if data_type_str .upper ().endswith ("_LE" ):
534+ data_byteorder = "little"
535+ data_type_str = data_type_str [:- 3 ]
536+ elif data_type_str .upper ().endswith ("_BE" ):
537+ data_byteorder = "big"
538+ data_type_str = data_type_str [:- 3 ]
539+
540+
541+ data_type = Data_Type .fromString (data_type_str )
542+
525543
526544
527545 if "values" not in row :
@@ -658,6 +676,7 @@ def process_row(row):
658676 unit_mod = unit_multiplier ,
659677 data_type = data_type ,
660678 data_type_size = data_type_len ,
679+ data_byteorder = data_byteorder ,
661680 concatenate = concatenate ,
662681 concatenate_registers = concatenate_registers ,
663682 values = values ,
@@ -857,6 +876,10 @@ def load_registry_map(self, registry_type : Registry_Type, file : str = "", sett
857876 def process_register_bytes (self , registry : dict [int ,bytes ], entry : registry_map_entry ):
858877 ''' process bytes into data'''
859878
879+ byte_order : str = self .byteorder
880+ if entry .data_byteorder : #allow map entry to override byteorder
881+ byte_order = entry .data_byteorder
882+
860883 if isinstance (registry [entry .register ], tuple ):
861884 register = registry [entry .register ][0 ] #can bus uses tuple for timestamp
862885 else :
@@ -869,14 +892,15 @@ def process_register_bytes(self, registry : dict[int,bytes], entry : registry_ma
869892 register = register [:entry .data_type_size ]
870893
871894 if entry .data_type == Data_Type .UINT :
872- value = int .from_bytes (register [:4 ], byteorder = self . byteorder , signed = False )
895+ value = int .from_bytes (register [:4 ], byteorder = byte_order , signed = False )
873896 elif entry .data_type == Data_Type .INT :
874- value = int .from_bytes (register [:4 ], byteorder = self . byteorder , signed = True )
897+ value = int .from_bytes (register [:4 ], byteorder = byte_order , signed = True )
875898 elif entry .data_type == Data_Type .USHORT :
876- value = int .from_bytes (register [:2 ], byteorder = self . byteorder , signed = False )
899+ value = int .from_bytes (register [:2 ], byteorder = byte_order , signed = False )
877900 elif entry .data_type == Data_Type .SHORT :
878- value = int .from_bytes (register [:2 ], byteorder = self . byteorder , signed = True )
901+ value = int .from_bytes (register [:2 ], byteorder = byte_order , signed = True )
879902 elif entry .data_type == Data_Type ._16BIT_FLAGS or entry .data_type == Data_Type ._8BIT_FLAGS or entry .data_type == Data_Type ._32BIT_FLAGS :
903+ val = int .from_bytes (register , byteorder = byte_order , signed = False )
880904 #16 bit flags
881905 start_bit : int = 0
882906 end_bit : int = 16 #default 16 bit
@@ -952,11 +976,20 @@ def process_register_bytes(self, registry : dict[int,bytes], entry : registry_ma
952976 # If positive, simply extract the value using the bit mask
953977 value = (register >> bit_index ) & bit_mask
954978
955- elif entry .data_type .value > 200 or entry .data_type == Data_Type .BYTE : #bit types
979+ elif entry .data_type == Data_Type .BYTE : #bit types
980+ value = int .from_bytes (register [:1 ], byteorder = byte_order , signed = False )
981+ elif entry .data_type .value > 200 : #bit types
956982 bit_size = Data_Type .getSize (entry .data_type )
957983 bit_mask = (1 << bit_size ) - 1 # Create a mask for extracting X bits
958984 bit_index = entry .register_bit
985+
986+
987+ if isinstance (register , bytes ):
988+ register = int .from_bytes (register , byteorder = byte_order )
989+
959990 value = (register >> bit_index ) & bit_mask
991+
992+
960993 elif entry .data_type == Data_Type .HEX :
961994 value = register .hex () #convert bytes to hex
962995 elif entry .data_type == Data_Type .ASCII :
@@ -986,6 +1019,11 @@ def process_register_bytes(self, registry : dict[int,bytes], entry : registry_ma
9861019
9871020 def process_register_ushort (self , registry : dict [int , int ], entry : registry_map_entry ):
9881021 ''' process ushort type registry into data'''
1022+
1023+ byte_order : str = self .byteorder
1024+ if entry .data_byteorder :
1025+ byte_order = entry .data_byteorder
1026+
9891027 if entry .data_type == Data_Type .UINT : #read uint
9901028 if entry .register + 1 not in registry :
9911029 return
@@ -1074,10 +1112,10 @@ def process_register_ushort(self, registry : dict[int, int], entry : registry_ma
10741112 bit_index = entry .register_bit
10751113 value = (registry [entry .register ] >> bit_index ) & bit_mask
10761114 elif entry .data_type == Data_Type .HEX :
1077- value = registry [entry .register ].to_bytes ((16 + 7 ) // 8 , byteorder = self . byteorder ) #convert to ushort to bytes
1115+ value = registry [entry .register ].to_bytes ((16 + 7 ) // 8 , byteorder = byte_order ) #convert to ushort to bytes
10781116 value = value .hex () #convert bytes to hex
10791117 elif entry .data_type == Data_Type .ASCII :
1080- value = registry [entry .register ].to_bytes ((16 + 7 ) // 8 , byteorder = self . byteorder ) #convert to ushort to bytes
1118+ value = registry [entry .register ].to_bytes ((16 + 7 ) // 8 , byteorder = byte_order ) #convert to ushort to bytes
10811119 try :
10821120 value = value .decode ("utf-8" ) #convert bytes to ascii
10831121 except UnicodeDecodeError as e :
0 commit comments