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+
819static ultramodern::input::callbacks_t input_callbacks {};
920
1021void ultramodern::input::set_callbacks (const callbacks_t & callbacks) {
@@ -177,8 +188,28 @@ extern "C" void osContGetReadData(OSContPad *data) {
177188s32 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) {
193224s32 __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