Beispiel #1
0
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;
}
Beispiel #2
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;
}
Beispiel #3
0
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;
}