+class ScanCode:
+ # Container for ScanCodes
+ #
+ # scancode - Non-interconnect adjusted scan code
+ # interconnect_id - Unique id for the interconnect node
+ def __init__( self, scancode, interconnect_id ):
+ self.scancode = scancode
+ self.interconnect_id = interconnect_id
+
+ def __eq__( self, other ):
+ return self.dict() == other.dict()
+
+ def __repr__( self ):
+ return repr( self.dict() )
+
+ def dict( self ):
+ return {
+ 'ScanCode' : self.scancode,
+ 'Id' : self.interconnect_id,
+ }
+
+ # Calculate the actual scancode using the offset list
+ def offset( self, offsetList ):
+ if self.interconnect_id > 0:
+ return self.scancode + offsetList[ self.interconnect_id - 1 ]
+ else:
+ return self.scancode
+
+
+class ScanCodeStore:
+ # Unique lookup for ScanCodes
+ def __init__( self ):
+ self.scancodes = []
+
+ def __getitem__( self, name ):
+ # First check if this is a ScanCode object
+ if isinstance( name, ScanCode ):
+ # Do a reverse lookup
+ for idx, scancode in enumerate( self.scancodes ):
+ if scancode == name:
+ return idx
+
+ # Could not find scancode
+ return None
+
+ # Return scancode using unique id
+ return self.scancodes[ name ]
+
+ # Attempt add ScanCode to list, return unique id
+ def append( self, new_scancode ):
+ # Iterate through list to make sure this is a unique ScanCode
+ for idx, scancode in enumerate( self.scancodes ):
+ if new_scancode == scancode:
+ return idx
+
+ # Unique entry, add to the list
+ self.scancodes.append( new_scancode )
+
+ return len( self.scancodes ) - 1
+
+