void AppStage_ComputeTrackerPoses::handle_controller_list_response( const ClientPSMoveAPI::ResponseMessage *response_message, void *userdata) { AppStage_ComputeTrackerPoses *thisPtr = static_cast<AppStage_ComputeTrackerPoses *>(userdata); const ClientPSMoveAPI::eClientPSMoveResultCode ResultCode = response_message->result_code; // const ClientPSMoveAPI::t_request_id request_id = response_message->request_id; switch (ResultCode) { case ClientPSMoveAPI::_clientPSMoveResultCode_ok: { assert(response_message->payload_type == ClientPSMoveAPI::_responsePayloadType_ControllerList); const ClientPSMoveAPI::ResponsePayload_ControllerList *controller_list = &response_message->payload.controller_list; int PSMoveControllerId = -1; for (int list_index = 0; list_index < controller_list->count; ++list_index) { if (controller_list->controller_type[list_index] == ClientControllerView::PSMove) { PSMoveControllerId = controller_list->controller_id[list_index]; break; } } if (PSMoveControllerId != -1) { thisPtr->request_start_controller_stream(PSMoveControllerId); } else { thisPtr->setState(AppStage_ComputeTrackerPoses::failedControllerListRequest); } } break; case ClientPSMoveAPI::_clientPSMoveResultCode_error: case ClientPSMoveAPI::_clientPSMoveResultCode_canceled: { thisPtr->setState(AppStage_ComputeTrackerPoses::failedControllerListRequest); } break; } }
void AppStage_ComputeTrackerPoses::handle_controller_list_response( const ClientPSMoveAPI::ResponseMessage *response_message, void *userdata) { const PSMoveProtocol::Response *response = GET_PSMOVEPROTOCOL_RESPONSE(response_message->opaque_response_handle); const PSMoveProtocol::Request *request = GET_PSMOVEPROTOCOL_REQUEST(response_message->opaque_request_handle); AppStage_ComputeTrackerPoses *thisPtr = static_cast<AppStage_ComputeTrackerPoses *>(userdata); const ClientPSMoveAPI::eClientPSMoveResultCode ResultCode = response_message->result_code; switch (ResultCode) { case ClientPSMoveAPI::_clientPSMoveResultCode_ok: { assert(response_message->payload_type == ClientPSMoveAPI::_responsePayloadType_ControllerList); const ClientPSMoveAPI::ResponsePayload_ControllerList *controller_list = &response_message->payload.controller_list; if (thisPtr->m_bSkipCalibration) { bool bStartedAnyControllers = false; for (int list_index = 0; list_index < controller_list->count; ++list_index) { if (controller_list->controller_type[list_index] == ClientControllerView::PSMove || controller_list->controller_type[list_index] == ClientControllerView::PSDualShock4) { int trackedControllerId = controller_list->controller_id[list_index]; const auto &protocolControllerResponse = response->result_controller_list().controllers(list_index); const PSMoveTrackingColorType trackingColorType= static_cast<PSMoveTrackingColorType>(protocolControllerResponse.tracking_color_type()); thisPtr->request_start_controller_stream(trackedControllerId, list_index, trackingColorType); bStartedAnyControllers = true; } } if (!bStartedAnyControllers) { thisPtr->setState(AppStage_ComputeTrackerPoses::failedControllerListRequest); } } else { int trackedControllerId = thisPtr->m_overrideControllerId; int trackedControllerListIndex = -1; PSMoveTrackingColorType trackingColorType; if (trackedControllerId == -1) { for (int list_index = 0; list_index < controller_list->count; ++list_index) { if (controller_list->controller_type[list_index] == ClientControllerView::PSMove || controller_list->controller_type[list_index] == ClientControllerView::PSDualShock4) { const auto &protocolControllerResponse = response->result_controller_list().controllers(list_index); trackingColorType = static_cast<PSMoveTrackingColorType>(protocolControllerResponse.tracking_color_type()); trackedControllerId = controller_list->controller_id[list_index]; trackedControllerListIndex = list_index; break; } } } if (trackedControllerId != -1) { thisPtr->request_start_controller_stream(trackedControllerId, trackedControllerListIndex, trackingColorType); } else { thisPtr->setState(AppStage_ComputeTrackerPoses::failedControllerListRequest); } } } break; case ClientPSMoveAPI::_clientPSMoveResultCode_error: case ClientPSMoveAPI::_clientPSMoveResultCode_canceled: { thisPtr->setState(AppStage_ComputeTrackerPoses::failedControllerListRequest); } break; } }