error_code cellPadSetActDirect(u32 port_no, vm::ptr<CellPadActParam> param) { sys_io.trace("cellPadSetActDirect(port_no=%d, param=*0x%x)", port_no, param); const auto handler = fxm::get<pad_thread>(); if (!handler) return CELL_PAD_ERROR_UNINITIALIZED; if (port_no >= CELL_MAX_PADS || !param) return CELL_PAD_ERROR_INVALID_PARAMETER; const auto& pads = handler->GetPads(); if (port_no >= pads.size() || port_no >= handler->GetInfo().max_connect) return CELL_PAD_ERROR_NO_DEVICE; const auto pad = pads[port_no]; if (!(pad->m_port_status & CELL_PAD_STATUS_CONNECTED)) return CELL_PAD_ERROR_NO_DEVICE; // TODO: find out if this is checked here or later or at all if (!(pad->m_device_capability & CELL_PAD_CAPABILITY_ACTUATOR)) return CELL_PAD_ERROR_UNSUPPORTED_GAMEPAD; // make sure reserved bits are 0. Looks like this happens after checking the pad status for (int i = 0; i < 6; i++) if (param->reserved[i]) return CELL_PAD_ERROR_INVALID_PARAMETER; handler->SetRumble(port_no, param->motor[1], param->motor[0] > 0); return CELL_OK; }
s32 cellPadSetActDirect(u32 port_no, vm::ptr<CellPadActParam> param) { sys_io.trace("cellPadSetActDirect(port_no=%d, param=*0x%x)", port_no, param); const auto handler = fxm::get<PadHandlerBase>(); if (!handler) return CELL_PAD_ERROR_UNINITIALIZED; const PadInfo& rinfo = handler->GetInfo(); if (port_no >= rinfo.max_connect) return CELL_PAD_ERROR_INVALID_PARAMETER; if (port_no >= rinfo.now_connect) return CELL_PAD_ERROR_NO_DEVICE; handler->SetRumble(port_no, param->motor[1], param->motor[0] > 0); return CELL_OK; }
void XBOX360_Controller::Rumble_Right(float intensity) { SetRumble(kRightRumble, intensity); }
void XBOX360_Controller::Rumble_Left(float intensity) { SetRumble(kLeftRumble, intensity); }