GUI Building for Test & Measurement Applications

Similar documents
There are two ways to launch Graphical User Interface (GUI). You can either

BUILDING A MATLAB GUI. Education Transfer Plan Seyyed Khandani, Ph.D. IISME 2014

Data Acquisition Toolbox Quick Reference Guide

Special Topics II: Graphical User Interfaces (GUIs)

The Language of Technical Computing. Computation. Visualization. Programming. Creating Graphical User Interfaces Version 1

The purpose of this tutorial is to introduce you to the Construct 2 program. First, you will be told where the software is located on the computer

Still More About Matlab GUI s (v. 1.3) Popup Menus. Popup Menu Exercise. Still More GUI Info - GE /29/2012. Copyright C. S. Tritt, Ph.D.

Mach4 CNC Controller Screen Editing Guide Version 1.0

INTRODUCTION TO MATLAB INTERACTIVE GRAPHICS EXERCISES

1. Make the recordings. 2. Transfer the recordings to your computer

Building a Graphical User Interface

VisualPST 2.4. Visual object report editor for PowerSchool. Copyright Park Bench Software, LLC All Rights Reserved

Working with PDF s. To open a recent file on the Start screen, double click on the file name.

MATLAB. Creating Graphical User Interfaces Version 7. The Language of Technical Computing

Introduction to Kaltura

Using Smart Search. Understanding Smart Search CHAPTER

Anatomy of a Window (Windows 7, Office 2010)

Center for Faculty Development and Support Making Documents Accessible

ME 365 EXPERIMENT 3 INTRODUCTION TO LABVIEW

INTRODUCTION TO THE MATLAB APPLICATION DESIGNER EXERCISES

Simply Personnel Screen Designer

How to Use Serif WebPlus 10

Graphical User Interface. GUI in MATLAB. Eng. Banan Ahmad Allaqta

Google LayOut 2 Help. Contents

