//Copyright 2012-2019 Keysight Technologies // //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at // //http://www.apache.org/licenses/LICENSE-2.0 // //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. using OpenTap; // This example demonstrates how a SwitchMatrix instrument can be created with simulated functionality namespace OpenTap.Plugins.PluginDevelopment { [Display("Switch Matrix", Groups: new[] { "Examples", "Plugin Development", "Connections" }, Description: "A simulated 4x4 switch matrix.")] public class SwitchMatrixInstrument : Instrument { private readonly SwitchMatrixPathCollection _Channels; private SwitchMatrixPath _ActiveChannel; #region Settings public SwitchMatrixPathCollection Channels { get { return _Channels; } } #endregion public SwitchMatrixInstrument() { // A custom Name for the switch can be specified here. // This can also be specified manually in the Connection Settings GUI. // In absence of this, "N/A" will be used. this.Name = "My_4x4_Matrix"; _Channels = new SwitchMatrixPathCollection(this, 4, 4); } /// /// Open procedure for the instrument. /// public override void Open() { base.Open(); // Open the connection to the instrument here. // Usually, initialization will also include a reset operation // to ensure all matrix crosspoints are disconnected. resetSwitchConnections(); } public void SetMatrixChannel(int row, int col) { if (_Channels[row, col] == _ActiveChannel) return; // Disable any active connections before enabling a new connection. resetSwitchConnection(_ActiveChannel); // Add hardware driver calls to enable the switch channel here. // E.g. Switch.Route.CloseChannel("m1r1c1"); // Set the corresponding row and column as active. var channel = _Channels[row, col]; channel.IsActive = true; _ActiveChannel = channel; } /// /// Close procedure for the instrument. /// public override void Close() { // Shut down the connection to the instrument here. resetSwitchConnection(_ActiveChannel); base.Close(); } private void resetSwitchConnection(SwitchMatrixPath channel) { if (channel != null) { // Add hardware driver calls to disable the switch channel here. channel.IsActive = false; } } private void resetSwitchConnections() { // Add hardware driver calls to disable all switch channels here. _ActiveChannel = null; } } }