diff --git a/Maybe/Maybe.ino b/Maybe/Maybe.ino index 0a64554..8005214 100644 --- a/Maybe/Maybe.ino +++ b/Maybe/Maybe.ino @@ -30,7 +30,7 @@ MemSlot memory[] = //128 bytes for the Teensy LC {"bt10", 11, 0}, {"bt11", 12, 0}, {"bt12", 13, 0}, - {"effc", 14, 1}, + {"effc", 14, 2}, {"afps", 15, 24}, {"clea", 0, 0}, // != 0 -> reset eeprom }; @@ -141,7 +141,7 @@ int animationFrame = 0; bool animationPlaying = false; unsigned int animationLastFrameMillis = 0; unsigned int animationFrameDelayMillis = 64; -bool animationLooping = false; +bool animationIdle = false; bool animationEnabled = true; /* @@ -225,25 +225,30 @@ void initSevSegDisplay() void loop() { //animation draw tick + if (animationIdle && !animationPlaying && animationEnabled && !isInMenu) + { + playAnimation(4); + } if (animationEnabled && animationPlaying && (millis() > (animationLastFrameMillis + animationFrameDelayMillis))) { - drawAnimation(animationLooping); + drawAnimation(); animationLastFrameMillis = millis(); } + //INPUTS if (millis() > lastInputMillis + inputCoolDown) { - char customKey = keypad.getKey(); + char customKey = keypad.getKey(); //-1 because our array stars with 1 instead of 0 - if (customKey) + if (customKey > 0) { - sendInputOuput(customKey); + sendInputOuput(customKey-1); } if (rotaryEncoder.push() == 1) // = pressed { - sendInputOuput(15); + sendInputOuput(14); } rotaryEncoderState = rotaryEncoder.rotate(); @@ -252,12 +257,12 @@ void loop() { if ( rotaryEncoderState == 1 ) //Turned Clockwise { - sendInputOuput(14); + sendInputOuput(13); } if ( rotaryEncoderState == 2 ) //Turned Counter-Clockwise { - sendInputOuput(13); + sendInputOuput(12); } } } @@ -430,6 +435,7 @@ void applyMemoryChange() { animationEnabled = (getMemorySlot("effc")->value > 0); animationFrameDelayMillis = 1000 / max(1, getMemorySlot("afps")->value); + animationIdle = (getMemorySlot("effc")->value == 2); } int menuGetSelectionIndexFromPath(String path) @@ -467,15 +473,14 @@ MemSlot* getMemorySlot(String memSlotName) void sendInputOuput(int input) { - int numberOfModes = sizeof(modes)/(sizeof(Action)*15); - - int currentMode = (getMemorySlot("alt")->value) % numberOfModes; + //get current presetID + int currentPreset = (getMemorySlot("alt")->value) % getPresetsCount(); //Hardware inputs ordered from the bottom left = 1 to the top right = 12 on the switch matrix, - Action actionToRun = modes[currentMode][input-1]; //getting the virtual inputs from the modes array. + Action actionToRun = getAction(currentPreset, input); //getting the virtual inputs from the modes array. //Inputs uids starts with 1, so input - 1 to get the index 0 of the array String inputName = "bt"; - inputName += input; + inputName += input +1; MemSlot* buttonInputMem = getMemorySlot(inputName); Serial.println(inputName); @@ -486,16 +491,18 @@ void sendInputOuput(int input) else { playAnimation(1); - + + //toggle mode if (buttonInputMem != NULL) { if (buttonInputMem->value == 1) { - buttonsVirtualState[input-1] = !buttonsVirtualState[input-1]; + buttonsVirtualState[input] = !buttonsVirtualState[input]; + actionToRun = getAction(currentPreset + (int)!buttonsVirtualState[input], input); //Toggle mode sends the next preset's input if the troggle state is true } if (buttonInputMem->value == 0) { - buttonsVirtualState[input-1] = false; + buttonsVirtualState[input] = false; } } @@ -517,15 +524,15 @@ void sendInputOuput(int input) printMenu(); } } - else if (isInMenu && input == 13) //menu prev, hardcoded input + else if (isInMenu && input == 12) //menu prev, hardcoded input :/ { menuPrev(); } - else if (isInMenu && input == 14) //menu next, hardcoded input + else if (isInMenu && input == 13) //menu next, hardcoded input :/ { menuNext(); } - else if (isInMenu && input == 15) //menu enter, hardcoded input + else if (isInMenu && input == 14) //menu enter, hardcoded input :/ { menuEnter(); } @@ -535,11 +542,12 @@ void sendInputOuput(int input) void clickKey(int key, int modifier) { + Serial.println(key); Keyboard.set_modifier(modifier); Keyboard.press(key); Keyboard.release(key); Keyboard.set_modifier(0); - //Keyboard.send_now(); //can't remember what's that's for + Keyboard.send_now(); //i think that helps to avoid key to stay active } void playAnimation(int animID) @@ -552,7 +560,7 @@ void playAnimation(int animID) } } -void drawAnimation(bool looping) +void drawAnimation() { int currentAnimationFrameTotal = animData[currentAnimationID].animationFrameCount; sevseg.setSegments(animData[currentAnimationID].animationPtr + (animationFrame * (sizeof(const uint8_t)*4))); @@ -560,7 +568,7 @@ void drawAnimation(bool looping) if (animationFrame == currentAnimationFrameTotal) { animationFrame = 0; - if (!looping) + if (!(animData[currentAnimationID].animationLooping)) { animationPlaying = false; sevseg.blank(); diff --git a/Maybe/animations.h b/Maybe/animations.h index 99b9284..238930c 100644 --- a/Maybe/animations.h +++ b/Maybe/animations.h @@ -3,13 +3,14 @@ int currentAnimationID = 0; struct AnimationData { const uint8_t *animationPtr; - unsigned int animationFrameCount; + const unsigned int animationFrameCount; + const bool animationLooping; }; //animations created using https://jasonacox.github.io/TM1637TinyDisplay/examples/7-segment-animator.html /* Animation Data - HGFEDCBA Map */ -const uint8_t ANIMATION1[31][4] = { +const uint8_t ANIMATION1[][4] = { { 0x00, 0x00, 0x00, 0x01 }, // Frame 0 { 0x00, 0x00, 0x01, 0x00 }, // Frame 1 { 0x00, 0x01, 0x00, 0x00 }, // Frame 2 @@ -39,8 +40,6 @@ const uint8_t ANIMATION1[31][4] = { { 0x08, 0x08, 0x08, 0x0e }, // Frame 26 { 0x39, 0x09, 0x09, 0x0f }, // Frame 27 { 0x46, 0x76, 0x76, 0x70 }, // Frame 28 - { 0x40, 0x40, 0x40, 0x40 }, // Frame 29 - { 0x00, 0x40, 0x40, 0x00 } // Frame 30 }; /* Animation Data - HGFEDCBA Map */ @@ -78,12 +77,32 @@ const uint8_t ANIMATION4[][4] = { { 0x40, 0x40, 0x40, 0x40 }, // Frame 3 { 0x00, 0x40, 0x40, 0x00 }, // Frame 4 { 0x00, 0x00, 0x00, 0x00 }, // Frame 5 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 5 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 5 +}; + +/* Animation Data - HGFEDCBA Map */ +const uint8_t ANIMATION5[13][4] = { + { 0x39, 0x09, 0x09, 0x0f }, // Frame 0 + { 0x39, 0x08, 0x09, 0x0f }, // Frame 1 + { 0x38, 0x09, 0x09, 0x0f }, // Frame 2 + { 0x19, 0x09, 0x09, 0x0f }, // Frame 3 + { 0x29, 0x09, 0x09, 0x0f }, // Frame 4 + { 0x31, 0x09, 0x09, 0x0f }, // Frame 5 + { 0x39, 0x01, 0x09, 0x0f }, // Frame 6 + { 0x39, 0x09, 0x01, 0x0f }, // Frame 7 + { 0x39, 0x09, 0x09, 0x07 }, // Frame 8 + { 0x39, 0x09, 0x09, 0x0b }, // Frame 9 + { 0x39, 0x09, 0x09, 0x0d }, // Frame 10 + { 0x39, 0x09, 0x09, 0x0e }, // Frame 11 + { 0x39, 0x09, 0x08, 0x0f } // Frame 12 }; AnimationData animData[] = { - {(const uint8_t*)ANIMATION1, sizeof(ANIMATION1) / (sizeof(const uint8_t)*4)}, - {(const uint8_t*)ANIMATION2, sizeof(ANIMATION2) / (sizeof(const uint8_t)*4)}, - {(const uint8_t*)ANIMATION3, sizeof(ANIMATION3) / (sizeof(const uint8_t)*4)}, - {(const uint8_t*)ANIMATION4, sizeof(ANIMATION4) / (sizeof(const uint8_t)*4)} + {(const uint8_t*)ANIMATION1, sizeof(ANIMATION1) / (sizeof(const uint8_t)*4), false}, + {(const uint8_t*)ANIMATION2, sizeof(ANIMATION2) / (sizeof(const uint8_t)*4), false}, + {(const uint8_t*)ANIMATION3, sizeof(ANIMATION3) / (sizeof(const uint8_t)*4), false}, + {(const uint8_t*)ANIMATION4, sizeof(ANIMATION4) / (sizeof(const uint8_t)*4), false}, + {(const uint8_t*)ANIMATION5, sizeof(ANIMATION5) / (sizeof(const uint8_t)*4), true} }; diff --git a/Maybe/modeAction.h b/Maybe/modeAction.h index 1ae1a56..82352f9 100644 --- a/Maybe/modeAction.h +++ b/Maybe/modeAction.h @@ -5,7 +5,7 @@ struct Action }; //Hardware buttons and Actions are ordered from the bottom left to the top right matrix. Rotary encoder: left, right then press -Action modes[][15] = +Action presets[][15] = { { {KEY_MEDIA_PREV_TRACK, 0}, @@ -37,9 +37,9 @@ Action modes[][15] = {KEY_F22, MODIFIERKEY_SHIFT}, {KEY_F23, MODIFIERKEY_SHIFT}, {-1, 0}, //menu / back - {KEYPAD_MINUS, 0}, - {KEYPAD_PLUS, 0}, - {KEYPAD_ENTER, 0} + {KEYPAD_MINUS, MODIFIERKEY_ALT}, + {KEYPAD_PLUS, MODIFIERKEY_ALT}, + {KEYPAD_ASTERIX, MODIFIERKEY_ALT} }, { {KEY_F13, MODIFIERKEY_CTRL}, @@ -56,6 +56,17 @@ Action modes[][15] = {-1, 0}, //menu / back {KEYPAD_MINUS, MODIFIERKEY_CTRL}, {KEYPAD_PLUS, MODIFIERKEY_CTRL}, - {KEYPAD_ENTER, MODIFIERKEY_CTRL} + {KEYPAD_ASTERIX, MODIFIERKEY_CTRL} } }; + +int getPresetsCount() +{ + return sizeof(presets)/(sizeof(Action)*15); +} + +Action getAction(int presetID, int physicalKeyID) +{ + int presetCount = getPresetsCount(); + return presets[(presetID % presetCount)][physicalKeyID]; +}