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
This commit is contained in:
committed by
Drashna Jaelre
parent
f8d8005835
commit
8f5ac39fb9
510
keyboards/dz60/keymaps/marianas/relativity.c
Normal file
510
keyboards/dz60/keymaps/marianas/relativity.c
Normal file
@@ -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;
|
||||
}
|
Reference in New Issue
Block a user