Differences

This shows you the differences between two versions of the page.

Link to this comparison view

test-and-measurement:guides:waveforms-sdk-getting-started [2022/09/12 18:23] – changed forum.digilentinc.com to forum.digilent.com jeff.greenberg_ni.comtest-and-measurement:guides:waveforms-sdk-getting-started [2022/10/04 11:38] (current) – external edit 127.0.0.1
Line 1: Line 1:
 +====== Getting Started with WaveForms SDK ======
 +<WRAP group>
 +WaveForms SDK is a set of tools provided within the WaveForms installation that are used to develop custom software solutions that use Digilent Test and Measurement devices. The WaveForms SDK API is available in several programming languages, making it easy to use across many different platforms.
  
 +Normally, Test and Measurement devices are controlled and configured through the WaveForms application with a personal computer. Such a setup may be impossible in a given context, or an amount of automated signal measurement may be required beyond what WaveForms' scripting environment allows. WaveForms SDK gives the necessary tools to help craft the perfect solution for any problem.
 +
 +This guide demonstrates the usage of some basic instruments and presents some patterns to help develop your own application. It is written with Python in mind, but users of other languages will still find it useful to illustrate the principles of working with the SDK.
 +</WRAP>
 +----
 +
 +===== Inventory =====
 +<WRAP group>
 +  * A Digilent Test & Measurement Device
 +    * [[test-and-measurement:analog-discovery-pro-5250:start|]]
 +    * [[test-and-measurement:analog-discovery-pro-3x50:start|]]
 +    * [[test-and-measurement:analog-discovery-studio:start|]]
 +    * [[test-and-measurement:analog-discovery-2:start|]]
 +    * [[test-and-measurement:analog-discovery:start|]]
 +    * [[test-and-measurement:digital-discovery:start|]]
 +  * A Computer with WaveForms Installed
 +    * Both the WaveForms application and WaveForms SDK can be installed by following the [[software:waveforms:waveforms-3:getting-started-guide]].
 +</WRAP>
 +----
 +
 +===== SDK Overview =====
 +<WRAP group>
 +WaveForms SDK is included with WaveForms and is installed alongside the application. The SDK is available to use with C/C++, C#, Python, and Visual Basic through a dynamic library (a module that contains data that can be used by other applications).
 +
 +Another important file is the one that contains the definition of all constants. If you want to use the SDK from Python, this file is a Python module, while for C/C++ applications, the constants are defined in a header file.
 +
 +Working code examples for each supported programming language are provided with the SDK and may be found at the following locations:
 +  * Windows 32-bit: **C:\Program Files\Digilent\WaveFormsSDK\samples**
 +  * Windows 64-bit: **C:\Program Files (x86)\Digilent\WaveFormsSDK\samples**
 +  * Linux: **/usr/share/digilent/waveforms/samples**
 +  * macOS: **/Applications/WaveForms.app/Contents/Resources/SDK/samples**
 +
 +</WRAP>
 +----
 +
 +===== Workflow =====
 +==== 1. Importing the Constants and Loading the Dynamic Library ====
 +<WRAP group><WRAP half column>
 +The WaveForms SDK Python functions use C-compatible data types, so along with the dynamic library and the module containing the constants, you will also need the **ctypes** module, which is installed together with Python by default.
 +
 +As the first step of your project import the **dwfconstants.py** file to your project directory (it is located among the sample codes, in the **py** folder), then load the necessary modules and the dynamic library.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fdevice.py%23L23-L44&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +--> Optional: Importing the Constants from the Project Directory #
 +<WRAP group><WRAP half column>
 +Alternatively, you can import the dwfconstants.py file from the project directory, simplifying this way the code. Copy the file into your project, then import it like any other module, but include the directory name in the import path.
 +</WRAP><WRAP half column>
 +<html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fdevice.py%23L4-L17&style=github&showCopy=on"></script>
 +</html>
 +</WRAP></WRAP>
 +<--
 +----
 +
 +==== 2. Connecting the Test & Measurement Device ====
 +<WRAP group><WRAP half column>
 +The next step is to "open" your device. If you have only one Test & Measurement device connected, the simplest method is to ask the WaveForms SDK to connect to the first available device.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fdevice.py%23L49-L58&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +--> Optional: Connecting to a Specific Device #
 +<WRAP group><WRAP half column>
 +If you have multiple Test & Measurement devices connected, opening the first available device might not be the best option. If you want to open a specific type of device, use the function presented to the right.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fdevice.py%23L63-L117&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +<--
 +
 +--> Optional: Error Checking #
 +<WRAP group><WRAP half column>
 +You can check for errors, to know whether your device was connected to or not.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fdevice.py%23L121-L139&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +<--
 +----
 +
 +==== 3. Using Instruments ====
 +--> Oscilloscope #
 +<WRAP group>
 +=== 3.1 Initialize the Scope ===
 +<WRAP group><WRAP half column>
 +Before measuring with the oscilloscope, it must be set up. Change the values to fit your needs.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fscope.py%23L37-L64&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.2 Measure a Voltage ===
 +<WRAP group><WRAP half column>
 +You can measure voltages, like with the Voltmeter instrument in WaveForms.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fscope.py%23L68-L89&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.3 Record a Signal ===
 +<WRAP group><WRAP half column>
 +The most important feature of the oscilloscope is, that it can record signals. The recorded voltages can be stored in a list.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fscope.py%23L137-L172&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.4 Reset the Scope ===
 +<WRAP group><WRAP half column>
 +After usage, reset the oscilloscope to the default settings.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fscope.py%23L176-L181&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +--> Optional: Triggering #
 +<WRAP group><WRAP half column>
 +Before recording a signal, you might want to set up triggering. Set the trigger parameters to fit your needs.
 +
 +<WRAP center round tip 80%>
 +You can define custom trigger source names, to make the usage of the function easier.
 +</WRAP>
 +
 +<html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fscope.py%23L28-L33&style=github&showCopy=on"></script>
 +</html>
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fscope.py%23L93-L133&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +<--
 +----
 +</WRAP>
 +<--
 +
 +--> Waveform Generator #
 +<WRAP group>
 +=== 3.1 Generate a Signal ===
 +<WRAP group><WRAP half column>
 +Use the waveform generator to generate different signals.
 +
 +<WRAP center round tip 80%>
 +You can define custom function names, to make the usage of the function easier.
 +</WRAP>
 +
 +<html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fwavegen.py%23L28-L40&style=github&showCopy=on"></script>
 +</html>
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fwavegen.py%23L44-L98&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.2 Reset the Wavegen ===
 +<WRAP group><WRAP half column>
 +After usage, reset the wavegen to the default settings.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fwavegen.py%23L102-L107&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +----
 +</WRAP>
 +<--
 +
 +--> Power Supplies #
 +<WRAP group>
 +--> 3.1 Analog Discovery Supplies #
 +<WRAP group><WRAP half column>
 +The Analog Discovery has only fixed supplies, so just a limited number of functions are available.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fsupplies.py%23L28-L45&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +<--
 +
 +--> 3.1 Analog Discovery 2 and Analog Discovery Studio Supplies #
 +<WRAP group><WRAP half column>
 +These devices have variable positive and negative supplies, so a voltage level can also be set.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fsupplies.py%23L49-L76&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +<--
 +
 +--> 3.1 Analog Discovery Pro 3X50 and Digital Discovery Supplies #
 +<WRAP group><WRAP half column>
 +Devices with digital supplies have only positive voltage supplies with a variable voltage level between 1.2 and 3.3 Volts.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fsupplies.py%23L80-L94&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +<--
 +
 +--> 3.1 Analog Discovery Pro 5250 6V Power Supply #
 +<WRAP group><WRAP half column>
 +You can set not only the voltage for the 6V power supply on the Analog Discovery 5250, but also the current limit, up to 1A.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fsupplies.py%23L98-L117&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +<--
 +
 +--> 3.1 Analog Discovery Pro 5250 25V Power Supplies #
 +<WRAP group><WRAP half column>
 +The positive and negative isolated 25V power supplies are similar to the 6V one, but with a maximum current limit of 500mA.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fsupplies.py%23L121-L154&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +<--
 +
 +--> Optional: Power Supplies Wrapper Function #
 +<WRAP group><WRAP half column>
 +To make the usage of the above functions easier, you can create a wrapper function, which is able to call the function you need.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fsupplies.py%23L158-L257&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +<--
 +
 +=== 3.2 Reset the Supplies ===
 +<WRAP group><WRAP half column>
 +After usage, reset the supplies to the default settings.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fsupplies.py%23L261-L266&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +----
 +</WRAP>
 +<--
 +
 +--> Digital Multimeter - Only on ADP5250 #
 +<WRAP group>
 +=== 3.1 Initialize the DMM ===
 +<WRAP group><WRAP half column>
 +Before measuring with the digital multimeter, it must be enabled.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fdmm.py%23L28-L34&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.2 Measure With the DMM ===
 +<WRAP group><WRAP half column>
 +<WRAP center round important 60%>
 +This function was not tested.
 +</WRAP>
 +
 +You can use the digital multimeter to measure AC, or DC voltages (in Volts), with an input impedance of 10MΩ, or 10GΩ, low (<100mA), or high AC, or DC currents (up to 10A), resistance, conductance, temperature and more, with automatic, or fixed range.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fdmm.py%23L38-L108&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.3 Reset the DMM ===
 +<WRAP group><WRAP half column>
 +After usage, reset the instrument to the default settings.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fdmm.py%23L112-L120&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +----
 +</WRAP>
 +<--
 +
 +--> Logic Analyzer #
 +<WRAP group>
 +=== 3.1 Initialize the Logic Analyzer ===
 +<WRAP group><WRAP half column>
 +Before measuring with the logic analyzer, it must be set up. Change the values to fit your needs.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Flogic.py%23L28-L48&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.2 Record Logic Signals ===
 +<WRAP group><WRAP half column>
 +Record logic signals in a list of lists, then select the one specific for the required DIO line.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Flogic.py%23L99-L140&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.3 Reset the Logic Analyzer ===
 +<WRAP group><WRAP half column>
 +After usage, reset the logic analyzer to the default settings.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Flogic.py%23L144-L149&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +--> Optional: Triggering #
 +<WRAP group><WRAP half column>
 +Before recording a signal, you might want to set up triggering. Set the trigger parameters to fit your needs.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Flogic.py%23L52-L95&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +<--
 +----
 +</WRAP>
 +<--
 +
 +--> Pattern Generator #
 +<WRAP group>
 +=== 3.1 Generate Logic Signals ===
 +<WRAP group><WRAP half column>
 +Configure the pattern generator to generate logic signals.
 +
 +<WRAP center round important 80%>
 +You can use a DIO line for pattern generation only if the respective line is configured as input and set to LOW state by the static I/O instrument (these are the default settings for all lines).
 +</WRAP>
 +
 +<WRAP center round tip 80%>
 +You can define custom function and trigger source names, to make the usage of the function easier.
 +</WRAP>
 +
 +<html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fpattern.py%23L28-L32&style=github&showCopy=on"></script>
 +</html>
 +
 +<html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fpattern.py%23L36-L41&style=github&showCopy=on"></script>
 +</html>
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fpattern.py%23L45-L126&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.2 Reset the Pattern Generator ===
 +<WRAP group><WRAP half column>
 +After usage, reset the pattern generator to the default settings.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fpattern.py%23L130-L135&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +----
 +</WRAP>
 +<--
 +
 +--> Static I/O #
 +<WRAP group>
 +=== 3.1 Set Pins As Input Or As Output ===
 +<WRAP group><WRAP half column>
 +Each digital pin of the Test & Measurement device can be used only as input, or as output at a time. The default settings for each line are input states.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fstatic.py%23L28-L55&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.2 Get Pin State ===
 +<WRAP group><WRAP half column>
 +Read the state of a DIO line with the following code snippet:
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fstatic.py%23L59-L83&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.3 Set Pin State ===
 +<WRAP group><WRAP half column>
 +To set the state of a DIO line, it must be set as output!
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fstatic.py%23L87-L114&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.4 Reset the Static I/O ===
 +<WRAP group><WRAP half column>
 +After usage, reset the instrument to the default settings.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fstatic.py%23L210-L215&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +--> Optional: Limiting DIO Channel Current #
 +<WRAP group><WRAP half column>
 +Test & Measurement devices with digital supplies (the Digital Discovery and the Analog Discovery Pro 3X50) also have options to limit the output current of a DIO channel.
 +
 +<WRAP center round important 60%>
 +This function was not tested.
 +</WRAP>
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fstatic.py%23L118-L143&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +<--
 +
 +--> Optional: DIO Channel Pull Up/Down #
 +<WRAP group><WRAP half column>
 +Test & Measurement devices with digital supplies (the Digital Discovery and the Analog Discovery Pro 3X50) also have options to pull a DIO channel up, or down.
 +
 +<WRAP center round important 60%>
 +This function was not tested.
 +</WRAP>
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fstatic.py%23L147-L206&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +<--
 +----
 +</WRAP>
 +<--
 +
 +--> Protocol: UART #
 +<WRAP group>
 +=== 3.1 Initialize the Interface ===
 +<WRAP group><WRAP half column>
 +Before using a communication interface, it must be initialized by setting the communication parameters to the desired values.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fprotocol%2Fuart.py%23L28-L73&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.2 Receive Data ===
 +<WRAP group><WRAP half column>
 +Use the function to the right to read data on an initialized UART interface.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fprotocol%2Fuart.py%23L77-L130&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.3 Send Data ===
 +<WRAP group><WRAP half column>
 +Use the function to the right to send data on an initialized UART interface to another device.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fprotocol%2Fuart.py%23L134-L152&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.4 Reset the Interface ===
 +<WRAP group><WRAP half column>
 +After usage, reset the instrument to the default settings.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fprotocol%2Fuart.py%23L156-L161&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +----
 +</WRAP>
 +<--
 +
 +--> Protocol: SPI #
 +<WRAP group>
 +=== 3.1 Initialize the Interface ===
 +<WRAP group><WRAP half column>
 +Before using a communication interface, it must be initialized by setting the communication parameters to the desired values.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fprotocol%2Fspi.py%23L28-L78&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.2 Receive Data ===
 +<WRAP group><WRAP half column>
 +Use the function to the right to read data on an initialized SPI interface.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fprotocol%2Fspi.py%23L82-L107&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.3 Send Data ===
 +<WRAP group><WRAP half column>
 +Use the function to the right to send data on an initialized SPI interface to another device.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fprotocol%2Fspi.py%23L111-L140&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.4 Exchange Data ===
 +<WRAP group><WRAP half column>
 +You might want to receive data from a slave device while you are sending commands to it. In this case the data exchanging function can be used.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fprotocol%2Fspi.py%23L144-L182&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.5 Spy on SPI communication ===
 +<WRAP group><WRAP half column>
 +If two other devices, a master and a slave, are communicating using the initialized communication interface, the Test & Measurement device can be used to spy on this communication (record both incoming and outgoing data).
 +
 +<WRAP center round important 60%>
 +This function was not tested.
 +</WRAP>
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fprotocol%2Fspi.py%23L186-L292&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.6 Reset the Interface ===
 +<WRAP group><WRAP half column>
 +After usage, reset the instrument to the default settings.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fprotocol%2Fspi.py%23L296-L301&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +----
 +</WRAP>
 +<--
 +
 +--> Protocol: I2C #
 +<WRAP group>
 +=== 3.1 Initialize the Interface ===
 +<WRAP group><WRAP half column>
 +Before using a communication interface, it must be initialized by setting the communication parameters to the desired values.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fprotocol%2Fi2c.py%23L28-L68&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.2 Receive Data ===
 +<WRAP group><WRAP half column>
 +Use the function to the right to read data on an initialized I2C interface.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fprotocol%2Fi2c.py%23L106-L131&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.3 Send Data ===
 +<WRAP group><WRAP half column>
 +Use the function to the right to send data on an initialized I2C interface to another device.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fprotocol%2Fi2c.py%23L72-L102&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.4 Exchange Data ===
 +<WRAP group><WRAP half column>
 +You might want to receive data from a slave device while you are sending commands to it. In this case the data exchanging function can be used.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fprotocol%2Fi2c.py%23L135-L173&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.5 Spy on I2C communication ===
 +<WRAP group><WRAP half column>
 +If two other devices, a master and a slave, are communicating using the initialized communication interface, the Test & Measurement device can be used to spy on this communication (record both incoming and outgoing data).
 +
 +<WRAP center round important 60%>
 +This function was not tested.
 +</WRAP>
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fprotocol%2Fi2c.py%23L177-L238&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +
 +=== 3.6 Reset the Interface ===
 +<WRAP group><WRAP half column>
 +After usage, reset the instrument to the default settings.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fprotocol%2Fi2c.py%23L242-L247&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +----
 +</WRAP>
 +<--
 +
 +<WRAP group>
 +The code snippets above present basic functionality of some instruments. For more possibilities (advanced features and more instruments) check the documentation of the WaveForms SDK and the available sample scripts.
 +</WRAP>
 +----
 +==== 4. Disconnecting the Device ====
 +<WRAP group><WRAP half column>
 +When your script is exiting, it is very important to close the opened connections, to make the device available for other software (like the WaveForms application).
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fdevice.py%23L143-L148&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +----
 +===== Creating Modules =====
 +<WRAP group>
 +To avoid copying several hundred lines of code into every project, you can create Python modules from the functions controlling the instruments. These modules then can be imported in your project.
 +
 +To create a module, create a new file with the desired name and the extension ***.py**, then copy the respective functions into that file. Don't forget to also import the dwfconstants file into every module.
 +
 +Place your modules in a separate folder, name this folder (for example WF_SDK is a good name as it is suggestive), then copy the **dwfconstants.py** file into the same folder.
 +
 +<WRAP center round important 60%>
 +Don't forget to correct the import path of the **dwfconstants.py** file, if you import it from the project directory. The name of the parent directory (WF_SDK), followed by a dot must be added before the file name.
 +
 +If you import the file from the installation folder, no changes have to be made.
 +</WRAP>
 +
 +You can download the archive containing the module and some test files [[https://github.com/Digilent/WaveForms-SDK-Getting-Started/archive/refs/heads/master.zip|here]].
 +
 +Open the drop-downs below to see the content of the created modules.
 +</WRAP>
 +
 +--> Device Control - device.py #
 +<WRAP group><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fdevice.py&style=github&showCopy=on"></script>
 +</html></WRAP>
 +<--
 +
 +--> Oscilloscope Control - scope.py #
 +<WRAP group><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fscope.py&style=github&showCopy=on"></script>
 +</html></WRAP>
 +<--
 +
 +--> Waveform Generator Control - wavegen.py #
 +<WRAP group><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fwavegen.py&style=github&showCopy=on"></script>
 +</html></WRAP>
 +<--
 +
 +--> Power Supplies Control - supplies.py #
 +<WRAP group><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fsupplies.py&style=github&showCopy=on"></script>
 +</html></WRAP>
 +<--
 +
 +--> Digital Multimeter Control - supplies.py #
 +<WRAP group>
 +<WRAP center round important 60%>
 +This module contains untested functions.
 +</WRAP>
 +
 +<html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fdmm.py&style=github&showCopy=on"></script>
 +</html></WRAP>
 +<--
 +
 +--> Logic Analyzer Control - logic.py #
 +<WRAP group><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Flogic.py&style=github&showCopy=on"></script>
 +</html></WRAP>
 +<--
 +
 +--> Pattern Generator Control - pattern.py #
 +<WRAP group><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fpattern.py&style=github&showCopy=on"></script>
 +</html></WRAP>
 +<--
 +
 +--> Static I/O Control - static.py #
 +<WRAP group>
 +<WRAP center round important 60%>
 +This module contains untested functions.
 +</WRAP>
 +
 +<html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fstatic.py&style=github&showCopy=on"></script>
 +</html></WRAP>
 +<--
 +
 +--> Protocol: UART Interface - protocol/uart.py #
 +<WRAP group>
 +<html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fprotocol%2Fuart.py&style=github&showCopy=on"></script>
 +</html></WRAP>
 +<--
 +
 +--> Protocol: SPI Interface - protocol/spi.py #
 +<WRAP group>
 +<WRAP center round important 60%>
 +This module contains untested functions.
 +</WRAP>
 +
 +<html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fprotocol%2Fspi.py&style=github&showCopy=on"></script>
 +</html></WRAP>
 +<--
 +
 +--> Protocol: I2C Interface - protocol/i2c.py #
 +<WRAP group>
 +<WRAP center round important 60%>
 +This module contains untested functions.
 +</WRAP>
 +
 +<html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fprotocol%2Fi2c.py&style=github&showCopy=on"></script>
 +</html></WRAP>
 +<--
 +
 +<WRAP group>
 +As the created function set will be used as a module, an initializer is needed, to let the text editors recognize the module. This file contains only the description of the module and imports every file in the module, to make the functions accessible. The created file has to be named <html><b>__init__.py</b></html> and must be put in the module directory.
 +
 +After the file is created, your module will be recognized: the module name in the text editor will be colored (this depends on the editor) and if you hover the mouse on the module name, the module description appears.
 +
 +<html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2F__init__.py&style=github&showCopy=on"></script></html>
 +
 +Remember, that any submodule (the protocol folder in this case) also needs initialization:
 +<html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2FWF_SDK%2Fprotocol%2F__init__.py&style=github&showCopy=on"></script></html>
 +</WRAP>
 +----
 +
 +==== Testing ====
 +<WRAP group>
 +Copy your module folder (WF_SDK in this case) into the project directory, then create a new Python script. Import the necessary modules, then use your functions to control the Test & Measurement device.
 +
 +In the drop-downs below, several examples and a project template will be presented.
 +
 +**Note: ** //The example using the oscilloscope and the waveform generator won't work on devices without analog I/O capability (Digital Discovery).//
 +
 +**Note: ** //Name your test scripts "test_testname.py". This will be important if you want to install the module as a package.//
 +</WRAP>
 +
 +--> Empty Project Template #
 +<WRAP group><WRAP half column>
 +Fill in this template. Be creative, use any instrument in any configuration.
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2Ftest_template.py&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +<--
 +
 +--> Using the Oscilloscope and the Waveform Generator #
 +<WRAP group><WRAP half column>
 +This example generates a sinusoidal signal on a wavegen channel, then records it on a scope channel. Connect the respective channels together on your device!
 +
 +{{ :test-and-measurement:guides:scope-wavegen_bb.png?400 |}}
 +
 +{{ :test-and-measurement:guides:scope-wavegen.png?600 |}}
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2Ftest_scope-wavegen.py&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +<--
 +
 +--> Using the Logic Analyzer and the Pattern Generator #
 +<WRAP group><WRAP half column>
 +This example generates a PWM signal on a DIO line and reads it back with the logic analyzer. As the same line is used both as input and as output, no external connections have to be made.
 +
 +{{ :test-and-measurement:guides:logic-pattern.png?600 |}}
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2Ftest_logic-pattern.py&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +<--
 +
 +--> Using the Static I/O and the Power Supplies #
 +<WRAP group><WRAP half column>
 +Connect LEDs and series resistors to each DIO channel of your device. Use the positive, or the digital power supply to provide current to the LEDs, then use the Static I/O instrument to sink the currents (turn the LEDs on/off).
 +
 +{{ :test-and-measurement:guides:static-supplies_bb.png?600 |}}
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2Ftest_static-supplies.py&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +<--
 +
 +--> Controlling the Pmod CLS and the Pmod MAXSonar with UART #
 +<WRAP group><WRAP half column>
 +Connect the UART interface of both Pmods to your Test & Measurement device as presented below. Pay special attention to the jumpers on the Pmod CLS. Use the positive, or the digital power supply to provide current to the Pmods, then receive and send data with the protocol instrument.
 +
 +{{ :test-and-measurement:guides:cls-maxsonar-uart_bb.png?600 |}}
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2Ftest_UART_CLS-MAXSonar.py&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +<--
 +
 +--> Controlling the Pmod CLS and the Pmod ALS with SPI #
 +<WRAP group><WRAP half column>
 +Connect the SPI interface of both Pmods to your Test & Measurement device as presented below. Pay special attention to the jumpers on the Pmod CLS. Use the positive, or the digital power supply to provide current to the Pmods, then receive and send data with the protocol instrument.
 +
 +{{ :test-and-measurement:guides:cls-als-spi_bb.png?600 |}}
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2Ftest_SPI_CLS-ALS.py&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +<--
 +
 +--> Controlling the Pmod CLS and the Pmod TMP2 with I2C #
 +<WRAP group><WRAP half column>
 +Connect the I2C interface of both Pmods to your Test & Measurement device as presented below. Pay special attention to the jumpers on the Pmod CLS. Use the positive, or the digital power supply to provide current to the Pmods, then receive and send data with the protocol instrument.
 +
 +{{ :test-and-measurement:guides:cls-tmp2-i2c_bb.png?600 |}}
 +</WRAP><WRAP half column><html>
 +<script src="https://emgithub.com/embed.js?target=https%3A%2F%2Fgithub.com%2FDigilent%2FWaveForms-SDK-Getting-Started%2Fblob%2Fmaster%2Ftest_I2C_CLS-TMP2.py&style=github&showCopy=on"></script>
 +</html></WRAP></WRAP>
 +<--
 +----
 +
 +==== Installing the Package ====
 +<WRAP group>
 +Once you completed the package, you might want to install it, like other Python packages and use it on new projects as well. To do so, you must create some additional files in the project folder.
 +
 +First, exclude the test scripts from the final package. Create a file named **MANIFEST.in**, with the content:
 +<code>global-exclude test_*</code>
 +
 +The installer needs the list of dependencies to install your package. Specify this list on a file called **requirements.txt**:
 +<code>
 +setuptools==58.1.0
 +wheel==0.37.1</code>
 +
 +Finally, create a **README.md** file with the description of your package, then create the installer. The installer is the file named **setup.py**, with the following content:
 +<code python>
 +from setuptools import setup
 +
 +with open("README.md", "r") as f:
 +    long_description = f.read()
 +
 +setup(
 +   name = "WF_SDK",
 +   version = "1.0",
 +   description = "This module realizes communication with Digilent Test & Measurement devices",
 +   license = "MIT",
 +   long_description = long_description,
 +   author = "author_name",
 +   author_email = "author_email_address",
 +   url = "https://digilent.com/reference/test-and-measurement/guides/waveforms-sdk-getting-started",
 +   packages = ["WF_SDK", "WF_SDK.protocol"],
 +)
 +</code>
 +</WRAP>
 +
 +<WRAP group>
 +Once the necessary files are created, open a terminal, go to the project folder and install your package with the following command:
 +<code>pip install .</code>
 +
 +Alternatively, you can install the package from the GitHub repository, with the command:
 +<code>pip install git+https://github.com/Digilent/WaveForms-SDK-Getting-Started#egg=WF_SDK</code>
 +
 +**Note:** //Use "pip3" instead of "pip", if you are using Python 3.//
 +</WRAP>
 +----
 +
 +===== Other Programming Languages =====
 +<WRAP group>
 +Realizing the same package in other programming languages is also possible. To check the C++ version of the package and some test programs, follow [[https://github.com/Digilent/WaveForms-SDK-Getting-Started-Cpp|this]] link.
 +</WRAP>
 +----
 +===== Next Steps =====
 +<WRAP group>
 +For more guides on how to use your Digilent Test & Measurement Device, return to the device's Resource Center, linked from the [[test-and-measurement:start]] page of this wiki.
 +
 +For more information on the WaveForms SDK visit the [[software:waveforms:waveforms-sdk:start|WaveForms SDK Resource Center]].
 +
 +For more information on WaveForms visit the [[software:waveforms:waveforms-3:reference-manual|]]. 
 +
 +For technical support, please visit the [[https://forum.digilentinc.com/forum/8-test-and-measurement/|Test and Measurement]] section of the Digilent Forums.
 +</WRAP>