|
21 | 21 | ; |
22 | 22 | #endif |
23 | 23 | #endif |
| 24 | + |
| 25 | +static std::vector<uint8_t> reportvector; |
| 26 | + |
| 27 | +/**************************************************************************************************************************/ |
| 28 | +trigger_keycodes_t sendKeys(trigger_keycodes_t activeKeycodes) |
| 29 | +{ |
| 30 | + // Serial.println("S"); |
| 31 | + static bool has_key = false; // must be static to remember previous state |
| 32 | + if ( activeKeycodes.empty() ) |
| 33 | + { |
| 34 | + // send empty key report if previously has key pressed |
| 35 | + if (has_key) |
| 36 | + { |
| 37 | + bluemicro_hid.keyboardRelease(); |
| 38 | + has_key = false; |
| 39 | + } |
| 40 | + } |
| 41 | + else |
| 42 | + { |
| 43 | + has_key = true; |
| 44 | + uint8_t currentMod = 0; |
| 45 | + for (auto keycode : activeKeycodes) |
| 46 | + { |
| 47 | + auto hidKeycode = static_cast<uint8_t>(keycode & 0x00FF); |
| 48 | + auto extraModifiers = static_cast<uint8_t>((keycode & 0xFF00) >> 8); |
| 49 | + |
| 50 | + if (hidKeycode >= KC_A && hidKeycode <= KC_EXSEL) |
| 51 | + { |
| 52 | + // add hidKeycode to report vector |
| 53 | + reportvector.push_back(hidKeycode); |
| 54 | + } |
| 55 | + //check if the hid keycode contains a modifier. // also check for macros. |
| 56 | + switch (hidKeycode) { |
| 57 | + case KC_LCTRL: currentMod |= 1; currentMod |= extraModifiers; break; |
| 58 | + case KC_LSHIFT: currentMod |= 2; currentMod |= extraModifiers; break; |
| 59 | + case KC_LALT: currentMod |= 4; currentMod |= extraModifiers; break; |
| 60 | + case KC_LGUI: currentMod |= 8; currentMod |= extraModifiers; break; |
| 61 | + case KC_RCTRL: currentMod |= 16; currentMod |= extraModifiers; break; |
| 62 | + case KC_RSHIFT: currentMod |= 32; currentMod |= extraModifiers; break; |
| 63 | + case KC_RALT: currentMod |= 64; currentMod |= extraModifiers; break; |
| 64 | + case KC_RGUI: currentMod |= 128; currentMod |= extraModifiers; break; |
| 65 | + } |
| 66 | + //add all of the extra modifiers into the curren modifier |
| 67 | + currentMod |= extraModifiers; |
| 68 | + } |
| 69 | + |
| 70 | + uint8_t keycode[6] = { 0 }; |
| 71 | + uint8_t keycodeposition = 0; |
| 72 | + for (auto thiskeycode : reportvector) |
| 73 | + { |
| 74 | + if (keycodeposition<6) |
| 75 | + { |
| 76 | + keycode[keycodeposition] = thiskeycode; |
| 77 | + } |
| 78 | + keycodeposition++; |
| 79 | + } |
| 80 | + bluemicro_hid.keyboardReport(currentMod, keycode); |
| 81 | + activeKeycodes.clear(); |
| 82 | + reportvector.clear(); |
| 83 | + } |
| 84 | + return activeKeycodes; |
| 85 | +} |
0 commit comments