changeset 40:159d6ede7ed3

Adding None keyword (0.3b) - Prevents fall-through - Cannot be combined with other result capabilities
author Jacob Alexander <haata@kiibohd.com>
date Sun, 10 May 2015 15:32:15 -0700
parents b242f1b264d6
children 562640af424d
files backends/kiibohd.py examples/simple2.kll kll.py kll_lib/hid_dict.py
diffstat 4 files changed, 28 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/backends/kiibohd.py	Sun May 10 14:52:07 2015 -0700
+++ b/backends/kiibohd.py	Sun May 10 15:32:15 2015 -0700
@@ -168,16 +168,23 @@
 
 					# Add each of the arguments of the capability
 					for arg in range( 0, len( resultItem[1] ) ):
-						# If this is a CONSUMER_ element, needs to be split into 2 elements
-						if isinstance( resultItem[1][ arg ], str ) and re.match( '^CONSUMER_', resultItem[1][ arg ] ):
-							tag = resultItem[1][ arg ].split( '_', 1 )[1]
-							if '_' in tag:
-								tag = tag.replace( '_', '' )
-							lookupNum = kll_hid_lookup_dictionary['ConsCode'][ tag ][1]
-							byteForm = lookupNum.to_bytes( 2, byteorder='little' ) # XXX Yes, little endian from how the uC structs work
-							self.fill_dict['ResultMacros'] += "{0}, {1}, ".format( *byteForm )
-						else:
-							self.fill_dict['ResultMacros'] += "{0}, ".format( resultItem[1][ arg ] )
+						# Special cases
+						if isinstance( resultItem[1][ arg ], str ):
+							# If this is a CONSUMER_ element, needs to be split into 2 elements
+							if re.match( '^CONSUMER_', resultItem[1][ arg ] ):
+								tag = resultItem[1][ arg ].split( '_', 1 )[1]
+								if '_' in tag:
+									tag = tag.replace( '_', '' )
+								lookupNum = kll_hid_lookup_dictionary['ConsCode'][ tag ][1]
+								byteForm = lookupNum.to_bytes( 2, byteorder='little' ) # XXX Yes, little endian from how the uC structs work
+								self.fill_dict['ResultMacros'] += "{0}, {1}, ".format( *byteForm )
+								continue
+
+							# None, fall-through disable
+							elif resultItem[0] is self.capabilityLookup('NONE'):
+								continue
+
+						self.fill_dict['ResultMacros'] += "{0}, ".format( resultItem[1][ arg ] )
 
 			# If sequence is longer than 1, append a sequence spacer at the end of the sequence
 			# Required by USB to end at sequence without holding the key down
--- a/examples/simple2.kll	Sun May 10 14:52:07 2015 -0700
+++ b/examples/simple2.kll	Sun May 10 15:32:15 2015 -0700
@@ -39,3 +39,5 @@
 S0x46 : SYS["UnDock"];
 S0x47 : SYS0xA2;
 
+S0x48 : None;
+
--- a/kll.py	Sun May 10 14:52:07 2015 -0700
+++ b/kll.py	Sun May 10 15:32:15 2015 -0700
@@ -255,6 +255,10 @@
 def make_sysCode_number( token ):
 	return make_hidCode_number( 'SysCode', token )
 
+   # Replace key-word with None specifier (which indicates a noneOut capability)
+def make_none( token ):
+	return [[[('NONE', 0)]]]
+
 def make_seqString( token ):
 	# Shifted Characters, and amount to move by to get non-shifted version
 	# US ANSI
@@ -535,6 +539,7 @@
 scanCode    = tokenType('ScanCode') >> make_scanCode
 consCode    = tokenType('ConsCode') >> make_consCode
 sysCode     = tokenType('SysCode') >> make_sysCode
+none        = tokenType('None') >> make_none
 name        = tokenType('Name')
 number      = tokenType('Number') >> make_number
 comma       = tokenType('Comma')
@@ -603,7 +608,7 @@
   # Trigger / Result Codes
 triggerCode_outerList    = scanCode_sequence >> optionExpansion
 triggerUSBCode_outerList = usbCode_sequence >> optionExpansion >> hidCodeToCapability
-resultCode_outerList     = capFunc_sequence >> optionExpansion >> hidCodeToCapability
+resultCode_outerList     = ( ( capFunc_sequence >> optionExpansion ) | none ) >> hidCodeToCapability
 
 
  ## Main Rules
--- a/kll_lib/hid_dict.py	Sun May 10 14:52:07 2015 -0700
+++ b/kll_lib/hid_dict.py	Sun May 10 15:32:15 2015 -0700
@@ -20,6 +20,9 @@
 
 # Rather than generating tables of hex USB codes for the keymapping tables, readable defines are used (which correspond to usb_hid.h)
 hid_lookup_dictionary = dict([
+	# Fall-through block
+	( ('NONE', 0), '' ), # Special case, there are no arguments
+
 	# USB HID Keyboard Codes
 	( ('USB', 0x00), 'KEY_NOEVENT' ), # Event, not a physical key
 	( ('USB', 0x01), 'KEY_ERRORROLLOVER' ), # Event, not a physical key