/// <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; } } }
/// <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(); }
/// <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; }
/// <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; } }
/// <summary> /// Devuelve una instancia de LenzComm. /// </summary> public LenzComm() { _port = new SerialPort(); _response = new LenzResponse(null); }
/// <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); }