size_t NKROKeyboardAPI::set(KeyboardKeycode k, bool s) { // Press keymap key if (k < NKRO_KEY_COUNT){ uint8_t bit = 1 << (uint8_t(k) % 8); if(s){ _keyReport.keys[k / 8] |= bit; } else{ _keyReport.keys[k / 8] &= ~bit; } return 1; } // It's a modifier key else if(k >= KEY_LEFT_CTRL && k <= KEY_RIGHT_GUI) { // Convert key into bitfield (0 - 7) k = KeyboardKeycode(uint8_t(k) - uint8_t(KEY_LEFT_CTRL)); if(s){ _keyReport.modifiers = (1 << k); } else{ _keyReport.modifiers &= ~(1 << k); } return 1; } // Its a custom key (outside our keymap) else{ // Add k to the key report only if it's not already present // and if there is an empty slot. Remove the first available key. auto key = _keyReport.key; // Is key already in the list or did we found an empty slot? if (s && (key == uint8_t(k) || key == KEY_RESERVED)) { _keyReport.key = k; return 1; } // Test the key report to see if k is present. Clear it if it exists. if (!s && (key == k)) { _keyReport.key = KEY_RESERVED; return 1; } } // No empty/pressed key was found return 0; }
size_t KeyboardAPI::set(uint8_t k, bool s){ // Ignore invalid input if(k >= sizeof(_asciimap)){ setWriteError(); return 0; } // Read key from ascii lookup table uint16_t key = pgm_read_word(_asciimap + k); auto ret = set(KeyboardKeycode((uint8_t)(key & 0xFF)), s); // Only add modifier if keycode was successfully added before. // Always try to release modifier (if used). if(ret || !s){ if (key & MOD_LEFT_CTRL) { ret |= set(KEY_LEFT_CTRL, s); } if (key & MOD_LEFT_SHIFT) { ret |= set(KEY_LEFT_SHIFT, s); } if (key & MOD_LEFT_ALT) { ret |= set(KEY_LEFT_ALT, s); } if (key & MOD_LEFT_GUI) { ret |= set(KEY_LEFT_GUI, s); } if (key & MOD_RIGHT_CTRL) { ret |= set(KEY_RIGHT_CTRL, s); } if (key & MOD_RIGHT_SHIFT) { ret |= set(KEY_RIGHT_SHIFT, s); } if (key & MOD_RIGHT_ALT) { ret |= set(KEY_RIGHT_ALT, s); } if (key & MOD_RIGHT_GUI) { ret |= set(KEY_RIGHT_GUI, s); } } return ret; }
size_t DefaultKeyboardAPI::set(KeyboardKeycode k, bool s) { // It's a modifier key if(k >= KEY_LEFT_CTRL && k <= KEY_RIGHT_GUI) { // Convert key into bitfield (0 - 7) k = KeyboardKeycode(uint8_t(k) - uint8_t(KEY_LEFT_CTRL)); if(s){ _keyReport.modifiers |= (1 << k); } else{ _keyReport.modifiers &= ~(1 << k); } return 1; } // Its a normal key else{ // Add k to the key report only if it's not already present // and if there is an empty slot. Remove the first available key. for (uint8_t i = 0; i < sizeof(_keyReport.keycodes); i++) { auto key = _keyReport.keycodes[i]; // Is key already in the list or did we found an empty slot? if (s && (key == uint8_t(k) || key == KEY_RESERVED)) { _keyReport.keycodes[i] = k; return 1; } // Test the key report to see if k is present. Clear it if it exists. if (!s && (key == k)) { _keyReport.keycodes[i] = KEY_RESERVED; return 1; } } } // No empty/pressed key was found return 0; }