elif operator == ":":
macros_map.replaceScanCode( trigger, result )
- print ( triggers )
- print ( results )
-
def eval_usbCode( triggers, operator, results ):
# Convert to lists of lists of lists to tuples of tuples of tuples
# Tuples are non-mutable, and can be used has index items
scanCodes = macros_map.lookupUSBCodes( trigger )
for scanCode in scanCodes:
for result in results:
- # Append Case
- if operator == ":+":
- macros_map.appendScanCode( scanCode, result )
-
- # Remove Case
- elif operator == ":-":
- macros_map.removeScanCode( scanCode, result )
-
- # Replace Case
- elif operator == ":":
- macros_map.replaceScanCode( scanCode, result )
-
- print ( triggers )
- print ( results )
+ # Cache assignment until file finishes processing
+ macros_map.cacheAssignment( operator, scanCode, result )
def eval_variable( name, content ):
# Content might be a concatenation of multiple data types, convert everything into a single string
#| <trigger> : <result>;
operatorTriggerResult = operator(':') | operator(':+') | operator(':-')
-scanCode_expression = triggerCode_outerList + operatorTriggerResult + resultCode_outerList + skip( eol ) >> map_scanCode
-usbCode_expression = triggerUSBCode_outerList + operatorTriggerResult + resultCode_outerList + skip( eol ) #>> map_usbCode
+scanCode_expression = triggerCode_outerList + operatorTriggerResult + resultCode_outerList + skip( eol ) >> map_scanCode
+usbCode_expression = triggerUSBCode_outerList + operatorTriggerResult + resultCode_outerList + skip( eol ) >> map_usbCode
def parse( tokenSequence ):
"""Sequence(Token) -> object"""
data = file.read()
tokenSequence = tokenize( data )
- print ( pformat( tokenSequence ) ) # Display tokenization
+ #print ( pformat( tokenSequence ) ) # Display tokenization
tree = parse( tokenSequence )
- #print ( tree )
- #print ( variable_dict )
- #print ( capabilities_dict )
+
+ # Apply assignment cache, see 5.1.2 USB Codes for why this is necessary
+ macros_map.replayCachedAssignments()
# Do macro correlation and transformation
macros_map.generate()
self.triggerList = []
self.maxScanCode = []
+ # USBCode Assignment Cache
+ self.assignmentCache = []
+
def __repr__( self ):
return "{0}".format( self.macros )
# Scan current layer for USB Codes
for macro in self.macros[ self.layer ].keys():
- if usbCode == self.macros[ self.layer ][ macro ]:
+ if usbCode in self.macros[ self.layer ][ macro ]:
scanCodeList.append( macro )
return scanCodeList
+ # Cache USBCode Assignment
+ def cacheAssignment( self, operator, scanCode, result ):
+ self.assignmentCache.append( [ operator, scanCode, result ] )
+
+ # Assign cached USBCode Assignments
+ def replayCachedAssignments( self ):
+ # Iterate over each item in the assignment cache
+ for item in self.assignmentCache:
+ # Check operator, and choose the specified assignment action
+ # Append Case
+ if item[0] == ":+":
+ self.appendScanCode( item[1], item[2] )
+
+ # Remove Case
+ elif item[0] == ":-":
+ self.removeScanCode( item[1], item[2] )
+
+ # Replace Case
+ elif item[0] == ":":
+ self.replaceScanCode( item[1], item[2] )
+
+ # Clear assignment cache
+ self.assignmentCache = []
+
# Generate/Correlate Layers
def generate( self ):
self.generateIndices()