/// <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); }
/// <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); }
/// <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); }