void usb_keyboard_press_keycode(uint16_t n) { uint8_t key, mod, msb, modrestore=0; KEYCODE_TYPE keycode; #ifdef DEADKEYS_MASK KEYCODE_TYPE deadkeycode; #endif msb = n >> 8; if (msb >= 0xC2 && msb <= 0xDF) { n = (n & 0x3F) | ((uint16_t)(msb & 0x1F) << 6); } else if (msb == 0x80) { usb_keyboard_press_key(0, n); return; } else if (msb == 0x40) { usb_keyboard_press_key(n, 0); return; } keycode = unicode_to_keycode(n); if (!keycode) return; #ifdef DEADKEYS_MASK deadkeycode = deadkey_to_keycode(keycode); if (deadkeycode) { modrestore = keyboard_modifier_keys; if (modrestore) { keyboard_modifier_keys = 0; usb_keyboard_send(); } // TODO: test if operating systems recognize // deadkey sequences when other keys are held mod = keycode_to_modifier(deadkeycode); key = keycode_to_key(deadkeycode); usb_keyboard_press_key(key, mod); usb_keyboard_release_key(key, mod); } #endif mod = keycode_to_modifier(keycode); key = keycode_to_key(keycode); usb_keyboard_press_key(key, mod | modrestore); }
// Step #4: do each keystroke // void usb_keyboard_class::write_key(KEYCODE_TYPE keycode) { keyboard_report_data[0] = keycode_to_modifier(keycode); keyboard_report_data[1] = 0; keyboard_report_data[2] = keycode_to_key(keycode); keyboard_report_data[3] = 0; keyboard_report_data[4] = 0; keyboard_report_data[5] = 0; keyboard_report_data[6] = 0; keyboard_report_data[7] = 0; send_now(); keyboard_report_data[0] = 0; keyboard_report_data[2] = 0; send_now(); }
void usb_keyboard_class::release(uint16_t n) { uint8_t key, mod, msb; msb = n >> 8; if (msb >= 0xC2 && msb <= 0xDF) { n = (n & 0x3F) | ((uint16_t)(msb & 0x1F) << 6); } else if (msb == 0x80) { releasekey(0, n); return; } else if (msb == 0x40) { releasekey(n, 0); return; } KEYCODE_TYPE keycode = unicode_to_keycode(n); if (!keycode) return; mod = keycode_to_modifier(keycode); key = keycode_to_key(keycode); releasekey(key, mod); }
// Step #4: do each keystroke // static void write_key(KEYCODE_TYPE keycode) { /* uint8_t key, modifier=0; #ifdef SHIFT_MASK if (keycode & SHIFT_MASK) modifier |= MODIFIERKEY_SHIFT; #endif #ifdef ALTGR_MASK if (keycode & ALTGR_MASK) modifier |= MODIFIERKEY_RIGHT_ALT; #endif #ifdef RCTRL_MASK if (keycode & RCTRL_MASK) modifier |= MODIFIERKEY_RIGHT_CTRL; #endif key = keycode & 0x3F; #ifdef KEY_NON_US_100 if (key == KEY_NON_US_100) key = 100; #endif usb_keyboard_press(key, modifier); */ usb_keyboard_press(keycode_to_key(keycode), keycode_to_modifier(keycode)); }