Archived
1
0

Adding basic layer support

- Not yet complete
- Partial layers are not compiling properly (adding too many macros, wasting memory)
- Adding example hhkb layout to try out as a layer
This commit is contained in:
Jacob Alexander 2014-09-07 23:22:07 -07:00
parent 0fe79f3418
commit ff6ba9198b
6 changed files with 109 additions and 27 deletions

View File

@ -178,20 +178,36 @@ class Backend:
self.fill_dict['DefaultLayerScanMap'] = self.fill_dict['DefaultLayerScanMap'][:-2] # Remove last comma and space self.fill_dict['DefaultLayerScanMap'] = self.fill_dict['DefaultLayerScanMap'][:-2] # Remove last comma and space
self.fill_dict['DefaultLayerScanMap'] += "\n};" self.fill_dict['DefaultLayerScanMap'] += "\n};"
#print( self.fill_dict['DefaultLayerTriggerList'] )
#print( self.fill_dict['DefaultLayerScanMap'] )
## Partial Layers and Partial Layer Scan Maps ##
## Partial Layers ##
self.fill_dict['PartialLayerTriggerLists'] = "" self.fill_dict['PartialLayerTriggerLists'] = ""
# TODO
#print( self.fill_dict['PartialLayerTriggerLists'] )
## Partial Layer Scan Maps ##
self.fill_dict['PartialLayerScanMaps'] = "" self.fill_dict['PartialLayerScanMaps'] = ""
# TODO
#print( self.fill_dict['PartialLayerScanMaps'] ) # Iterate over each of the layers, excluding the default layer
for layer in range( 1, len( macros.triggerList ) ):
# Prepare each layer
self.fill_dict['PartialLayerScanMaps'] += "// Partial Layer {0}\n".format( layer )
self.fill_dict['PartialLayerScanMaps'] += "const unsigned int *layer{0}_scanMap[] = {{\n".format( layer )
self.fill_dict['PartialLayerTriggerLists'] += "// Partial Layer {0}\n".format( layer )
# Iterate over triggerList and generate a C trigger array for the layer
for triggerList in range( 0, len( macros.triggerList[ layer ] ) ):
# Generate ScanCode index and triggerList length
self.fill_dict['PartialLayerTriggerLists'] += "Define_TL( layer{0}, 0x{1:02X} ) = {{ {2}".format( layer, triggerList, len( macros.triggerList[ 0 ][ triggerList ] ) )
# Add scanCode trigger list to Default Layer Scan Map
self.fill_dict['PartialLayerScanMaps'] += "layer{0}_tl_0x{1:02X}, ".format( layer, triggerList )
# Add each item of the trigger list
for trigger in macros.triggerList[ 0 ][ triggerList ]:
self.fill_dict['PartialLayerTriggerLists'] += ", {0}".format( trigger )
self.fill_dict['PartialLayerTriggerLists'] += " };\n"
self.fill_dict['PartialLayerTriggerLists'] += "\n"
self.fill_dict['PartialLayerScanMaps'] = self.fill_dict['PartialLayerScanMaps'][:-2] # Remove last comma and space
self.fill_dict['PartialLayerScanMaps'] += "\n};\n\n"
self.fill_dict['PartialLayerTriggerLists'] = self.fill_dict['PartialLayerTriggerLists'][:-2] # Remove last 2 newlines
self.fill_dict['PartialLayerScanMaps'] = self.fill_dict['PartialLayerScanMaps'][:-2] # Remove last 2 newlines
## Layer Index List ## ## Layer Index List ##
@ -200,15 +216,13 @@ class Backend:
# Iterate over each layer, adding it to the list # Iterate over each layer, adding it to the list
for layer in range( 0, len( macros.triggerList ) ): for layer in range( 0, len( macros.triggerList ) ):
# Default map is a special case, always the first index # Default map is a special case, always the first index
# TODO Fix names
if layer == 0: if layer == 0:
self.fill_dict['LayerIndexList'] += '\tLayer_IN( default_scanMap, "DefaultMap" ),\n' self.fill_dict['LayerIndexList'] += '\tLayer_IN( default_scanMap, "DefaultMap" ),\n'
else: else:
# TODO Partial Layer self.fill_dict['LayerIndexList'] += '\tLayer_IN( layer{0}_scanMap, "Layer {0}" ),\n'.format( layer )
pass
self.fill_dict['LayerIndexList'] += "};" self.fill_dict['LayerIndexList'] += "};"
#print( self.fill_dict['LayerIndexList'] )
# Generates the output keymap with fill tags filled # Generates the output keymap with fill tags filled
def generate( self, filepath ): def generate( self, filepath ):

