/// <summary>
        /// Connects to the INS
        /// </summary>
        /// <param name="theSummit">SummitSystem</param>
        /// /// <param name="_log">Caliburn Micro logger</param>
        /// <returns>True if connected or false if not connected</returns>
        public bool ConnectINS(ref SummitSystem theSummit, ILog _log)
        {
            ConnectReturn theWarnings;
            APIReturnInfo connectReturn;

            //Check if you can skip discovery, if successful, return immediately, if not proceed to discover
            //If it has already discovered the INS before then we can skip discovery.
            //If battery taken out or new connection then we need to discover
            if (skipDiscovery)
            {
                try
                {
                    int count = 5;
                    do
                    {
                        connectReturn = theSummit.StartInsSession(null, out theWarnings, true);
                        _log.Info("Skip Discovery: Start INS session reject code == " + connectReturn.RejectCode + "\r\nReject Code Type: " + connectReturn.RejectCodeType.ToString());
                        if (connectReturn.RejectCode == 0)
                        {
                            return(true);
                        }
                        count--;
                    } while (connectReturn.RejectCodeType != typeof(APIRejectCodes) && connectReturn.RejectCode != 12 && count >= 0);
                    skipDiscovery = false;
                }
                catch (Exception e)
                {
                    _log.Error(e);
                }
            }
            // Discovery INS with the connected CTM, loop until a device has been discovered
            List <DiscoveredDevice> discoveredDevices;
            int countForDiscoveredDevices = 5;

            try
            {
                do
                {
                    Thread.Sleep(100);
                    theSummit.OlympusDiscovery(out discoveredDevices);
                    _log.Info("Discovery INS with the connected CTM, loop until a device has been discovered");
                    countForDiscoveredDevices--;
                    if (countForDiscoveredDevices <= 0)
                    {
                        _log.Warn("count for discovered device ran out");
                        return(false);
                    }
                } while ((discoveredDevices == null || discoveredDevices.Count == 0));

                _log.Info("Olympi found: Creating Summit Interface.");
                // Connect to a device
                int countToAvoidInfiniteLoop = 5;
                do
                {
                    Thread.Sleep(2000); //Add short delay here for connection problems
                    connectReturn = theSummit.StartInsSession(discoveredDevices[0], out theWarnings, true);
                    _log.Info("Discovery: Start INS session reject code == " + connectReturn.RejectCode.ToString() + "\r\nReject Code Type: " + connectReturn.RejectCodeType.ToString());
                    if (connectReturn.RejectCodeType == typeof(InstrumentReturnCode) && (InstrumentReturnCode)connectReturn.RejectCode == InstrumentReturnCode.InvalidDiscoveredCount)
                    {
                        _log.Info("Start INS Session");
                        break;
                    }
                    countToAvoidInfiniteLoop--;
                    if (countToAvoidInfiniteLoop <= 0)
                    {
                        _log.Warn("count for ins connect ran out");
                        return(false);
                    }
                } while (theWarnings.HasFlag(ConnectReturn.InitializationError));

                // Write out the final result of the example
                if (connectReturn.RejectCode != 0)
                {
                    _log.Warn("Summit Initialization: INS failed to connect");
                    return(false);
                }
                else
                {
                    // Write out the warnings if they exist
                    _log.Info("Summit Initialization: INS connected, warnings: " + theWarnings.ToString());
                    skipDiscovery = true;
                    return(true);
                }
            }
            catch (Exception e)
            {
                _log.Error(e);
                return(false);
            }
        }