IEnumerator RunExperiment()
    {
        while (!isDone)
        {
            SetText("Querying for next trial");
            yield return(StartCoroutine(client.Ask()));

            Debug.Log(trialNum);
            config = client.GetConfig();

            SetText("Now presenting stimulus.");

            yield return(StartCoroutine(PresentStimulus(config)));

            SetText("Was it visible? (Y/N)");

            yield return(StartCoroutine(LogUserInput()));


            if (trialNum == (totalTrials - 1))
            {
                SetText("Experiment complete");
                isDone = true;
                break;
            }

            trialNum++;
        }
        yield return(0);
    }
    public IEnumerator SpawnSliders()
    {
        QueryEnabled(false);
        //Get the current config with n parameters
        yield return(StartCoroutine(client.Params()));

        //initParams = new TrialConfig();
        //initParams.Add("Dimension 1", new List<float>() { 0.0f });
        initParams = client.GetConfig(version: "0.0");
        if (!initialized)
        {
            foreach (KeyValuePair <string, List <float> > entry in initParams)
            {
                string     name      = entry.Key;
                float      min       = entry.Value[0];
                float      max       = entry.Value[1];
                GameObject sliderObj = Instantiate(sliderPrefab, canvasGroup.transform.position, Quaternion.identity, canvasGroup.transform);
                sliderObj.transform.parent = xslidergroup.transform;
                ModelSlider slider = sliderObj.GetComponent <ModelSlider>();
                slider.InitSlider(min, max, name, false);
                slider.SetQueryModel(this);
                xSliders.Add(slider);
            }
        }
        //Spawn final slider and query twice for its limits

        yield return(StartCoroutine(client.Query(QueryType.max)));

        QueryMessage m = client.GetQueryResponse();

        maxY = m.y;
        yield return(StartCoroutine(client.Query(QueryType.min)));

        m    = client.GetQueryResponse();
        minY = m.y;

        string nameY = yAxisName;

        //Spawn + initialize slider, if necessary.
        GameObject ySliderObj;

        if (!initialized)
        {
            ySliderObj = Instantiate(sliderPrefab, canvasGroup.transform.position + new Vector3(-1.0f, 0.5f), Quaternion.identity, canvasGroup.transform);
            RectTransform rt = ySliderObj.GetComponent <RectTransform>();
            rt.localScale *= 1.25f;
            rt.anchorMax   = new Vector2(.9f, 0.55f);
            rt.anchorMin   = new Vector2(.9f, 0.55f);
            rt.pivot       = new Vector2(1f, 0.5f);
            ySlider        = ySliderObj.GetComponent <ModelSlider>();
            ySlider.SetQueryModel(this);
            ySlider.DisableLockToggle();
        }

        //ySlider.InitSlider(0, 3.4567f, nameY, true);
        ySlider.InitSlider(minY, maxY, nameY, true);
        StartCoroutine(ComputeYFromModel());
        initialized = true;
    }
    IEnumerator RunExperiment()
    {
        while (!isDone)
        {
            Debug.Log("trial# " + trialNum + " strat " + currentStrat + " strat's trial# " + AEPsychStrats[currentStrat].currentTrial);

            SetText("Querying for next trial");
            yield return(StartCoroutine(client.Ask()));

            config = client.GetConfig();

            SetText("Now presenting stimulus.");

            yield return(StartCoroutine(PresentStimulus(config)));

            SetText("Was it visible? (Y/N)");

            yield return(StartCoroutine(LogUserInput()));

            //check if strat or experiment is done
            if (AEPsychStrats[currentStrat].currentTrial == (totalTrials - 1))
            {
                SetText("Strat is complete.");
                AEPsychStrats[currentStrat].isDone = true;
                if (checkFinished())
                {
                    SetText("Experiment complete");
                    isDone = true;
                    break;
                }
            }

            AEPsychStrats[currentStrat].currentTrial++;
            trialNum++;

            //in this example, switch every 5 trials
            if (AEPsychStrats[currentStrat].currentTrial % 5 == 4)
            {
                currentStrat = (currentStrat + 1) % numStrats;
                while (AEPsychStrats[currentStrat].isDone)
                {
                    currentStrat = (currentStrat + 1) % numStrats;
                }
                Debug.Log("switched to strat " + currentStrat);
                yield return(StartCoroutine(client.Resume(AEPsychStrats[currentStrat].stratId)));
            }
        }
        yield return(0);
    }