IEnumerator SearchRobotsCoroutine()
        {
            robotDetailsList       = new List <Robot>();
            searchSuccess          = false;
            searchResultsAvailable = false;
            searchReturn           = "";

            // If not logged in, log in first buddy
            if (!loginSuccess)
            {
                searchReturn = "Must login before trying to search available robots";
                Debug.Log(searchReturn);
                searchResultsAvailable = true;
                yield break;
            }

            if ((DateTime.Now - lastSearch).Seconds < 1)
            {
                searchReturn = "Cannot search more than once per second";
                Debug.Log(searchReturn);
                searchResultsAvailable = true;
                yield break;
            }

            lastSearch = DateTime.Now;

            var chosenRange = new GeoStruct {
                LowerLat = 0, LowerLong = 0, UpperLat = 0, UpperLong = 0
            };
            // TODO change search signature to just provide range because local and remote search logic should move into go
            var myNewThread = new Thread(() => ThreadedSearch(false, true, chosenRange));

            myNewThread.Start();

            while (!searchResultsAvailable)
            {
                yield return(null);
            }

            // Debug.Log(robotResults);
            Debug.Log(searchReturn);
            yield return(null);
        }
        private void ThreadedSearch(bool getLocal, bool getRemote, GeoStruct chosenRange)
        {
            searchSuccess          = false;
            searchResultsAvailable = false;
            searchReturn           = "";
            var errorFlag = false;

            var getRobotsRequest = new GetRobotsProtoRequest {
                GetLocal = false, GetRemote = true, Georange = chosenRange
            };
            var getRobotsReply = AnimusClient.AnimusClient.GetRobots(getRobotsRequest);

            if (getRobotsReply.LocalSearchError != null)
            {
                if (!getRobotsReply.LocalSearchError.Success)
                {
                    errorFlag    = true;
                    searchReturn = getRobotsReply.LocalSearchError.Description;
                }
            }

            if (getRobotsReply.RemoteSearchError != null)
            {
                if (!getRobotsReply.RemoteSearchError.Success)
                {
                    errorFlag     = true;
                    searchReturn += " " + getRobotsReply.RemoteSearchError.Description;
                }
            }

            if (errorFlag)
            {
                Debug.Log("Error searching robots: " + searchReturn);
                searchResultsAvailable = true;
                return;
            }


            if (getRobotsReply.Robots.Count > 0)
            {
                _norobotsCount = 0;

                foreach (Robot a in getRobotsReply.Robots)
                {
                    robotDetailsList.Add(a);
                    Debug.Log($"{a.Make} {a.Model} robot called {a.Name}");
                }

                Debug.Log("Finished search and robots found");
                searchSuccess = true;
            }
            else
            {
                Debug.Log("Robots not found");

                _norobotsCount += 1;
                if (_norobotsCount >= _norobotsMoreDetails)
                {
                    searchReturn =
                        "No robots found. Please search again.\nIf problem persists, check your WiFi connection or the robot's WiFi connection";
                }
                else
                {
                    searchReturn = "No robots found. Please search again.";
                }
            }

            searchResultsAvailable = true;
        }