예제 #1
0
        /// <summary>
        /// Connect to Lego RCX brick.
        /// </summary>
        ///
        /// <param name="towerType">Type of IR tower to use for communication with RCX brick.</param>
        ///
        /// <returns>Returns <b>true</b> on successful connection or <b>false</b>
        /// otherwise.</returns>
        ///
        /// <remarks>If connection to RCX brick was established before the call, existing connection will be reused.
        /// If it is required to force reconnection, then <see cref="Disconnect"/> method should be called before.
        /// </remarks>
        ///
        public bool Connect(IRTowerType towerType)
        {
            lock ( sync )
            {
                // check if we are already connected
                if (stack != IntPtr.Zero)
                {
                    return(true);
                }

                uint status;

                // create stack
                status = GhostAPI.GhCreateStack(
                    (towerType == IRTowerType.USB) ? "LEGO.Pbk.CommStack.Port.USB" : "LEGO.Pbk.CommStack.Port.RS232",
                    "LEGO.Pbk.CommStack.Protocol.IR",
                    "LEGO.Pbk.CommStack.Session",
                    out stack);

                if (!GhostAPI.PBK_SUCCEEDED(status))
                {
                    return(false);
                }

                // select first available device
                StringBuilder sb = new StringBuilder(200);
                status = GhostAPI.GhSelectFirstDevice(stack, sb, sb.Length);

                if (!GhostAPI.PBK_SUCCEEDED(status))
                {
                    Disconnect( );
                    return(false);
                }

                // open stack, set interleave, set wait mode and check if the brick is alive
                if (
                    !GhostAPI.PBK_SUCCEEDED(GhostAPI.GhOpen(stack)) ||
                    !GhostAPI.PBK_SUCCEEDED(GhostAPI.GhSetWaitMode(stack, IntPtr.Zero)) ||
                    !GhostAPI.PBK_SUCCEEDED(GhostAPI.GhSetInterleave(stack, 1, 0)) ||
                    !IsAlive( )
                    )
                {
                    Disconnect( );
                    return(false);
                }
            }

            return(true);
        }