changeset 182:880c33236cd1

Added capSelect function that can arbitrary run a keyboard capability - Made changes to the capabities/macro data structure to specify the capability arg count in the capability list - Remove the arg count from the result macro struct (as it is redundant)
author Jacob Alexander <haata@kiibohd.com>
date Fri, 25 Jul 2014 10:53:33 -0700
parents 80a44dcdafaf
children bb96551a3065
files Macro/PartialMap/generatedKeymap.h Macro/PartialMap/macro.c
diffstat 2 files changed, 76 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/Macro/PartialMap/generatedKeymap.h	Thu Jul 24 23:42:38 2014 -0700
+++ b/Macro/PartialMap/generatedKeymap.h	Fri Jul 25 10:53:33 2014 -0700
@@ -37,7 +37,7 @@
 // Default Args (always sent): key state/analog of last key
 // Combo Length of 0 signifies end of sequence
 //
-// ResultMacro.guide     -> [<combo length>|<function pointer>|<arg count>|<arg1>|<argn>|<function pointer>|...|<combo length>|...|0]
+// ResultMacro.guide     -> [<combo length>|<capability index>|<arg1>|<argn>|<capability index>|...|<combo length>|...|0]
 // ResultMacro.pos       -> <current combo position>
 // ResultMacro.state     -> <last key state>
 // ResultMacro.stateType -> <last key state type>
@@ -50,10 +50,9 @@
 } ResultMacro;
 
 // Guide, key element
-#define ResultGuideSize( guidePtr ) sizeof( ResultGuide ) - 1 + guidePtr->argCount
+#define ResultGuideSize( guidePtr ) sizeof( ResultGuide ) - 1 + CapabilitiesList[ guidePtr->index ].argCount
 typedef struct ResultGuide {
 	uint8_t index;
-	uint8_t argCount;
 	uint8_t args; // This is used as an array pointer (but for packing purposes, must be 8 bit)
 } ResultGuide;
 
@@ -99,7 +98,6 @@
 
 // ----- Macros -----
 
-#define debugPrint_cap( arg ) 0, 1, arg
 void debugPrint_capability( uint8_t state, uint8_t stateType, uint8_t *args )
 {
 	// Display capability name
@@ -116,10 +114,9 @@
 	printHex( state );
 	print(" )  arg ( ");
 	printHex( args[0] );
-	print( " )" NL );
+	print(" )");
 }
 
-#define debugPrint2_cap( arg1, arg2 ) 1, 2, arg1, arg2
 void debugPrint2_capability( uint8_t state, uint8_t stateType, uint8_t *args )
 {
 	// Display capability name
@@ -138,17 +135,23 @@
 	printHex( args[0] );
 	print(" )  arg2 ( ");
 	printHex( args[1] );
-	print( " )" NL );
+	print(" )");
 }
 
+// Capability
+typedef struct Capability {
+	void *func;
+	uint8_t argCount;
+} Capability;
+
 // Total Number of Capabilities
-#define CapabilitiesNum sizeof( CapabilitiesList ) / 4
+#define CapabilitiesNum sizeof( void* ) / 4 + sizeof( uint8_t )
 
 // Indexed Capabilities Table
 // TODO Should be moved to the Scan Module
-void *CapabilitiesList[] = {
-	debugPrint_capability,
-	debugPrint2_capability,
+Capability CapabilitiesList[] = {
+	{ debugPrint_capability, 1 },
+	{ debugPrint2_capability, 2 },
 };
 
 
@@ -164,10 +167,10 @@
 #define Guide_RM( index ) static uint8_t rm##index##_guide[]
 #define Define_RM( index ) { rm##index##_guide, 0, 0, 0 }
 
-Guide_RM( 0 ) = { 1, debugPrint_cap( 0xDA ), 0 };
-Guide_RM( 1 ) = { 1, debugPrint_cap( 0xBE ), 1, debugPrint_cap( 0xEF ), 0 };
-Guide_RM( 2 ) = { 2, debugPrint_cap( 0xFA ), debugPrint_cap( 0xAD ), 0 };
-Guide_RM( 3 ) = { 1, debugPrint2_cap( 0xCA, 0xFE ), 0 };
+Guide_RM( 0 ) = { 1, 0, 0xDA, 0 };
+Guide_RM( 1 ) = { 1, 0, 0xBE, 1, 0, 0xEF, 0 };
+Guide_RM( 2 ) = { 2, 0, 0xFA, 0, 0xAD, 0 };
+Guide_RM( 3 ) = { 1, 1, 0xCA, 0xFE, 0 };
 
 // Total number of result macros (rm's)
 // Used to create pending rm's table
--- a/Macro/PartialMap/macro.c	Thu Jul 24 23:42:38 2014 -0700
+++ b/Macro/PartialMap/macro.c	Fri Jul 25 10:53:33 2014 -0700
@@ -59,7 +59,7 @@
 char*       macroCLIDictName = "Macro Module Commands";
 CLIDictItem macroCLIDict[] = {
 	{ "capList",     "Prints an indexed list of all non USB keycode capabilities.", cliFunc_capList },
-	{ "capSelect",   "Triggers the specified capability." NL "\t\t\033[35mU10\033[0m USB Code 0x0A, \033[35mK11\033[0m Keyboard Capability 0x0B", cliFunc_capSelect },
+	{ "capSelect",   "Triggers the specified capabilities. First two args are state and stateType." NL "\t\t\033[35mK11\033[0m Keyboard Capability 0x0B", cliFunc_capSelect },
 	{ "keyPress",    "Send key-presses to the macro module. Held until released. Duplicates have undefined behaviour." NL "\t\t\033[35mS10\033[0m Scancode 0x0A", cliFunc_keyPress },
 	{ "keyRelease",  "Release a key-press from the macro module. Duplicates have undefined behaviour." NL "\t\t\033[35mS10\033[0m Scancode 0x0A", cliFunc_keyRelease },
 	{ "layerLatch",  "Latch the specified indexed layer." NL "\t\t\033[35mL15\033[0m Indexed Layer 0x0F", cliFunc_layerLatch },
@@ -381,7 +381,7 @@
 		print(" - ");
 
 		// Display/Lookup Capability Name (utilize debug mode of capability)
-		void (*capability)(uint8_t, uint8_t, uint8_t*) = (void(*)(uint8_t, uint8_t, uint8_t*))(CapabilitiesList[ cap ]);
+		void (*capability)(uint8_t, uint8_t, uint8_t*) = (void(*)(uint8_t, uint8_t, uint8_t*))(CapabilitiesList[ cap ].func);
 		capability( 0xFF, 0xFF, 0 );
 	}
 }
