//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; namespace OpenTap.Plugins.PluginDevelopment { [Display("SCPI Attribute Example", Groups: new[] { "Examples", "Plugin Development", "Attributes" }, Description: "Shows how the SCPI attribute can be used to easily integrated SCPI behavior into a code controlling a SCPI instrument.")] public class ScpiAttributeExample : TestStep { // Here the SCPI attribute is used to define an alias to a SCPI command. public enum TriggerType { [Scpi("IMM")] // The SCPI command. Immediate, // An alias shown in GUI. [Scpi("INT")] Internal, [Scpi("KEY")] Key, [Scpi("BUS")] Bus, [Scpi("EXTernal2")] External2 } public enum LinkType { [Scpi("UP")] Uplink, // Only a single SCPI attribute may be used, but it may include multiple SCPI commands. [Scpi("DOWN; SomeOtherScpi; EvenMoreScpi")] Downlink, } // The SCPI attribute here allows the conversion of SCPI ON|OFF to C# true|false by the SCPI class. [Scpi("DISPlay:STATe")] public bool DisplayState { get; set; } // Examples that use the SCPI attribute as defined in the enumeration above. [Display("Link Direction", Order: 1)] public LinkType LinkDirection { get; set; } [Display("Trigger", Order: 2)] public TriggerType Trigger { get; set; } public ScpiAttributeExample() { LinkDirection = LinkType.Downlink; Trigger = TriggerType.Immediate; } public override void Run() { // The SCPI class's format command takes the value of the enum (marked with the SCPI attribute), // and returns the associated SCPI command. Log.Info("The {0} property is set to {1}. Corresponding SCPI: {2}", "LinkDirection", LinkDirection, Scpi.Format("{0}", LinkDirection)); Log.Info("The {0} property is set to {1}. Corresponding SCPI: {2}", "Trigger", Trigger, Scpi.Format("{0}", Trigger)); // Like a C# string format, the SCPI class's format can take multiple parameters. string formattedScpi = Scpi.Format("Cmd1={0} Cmd2={1}", Trigger, LinkDirection); Log.Info("The combined SCPI commands are {0}", formattedScpi); // The SCPI class's Format command converts a boolean into the appropriate ON|Off values. // This could then be sent to an instrument. formattedScpi = Scpi.Format("DISPlay:STATe {0}", DisplayState); Log.Info("The formatted Display State SCPI is {0}", formattedScpi); // The SCPI parse command takes an "ON" return value and converts it into a boolean. string scpiOnOff = "ON"; bool csBoolean = Scpi.Parse(scpiOnOff); Log.Info("The SCPI {0} is converted to a C# boolean of {1}", scpiOnOff, csBoolean); // The SCPI Parse command takes a enumeration value and SCPI command, and returns the human readable string for the enumeration. string myScpi = "IMM"; // Case sensitive var myAlias = Scpi.Parse(myScpi); Log.Info("The SCPI is {0} and the property value is {1}", myScpi, myAlias); // The SCPI parse command takes a SCPI array, and convert it into a C# array. // This simulates reading some information from a device, and loading it into C# for further processing. string commaSeparatedValues = "1.1,2.2,3.3,4,5"; double [] myArray = Scpi.Parse(commaSeparatedValues); string myArrayAsString = string.Join(",", myArray); Log.Info("The SCPI arrays is {0} and the property value is {1}", commaSeparatedValues, myArrayAsString); } } }