@@ -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,15 +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 :
880- val = int .from_bytes (register , byteorder = self . byteorder , signed = False )
903+ val = int .from_bytes (register , byteorder = byte_order , signed = False )
881904 #16 bit flags
882905 start_bit : int = 0
883906 end_bit : int = 16 #default 16 bit
@@ -954,15 +977,15 @@ def process_register_bytes(self, registry : dict[int,bytes], entry : registry_ma
954977 value = (register >> bit_index ) & bit_mask
955978
956979 elif entry .data_type == Data_Type .BYTE : #bit types
957- value = int .from_bytes (register [:1 ], byteorder = self . byteorder , signed = False )
980+ value = int .from_bytes (register [:1 ], byteorder = byte_order , signed = False )
958981 elif entry .data_type .value > 200 : #bit types
959982 bit_size = Data_Type .getSize (entry .data_type )
960983 bit_mask = (1 << bit_size ) - 1 # Create a mask for extracting X bits
961984 bit_index = entry .register_bit
962985
963986
964987 if isinstance (register , bytes ):
965- register = int .from_bytes (register , byteorder = self . byteorder )
988+ register = int .from_bytes (register , byteorder = byte_order )
966989
967990 value = (register >> bit_index ) & bit_mask
968991
@@ -996,6 +1019,11 @@ def process_register_bytes(self, registry : dict[int,bytes], entry : registry_ma
9961019
9971020 def process_register_ushort (self , registry : dict [int , int ], entry : registry_map_entry ):
9981021 ''' 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+
9991027 if entry .data_type == Data_Type .UINT : #read uint
10001028 if entry .register + 1 not in registry :
10011029 return
@@ -1084,10 +1112,10 @@ def process_register_ushort(self, registry : dict[int, int], entry : registry_ma
10841112 bit_index = entry .register_bit
10851113 value = (registry [entry .register ] >> bit_index ) & bit_mask
10861114 elif entry .data_type == Data_Type .HEX :
1087- 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
10881116 value = value .hex () #convert bytes to hex
10891117 elif entry .data_type == Data_Type .ASCII :
1090- 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
10911119 try :
10921120 value = value .decode ("utf-8" ) #convert bytes to ascii
10931121 except UnicodeDecodeError as e :
0 commit comments