int initData() { initValues(); int i, j; srand(time(NULL)); for (i = 0; i <= ksize; ++i) nilKeyboard.layout[i] = nilKeyboard.shiftedLayout[i] = '\0'; nilKeyboard.fitness = 0; nilKeyboard.distance = 0; nilKeyboard.inRoll = 0; nilKeyboard.outRoll = 0; nilKeyboard.sameHand = 0; nilKeyboard.sameFinger = 0; nilKeyboard.rowChange = 0; nilKeyboard.homeJump = 0; nilKeyboard.toCenter = 0; nilKeyboard.toOutside = 0; qwerty[ 0] = 'q'; qwerty[ 1] = 'w'; qwerty[ 2] = 'e'; qwerty[ 3] = 'r'; qwerty[ 4] = 't'; qwerty[ 5] = 'y'; qwerty[ 6] = 'u'; qwerty[ 7] = 'i'; qwerty[ 8] = 'o'; qwerty[ 9] = 'p'; qwerty[10] = 'a'; qwerty[11] = 's'; qwerty[12] = 'd'; qwerty[13] = 'f'; qwerty[14] = 'g'; qwerty[15] = 'h'; qwerty[16] = 'j'; qwerty[17] = 'k'; qwerty[18] = 'l'; qwerty[19] = ';'; qwerty[20] = 'z'; qwerty[21] = 'x'; qwerty[22] = 'c'; qwerty[23] = 'v'; qwerty[24] = 'b'; qwerty[25] = 'n'; qwerty[26] = 'm'; qwerty[27] = ','; qwerty[28] = '.'; qwerty[29] = '\''; for (i = 0; i < 5; ++i) for (j = 0; j < 5; ++j) { rowChangeTableDown[i][j] = rowChangeDown; rowChangeTableUp[i][j] = rowChangeUp; if (i != THUMB && j != THUMB) { if (i == MIDDLE && j == INDEX) rowChangeTableDown[i][j] += handSmooth; else if (abs(i - j) == 1) rowChangeTableDown[i][j] += handWarp; if (i == INDEX && j == MIDDLE) rowChangeTableUp[i][j] += handSmooth; else if (abs(i - j) == 1) rowChangeTableUp[i][j] += handWarp; } } if (fullKeyboard == FK_NO) strcpy(keysToInclude, DEFAULT_KEYBOARD_30); else if (fullKeyboard == FK_STANDARD) strcpy(keysToInclude, DEFAULT_KEYBOARD_STANDARD); else if (fullKeyboard == FK_BS4822) strcpy(keysToInclude, DEFAULT_KEYBOARD_BS4822); else if (fullKeyboard == FK_KINESIS) strcpy(keysToInclude, DEFAULT_KEYBOARD_KINESIS); initKeyboardData(); initTypingData(); return 0; } // int initData();
int initData() { initValues(); int i, j; srand((unsigned int) time(NULL)); for (i = 0; i <= ksize; ++i) nilKeyboard.layout[i] = nilKeyboard.shiftedLayout[i] = '\0'; nilKeyboard.fitness = FITNESS_MAX; nilKeyboard.distance = 0; nilKeyboard.inRoll = 0; nilKeyboard.outRoll = 0; nilKeyboard.sameHand = 0; nilKeyboard.sameFinger = 0; nilKeyboard.rowChange = 0; nilKeyboard.homeJump = 0; nilKeyboard.toCenter = 0; nilKeyboard.toOutside = 0; strncpy(qwerty, "qwertyuiopasdfghjkl;zxcvbnm,./", 30); for (i = 0; i < 5; ++i) for (j = 0; j < 5; ++j) { rowChangeTableDown[i][j] = rowChangeDown; rowChangeTableUp[i][j] = rowChangeUp; if (i != THUMB && j != THUMB) { if (i == MIDDLE && j == INDEX) rowChangeTableDown[i][j] += handSmooth; else if (abs(i - j) == 1) rowChangeTableDown[i][j] += handWarp; if (i == INDEX && j == MIDDLE) rowChangeTableUp[i][j] += handSmooth; else if (abs(i - j) == 1) rowChangeTableUp[i][j] += handWarp; } } if (fullKeyboard == K_NO) strcpy(keysToInclude, DEFAULT_KEYBOARD_30); else if (fullKeyboard == K_STANDARD) strcpy(keysToInclude, DEFAULT_KEYBOARD_STANDARD); else if (fullKeyboard == K_KINESIS) strcpy(keysToInclude, DEFAULT_KEYBOARD_KINESIS); initKeyboardData(); initTypingData(); return 0; } // int initData();
int getCommands() { printf("Welcome to the Keyboard Layout Optimizer. If you have questions or comments, contact Michael Dickens by email ([email protected]) or leave a comment at http://mathematicalmulticore.wordpress.com/category/keyboards/.\n"); printf("Type \"help\" for a listing of commands.\n\n"); int length = 5000; char cmd[length]; do { printf(">>> "); fgets(cmd, length, stdin); cmd[strlen(cmd)-1] = '\0'; // Remove the newline. if (streq(cmd, "help")) { printf("algorithm: Run the keyboard optimization algorithm.\n"); printf("best swap <filename>: For the first layout in <filename>, print the single swap that would improve the layout the most.\n"); printf("compare <filename>: Print information about the keyboards in <filename>. The keyboards must be in the proper format.\n"); printf("damaging <filename>: Find the most damaging digraphs for the keyboard layouts in <filename>.\n"); printf("game: Play a keyboard layout game.\n"); printf("get <variable>: Get the value of the specified variable.\n"); printf("improve <filename>: Try to improve the first keyboard in <filename>. The keyboard must be in the proper format.\n"); printf("make typing data: Use the files in freq_types to customize character and digraph frequency.\n"); printf("set <variable> <value>: Set the specified variable to the given value.\n"); printf("setksize <fk_setting>: Set the keyboard type. Type \"setksize help\" for more information.\n"); printf("test fitness: Test that the fitness functions are working properly.\n"); printf("use <keys>: Use <keys> in the keyboard layout instead of the default.\n"); printf("worst <filename>: Find the worst digraphs for the keyboard layouts in <filename>.\n"); printf("variables: Print all variables that can be modified.\n"); printf("quit: Quit the keyboard optimization program.\n"); printf("\n"); } else if (streq(cmd, "algorithm")) { printf("Running the keyboard optimization algorithm. Press ctrl-C to abort.\n\n"); runCJAlgorithm(kbdFilename); } else if (streqn(cmd, "best swap ", strlen("best swap "))) { char *filename = cmd + strlen("best swap "); FILE *fp = fopen(filename, "r"); Keyboard k; if (layoutFromFile(fp, &k) != -1) { layoutFromFile(fp, &k); bestSwap(&k); } fclose(fp); } else if (streqn(cmd, "compare ", 8)) { compare(cmd + 8); } else if (streqn(cmd, "damaging ", 9)) { char *filename = cmd + 9; worstDigraphsFromFile(filename, TRUE); } else if (streq(cmd, "game")) { game(); } else if (streqn(cmd, "get ", 4)) { getValue(cmd + 4); } else if (streqn(cmd, "improve ", strlen("improve "))) { improveFromFile(cmd + 8); } else if (streq(cmd, "make typing data")) { makeTypingData(); } else if (streqn(cmd, "set ", strlen("set "))) { setValue(cmd + 4); } else if (streqn(cmd, "setksize ", strlen("setksize "))) { size_t str_len = strlen("setksize "); if (streq(cmd + str_len, "no")) { setksize(FK_NO); printf("Keyboard set to non-full. All user-defined values have been reset.\n\n"); } else if (streq(cmd + str_len, "standard")) { setksize(FK_STANDARD); printf("Keyboard set to full standard. All user-defined values have been reset.\n\n"); } else if (streq(cmd + str_len, "kinesis")) { setksize(FK_KINESIS); printf("Keyboard set to full Kinesis. All user-defined values have been reset.\n\n"); } else if (streq(cmd + str_len, "iphone")) { setksize(FK_IPHONE); printf("Keyboard set to iPhone. All user-defined values have been reset.\n\n"); } else if (streq(cmd+6, "bs4822")) { setksize(FK_BS4822); printf("Keyboard set to British Standard BS 4822. All user-defined values have been reset.\n\n"); } else { printf("Undefined input. Valid inputs: \"setksize no\" (do not use full keyboard), \"setksize standard\" (use standard full keyboard), \"setksize kinesis\" (use Kinesis full keyboard), \"setksize bs4822\" (use BS 4822 full keyboard).\n\n"); } } else if (streq(cmd, "test fitness")) { testFitness(); } else if (streqn(cmd, "use ", 4)) { strcpy(keysToInclude, cmd + 4); initTypingData(); printf("Now using keys: %s\n\n", cmd + 4); } else if (streq(cmd, "variables")) { printf("Boolean variables should be set to 0 for false and 1 for true. Variables not specified as booleans are integers.\n"); printf("\t(bool) detailedOutput : provide additional information while running the algorithm\n"); printf("\t(bool) keepZXCV : keep keys Z, X, C, and V in place\n"); printf("\t(bool) keepQWERTY : try to keep keys in their QWERTY positions\n"); printf("\t(bool) keepNumbers : keep numbers in place\n"); printf("\t(bool) keepBrackets : keep brackets symmetrical\n"); printf("\t(bool) keepShiftPairs : shifted/unshifted pairs of special characters stay together\n"); printf("\t(bool) keepTab : keep Tab in place\n"); printf("\t(bool) keepNumbersShifted: numbers do not move between shifted and unshifted\n"); printf("\nThese variables determine the costs for particular key combinations. Higher cost is worse.\n"); printf("\tdistance\n"); printf("\tinRoll\n"); printf("\toutRoll\n"); printf("\tsameHand\n"); printf("\tsameFingerP\n"); printf("\tsameFingerR\n"); printf("\tsameFingerM\n"); printf("\tsameFingerI\n"); printf("\trowChangeUp\n"); printf("\trowChangeDown\n"); printf("\thandWarp\n"); printf("\thandSmooth\n"); printf("\thomeJump\n"); printf("\thomeJumpIndex\n"); printf("\tdoubleJump\n"); printf("\ttoCenter\n"); printf("\ttoOutside\n"); } else if (streqn(cmd, "worst ", 6)) { char *filename = cmd + 6; worstDigraphsFromFile(filename, FALSE); } else if (streq(cmd, "quit")) { printf("Goodbye!\n"); break; } else { printf("Unknown command. Type \"help\" for a listing of commands.\n\n"); } } while (strcmp(cmd, "exit") != 0); return 0; }
int getCommands() { printf("Welcome to the Keyboard Layout Optimizer. If you have questions or comments, contact Michael Dickens by email ([email protected]) or leave a comment at http://mathematicalmulticore.wordpress.com/category/keyboards/.\n"); printf("Type \"help\" for a listing of commands.\n\n"); int length = 5000; char cmd[length]; do { printf(">>> "); fgets(cmd, length, stdin); cmd[strlen(cmd)-1] = '\0'; // Remove the newline. if (streq(cmd, "help")) { printf("algorithm: Run the keyboard optimization algorithm.\n"); printf("best swap <filename>: For the first layout in <filename>, print the single swap that would improve the layout the most.\n"); printf("compare <filename>: Print information about the keyboards in <filename>. The keyboards must be in the proper format.\n"); printf("damaging <filename>: Find the most damaging digraphs for the keyboard layouts in <filename>.\n"); printf("game: Play a keyboard layout game.\n"); printf("get <variable>: Get the value of the specified variable.\n"); printf("improve <filename>: Try to improve the first keyboard in <filename>. The keyboard must be in the proper format.\n"); printf("make typing data: Use the files in freq_types to customize character and digraph frequency.\n"); printf("run: See 'algorithm'.\n"); printf("set <variable> <value>: Set the specified variable to the given value.\n"); printf("setksize <K_setting>: Set the keyboard type. Type \"setksize help\" for more information.\n"); printf("test fitness: Test that the fitness functions are working properly.\n"); printf("use <keys>: Use <keys> in the keyboard layout instead of the default.\n"); printf("worst <filename>: Find the worst digraphs for the keyboard layouts in <filename>.\n"); printf("variables: Print all variables that can be modified.\n"); printf("quit: Quit the keyboard optimization program.\n"); printf("\n"); } else if (streq(cmd, "algorithm") || streq(cmd, "run")) { printf("Running the keyboard optimization algorithm. Press ctrl-C to quit.\n\n"); runAlgorithm(); } else if (streqn(cmd, "best swap ", strlen("best swap "))) { const char *const filename = cmd + strlen("best swap "); FILE *file = fopen(filename, "r"); CHECK_FILE_FOR_NULL(file, filename); Keyboard k; if (layoutFromFile(file, &k) != -1) { bestSwap(&k); } fclose(file); } else if (streqn(cmd, "compare ", 8)) { compare(cmd + 8); } else if (streqn(cmd, "damaging ", 9)) { const char *const filename = cmd + 9; worstDigraphsFromFile(filename, TRUE); } else if (streq(cmd, "game")) { game(); } else if (streqn(cmd, "get ", 4)) { getValue(cmd + 4); } else if (streqn(cmd, "improve ", strlen("improve "))) { improveFromFile(cmd + 8); } else if (streq(cmd, "make typing data")) { makeTypingData(); } else if (streqn(cmd, "set ", strlen("set "))) { setValue(cmd + 4); } else if (streqn(cmd, "setksize ", strlen("setksize "))) { size_t str_len = strlen("setksize "); if (streq(cmd + str_len, "no")) { setksize(K_NO); printf("Keyboard set to non-full. All user-defined values have been reset.\n\n"); } else if (streq(cmd + str_len, "standard")) { setksize(K_STANDARD); printf("Keyboard set to full standard. All user-defined values have been reset.\n\n"); } else if (streq(cmd + str_len, "kinesis")) { setksize(K_KINESIS); printf("Keyboard set to full Kinesis. All user-defined values have been reset.\n\n"); } else if (streq(cmd + str_len, "iphone")) { setksize(K_IPHONE); printf("Keyboard set to iPhone. All user-defined values have been reset.\n\n"); } else { printf("Undefined input. Valid inputs: \"setksize no\" (do not use full keyboard), \"setksize standard\" (use standard full keyboard), \"setksize kinesis\" (use Kinesis full keyboard).\n\n"); } } else if (streq(cmd, "test fitness")) { testFitness(); } else if (streqn(cmd, "use ", 4)) { strcpy(keysToInclude, cmd + 4); initTypingData(); printf("Now using keys: %s\n\n", cmd + 4); } else if (streq(cmd, "variables")) { printf("Boolean variables should be set to 0 for false and 1 for true. Variables not specified as booleans are integers.\n"); int i; for (i = 0; i < variablesLength; ++i) { printf("\t%s", variables[i].name); if (variables[i].description) printf(": %s", variables[i].description); printf("\n"); } printf("\n"); } else if (streqn(cmd, "worst ", 6)) { const char *const filename = cmd + 6; worstDigraphsFromFile(filename, FALSE); } else if (streq(cmd, "quit")) { printf("Goodbye!\n"); break; } else { printf("Unknown command. Type \"help\" for a listing of commands.\n\n"); } } while (strcmp(cmd, "exit") != 0); return 0; }