Пример #1
0
        /// <summary>
        /// Indica a la central digital que detenga una determinada locomotora, aunque seguirán activos el resto de locomotoras y sistemas.
        /// </summary>
        /// <param name="address">Dirección de la locomotora a detener.</param>
        public void StopLocomotive(int address)
        {
            // Comprueba que el puerto se encuentre abierto
            CheckPortStatus();

            // Comprueba los parámetros
            if (!LenzAddress.IsValidAddress(address))
            {
                throw new Exception("La dirección proporcionada no es válida.");
            }

            // Envia los datos al interface
            try
            {
                byte[] cmdData = { 0xFF, 0xFE, 0x92, 0x00, 0x00, 0x00 };

                LenzAddress add = new LenzAddress(address);
                cmdData[3] = add.HighAddress;
                cmdData[4] = add.LowAddress;
                cmdData[5] = (byte)Rwm.Otc.Math.Binary.Xor(cmdData, 2, 3);

                _port.Write(cmdData, 0, cmdData.Length);
            }
            catch (Exception ex)
            {
                throw new Exception("Write error: " + ex.Message, ex);
            }

            // Espera a la respuesta
            WaitForResponse(SystemResponses.RespLIOK);
        }
Пример #2
0
        /// <summary>
        /// Cambia el estado de un accesorio.
        /// </summary>
        /// <param name="address">Dirección del accesorio.</param>
        /// <param name="turned"><code>True</code> si la aguja está desviada (o verde en semáforos).</param>
        /// <param name="activate">Indica una de las dos salidas del accesorio.</param>
        public void SetTurnoutPosition(int address, bool turned, bool activate)
        {
            // Comprueba que el puerto se encuentre abierto
            CheckPortStatus();

            // Comprueba los parámetros proporcionados
            if (!LenzAddress.IsValidAddress(address))
            {
                throw new Exception("La dirección digital proporcionada no es válida.");
            }

            // Envia los datos al interface
            try
            {
                byte byteAddy = 0x00;
                byte byteB    = 0x00;
                byte byteD    = 0x00;

                byteAddy = (byte)(address / 4);
                byteB    = (byte)(((address % 4) & 0x01) << 1);
                byteB   += (byte)(((address % 4) & 0x02) << 1);
                byteD    = (byte)(activate ? 0x08 :0x00);
                byteD   += (byte)(turned ? 0x01 : 0x00);

                byte[] cmdData = { 0xFF, 0xFE, 0x52, 0x00, 0x00, 0x00 };
                cmdData[3] = byteAddy;
                cmdData[4] = (byte)(byteB + byteD + 0x80);
                cmdData[5] = (byte)Binary.Xor(cmdData, 2, 3);

                _port.Write(cmdData, 0, cmdData.Length);
            }
            catch (Exception ex)
            {
                throw new Exception("Write error: " + ex.Message, ex);
            }

            // Espera a la respuesta
            WaitForResponse(SystemResponses.RespLIOK);
        }
Пример #3
0
        /// <summary>
        /// Obtiene la información de estado de un descodificador de accesorios.
        /// </summary>
        /// <param name="address">Dirección del descodificador.</param>
        public OTCSysCmdAccessoryDecoderInfo GetTurnoutDecoderInfo(int address)
        {
            byte byteAddy   = 0x00;
            byte byteNibble = 0x00;

            // Comprueba que el puerto se encuentre abierto
            CheckPortStatus();

            // Comprueba los parámetros
            if (!LenzAddress.IsValidAddress(address))
            {
                throw new Exception("La dirección proporcionada no es válida.");
            }

            // Envia los datos al interface
            try
            {
                byteAddy   = (byte)(address / 4);
                byteNibble = (byte)(((byte)(((byte)(address % 4)) / 2) > 0) ? 0x81 : 0x80); // 0, 1 -> 0, 2, 3 -> 1

                byte[] cmdData = { 0xFF, 0xFE, 0x42, 0x00, 0x00, 0x00 };
                cmdData[3] = byteAddy;
                cmdData[4] = byteNibble;
                cmdData[5] = (byte)Binary.Xor(cmdData, 2, 3);

                _port.Write(cmdData, 0, cmdData.Length);
            }
            catch (Exception ex)
            {
                throw new Exception("Write error: " + ex.Message, ex);
            }

            // Espera a la respuesta
            LenzResponse response = WaitForResponse(SystemResponses.RespFeedback1Addy);

            // Trata los datos recibidos
            OTCSysCmdAccessoryDecoderInfo command = new OTCSysCmdAccessoryDecoderInfo(address);

            command.Nibble = byteNibble;

            byte byteHighNibble = (byte)(((byte)(response.Data[2] & 0x10) > 0) ? 0x81 : 0x80);

            if ((response.Data[1] == byteAddy) && (byteHighNibble == byteNibble))
            {
                command.Type = (OTCSysCmdAccessoryDecoderInfo.AccessoryTypes)((response.Data[2] & 0x60) >> 5);

                if (((byte)(address % 2)) > 0)
                {
                    // Left over means we want bits 2, 3 (second turnout)
                    command.Position = (OTCSysCmdAccessoryDecoderInfo.AccessoryPosition)((response.Data[2] & 0X0C) >> 2);
                }
                else
                {
                    // No left over means we want bits 0, 1 (first turnout)
                    command.Position = (OTCSysCmdAccessoryDecoderInfo.AccessoryPosition)(response.Data[2] & 0X03);
                }
            }
            else
            {
                throw new Exception("GetTurnoutDecoderInfo: Unexpected Response");
            }

            return(command);
        }