This repository has been archived on 2025-01-28. You can view files and clone it, but cannot push or open issues or pull requests.
TheOneTrueTrench 8f5ac39fb9 separated all my changes into separate files, working on generalizing my relativity macros. (#4368)
* Updating to my local changes.

* Added auto-complete for joins.

* Added lights to imply current state better
2018-11-06 12:01:18 -08:00

511 lines
9.4 KiB
C

#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;
}