Browse Source

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
simple
Jacob Alexander 9 years ago
parent
commit
ff6ba9198b
6 changed files with 108 additions and 26 deletions
  1. 28
    14
      backends/kiibohd.py
  2. 1
    1
      examples/colemak.kll
  3. 53
    0
      examples/hhkbpro2.kll
  4. 1
    1
      examples/md1Map.kll
  5. 21
    8
      kll.py
  6. 4
    2
      kll_lib/containers.py

+ 28
- 14
backends/kiibohd.py 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'] += "\n};"

#print( self.fill_dict['DefaultLayerTriggerList'] )
#print( self.fill_dict['DefaultLayerScanMap'] )


## Partial Layers ##
## Partial Layers and Partial Layer Scan Maps ##
self.fill_dict['PartialLayerTriggerLists'] = ""
# TODO
#print( self.fill_dict['PartialLayerTriggerLists'] )
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 )

## Partial Layer Scan Maps ##
self.fill_dict['PartialLayerScanMaps'] = ""
# TODO
#print( self.fill_dict['PartialLayerScanMaps'] )
# 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 ##
@@ -200,15 +216,13 @@ class Backend:
# Iterate over each layer, adding it to the list
for layer in range( 0, len( macros.triggerList ) ):
# Default map is a special case, always the first index
# TODO Fix names
if layer == 0:
self.fill_dict['LayerIndexList'] += '\tLayer_IN( default_scanMap, "DefaultMap" ),\n'
else:
# TODO Partial Layer
pass
self.fill_dict['LayerIndexList'] += '\tLayer_IN( layer{0}_scanMap, "Layer {0}" ),\n'.format( layer )
self.fill_dict['LayerIndexList'] += "};"

#print( self.fill_dict['LayerIndexList'] )


# Generates the output keymap with fill tags filled
def generate( self, filepath ):

+ 1
- 1
examples/colemak.kll View File

@@ -6,7 +6,7 @@ KLL = 0.3;
# Modified Date
Date = 2014-09-07;

# Top row
# Top Row
'e' : 'f';
'r' : 'p';
't' : 'g';

+ 53
- 0
examples/hhkbpro2.kll 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


+ 1
- 1
examples/md1Map.kll View File

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

+ 21
- 8
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 ###

if __name__ == '__main__':
@@ -517,17 +529,18 @@ if __name__ == '__main__':
backend_import = importlib.import_module( "backends.{0}".format( backend_name ) )
backend = backend_import.Backend( template )

#TODO Move elsewhere
# Default combined layer
for filename in defaultFiles:
with open( filename ) as file:
data = file.read()
processKLLFile( filename )

tokenSequence = tokenize( data )
#print ( pformat( tokenSequence ) ) # Display tokenization
tree = parse( tokenSequence )
# Iterate through additional layers
for partial in partialFileSets:
# Increment layer for each -p option
macros_map.addLayer()

# Apply assignment cache, see 5.1.2 USB Codes for why this is necessary
macros_map.replayCachedAssignments()
# Iterate and process each of the file in the layer
for filename in partial:
processKLLFile( filename )

# Do macro correlation and transformation
macros_map.generate()

+ 4
- 2
kll_lib/containers.py View File

@@ -100,8 +100,10 @@ class Macros:
def __repr__( self ):
return "{0}".format( self.macros )

def setLayer( self, layer ):
self.layer = layer
def addLayer( self ):
# Increment layer count, and append another macros dictionary
self.layer += 1
self.macros.append( dict() )

# Use for ScanCode trigger macros
def appendScanCode( self, trigger, result ):