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