- Prevents fall-through - Cannot be combined with other result capabilitiesmaster
# Add each of the arguments of the capability | # Add each of the arguments of the capability | ||||
for arg in range( 0, len( resultItem[1] ) ): | 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 | # 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 | # Required by USB to end at sequence without holding the key down |
S0x46 : SYS["UnDock"]; | S0x46 : SYS["UnDock"]; | ||||
S0x47 : SYS0xA2; | S0x47 : SYS0xA2; | ||||
S0x48 : None; | |||||
def make_sysCode_number( token ): | def make_sysCode_number( token ): | ||||
return make_hidCode_number( 'SysCode', 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 ): | def make_seqString( token ): | ||||
# Shifted Characters, and amount to move by to get non-shifted version | # Shifted Characters, and amount to move by to get non-shifted version | ||||
# US ANSI | # US ANSI | ||||
scanCode = tokenType('ScanCode') >> make_scanCode | scanCode = tokenType('ScanCode') >> make_scanCode | ||||
consCode = tokenType('ConsCode') >> make_consCode | consCode = tokenType('ConsCode') >> make_consCode | ||||
sysCode = tokenType('SysCode') >> make_sysCode | sysCode = tokenType('SysCode') >> make_sysCode | ||||
none = tokenType('None') >> make_none | |||||
name = tokenType('Name') | name = tokenType('Name') | ||||
number = tokenType('Number') >> make_number | number = tokenType('Number') >> make_number | ||||
comma = tokenType('Comma') | comma = tokenType('Comma') | ||||
# Trigger / Result Codes | # Trigger / Result Codes | ||||
triggerCode_outerList = scanCode_sequence >> optionExpansion | triggerCode_outerList = scanCode_sequence >> optionExpansion | ||||
triggerUSBCode_outerList = usbCode_sequence >> optionExpansion >> hidCodeToCapability | triggerUSBCode_outerList = usbCode_sequence >> optionExpansion >> hidCodeToCapability | ||||
resultCode_outerList = capFunc_sequence >> optionExpansion >> hidCodeToCapability | |||||
resultCode_outerList = ( ( capFunc_sequence >> optionExpansion ) | none ) >> hidCodeToCapability | |||||
## Main Rules | ## Main Rules |
# Rather than generating tables of hex USB codes for the keymapping tables, readable defines are used (which correspond to usb_hid.h) | # 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([ | hid_lookup_dictionary = dict([ | ||||
# Fall-through block | |||||
( ('NONE', 0), '' ), # Special case, there are no arguments | |||||
# USB HID Keyboard Codes | # USB HID Keyboard Codes | ||||
( ('USB', 0x00), 'KEY_NOEVENT' ), # Event, not a physical key | ( ('USB', 0x00), 'KEY_NOEVENT' ), # Event, not a physical key | ||||
( ('USB', 0x01), 'KEY_ERRORROLLOVER' ), # Event, not a physical key | ( ('USB', 0x01), 'KEY_ERRORROLLOVER' ), # Event, not a physical key |