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); } } } } }
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); } } }
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); }
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); } } }
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); }
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); } }
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; }
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); } } } }