@@ -389,27 +389,64 @@
 void cliFunc_capSelect( char* args )
 {
 	// Parse code from argument
-	//  NOTE: Only first argument is used
+	char* curArgs;
 	char* arg1Ptr;
-	char* arg2Ptr;
-	CLI_argumentIsolation( args, &arg1Ptr, &arg2Ptr );
+	char* arg2Ptr = args;
+
+	// Total number of args to scan (must do a lookup if a keyboard capability is selected)
+	unsigned int totalArgs = 2; // Always at least two args
+	unsigned int cap = 0;
 
-	// Depending on the first character, the lookup changes
-	switch ( arg1Ptr[0] )
+	// Arguments used for keyboard capability function
+	unsigned int argSetCount = 0;
+	uint8_t *argSet = (uint8_t*)args;
+
+	// Process all args
+	for ( unsigned int c = 0; argSetCount < totalArgs; c++ )
 	{
-	// Keyboard Capability
-	case 'K':
-		// TODO
-		break;
+		curArgs = arg2Ptr;
+		CLI_argumentIsolation( curArgs, &arg1Ptr, &arg2Ptr );
+
+		// Stop processing args if no more are found
+		// Extra arguments are ignored
+		if ( *arg1Ptr == '\0' )
+			break;
+
+		// For the first argument, choose the capability
+		if ( c == 0 ) switch ( arg1Ptr[0] )
+		{
+		// Keyboard Capability
+		case 'K':
+			// Determine capability index
+			cap = decToInt( &arg1Ptr[1] );
+
+			// Lookup the number of args
+			totalArgs += CapabilitiesList[ cap ].argCount;
+			continue;
+		}
 
-	// USB Code
-	case 'U':
-		// Just add the key to the USB Buffer
-		if ( KeyIndex_BufferUsed < KEYBOARD_BUFFER )
+		// Because allocating memory isn't doable, and the argument count is arbitrary
+		// The argument pointer is repurposed as the argument list (much smaller anyways)
+		argSet[ argSetCount++ ] = (uint8_t)decToInt( arg1Ptr );
+
+		// Once all the arguments are prepared, call the keyboard capability function
+		if ( argSetCount == totalArgs )
 		{
-			KeyIndex_Buffer[KeyIndex_BufferUsed++] = decToInt( &arg1Ptr[1] );
+			// Indicate that the capability was called
+			print( NL );
+			info_msg("K");
+			printInt8( cap );
+			print(" - ");
+			printHex( argSet[0] );
+			print(" - ");
+			printHex( argSet[1] );
+			print(" - ");
+			printHex( argSet[2] );
+			print( "..." NL );
+
+			void (*capability)(uint8_t, uint8_t, uint8_t*) = (void(*)(uint8_t, uint8_t, uint8_t*))(CapabilitiesList[ cap ].func);
+			capability( argSet[0], argSet[1], &argSet[2] );
 		}
-		break;
 	}
 }
 
@@ -626,22 +663,22 @@
 			print("|");
 
 			// Display Function Ptr Address
-			printHex( (unsigned int)CapabilitiesList[ guide->index ] );
+			printHex( (unsigned int)CapabilitiesList[ guide->index ].func );
 			print("|");
 
 			// Display/Lookup Capability Name (utilize debug mode of capability)
-			void (*capability)(uint8_t, uint8_t, uint8_t*) = (void(*)(uint8_t, uint8_t, uint8_t*))(CapabilitiesList[ guide->index ]);
+			void (*capability)(uint8_t, uint8_t, uint8_t*) = (void(*)(uint8_t, uint8_t, uint8_t*))(CapabilitiesList[ guide->index ].func);
 			capability( 0xFF, 0xFF, 0 );
 
 			// Display Argument(s)
 			print("(");
-			for ( unsigned int arg = 0; arg < guide->argCount; arg++ )
+			for ( unsigned int arg = 0; arg < CapabilitiesList[ guide->index ].argCount; arg++ )
 			{
 				// Arguments are only 8 bit values
 				printHex( (&guide->args)[ arg ] );
 
 				// Only show arg separator if there are args left
-				if ( arg + 1 < guide->argCount )
+				if ( arg + 1 < CapabilitiesList[ guide->index ].argCount )
 					print(",");
 			}
 			print(")");