Exemple #1
0
void EmuScreen::processAxis(const AxisInput &axis, int direction) {
	std::vector<int> results;
	KeyMap::AxisToPspButton(axis.deviceId, axis.axisId, direction, &results);
	std::vector<int> resultsOpposite;
	KeyMap::AxisToPspButton(axis.deviceId, axis.axisId, -direction, &resultsOpposite);

	for (size_t i = 0; i < results.size(); i++) {
		int result = results[i];
		switch (result) {
		case VIRTKEY_AXIS_X_MIN:
			__CtrlSetAnalogX(-fabs(axis.value), CTRL_STICK_LEFT);
			break;
		case VIRTKEY_AXIS_X_MAX:
			__CtrlSetAnalogX(fabs(axis.value), CTRL_STICK_LEFT);
			break;
		case VIRTKEY_AXIS_Y_MIN:
			__CtrlSetAnalogY(-fabs(axis.value), CTRL_STICK_LEFT);
			break;
		case VIRTKEY_AXIS_Y_MAX:
			__CtrlSetAnalogY(fabs(axis.value), CTRL_STICK_LEFT);
			break;

		case VIRTKEY_AXIS_RIGHT_X_MIN:
			__CtrlSetAnalogX(-fabs(axis.value), CTRL_STICK_RIGHT);
			break;
		case VIRTKEY_AXIS_RIGHT_X_MAX:
			__CtrlSetAnalogX(fabs(axis.value), CTRL_STICK_RIGHT);
			break;
		case VIRTKEY_AXIS_RIGHT_Y_MIN:
			__CtrlSetAnalogY(-fabs(axis.value), CTRL_STICK_RIGHT);
			break;
		case VIRTKEY_AXIS_RIGHT_Y_MAX:
			__CtrlSetAnalogY(fabs(axis.value), CTRL_STICK_RIGHT);
			break;

		default:
			if (axis.value >= AXIS_BIND_THRESHOLD || axis.value <= -AXIS_BIND_THRESHOLD) {
				pspKey(result, KEY_DOWN);

				// Also unpress the other direction.
				std::vector<int> opposite;
				KeyMap::AxisToPspButton(axis.deviceId, axis.axisId, axis.value >= 0 ? -1 : 1, &opposite);
				for (size_t i = 0; i < opposite.size(); i++) {
					pspKey(opposite[i], KEY_UP);
				}
				// Hm, why do we use a different way below?
			} else {
				// Release both directions, trying to deal with some erratic controllers that can cause it to stick.
				pspKey(result, KEY_UP);
				for (size_t i = 0; i < resultsOpposite.size(); i++) {
					pspKey(resultsOpposite[i], KEY_UP);
				}
			}
		}
	}
}
Exemple #2
0
void EmuScreen::processAxis(const AxisInput &axis, int direction) {
	int result = KeyMap::AxisToPspButton(axis.deviceId, axis.axisId, direction);
	int resultOpposite = KeyMap::AxisToPspButton(axis.deviceId, axis.axisId, -direction);

	if (result == KEYMAP_ERROR_UNKNOWN_KEY)
		return;

	switch (result) {
	case VIRTKEY_AXIS_X_MIN:
		__CtrlSetAnalogX(-fabs(axis.value), CTRL_STICK_LEFT);
		break;
	case VIRTKEY_AXIS_X_MAX:
		__CtrlSetAnalogX(fabs(axis.value), CTRL_STICK_LEFT);
		break;
	case VIRTKEY_AXIS_Y_MIN:
		__CtrlSetAnalogY(-fabs(axis.value), CTRL_STICK_LEFT);
		break;
	case VIRTKEY_AXIS_Y_MAX:
		__CtrlSetAnalogY(fabs(axis.value), CTRL_STICK_LEFT);
		break;

	case VIRTKEY_AXIS_RIGHT_X_MIN:
		__CtrlSetAnalogX(-fabs(axis.value), CTRL_STICK_RIGHT);
		break;
	case VIRTKEY_AXIS_RIGHT_X_MAX:
		__CtrlSetAnalogX(fabs(axis.value), CTRL_STICK_RIGHT);
		break;
	case VIRTKEY_AXIS_RIGHT_Y_MIN:
		__CtrlSetAnalogY(-fabs(axis.value), CTRL_STICK_RIGHT);
		break;
	case VIRTKEY_AXIS_RIGHT_Y_MAX:
		__CtrlSetAnalogY(fabs(axis.value), CTRL_STICK_RIGHT);
		break;

	default:
		if (axis.value >= AXIS_BIND_THRESHOLD || axis.value <= -AXIS_BIND_THRESHOLD) {
			pspKey(result, KEY_DOWN);

			// Also unpress the other direction.
			result = KeyMap::AxisToPspButton(axis.deviceId, axis.axisId, axis.value >= 0 ? -1 : 1);
			if (result != KEYMAP_ERROR_UNKNOWN_KEY)
				pspKey(result, KEY_UP);
		} else {
			// Release both directions, trying to deal with some erratic controllers that can cause it to stick.
			pspKey(result, KEY_UP);
			pspKey(resultOpposite, KEY_UP);
		}
	}
}
Exemple #3
0
void EmuScreen::key(const KeyInput &key) {
	int result = KeyMap::KeyToPspButton(key.deviceId, key.keyCode);
	if (result == KEYMAP_ERROR_UNKNOWN_KEY)
		return;

	pspKey(result, key.flags);
}
Exemple #4
0
void EmuScreen::axis(const AxisInput &axis) {
	int result = KeyMap::AxisToPspButton(axis.deviceId, axis.axisId, axis.value >= 0 ? 1 : -1);
	if (result == KEYMAP_ERROR_UNKNOWN_KEY)
		return;

	switch (result) {
	case VIRTKEY_AXIS_X_MIN:
		__CtrlSetAnalogX(-fabs(axis.value), CTRL_STICK_LEFT);
		break;
	case VIRTKEY_AXIS_X_MAX:
		__CtrlSetAnalogX(fabs(axis.value), CTRL_STICK_LEFT);
		break;
	case VIRTKEY_AXIS_Y_MIN:
		__CtrlSetAnalogY(-fabs(axis.value), CTRL_STICK_LEFT);
		break;
	case VIRTKEY_AXIS_Y_MAX:
		__CtrlSetAnalogY(fabs(axis.value), CTRL_STICK_LEFT);
		break;

	case VIRTKEY_AXIS_RIGHT_X_MIN:
		__CtrlSetAnalogX(-fabs(axis.value), CTRL_STICK_RIGHT);
		break;
	case VIRTKEY_AXIS_RIGHT_X_MAX:
		__CtrlSetAnalogX(fabs(axis.value), CTRL_STICK_RIGHT);
		break;
	case VIRTKEY_AXIS_RIGHT_Y_MIN:
		__CtrlSetAnalogY(-fabs(axis.value), CTRL_STICK_RIGHT);
		break;
	case VIRTKEY_AXIS_RIGHT_Y_MAX:
		__CtrlSetAnalogY(fabs(axis.value), CTRL_STICK_RIGHT);
		break;

	default:
		if (axis.value >= AXIS_BIND_THRESHOLD || axis.value <= -AXIS_BIND_THRESHOLD) {
			pspKey(result, KEY_DOWN);

			// Also unpress the other direction.
			result = KeyMap::AxisToPspButton(axis.deviceId, axis.axisId, axis.value >= 0 ? -1 : 1);
			if (result != KEYMAP_ERROR_UNKNOWN_KEY)
				pspKey(result, KEY_UP);
		} else {
			pspKey(result, KEY_UP);
		}
	}
}
Exemple #5
0
void EmuScreen::key(const KeyInput &key) {
	if (key.keyCode == NKCODE_BACK)
		pauseTrigger_ = true;

	int result = KeyMap::KeyToPspButton(key.deviceId, key.keyCode);
	if (result == KEYMAP_ERROR_UNKNOWN_KEY)
		return;

	pspKey(result, key.flags);
}
Exemple #6
0
void EmuScreen::key(const KeyInput &key) {
	if ((key.flags & KEY_DOWN) && key.keyCode == NKCODE_BACK) {
		pauseTrigger_ = true;
	}

	std::vector<int> pspKeys;
	KeyMap::KeyToPspButton(key.deviceId, key.keyCode, &pspKeys);
	for (size_t i = 0; i < pspKeys.size(); i++) {
		pspKey(pspKeys[i], key.flags);
	}
}
Exemple #7
0
bool EmuScreen::key(const KeyInput &key) {
	if ((key.flags & KEY_DOWN) && key.keyCode == NKCODE_BACK) {
		pauseTrigger_ = true;
	}

	std::vector<int> pspKeys;
	KeyMap::KeyToPspButton(key.deviceId, key.keyCode, &pspKeys);

	if (pspKeys.size() && (key.flags & KEY_IS_REPEAT)) {
		// Claim that we handled this. Prevents volume key repeats from popping up the volume control on Android.
		return true;
	}

	for (size_t i = 0; i < pspKeys.size(); i++) {
		pspKey(pspKeys[i], key.flags);
	}
	return pspKeys.size() > 0;
}
Exemple #8
0
void EmuScreen::processAxis(const AxisInput &axis, int direction) {
	// Sanity check
	if (axis.axisId < 0 || axis.axisId >= JOYSTICK_AXIS_MAX) {
		return;
	}

	std::vector<int> results;
	KeyMap::AxisToPspButton(axis.deviceId, axis.axisId, direction, &results);
	for (size_t i = 0; i < results.size(); i++) {
		int result = results[i];
		switch (result) {
		case VIRTKEY_AXIS_X_MIN:
			__CtrlSetAnalogX(-fabs(axis.value), CTRL_STICK_LEFT);
			break;
		case VIRTKEY_AXIS_X_MAX:
			__CtrlSetAnalogX(fabs(axis.value), CTRL_STICK_LEFT);
			break;
		case VIRTKEY_AXIS_Y_MIN:
			__CtrlSetAnalogY(-fabs(axis.value), CTRL_STICK_LEFT);
			break;
		case VIRTKEY_AXIS_Y_MAX:
			__CtrlSetAnalogY(fabs(axis.value), CTRL_STICK_LEFT);
			break;

		case VIRTKEY_AXIS_RIGHT_X_MIN:
			__CtrlSetAnalogX(-fabs(axis.value), CTRL_STICK_RIGHT);
			break;
		case VIRTKEY_AXIS_RIGHT_X_MAX:
			__CtrlSetAnalogX(fabs(axis.value), CTRL_STICK_RIGHT);
			break;
		case VIRTKEY_AXIS_RIGHT_Y_MIN:
			__CtrlSetAnalogY(-fabs(axis.value), CTRL_STICK_RIGHT);
			break;
		case VIRTKEY_AXIS_RIGHT_Y_MAX:
			__CtrlSetAnalogY(fabs(axis.value), CTRL_STICK_RIGHT);
			break;
		}
	}

	std::vector<int> resultsOpposite;
	KeyMap::AxisToPspButton(axis.deviceId, axis.axisId, -direction, &resultsOpposite);

	int axisState = 0;
	if ((direction == 1 && axis.value >= AXIS_BIND_THRESHOLD)) {
		axisState = 1;
	} else if (direction == -1 && axis.value <= -AXIS_BIND_THRESHOLD) {
		axisState = -1;
	} else {
		axisState = 0;
	}

	if (axisState != axisState_[axis.axisId]) {
		axisState_[axis.axisId] = axisState;
		if (axisState != 0) {
			for (size_t i = 0; i < results.size(); i++) {
				if (!IsAnalogStickKey(results[i]))
					pspKey(results[i], KEY_DOWN);
			}
			// Also unpress the other direction.
			for (size_t i = 0; i < resultsOpposite.size(); i++) {
				if (!IsAnalogStickKey(resultsOpposite[i]))
					pspKey(resultsOpposite[i], KEY_UP);
			}
		} else if (axisState == 0) {
			// Release both directions, trying to deal with some erratic controllers that can cause it to stick.
			for (size_t i = 0; i < results.size(); i++) {
				if (!IsAnalogStickKey(results[i]))
					pspKey(results[i], KEY_UP);
			}
			for (size_t i = 0; i < resultsOpposite.size(); i++) {
				if (!IsAnalogStickKey(resultsOpposite[i]))
					pspKey(resultsOpposite[i], KEY_UP);
			}
		}
	}
}