Esempio n. 1
0
        /// <summary>
        /// Trata la recepción de datos desde el puerto.
        /// </summary>
        private void PortDataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            byte[] byteResp = new byte[_port.ReadBufferSize];

            // Lee el contenido del buffer de entrada
            _port.Read(byteResp, 0, _port.ReadBufferSize);

            // Genera la respuesta normalizada
            _response = new LenzResponse(byteResp);

            // Si existe información perdida, lanza un mensaje de error informativo
            if (!_response.IsDataOk)
            {
                _response = null;
                // OnError(new OTCInformationEventArgs("Paquete desconocido [" + _response.ToString() + "]"), new Exception("Paquete desconocido"));
                return;
            }

            // Trata los paquetes recibidos sin petición (feedback, etc)
            switch (_response.Type)
            {
            case SystemResponses.RespFeedback1Addy:
            case SystemResponses.RespFeedback2Addy:
            case SystemResponses.RespFeedback3Addy:
            case SystemResponses.RespFeedback4Addy:
            case SystemResponses.RespFeedback5Addy:
            case SystemResponses.RespFeedback6Addy:
            case SystemResponses.RespFeedback7Addy:
            {
                // Encolar información
                break;
            }
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Obtiene la información del interface.
        /// </summary>
        public void GetInterfaceInfo()
        {
            // Comprueba que el puerto se encuentre abierto
            CheckPortStatus();

            // Envia los datos al interface
            try
            {
                byte[] cmdData = { 0xFF, 0xFE, 0xF0, 0xF0 };
                _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.RespLIVersion);

            // Trata los datos recibidos
            double hwVer = (double)((response.Data[1] & 0xF0) >> 4) + ((double)(response.Data[1] & 0x0F) / 10.0);
            double swVer = response.Data[2];

            _ifName  = "LI-USB";    // Fijado pues este controlador sólo soporta LI-USB
            _ifHwVer = hwVer.ToString();
            _ifSwVer = swVer.ToString();
        }
Esempio n. 3
0
        /// <summary>
        /// Devuelve una instancia de LenzComm.
        /// </summary>
        /// <param name="portName">Nombre identificativo del puerto al que está conectado el sistema digital (COM1).</param>
        /// <param name="portSpeed">Velocidad a la que se comunicarán PC y sistema digital (en baudios).</param>
        /// <param name="reqTimeout">Tiempo máximo de espera después de realizar una petición al sistema digital.</param>
        public LenzComm(string portName, int portSpeed, int reqTimeout)
        {
            _port     = new SerialPort();
            _response = new LenzResponse(null);

            _portName   = portName;
            _portSpeed  = portSpeed;
            _reqTimeout = reqTimeout;
        }
Esempio n. 4
0
        /// <summary>
        /// Obtiene la información de la central digital.
        /// </summary>
        /// <remarks>
        /// Sólo reconoce software de la versión 3 o superior (XpressNet). No soporta X-BUS.
        /// </remarks>
        public void GetSystemInfo()
        {
            byte[] byteRespVer = new byte[MAX_BROADCAST_MESSAGE_SIZE];

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

            // Envia los datos al interface
            try
            {
                byte[] cmdData = { 0xFF, 0xFE, 0x21, 0x21, 0x00 };
                _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.RespSoftwareVer3);

            // Trata los datos recibidos
            double ver = (double)((response.Data[2] & 0xF0) >> 4) + ((double)(response.Data[2] & 0x0F) / 10.0);

            _dsVer = ver.ToString();
            switch (response.Data[3])
            {
            case 0x00: _dsName = "LZ100"; break;

            case 0x01: _dsName = "LH200"; break;

            case 0x02: _dsName = "DPC (Compact o Commander)"; break;

            default: _dsName = "Modelo desconocido (no Lenz)"; break;
            }
        }
Esempio n. 5
0
 /// <summary>
 /// Devuelve una instancia de LenzComm.
 /// </summary>
 public LenzComm()
 {
     _port     = new SerialPort();
     _response = new LenzResponse(null);
 }
Esempio n. 6
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);
        }