PSP2: Better rumble

This commit is contained in:
Jeffrey Pfau 2016-08-14 01:25:36 -07:00
parent b620ac1af2
commit 476b34ce07
1 changed files with 22 additions and 6 deletions

View File

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