From 0fe79f341872cccc74ecd474c15999f4a8e26805 Mon Sep 17 00:00:00 2001 From: Jacob Alexander Date: Sun, 7 Sep 2014 21:32:36 -0700 Subject: [PATCH] Adding support for USB Code trigger assignment - Added USBCode "cached assignment" - Added ANSI -> Colemak USBCode assignment kll file - Removed debug printing --- examples/colemak.kll | 31 +++++++++++++++++++++++++++++++ examples/md1Map.kll | 3 ++- kll.py | 31 ++++++++----------------------- kll_lib/containers.py | 29 ++++++++++++++++++++++++++++- 4 files changed, 69 insertions(+), 25 deletions(-) create mode 100644 examples/colemak.kll diff --git a/examples/colemak.kll b/examples/colemak.kll new file mode 100644 index 0000000..6500e3e --- /dev/null +++ b/examples/colemak.kll @@ -0,0 +1,31 @@ +Name = colemak; +Version = 0.1; +Author = "HaaTa (Jacob Alexander) 2014"; +KLL = 0.3; + +# Modified Date +Date = 2014-09-07; + +# Top row +'e' : 'f'; +'r' : 'p'; +'t' : 'g'; +'y' : 'j'; +'u' : 'l'; +'i' : 'u'; +'o' : 'y'; +'p' : ';'; + +# Middle Row +'s' : 'r'; +'d' : 's'; +'f' : 't'; +'g' : 'd'; +'j' : 'n'; +'k' : 'e'; +'l' : 'i'; +';' : 'o'; + +# Bottom Row +'n' : 'k'; + diff --git a/examples/md1Map.kll b/examples/md1Map.kll index 76c0b75..990d558 100644 --- a/examples/md1Map.kll +++ b/examples/md1Map.kll @@ -4,11 +4,12 @@ Author = "HaaTa (Jacob Alexander) 2014"; KLL = 0.3; # Modified Date -Date = 2014-08-24; +Date = 2014-09-07; # MOVE THIS SECTION to another file usbKeyOut => Output_usbCodeSend_capability( usbCode : 1 ); +layerState => Macro_layerState_capability( layer: 2, state : 1 ); # END SECTION diff --git a/kll.py b/kll.py index 21c4418..06ce83d 100755 --- a/kll.py +++ b/kll.py @@ -397,9 +397,6 @@ def eval_scanCode( triggers, operator, results ): 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 @@ -411,20 +408,8 @@ def eval_usbCode( triggers, operator, results ): 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 @@ -506,8 +491,8 @@ capability_expression = name + skip( operator('=>') ) + name + skip( parenthesis #| : ; 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""" @@ -538,11 +523,11 @@ if __name__ == '__main__': 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() diff --git a/kll_lib/containers.py b/kll_lib/containers.py index d843574..751f949 100644 --- a/kll_lib/containers.py +++ b/kll_lib/containers.py @@ -94,6 +94,9 @@ class Macros: self.triggerList = [] self.maxScanCode = [] + # USBCode Assignment Cache + self.assignmentCache = [] + def __repr__( self ): return "{0}".format( self.macros ) @@ -124,11 +127,35 @@ class 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()