View File

@ -6,7 +6,7 @@ KLL = 0.3;
# Modified Date # Modified Date
Date = 2014-09-07; Date = 2014-09-07;
# Top row # Top Row
'e' : 'f'; 'e' : 'f';
'r' : 'p'; 'r' : 'p';
't' : 'g'; 't' : 'g';

53
examples/hhkbpro2.kll Normal file
View File

@ -0,0 +1,53 @@
Name = hhkbpro2;
Version = 0.1;
Author = "HaaTa (Jacob Alexander) 2014";
KLL = 0.3;
# Modified Date
Date = 2014-09-07;
# Number Row
U"1" : U"F1";
U"2" : U"F2";
U"3" : U"F3";
U"4" : U"F4";
U"5" : U"F5";
U"6" : U"F6";
U"7" : U"F7";
U"8" : U"F8";
U"9" : U"F9";
U"0" : U"F10";
U"-" : U"F11";
U"=" : U"F12";
U"Backslash" : U"Insert";
U"Backtick" : U"Delete";
# Top Row
U"Tab" : U"Capslock";
U"I" : U"PrintScreen";
U"O" : U"ScrollLock";
U"P" : U"Pause";
U"{" : U"Up";
# Middle Row
U"A" : U"VolumeDown";
U"S" : U"VolumeUp";
U"D" : U"Mute";
#U"F" : U"Eject"; # TODO Requires additional firmware support for media keys -HaaTa
U"H" : U"Keypad Asterix";
U"J" : U"Keypad Slash";
U"K" : U"Home";
U"L" : U"PageUp";
U";" : U"Left";
U"Quote" : U"Right";
# Bottom Row
U"N" : U"Keypad Plus";
U"M" : U"Keypad Minus";
U"Comma" : U"End";
U"Period" : U"PageDown";
U"Slash" : U"Down";
# Space Row
# N/A

View File

@ -40,7 +40,7 @@ S0x17 : U"O";
S0x18 : U"P"; S0x18 : U"P";
S0x19 : U"LBrace"; S0x19 : U"LBrace";
S0x1A : U"RBrace"; S0x1A : U"RBrace";
S0x1B : U"Delete"; S0x1B : U"Backspace";
S0x1C : U"Ctrl"; S0x1C : U"Ctrl";
S0x1D : U"A"; S0x1D : U"A";
S0x1E : U"S"; S0x1E : U"S";

29
kll.py
View File

@ -507,6 +507,18 @@ def parse( tokenSequence ):
def processKLLFile( filename ):
with open( filename ) as file:
data = file.read()
tokenSequence = tokenize( data )
#print ( pformat( tokenSequence ) ) # Display tokenization
tree = parse( tokenSequence )
# Apply assignment cache, see 5.1.2 USB Codes for why this is necessary
macros_map.replayCachedAssignments()
### Main Entry Point ### ### Main Entry Point ###
if __name__ == '__main__': if __name__ == '__main__':
@ -517,17 +529,18 @@ if __name__ == '__main__':
backend_import = importlib.import_module( "backends.{0}".format( backend_name ) ) backend_import = importlib.import_module( "backends.{0}".format( backend_name ) )
backend = backend_import.Backend( template ) backend = backend_import.Backend( template )
#TODO Move elsewhere # Default combined layer
for filename in defaultFiles: for filename in defaultFiles:
with open( filename ) as file: processKLLFile( filename )
data = file.read()
tokenSequence = tokenize( data ) # Iterate through additional layers
#print ( pformat( tokenSequence ) ) # Display tokenization for partial in partialFileSets:
tree = parse( tokenSequence ) # Increment layer for each -p option
macros_map.addLayer()
# Apply assignment cache, see 5.1.2 USB Codes for why this is necessary # Iterate and process each of the file in the layer
macros_map.replayCachedAssignments() for filename in partial:
processKLLFile( filename )
# Do macro correlation and transformation # Do macro correlation and transformation
macros_map.generate() macros_map.generate()

View File

@ -100,8 +100,10 @@ class Macros:
def __repr__( self ): def __repr__( self ):
return "{0}".format( self.macros ) return "{0}".format( self.macros )
def setLayer( self, layer ): def addLayer( self ):
self.layer = layer # Increment layer count, and append another macros dictionary
self.layer += 1
self.macros.append( dict() )
# Use for ScanCode trigger macros # Use for ScanCode trigger macros
def appendScanCode( self, trigger, result ): def appendScanCode( self, trigger, result ):