mirror of https://github.com/mgba-emu/mgba.git
PSP2: Better rumble
This commit is contained in:
parent
b620ac1af2
commit
476b34ce07
|
@ -18,6 +18,7 @@
|
||||||
#include "gba/input.h"
|
#include "gba/input.h"
|
||||||
|
|
||||||
#include "util/memory.h"
|
#include "util/memory.h"
|
||||||
|
#include "util/circle-buffer.h"
|
||||||
#include "util/ring-fifo.h"
|
#include "util/ring-fifo.h"
|
||||||
#include "util/threading.h"
|
#include "util/threading.h"
|
||||||
#include "util/vfs.h"
|
#include "util/vfs.h"
|
||||||
|
@ -34,6 +35,8 @@
|
||||||
|
|
||||||
#include <vita2d.h>
|
#include <vita2d.h>
|
||||||
|
|
||||||
|
#define RUMBLE_PWM 8
|
||||||
|
|
||||||
static enum ScreenMode {
|
static enum ScreenMode {
|
||||||
SM_BACKDROP,
|
SM_BACKDROP,
|
||||||
SM_PLAIN,
|
SM_PLAIN,
|
||||||
|
@ -50,7 +53,11 @@ static struct mSceRotationSource {
|
||||||
struct mRotationSource d;
|
struct mRotationSource d;
|
||||||
struct SceMotionSensorState state;
|
struct SceMotionSensorState state;
|
||||||
} rotation;
|
} rotation;
|
||||||
static struct mRumble rumble;
|
static struct mSceRumble {
|
||||||
|
struct mRumble d;
|
||||||
|
struct CircleBuffer history;
|
||||||
|
int current;
|
||||||
|
} rumble;
|
||||||
|
|
||||||
extern const uint8_t _binary_backdrop_png_start[];
|
extern const uint8_t _binary_backdrop_png_start[];
|
||||||
static vita2d_texture* backdrop = 0;
|
static vita2d_texture* backdrop = 0;
|
||||||
|
@ -116,10 +123,17 @@ static int32_t _readGyroZ(struct mRotationSource* source) {
|
||||||
return rotation->state.gyro.z * -0x10000000;
|
return rotation->state.gyro.z * -0x10000000;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _setRumble(struct mRumble* rumble, int enable) {
|
static void _setRumble(struct mRumble* source, int enable) {
|
||||||
UNUSED(rumble);
|
struct mSceRumble* rumble = (struct mSceRumble*) source;
|
||||||
|
rumble->current += enable;
|
||||||
|
if (CircleBufferSize(&rumble->history) == RUMBLE_PWM) {
|
||||||
|
int8_t oldLevel;
|
||||||
|
CircleBufferRead8(&rumble->history, &oldLevel);
|
||||||
|
rumble->current -= oldLevel;
|
||||||
|
}
|
||||||
|
CircleBufferWrite8(&rumble->history, enable);
|
||||||
struct SceCtrlActuator state = {
|
struct SceCtrlActuator state = {
|
||||||
enable,
|
rumble->current * 31,
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
sceCtrlSetActuator(1, &state);
|
sceCtrlSetActuator(1, &state);
|
||||||
|
@ -182,8 +196,9 @@ void mPSP2Setup(struct mGUIRunner* runner) {
|
||||||
rotation.d.readGyroZ = _readGyroZ;
|
rotation.d.readGyroZ = _readGyroZ;
|
||||||
runner->core->setRotation(runner->core, &rotation.d);
|
runner->core->setRotation(runner->core, &rotation.d);
|
||||||
|
|
||||||
rumble.setRumble = _setRumble;
|
rumble.d.setRumble = _setRumble;
|
||||||
runner->core->setRumble(runner->core, &rumble);
|
CircleBufferInit(&rumble.history, RUMBLE_PWM);
|
||||||
|
runner->core->setRumble(runner->core, &rumble.d);
|
||||||
|
|
||||||
backdrop = vita2d_load_PNG_buffer(_binary_backdrop_png_start);
|
backdrop = vita2d_load_PNG_buffer(_binary_backdrop_png_start);
|
||||||
|
|
||||||
|
@ -277,6 +292,7 @@ void mPSP2Unpaused(struct mGUIRunner* runner) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void mPSP2Teardown(struct mGUIRunner* runner) {
|
void mPSP2Teardown(struct mGUIRunner* runner) {
|
||||||
|
CircleBufferDeinit(&rumble.history);
|
||||||
vita2d_free_texture(tex);
|
vita2d_free_texture(tex);
|
||||||
vita2d_free_texture(screenshot);
|
vita2d_free_texture(screenshot);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue