Skip to content

Commit d83c2ad

Browse files
committed
Add check for controller device info in rumble functions (N64Recomp#132)
1 parent 61f74e4 commit d83c2ad

1 file changed

Lines changed: 36 additions & 1 deletion

File tree

ultramodern/src/input.cpp

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,17 @@
55
#include "ultramodern/ultra64.h"
66
#include "ultramodern/ultramodern.hpp"
77

8+
#define PFS_ERR_NOPACK 1 // no device inserted
9+
#define PFS_ERR_CONTRFAIL 4 // data transmission failure
10+
#define PFS_ERR_INVALID 5 // invalid parameter or invalid file
11+
#define PFS_ERR_DEVICE 11 // different type of device inserted
12+
13+
#define PFS_INITIALIZED 1
14+
#define PFS_CORRUPTED 2
15+
#define PFS_ID_BROKEN 4
16+
#define PFS_MOTOR_INITIALIZED 8
17+
#define PFS_GBPAK_INITIALIZED 16
18+
819
static ultramodern::input::callbacks_t input_callbacks {};
920

1021
void ultramodern::input::set_callbacks(const callbacks_t& callbacks) {
@@ -177,8 +188,28 @@ extern "C" void osContGetReadData(OSContPad *data) {
177188
s32 osMotorInit(RDRAM_ARG PTR(OSMesgQueue) mq, PTR(OSPfs) pfs_, int channel) {
178189
OSPfs *pfs = TO_PTR(OSPfs, pfs_);
179190

191+
// basic initialization performed regardless of connected/disconnected status
192+
pfs->queue = mq;
180193
pfs->channel = channel;
194+
pfs->activebank = 0xFF;
195+
pfs->status = 0;
196+
197+
ultramodern::input::connected_device_info_t device_info{};
198+
if (input_callbacks.get_connected_device_info != nullptr) {
199+
device_info = input_callbacks.get_connected_device_info(channel);
200+
}
181201

202+
if (device_info.connected_device != ultramodern::input::Device::Controller) {
203+
return PFS_ERR_CONTRFAIL;
204+
}
205+
if (device_info.connected_pak == ultramodern::input::Pak::None) {
206+
return PFS_ERR_NOPACK;
207+
}
208+
if (device_info.connected_pak != ultramodern::input::Pak::RumblePak) {
209+
return PFS_ERR_DEVICE;
210+
}
211+
212+
pfs->status = PFS_MOTOR_INITIALIZED;
182213
return 0;
183214
}
184215

@@ -193,10 +224,14 @@ s32 osMotorStart(RDRAM_ARG PTR(OSPfs) pfs) {
193224
s32 __osMotorAccess(RDRAM_ARG PTR(OSPfs) pfs_, s32 flag) {
194225
OSPfs *pfs = TO_PTR(OSPfs, pfs_);
195226

227+
if (!(pfs->status & PFS_MOTOR_INITIALIZED)) {
228+
return PFS_ERR_INVALID;
229+
}
230+
196231
if (input_callbacks.set_rumble != nullptr) {
197-
// TODO: Should we check if the Rumble Pak is connected? Or just rumble regardless of the connected Pak?
198232
input_callbacks.set_rumble(pfs->channel, flag);
199233
}
200234

201235
return 0;
202236
}
237+

0 commit comments

Comments
 (0)