Small rectangles (and sometimes squares like this

Reset Cursor Tool Clicking on the Reset Cursor tool will clear all map and tool selections and allow tooltips to be displayed.

MATLAB Project: Getting Started with MATLAB

Useful Google Apps for Teaching and Learning

12 Duplicate Clips and Virtual Clips

To familiarize of 3ds Max user interface and adapt a workflow based on preferences of navigating Autodesk 3D Max.

Fading Music into Voice

With ClaroIdeas you can quickly and easily create idea maps using a combination of words, symbols and pictures.

QUADRA-CHEK 2000 Demo User's Manual. Evaluation Unit

Working with Mailbox Manager

SCH Filter. Summary. Panel Access. Modified by Susan Riege on Jan 19, SCH Inspector. Parent page: Panels

4 TRANSFORMING OBJECTS

Document Editor Basics

L E S S O N 2 Background

OnCOR Silverlight Viewer Guide

Basic Data Acquisition with LabVIEW

Visual Physics - Introductory Lab Lab 0

ChemSense Studio Client Version 3.0.7

SolidWorks Intro Part 1b

Simulink Basics Tutorial

IT82: Multimedia Macromedia Director Practical 1

Randy H. Shih. Jack Zecher PUBLICATIONS

Dreamweaver 101. Here s the desktop icon for Dreamweaver CS5: Click it open. From the top menu options, choose Site and New Site

Session 3 Introduction to SIMULINK

ENVI Tutorial: Introduction to ENVI

Working with Images and Multimedia

Technology Assignment: Scatter Plots

Using Graph-N-Go With ODS to Easily Present Your Data and Web-Enable Your Graphs Curtis A. Smith, Defense Contract Audit Agency, La Mirada, CA

CHAPTER 1 COPYRIGHTED MATERIAL. Getting to Know AutoCAD. Opening a new drawing. Getting familiar with the AutoCAD and AutoCAD LT Graphics windows

Lectora Audio Editor Information Center

Tree and Data Grid for Micro Charts User Guide

Information Visualization

Prezi: Moving beyond Slides

With Dreamweaver CS4, Adobe has radically

ECE 202 LAB 1 INTRODUCTION TO LABVIEW

Multi-NVR Manager. Quick Start Configuration Usage

Emote 1.0 Users Manual

BASICS OF GRAPHICAL APPS

< building websites with dreamweaver mx >

MDA V8.1 What s New Functionality Overview

Welcome to noiselab Express 1.0

Introduction to MATLAB

2 The Stata user interface

TOP Server Client Connectivity Guide for National Instruments' LabVIEW

CounselLink Reporting. Designer

Contents. CRITERION Vantage 3 Analysis Training Manual. Introduction 1. Basic Functionality of CRITERION Analysis 5. Charts and Reports 17

IBM NetBAY Virtual Console Software. Installer and User Guide

ProPresenter-Scoreboard. A Renewed Vision Product

Adobe After Effects Tutorial

How do I make a basic composite or contact sheet?

Let s Make a Front Panel using FrontCAD

ENVI Classic Tutorial: Introduction to ENVI Classic 2

SolidWorks 2½D Parts

Dell Canvas Layout. Version 1.0 User s Guide

Guide to Editing Map Legends

3D Body. Summary. Modified by Admin on Sep 13, Parent page: Objects

Models for Nurses: Quadratic Model ( ) Linear Model Dx ( ) x Models for Doctors:

Reference Services Division Presents. Microsoft Word 2

Microsoft Word 2007 on Windows

DAQFactory U3 Tutorial Getting Started with DAQFactory-Express and your LabJack U3 11/3/06

build a digital portfolio in WebPlus X4

Software Introduction

User s guide to using the ForeTees TinyMCE online editor. Getting started with TinyMCE and basic things you need to know!

Lab 4 - Data Acquisition

Introduction to Dreamweaver CS3

Part I. Integrated Development Environment. Chapter 2: The Solution Explorer, Toolbox, and Properties. Chapter 3: Options and Customizations

Program and Graphical User Interface Design

Report Designer Report Types Table Report Multi-Column Report Label Report Parameterized Report Cross-Tab Report Drill-Down Report Chart with Static

Electronic Portfolios in the Classroom

Bucknell University Digital Collections. LUNA Insight User Guide February 2006

Gallios TM Quick Reference

AEMLog Users Guide. Version 1.01

Quick Tips to Using I-DEAS. Learn about:

Computer Essentials Session 1 Step-by-Step Guide

Baseline dimension objects are available for placement in the PCB Editor only, by clicking Home

Customizing FlipCharts Promethean Module 2 (ActivInspire)

Transcription:

by: Ahmed Abdalla, The MathWorks GUI Building for Test & Measurement Applications This article demonstrates how you can utilize the below-listed products to create a custom test and measurement GUI application that acquires and displays data from a PC sound card. These examples require the use of a Windows-based PC, as well as MATLAB 6.5 (R13) and the Data Acquisition Toolbox 2.2. GUIDE (Graphical User Interface Development Environment) a built-in drag-and-drop interface for constructing GUIs The Data Acquisition Toolbox a product that allows the user to interface MATLAB with many NI-DAQ, MCC, and other boards The examples in this article assume that you have familiarity with GUIDE and have read the Creating a GUI example in the GUIDE documentation at the following URL: http://www.mathworks.com/access/helpdesk/help/techdoc/creating_guis/simple_g.shtml The examples also assume that you are familiar with test and measurement concepts and have gone through the Getting Started with the Data Acquisition Toolbox section at the following URL: http://www.mathworks.com/access/helpdesk/help/toolbox/daq/c2_getst.shtml#10972 This article will describe phases of an application. Each successive phase is more complex than the previous and describes the functions used to create the example. The source code for the examples is available in MATLAB Central at: http://www.mathworks.com/matlabcentral/fileexchange/loadfile.do?objectid=2549&objecttype=file# Phase 1: Displaying Acquired Data to an Axis This example is intended to familiarize you with GUI creation and the data acquisition session by creating a simple GUI whose only purpose is to plot data as it is being acquired. Open up a new GUI in the Layout Editor and add components Open a new GUI in GUIDE and specify the size of the GUI by resizing the grid area in the Layout Editor. Click on the lower right-hand corner and resize the grid until it is approximately 3 x-4 inches or how you see fit. Add three push buttons and an axes. Arrange them as shown in the following figure. Resize the axes component by selecting it with the mouse and then clicking and dragging a corner. Try using the Align Objects tool to vertically align the buttons. COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 1

Set the general properties for the GUI components You can use the Property Inspector to set the properties of each GUI component. To open the Property Inspector, select Property Inspector from the View menu. When a component is selected in the Layout Editor, the Property Inspector is automatically updated to display the selected component. If no component is selected, the Property Inspector displays the properties of the GUI figure. Select the top Push Button component and view its properties as shown in the following figure. COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 2

Notice that the Callback property is set to %automatic. This means that GUIDE automatically generates an empty callback (or framework for a callback) when the GUI is saved. We will add code to the Callback later. For the top button, set the String property to Start and the Tag property to Start. For the middle button, set the String property to Stop and the Tag property to Stop. For the bottom button, set the String property to Close and the Tag property to Close. For the axis, set the Tag property to Axes. Double-click on the GUI background to bring up the properties for the figure.set the DoubleBuffer property to On and the Name property to Phase1: daq2axis. Save this GUI as daq2axis. This step should bring up the GUI M-file, which we will edit later. The GUI M-file contains all the callbacks that are used by our application when it performs an action. Notice that if you take a look at the Callback property for any of your buttons, it is no longer %automatic. Looking at the Stop button, we should see something similar to daq2axis('stop_callback',gcbo,[],guidata(gcbo). If you had already saved your GUI previous to this step then you may see something different because the callback name that is COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 3

generated depends on the Tag that is used for that particular component. Change the Callback property back to %automatic and resave your GUI. Thinking ahead, we know that we want the GUI to close in the same fashion whether we click on the 1 Close button or the X button in upper right-hand corner of the title bar. With this in mind, copy the Close button Callback property and paste it in the CloseRequestFcn of the figure's properties. If you click on the Run button in GUIDE (green triangle), you should see something similar to: Note that the buttons do not do anything yet because we haven't written any code for their callbacks. Edit the GUI M-file At this point, we need to define what actions the GUI will perform by programming the GUI M-file. For this simple case, we can do most of the coding in the daq2axis_openingfcn(hobject, eventdata, handles, varargin). Since the code in this function is the first to run once the GUI is created, we can initialize the GUI elements (such as axis) and create the data acquisition ANALOGINPUT object to read from your PC's sound card here. The ANALOGINPUT object is created and the channels are added with the following code: daq_object = analoginput('winsound'); chan = addchannel(daq_object,[1 2]); We can use the SamplesAcquiredFcn function of an ANALOGINPUT object to execute a series of commands every time a certain number of samples are acquired. A line similar to the following should be used after creating the DAQ object so that the plot is continuously updated after a specified number of samples, num_samples, are collected: set(daq_object,'samplespertrigger',inf,'samplesacquiredfcncount',num_samples,... 'SamplesAcquiredFcn',{@update_plot,handles}); COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 4

After we create the data acquisition object, it needs to be accessible to the rest of the functions in the GUI. In order to accomplish this, we can add the daq_object variable to the Handles structure. For more information on the Handles structure and sharing information in your GUI, please see the Sharing Data Between Callbacks section of the GUIDE documentation. We can use DAQ callbacks to specify a function called update_plot, which will update the data in the axes. We will use Handle Graphics (the SET command in particular) to update the YData property of the plot. The code used in this callback is: data = getdata(handles.daq_object,handles.num_samples); for i = 1:length(handles.plot_handle) set(handles.plot_handle(i),'ydata',data(:,i)); end The start_callback(hobject, eventdata, handles), stop_callback(hobject, eventdata, handles) and close_callback(hobject, eventdata, handles) callbacks are all very small. Each of the callbacks in this case has a very specific function, which is to start acquisition using the Start command, stop acquisition with the Stop command, and close the GUI with the Close command, respectively. You can now save the GUI M-file. When you launch the GUI now, it should look similar to the figure below. Run the GUI Run the GUI by either pressing the Run button (green triangle) in the GUIDE window or typing the name of the GUI at the MATLAB command prompt. Press Start and watch the signal that is being acquired on your sound card (signal from a CD, MP3, etc.). COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 5

Phase 2: Displaying Data to Axes and Acquiring User Input This phase shows how to control some parameters of the data acquisition session. In this phase, we will begin developing a more sophisticated application whose functionality will grow in Phase 3 and Phase 4. We will create a GUI that will plot data from each channel to its own axis as it is being acquired. We will also set the sample rate and the duration of the acquisition session. Open up a new GUI in the Layout Editor and add components Open a new GUI in GUIDE and specify the size of the GUI by resizing the grid area in the Layout Editor. Add 7 static text fields, 2 text edit fields, 2 axes, and 3 push buttons and arrange them in a similar manner to that shown in the following figure. Resize the axes component by selecting it with the mouse and then clicking and dragging a corner. Try using the Align Objects tool to vertically align the buttons. COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 6

You can now add a frame to your GUI. Resize and position the frame so that it covers the 7 static text fields and the 2 text edit fields. Set the general properties for the GUI components To view the 7 static text fields and the 2 text edit fields again, right-click on the frame and choose Send to Back. To set the properties of each GUI component, select the Property Inspector from the View menu to display the Property Inspector. When you select a component in the Layout Editor, the Property Inspector displays the component's properties. If no component is selected, the Property Inspector displays the properties of the GUI figure. Double-click on the GUI background to bring up the Property Inspector of the GUI figure. Set the Name field to Phase 2: daq2axisfield and set the DoubleBuffer property to On. Double-click on the top axis to view its properties and change the Tag property to axesl (left channel). Double-click on the bottom axis to view its properties and change the Tag property to axesr (right channel). Double-click on the left most push button and set the String property to Start and the Tag property to Start. For the button to the left, set the String property to Stop and the Tag property to Stop. For the last button, set the String property to Close and the Tag property to Close. Double-click on the top text edit field and change the Tag property to sample_rate. Change the Tag property of the text edit field below that to duration. Double-click on the top most static text field (this field will be the label of the frame) and set the String property to Modifiable Parameters. Working your way down from there, set the String property of the next 4 static text fields to the following respectively: Sample Rate, Current Sample Rate (Hz), Duration, Current Duration (sec). You can resize the text fields so that all strings display correctly. For the remaining 2 text fields, set the String property to '' (empty) and set the Tag properties to current_fs and current_dur respectively. Your GUI should now look similar to the following figure. COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 7

Notice that there are 2 invisible text fields (highlighted in the figure above) that are there but are not visible. We will use these later to show what the currently stored sample rate and duration values are. Save this GUI as daq2axisfield. This step should bring up the GUI's M-file counterpart, which we will edit later on in this phase so that our application performs an action. Notice that if you look at the Callback property for any of your buttons, it is no longer %automatic. Looking at the Stop button, we should see something similar to daq2axisfield('stop_callback',gcbo,[],guidata(gcbo)). If you had already saved your GUI previous to this step then you may see something different. Change the Callback property back to %automatic and resave your GUI. Thinking ahead, we know that we want the GUI to close in the same fashion whether it is the Close button that is clicked or the X button in the upper right-hand corner of the title bar. With this in mind, copy the Close button Callback property and paste it in the CloseRequestFcn of the figure's properties. If you click on the Run button in GUIDE (green triangle), you should see something similar to: COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 8

Note that the buttons do not do anything yet because we haven't written any code for their callbacks. Edit the GUI M-file At this point, we will define what actions the GUI will perform by programming the GUIDE-generated M-file. For this case, we can use the daq2axisfield_openingfcn(hobject, eventdata, handles, varargin) callback to initialize the GUI elements (such as axis and text fields) and create the data acquisition ANALOGINPUT object to read from your PC's sound card. Thinking ahead to the error checking in the callback for the sample rate input field, we can also use the DAQHWINFO command to find out what the minimum and maximum sample rates supported by the board are (e.g., daqhwinfo(daq_object)). DAQHWINFO can be used to return information (such as minimum and maximum sample rate capabilities) about the data acquisition board that is being used. As in Phase 1, a line similar to the following should be used after creating the DAQ object so that the plot is continuously updated after a specified number of samples, num_samples, are collected: set(daq_object,'samplespertrigger',inf,'samplesacquiredfcncount',num_samples,... 'SamplesAcquiredFcn',{@update_plot,handles}, 'StopFcn',{@stop_daq,handles}, 'StartFcn',{@start_daq,handles}); We can use DAQ callbacks to specify a function called update_plot that will update the data in the axes. The heart of this function will be the use of Handle Graphics (the SET command in particular) to update the YData property of the plot. We can also use DAQ callbacks to specify the function start_daq for the StartFcn property and stop_daq for the StopFcn property, which will execute when acquisition starts and stops respectively. In this case, we can just use these callback functions to enable/disable GUI elements depending on the Running status of the DAQ object. Since we are allowing the user to enter the sample rate, there will be some error checking involved in the sample_rate_callback(hobject, eventdata, handles) function. We can make sure COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 9

that the specified sample rate is within the minimum and maximum bounds for the card being used (remember that we obtained this information in the OpeningFcn). A good function to use in this callback is SETVERIFY. This function will set the DAQ object sample rate to the specified value and will return the true sample rate as seen by the object since sound cards generally only support a support a subset of sample rates. Error checking for the duration parameter can be performed in duration_callback(hobject, eventdata, handles). Here, check to make sure that the duration specified is either a number or Inf. The start_callback(hobject, eventdata, handles), stop_callback(hobject, eventdata, handles), and close_callback(hobject, eventdata, handles) callbacks are all very short. Each of the callbacks in this case has a very specific function: to start acquisition, stop acquisition, and close the GUI, respectively. You can now save the GUI M-file. When you launch the GUI now, it should look similar to the figure below. Run the GUI Run the GUI by either pressing the Run button (green triangle) in the GUIDE window or typing the name of the GUI at the MATLAB command prompt. Press Start and watch the signal that is being acquired on your sound card (signal from a CD, MP3, etc.). Try changing the duration and sample rate parameters during your session. COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 10

Phase 3: Displaying, Saving, and Playing Data and Acquiring User Input We will build upon the application developed in Phase 2 to create a GUI that will plot data from each channel to its own axis as it is being acquired, allow the user to set the sample rate and the duration of the acquisition session, and also allow the user to save and play back the acquired data. Open up the Phase 2 GUI in the Layout Editor and add/edit components Open the Phase 2 GUI in GUIDE by choosing File -> Open, and then selecting the GUI s name. Leave the static text fields, text edit fields, and axes unchanged. Replace the Start push button with a toggle button and leave the other 2 push buttons unchanged. COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 11

Set the general properties for the GUI components The properties of each GUI component should be left unchanged except for the toggle button and the Stop button. Select the Property Inspector from the View menu to display the Property Inspector. When you select a component in the Layout Editor, the Property Inspector displays the component's properties. If no component is selected, the Property Inspector displays the properties of the GUI figure. Double-click on the GUI background to bring up the property inspector of the GUI figure and set the Name field to Phase 3: daq2axisfieldplay and set the DoubleBuffer property to On. Double-click on the toggle button and set the String property to Start and the Tag property to start_stop. Double-click on the currently labeled Stop push button and set the String property to Play and the Tag property to Play. You will need to regenerate the push button s callback stub. To do so, set the Callback property to %automatic. Your GUI should now look similar to the following figure. COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 12

Notice that similar to Phase 2, there are 2 invisible text fields. Now let us set up the Menu. Click on Tools -> Menu Editor to bring up the Menu Editor GUI. Click on the New Menu icon to add a new top-level menu. Highlight the new Untitled 1 menu item to view its properties. Edit the label to say File and the tag to say File. Click on the New Menu Item icon to add a new item to our top level File menu. Highlight the Untitled 2 menu item to view its properties. At this point, your menu should look similar to the following. COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 13

Edit the label for this menu item to say Save and the tag to Save. Highlight the File menu item and add another menu item under it by clicking the New Menu Item icon. Highlight this Untitled 3 menu item and change the label to say Close and the tag to say Close. You can also check the Separator above this item option to get a horizontal line separator in the final menu. Save this GUI as daq2axisfieldplay. This step should bring up the GUI's M-file counterpart, which we will edit later so that our application performs an action. Notice that if you look at the Callback property for any of your buttons, it is no longer %automatic. Looking at the Stop button, we should see something similar to daq2axisfield('stop_callback',gcbo,[],guidata(gcbo)). If you had already saved your GUI previous to this step then you may see something different. In this instance, change the Callback property back to %automatic and resave your GUI. Thinking ahead, we know that we want the GUI to close in the same fashion whether it is the Close button that is clicked or the X button in the upper right-hand corner of the title bar. With this in mind, copy the Close button Callback property and paste it in the CloseRequestFcn of the figure's properties. If you click on the Run button in GUIDE (green triangle), you should see something similar to: COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 14

Note that the buttons do not do anything yet because we haven't written any code for their callbacks. Edit the GUI M-file At this point, we will define what actions the GUI will perform by programming the GUIDE generated M-file. We can use the daq2axisfieldplay_openingfcn(hobject, eventdata, handles, varargin) callback to initialize the GUI elements (such as axis and text fields) and create the data acquisition ANALOGINPUT object to read from your PC's sound card. We will leave this callback mostly unchanged from Phase 2 except that a line similar to the following should be used after creation of the ANALOGINPUT object: set(daq_object,'loggingmode','disk','logfilename','untitled.daq',... 'StartFcn',{@start_daq,handles},'StopFcn',{@stop_daq,handles}); Notice that the logging mode of the data acquisition object is now different. We are choosing to stream data directly to the hard disk in a file called untitled.daq. This means that we can avoid worrying about the buffer size for large acquisitions and we can access the acquired data after the session is over. We can also create an ANALOGOUTPUT object to play back the acquired waveform to your PC's sound card: set(daq_object_out,'startfcn',{@start_daq_out,handles},'stopfcn',{@stop_daq_out,handl es}); We are using the same callback strategy that we have already used in Phase 2 to set a start_daq_out and stop_daq_out function for the output DAQ object daq_object_out. COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 15

The sample rate and duration callbacks should be left unchanged from Phase 2. When the user calls play_callback(hobject, eventdata, handles) by clicking on the Play button, we can start the ANALOGOUTPUT DAQ object here. If there is no data to play back (i.e., none has been acquired), we can return a meaningful message to let the user know that data must be acquired first before playing. The save functionality can be implemented in save_callback(hobject, eventdata, handles) which is executed when the user chooses the Save option from the File menu. You can add the ability to save.daq files by renaming the acquired.daq file. The ability to save.mat files can be added by using daqread to read in the acquired data and then using the SAVE command to save the data as a.mat file: [data time] = daqread('untitled.daq'); save([path filename '.mat'],'data','time'); There is no separate start and stop callback in this case because we used a toggle button. Starting and stopping ANALOGINPUT acquisition will be similar to the previous phases, but all the code will be contained in a single start_stop_callback(hobject, eventdata, handles). The close_callback(hobject, eventdata, handles) callback is more complicated in this phase because you need to make sure that both the input and output DAQ objects are not running and have been deleted before exiting the GUI: if(strcmp(handles.daq_object.running,'on')) stop(handles.daq_object); end if(strcmp(handles.daq_object_out.running,'on')) stop(handles.daq_object_out); end delete(handles.daq_object); delete(handles.daq_object_out); clear handles.daq_object handles.daq_object_out; if exist('untitled.daq') delete untitled.daq; end delete(handles.figure1) You can now save the GUI M-file. When you launch the GUI now, it should look similar to the figure below. COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 16

Run the GUI Run the GUI by either pressing the Run button (green triangle) in the GUIDE window or typing the name of the GUI at the MATLAB command prompt. Press Start and watch the signal that is being acquired on your sound card (signal from a CD, MP3, etc.). Try changing the Duration and Sample Rate parameters during your session. Press Stop to stop acquiring data and then press Play to listen to your signal. Try saving the acquired signal as a.daq or a.mat file. COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 17

Phase 4: Displaying, Saving, and Playing Data; Acquiring User Input, and More We will build upon the application developed in Phase 3 to create a GUI that will plot data from each channel to its own axis as it is being acquired, allow the user to set the sample rate and the duration of the acquisition session, and allow the user to save, export, play back, and pan through the acquired data. This GUI will also provide an example of how to use images on your GUI uicontrols (push/toggle buttons). Open up the Phase 3 GUI in the Layout Editor and add/edit components Open the Phase 3 GUI in GUIDE by choosing File -> Open and then selecting the GUI s name. Leave the static text fields, text edit fields, axes, toggle button, and push buttons unchanged. Add one axes and one slider and arrange them in a similar manner to that shown in the following figure. Resize the new axes component by selecting it with the mouse and then clicking and dragging a corner. Set the general properties for the GUI components To set the properties of each GUI component, select the Property Inspector from the View menu to display the Property Inspector. When you select a component in the Layout Editor, the Property Inspector displays the component's properties. If no component is selected, the Property Inspector COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 18

displays the properties of the GUI figure. All of the elements from Phase 3 will remain unchanged but the new elements will need some edits. Double-click on the GUI background to bring up the Property Inspector of the GUI figure and set the Name field to Phase 4:SoundRecorder Demo and set the DoubleBuffer property to On. Double-click on the bottom axis and change the Tag property to sig. Double-click on the slider and set the Tag to chan1slider. Your GUI should now look similar to the following figure. Now we will edit the Menu. Click on Tools -> Menu Editor to bring up the Menu Editor GUI. You should already see a top-level menu called File with two menu items that we created in Phase 3: Save As and Close. Highlight the File menu item and add another menu item under it by clicking the New Menu Item icon. Highlight this Untitled 3 menu item and change the label to say Send To and the tag to say send_to. You can also check the Separator above this item option to get a horizontal line separator in the final menu. COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 19

Highlight the Send To menu item and add another menu item under it by clicking the New Menu Item icon. Highlight this Untitled 5 menu item and change the label to say Workspace and the tag to say send_to_workspace. Add two more menu items on the same level as Workspace with their labels set to Figure and SPTool and their tag set to send_to_figure and send_to_sptool, respectively. Add a new top-level menu by clicking the New Menu icon. Set the label to Help and the tag to Help. Add three new menu items to this Help menu by using the New Menu Item icon. Set the labels of these to SoundRecorderDemo Information, Data Acqusition Toolbox, and More Demos... and set the tags to SRD_help, daq_help, and demos_help, respectively. Your menu tree should now look like the following: Save this GUI as SoundRecorderDemo. This step should bring up the GUI's M-file counterpart, which we will edit later so that our application performs an action. If you had already saved your GUI previous to this step then change the Callback properties back to %automatic and resave your GUI so that appropriately named callback functions are generated. Thinking ahead, we know that we want the GUI to close in the same fashion whether it is the Close menu item that is selected or the X button in the upper right-hand corner of the title bar. With this in COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 20

mind, copy the Close menu item Callback property and paste it in the CloseRequestFcn of the figure's properties. If you click on the Run button in GUIDE (green triangle), you should see something similar to: Note that the buttons do not do anything yet because we haven't written any code for their callbacks. Edit the GUI M-file At this point, we will define what actions the GUI will perform by programming the GUIDE generated M-file. We can use the same OpeningFcn callback to initialize the GUI elements (such as axis and text fields). We can create the data acquisition ANALOGINPUT object to read from your PC's sound card and an ANALOGOUTPUT object to play back to your PC's sound card. This callback will remain unchanged from Phase 3 except that we will add some extra code to initialize the added GUI elements. Use a line similar to the following after creating your DAQ input object: set(handles.daq_object,'loggingmode','disk','logfilename',[handles.fname '.daq'],... 'StartFcn',{@start_daq,handles},'StopFcn',{@stop_daq,handles}); Note that the data logging method is unchanged from Phase 3. We will also want to use the same callback strategy to set a start_daq_out and stop_daq_out function for the ANALOGOUTPUT DAQ object daq_object_out. We can use a line such as the following so that we know how many samples are output to the soundcard. This will enable us to update our GUI to indicate that playback is progressing: COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 21

set(handles.daq_object_out,'samplerate',fs,'samplesoutputfcncount',preview,'samples OutputFcn',{@selectRegion,handles,2}); The selectregion function is a custom function that will update GUI elements every time the SamplesOutputFcn callback is run. The duration, sample rate, and close callbacks should be unchanged from Phase 3. The slider callback function, chan1slider_callback(hobject, eventdata, handles), will be more involved to create. In this callback, the slider will have to update all the axes appropriately to show the full signal and the local (zoomed-in) signal. This can be accomplished using the SET command to set the plot XData and YData properties. When the user calls play_callback(hobject, eventdata, handles) by clicking on the Play button, we can start the ANALOGOUTPUT DAQ object here. If there is no data to acquire, let the user know. The save functionality already implemented in save_as_callback(hobject, eventdata, handles) can be left unchanged but we can add the ability to save.wav files by using WAVWRITE. The export functionality can allow the user to continue processing data immediately after the data acquisition session has ended. You can use the EVALIN command to send the acquired data to the workspace. You can use the PLOT and SUBPLOT commands to send the data to a figure and the SPTOOL command to send the data to SPTOOL if it is installed. If you would like existing MATLAB documentation to be displayed from the Help menu, use the DOC command. If you would like to point to your own HTML documentation, use the WEB command. There are no separate Start and Stop callbacks in this case because we used a toggle button so that the example would very similar to the callback from Phase 3. However, we also need to add the functionality of loading the acquired data into the GUI to populate the full signal axes. We can also make the call to an update_plot function, which does the work of updating the current signal axes with data as it is being acquired. The graphics on the push buttons can be implemented by writing a simple iconize function, which subsamples the image to fit a particular size. For example the iconize function may look like: function out = iconize(a) % 'a' is an image that is read into MATLAB using IMREAD [r,c,d] = size(a); r_skip = ceil(r/18); c_skip = ceil(c/18); out = a(1:r_skip:end,1:c_skip:end,:); COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 22

You can now save the GUI M-file. When you launch the GUI now, it should look similar to the figure below. Run the GUI Run the GUI by either pressing the Run button (green triangle) in the GUIDE window or typing the name of the GUI at the MATLAB command prompt. Press Start and watch the signal that is being acquired on your sound card (signal from a CD, MP3, etc.). Try changing the Duration and Sample Rate parameters during your session. Press Stop to stop acquiring data and the press Play to listen to your signal. Try saving the acquired signal as a.daq,.mat, or.wav file. Try exporting the acquired signal to the workspace or another figure. If you have problems seeing the signal at this point, make sure that you have Windows configured correctly so that you are recording from the appropriate source. For more information on this issue, please see the Data Acquisition Toolbox documentation at the following URL: http://www.mathworks.com/access/helpdesk/help/toolbox/daq/a1_hard8.shtml#9081 Conclusion Using existing MATLAB tools such as GUIDE and Handle Graphics along with the Data Acquisition Toolbox can enable you to develop aesthetically appealing and fully functional GUI applications in a relatively short amount of time. The level of complexity of your GUI will depend upon your application needs. COPYRIGHT 2003 The MathWorks, Inc. All Rights Reserved. 23