diff options
Diffstat (limited to 'keyboards/dz60/keymaps/marianas/relativity.c')
-rw-r--r-- | keyboards/dz60/keymaps/marianas/relativity.c | 510 |
1 files changed, 510 insertions, 0 deletions
diff --git a/keyboards/dz60/keymaps/marianas/relativity.c b/keyboards/dz60/keymaps/marianas/relativity.c new file mode 100644 index 0000000000..96a5eb4e6f --- /dev/null +++ b/keyboards/dz60/keymaps/marianas/relativity.c @@ -0,0 +1,510 @@ +#include "relativity.h" +#include "keymap.h" +#include "keyDefinitions.h" + + +uint16_t *macroTaps = 0; + +char *tableNameList = 0; + +uint8_t *charCount = 0; +uint8_t countPointer = 0; + +bool relativityActive = false; + + +bool sendAbbr = false; + + +static int16_t relativityTimer = 0; + + +bool tempOff = false; + + + + +void initStringData() +{ + if (macroTaps == 0) + { + macroTaps = malloc(macroTapsLen*sizeof(uint16_t)); + for(int i = 0; i < macroTapsLen; i++) + { + macroTaps[i] = 0; + } + } + if (tableNameList == 0) + { + tableNameList = malloc(tableNameListLen*sizeof(char)); + for(int i = 0; i < tableNameListLen; i++) + { + tableNameList[i] = 0; + } + } + if (charCount == 0) + { + charCount = malloc(charCountLen*sizeof(uint8_t)); + for (int i = 0; i < charCountLen; i++) + { + charCount[i] = 0; + } + } +} + +void activateRelativity(void) +{ + initStringData(); + rgblight_mode(RGBLIGHT_MODE_KNIGHT); + relativityTimer = timer_read(); + relativityActive = true; +} + +bool deactivateRelativity(void) +{ + rgblight_mode(9); + eraseKeyCodes(); + eraseTableAbbreviation(); + eraseCharCounts(); + relativityActive = false; + tempOff = false; + return false; +} + +bool containsCode(uint16_t kc) +{ + for (int i = 0; i < macroTapsLen && macroTaps[i] > 0; i++) + { + if (macroTaps[i] == kc) return true; + } + return false; +} + +bool lastCodeIs(uint16_t kc) +{ + for (int i = 0; i < macroTapsLen-1 && macroTaps[i] > 0; i++) + { + if (macroTaps[i] == kc && macroTaps[i+1] == 0) return true; + } + return false; +} + +bool last2CodeAre(uint16_t kc) +{ + for (int i = 0; i < macroTapsLen-2 && macroTaps[i] > 0; i++) + { + if (macroTaps[i] == kc && macroTaps[i+1] == kc && macroTaps[i+2] == 0) return true; + } + return false; +} + +bool last2CodesAre(uint16_t kc, uint16_t kc2) +{ + for (int i = 0; i < macroTapsLen-2 && macroTaps[i] > 0; i++) + { + if (macroTaps[i] == kc && macroTaps[i+1] == kc2 && macroTaps[i+2] == 0) return true; + } + return false; +} + +void addKeyCode(uint16_t kc) +{ + int i = 0; + while (i < macroTapsLen-2 && macroTaps[i] > 0) i++; + if (macroTaps[i] == 0) + { + macroTaps[i] = kc; + macroTaps[i+1] = 0; + } +} + +void eraseKeyCodes(void) +{ + int i = 0; + while (i < macroTapsLen && macroTaps[i] > 0) macroTaps[i++] = 0; +} + +void eraseCharCounts(void) +{ + while (countPointer > 0) + { + charCount[countPointer] = 0; + countPointer--; + } + charCount[countPointer] = 0; +} + +void printTableAbbreviationLimited(void) +{ + if (tableNameList[0] == 0) + { + return; + } + int i = 0; + for (i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) + { + if (tableNameList[i] >= 65 && tableNameList[i] <= 90) + { + send_char(tableNameList[i]+32); + } + else + { + send_char(tableNameList[i]); + } + } +} + +void printTableAbbreviation(void) +{ + if (tableNameList[0] == 0) + { + return; + } + send_char(0x20); + int i = 0; + for (i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) + { + if (tableNameList[i] >= 65 && tableNameList[i] <= 90) + { + send_char(tableNameList[i]+32); + } + else + { + send_char(tableNameList[i]); + } + } + send_char(0x20); +} + +void eraseTableAbbreviation(void) +{ + for (int i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) + { + tableNameList[i] = '\0'; + } +} + +void printString(char* str) +{ + + if (str[0] != '\0') + { + int i = 0; + while (true) + { + if (str[i] == 0) + { + break; + } + send_char(str[i++]); + charCount[countPointer]++; + } + } +} + +void printStringAndQueueChar(char* str) +{ + if (charCount[countPointer] > 0 && countPointer < charCountLen) + { + countPointer++; + } + sendAbbr = true; + if (str[0] != '\0') + { + printString(str); + + for (int i = 0; i < tableNameListLen-1; i++) + { + if (tableNameList[i] == '\0') + { + tableNameList[i] = str[0]; + tableNameList[i+1] = '\0'; + break; + } + else if (i == tableNameListLen-2) + { + printTableAbbreviation(); + break; + } + } + //for (i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) + //{ + // send_char(tableNameList[i]); + //} + //send_string_P("Darden"); + //send_string_P(&myarray); + //send_string_P(str); + } +} + +void ReplaceString(char *orig, char *repl) +{ + int i = 0; + while((orig[i] != 0x0 && repl[i] != 0x0) && orig[i] == repl[i]) + i++; + + if(orig[i] != 0x0) + { + int o = i; + while (orig[o++] != 0x0) { + charCount[countPointer]--; + register_code(KC_BSPC); + unregister_code(KC_BSPC); + } + } + printString(repl+i); +} + +void deletePrev(void) +{ + if (countPointer == 0 && charCount[countPointer] == 0) + return; + for (int i = 0; i < charCount[countPointer]; i++) + { + register_code(KC_BSPC); + unregister_code(KC_BSPC); + } + charCount[countPointer] = 0; + int i = 1; + for (;i < tableNameListLen-1; i++) + { + if (tableNameList[i] == 0x0) + { + break; + } + } + tableNameList[i-1] = 0x0; + if (countPointer > 0) + { + countPointer--; + } +} + +bool processSmartMacroTap(uint16_t kc) +{ + if (relativityTimer > 0 && TIMER_DIFF_16(timer_read(), relativityTimer) >= relTimeout) + { + deactivateRelativity(); + return true; + } + relativityTimer = 0; + switch(kc) + { + case KC_C: + if (containsCode(KC_D)) + { + printString("ribution"); + printStringAndQueueChar("Center"); + } + else if (last2CodeAre(KC_C)) + { + ReplaceString("Corporation", "Contact"); + } + else if(lastCodeIs(KC_C)) + { + printString("oration"); + } + else + { + printStringAndQueueChar("Corp"); + } + break; + case KC_D: + if (last2CodeAre(KC_D)) + { + ReplaceString("Distribution", "Distributor"); + } + else if(lastCodeIs(KC_D)) + { + printString("ribution"); + } + else + { + printStringAndQueueChar("Dist"); + } + break; + case KC_G: + printStringAndQueueChar("Global"); + printStringAndQueueChar("Lookup"); + break; + case KC_I: + if (containsCode(KC_W)) + printStringAndQueueChar("Instance"); + else + printStringAndQueueChar("Item"); + break; + case KC_N: + printStringAndQueueChar("NadRate"); + break; + case KC_P: + if (last2CodesAre(KC_D, KC_C)) + { + ReplaceString("DistributionCenter", "DistCenter"); + printStringAndQueueChar("Pricing"); + } + else if (last2CodeAre(KC_P)) + { + } + else if(lastCodeIs(KC_P)) + { + ReplaceString("Product", "Person"); + } + else + { + printStringAndQueueChar("Product"); + } + break; + case KC_Q: + printStringAndQueueChar("Darden"); + break; + case KC_S: + if (containsCode(KC_W)) + if (containsCode(KC_S) || containsCode(KC_D)) + printStringAndQueueChar("Step"); + else + printStringAndQueueChar("Session"); + else + printStringAndQueueChar("Supplier"); + break; + case KC_T: + if (containsCode(KC_W)) + printStringAndQueueChar("Task"); + else + printStringAndQueueChar("Type"); + break; + case KC_W: + printStringAndQueueChar("Workflow"); + break; + } + addKeyCode(kc); + return false; +} + + +bool shifted = false; +bool isShifted() +{ + return shifted; +} + +void setShifted(bool val) +{ + shifted = val; +} + + +bool storeShiftState(uint16_t keycode, keyrecord_t *record) +{ + + if (record->event.pressed) + { + switch (keycode) + { + case KC_LSPO: + case KC_RSPC: + shifted = true; + } + } + else + { + switch (keycode) + { + + case KC_LSPO: + case KC_RSPC: + shifted = false; + return true; + } + } + return true; +} + +bool handleSmartMacros(uint16_t keycode, keyrecord_t *record) +{ + if (relativityActive != true) return true; + if (record->event.pressed) + { + switch (keycode) + { + case KC_BSPC: + if (!isShifted()){ + deletePrev(); + } + else { + register_code(KC_BSPC); + unregister_code(KC_BSPC); + } + return false; + case KC_A: + case KC_B: + case KC_C: + case KC_D: + case KC_E: + case KC_F: + case KC_G: + case KC_H: + case KC_I: + case KC_J: + case KC_K: + case KC_L: + case KC_M: + case KC_N: + case KC_O: + case KC_P: + case KC_Q: + case KC_R: + case KC_S: + case KC_T: + case KC_U: + case KC_V: + case KC_W: + case KC_X: + case KC_Y: + case KC_Z: + return processSmartMacroTap(keycode); + + case PRRD: + if (tempOff) + { + SEND_STRING("Id = "); + printTableAbbreviationLimited(); + SEND_STRING(".Id"); + return deactivateRelativity(); + } + else + { + printTableAbbreviation(); + SEND_STRING("ON "); + printTableAbbreviationLimited(); + eraseKeyCodes(); + eraseTableAbbreviation(); + eraseCharCounts(); + tempOff = true; + return true; + } + + + case KC_SPC: + printTableAbbreviation(); + return deactivateRelativity(); + case ENTER_OR_SQL: + if (tempOff) + { + SEND_STRING("Id = "); + printTableAbbreviationLimited(); + SEND_STRING(".Id"); + deactivateRelativity(); + return true; + } + else + { + printTableAbbreviation(); + deactivateRelativity(); + return true; + } + case KC_ESC: + return deactivateRelativity(); + } + } + return true; +} |