Index: /ossiedev/branches/cdietric/waveform_gui/OSSIEAMFMReceiver.py
===================================================================
--- /ossiedev/branches/cdietric/waveform_gui/OSSIEAMFMReceiver.py	(revision 10975)
+++ /ossiedev/branches/cdietric/waveform_gui/OSSIEAMFMReceiver.py	(revision 10975)
@@ -0,0 +1,585 @@
+#!/usr/bin/python
+'''****************************************************************************
+
+Copyright 2010, 2011 Virginia Polytechnic Institute and State University
+and Brittany McNair
+
+This file is part of the OSSIE AM/FM Receiver
+
+This file is for use with OSSIE 0.8.2 and the Ettus USRP 1 RF front end, 
+and controls the AMReceiverDemo2USRP1 and FMReceiverDemo2USRP1 waveforms.
+
+OSSIE AM/FM Receiver is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with OSSIE AM/FM Receiver; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+****************************************************************************'''
+
+import wx
+from wavedash.src.WaveformModel import *
+from wavedash.src.WavedashUtils import WaveAppCORBA
+from wavedash.src.WavedashController import Controller #from WavedashModel import * --> it is already in wavedashController
+import time
+from numpy import*
+import os
+from alf_plugins.plot.plot import *
+
+class Messages(wx.Frame):
+	def __init__(self, parent, id, title):
+		# Frame and panels
+		wx.Frame.__init__(self, parent, id, title, size=(640, 300))
+		self.Bind(wx.EVT_CLOSE, self.OnClose)
+
+		sunk = wx.RAISED_BORDER
+		self.panel1 = wx.Panel(self, -1, style=sunk)
+		self.panel2 = wx.Panel(self, -1, style=sunk)
+		self.panel3 = wx.Panel(self, -1, style=sunk)
+		self.panel4 = wx.Panel(self, -1, style=sunk)
+		self.panel5 = wx.Panel(self, -1, style=sunk)
+
+		# Waveform selection buttons and bindings
+		self.AMSelectButton = wx.RadioButton(self.panel1, -1, "AM",
+			pos=(20, 30))
+		self.NBFMSelectButton = wx.RadioButton(self.panel1, -1, " Narrowband FM",
+			pos=(20, 50))
+		self.WBFMSelectButton = wx.RadioButton(self.panel1, -1, " Wideband FM",
+			pos=(20, 70))
+		self.label2 = wx.StaticText(self.panel1, -1, "Select Modulation" , (20, 10))
+		modulationFont = self.label2.GetFont()
+		modulationFont.SetWeight(wx.FONTWEIGHT_BOLD)
+		self.label2.SetFont(modulationFont)
+
+		self.AMSelectButton.Bind(wx.EVT_RADIOBUTTON, self.StartAMWaveform)
+		self.NBFMSelectButton.Bind(wx.EVT_RADIOBUTTON, self.StartNBFMWaveform)
+		self.WBFMSelectButton.Bind(wx.EVT_RADIOBUTTON, self.StartWBFMWaveform)
+
+		
+
+		# Controls for transceiver (not used)
+		#self.trans = wx.RadioButton(self.panel3, -1, "Transmit",
+		#	pos=(10, 150))
+		#self.rec = wx.RadioButton(self.panel3, -1, "Receive",
+		#	pos=(10, 200))
+
+		#self.trans.Bind(wx.EVT_RADIOBUTTON, self.Transmit)
+		#self.rec.Bind(wx.EVT_RADIOBUTTON, self.Receive)
+
+
+		# AM frequency slider
+		self.AMTitle = wx.StaticText(self.panel2, -1, "AM Broadcast" , (20, 10))
+		AMFont = self.AMTitle.GetFont()
+		AMFont.SetWeight(wx.FONTWEIGHT_BOLD)
+		self.AMTitle.SetFont(AMFont)
+		self.AMFrequencySlider = wx.Slider(self.panel2, -1, 0, 520, 1620, (20, 40), (450, -1),
+			wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_LABELS)
+		self.AMFrequencySlider.SetLineSize(10)
+		self.AMFrequencySlider.SetPageSize(100)
+		self.AMText = wx.StaticText(self.panel2, -1, "Frequency (kHz) " , (20,80))
+
+		# Narrowband FM frequency slider
+		self.NBFMTitle = wx.StaticText(self.panel2, -1, "Narrowband FM (VHF)" , (20,10))
+		NBFMFont = self.NBFMTitle.GetFont()
+		NBFMFont.SetWeight(wx.FONTWEIGHT_BOLD)
+		self.NBFMTitle.SetFont(NBFMFont)
+		self.NBFMTitle.Hide()
+		self.NBFMFrequencySlider = wx.Slider(self.panel2, -1, 0, 144000, 164000, (20, 40), (450, -1),
+			wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_LABELS)
+		self.NBFMFrequencySlider.SetLineSize(5)
+		self.NBFMFrequencySlider.SetPageSize(200)
+		self.NBFMText = wx.StaticText(self.panel2, -1, "Frequency (kHz)" , (20, 80))
+		self.NBFMFrequencySlider.Hide()
+		self.NBFMText.Hide()
+
+		# Wideband FM frequency slider
+		self.WBFMTitle = wx.StaticText(self.panel2, -1, "Wideband FM Broadcast" , (20,10))
+		wband = self.WBFMTitle.GetFont()
+		wband.SetWeight(wx.FONTWEIGHT_BOLD)
+		self.WBFMTitle.SetFont(wband)
+		self.WBFMTitle.Hide()
+		self.WBFMFrequencySlider = wx.Slider(self.panel2, -1, 0, 88000, 108000, (20, 40), (450, -1),
+			wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_LABELS)
+		self.WBFMFrequencySlider.SetLineSize(100)
+		self.WBFMFrequencySlider.SetPageSize(1000)		
+		self.WBFMText = wx.StaticText(self.panel2, -1, "Frequency (kHz)" , (20, 80))
+		self.WBFMFrequencySlider.Hide()
+		self.WBFMText.Hide()
+
+		# Sliders for volume and squelch
+		self.volumeSlider = wx.Slider(self.panel4, -1, 0, 0, 10, (20, 10), (200,-1),
+			wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_LABELS)
+		self.volumeSlider.SetValue(1)
+		self.volume = wx.StaticText(self.panel4, -1, "Volume" , (20, 50))
+		volumeFont = self.volume.GetFont()
+		volumeFont.SetWeight(wx.FONTWEIGHT_BOLD)
+		self.volume.SetFont(volumeFont)
+
+		self.squelchSlider = wx.Slider(self.panel4, -1, 0, 0, 100, (270, 10), (200, -1),
+			wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_LABELS)
+		self.squelchText = wx.StaticText(self.panel4, -1, "Squelch" , (270, 50))
+		squelchFont = self.squelchText.GetFont()
+		squelchFont.SetWeight(wx.FONTWEIGHT_BOLD)
+		self.squelchText.SetFont(squelchFont)
+
+		# Mute button
+		self.muteButton = wx.CheckBox(self.panel4, wx.ID_ANY, 'Mute', pos=(80, 48))
+		muteFont = self.muteButton.GetFont()
+		self.muteButton.Bind(wx.EVT_CHECKBOX, self.Mute)
+
+		# Audio boost button
+		self.boostButton = wx.CheckBox(self.panel4, wx.ID_ANY, '+20dB', pos=(140, 48))
+		boostFont = self.boostButton.GetFont()
+		self.boostButton.Bind(wx.EVT_CHECKBOX, self.Mute)
+
+		# Slider bindings: respond to the slider events
+		self.AMFrequencySlider.Bind(wx.EVT_SLIDER, self.AMSliderUpdate)
+		self.NBFMFrequencySlider.Bind(wx.EVT_SLIDER, self.NBFMSliderUpdate)
+		self.WBFMFrequencySlider.Bind(wx.EVT_SLIDER, self.WBFMSliderUpdate)
+		self.squelchSlider.Bind(wx.EVT_SLIDER, self.RssiSlideUpdate)
+		self.volumeSlider.Bind(wx.EVT_SLIDER, self.VolumeSliderUpdate)
+
+		# Toggle start/stop button for radio
+		self.toggleButton = wx.Button(self.panel5, wx.ID_ANY, "Start", (20,10))
+		self.reset = wx.Button(self.panel5, wx.ID_ANY, "Reset", (120, 10))
+		self.toggleButton.Bind(wx.EVT_BUTTON, self.OnToggle)
+		self.reset.Bind(wx.EVT_BUTTON, self.StopAll)
+
+		# Push-to-Talk button for transceiver (not used)
+		#self.pushButton = wx.Button(self.panel4, wx.ID_ANY, "Push to talk", (200, 100))
+		#self.pushButton.Bind(wx.EVT_LEFT_DOWN, self.pushTalk)
+		#self.pushButton.Hide()
+
+
+		# Set the sizers for the GUI
+		# Vertical stacks panels vertically, horizontal stacks panels horizontally
+		sizer_v = wx.BoxSizer(wx.VERTICAL)
+		sizer_h = wx.BoxSizer(wx.HORIZONTAL)
+		sizer_h1 = wx.BoxSizer(wx.HORIZONTAL)
+
+		sizer_h.Add(self.panel1, proportion=1, flag=wx.EXPAND)
+		sizer_h1.Add(self.panel2, proportion=3, flag=wx.EXPAND)
+		#sizer_h1.Add(self.panel3, proportion=1, flag=wx.EXPAND) # Not used for receive-only waveforms
+
+		#sizer_v.Add(sizer_h1, proportion=0, flag=wx.EXPAND)
+		sizer_v.Add(self.panel2, proportion=4, flag=wx.EXPAND)
+		sizer_v.Add(self.panel4, proportion=3, flag=wx.EXPAND)
+		sizer_v.Add(self.panel5, proportion=2, flag=wx.EXPAND)
+		sizer_h.Add(sizer_v, proportion=3, flag=wx.EXPAND)
+
+		# only set the main sizer
+		self.SetSizer(sizer_h)
+
+		self.Centre()
+		self.Show(True)
+
+		# Menu bar and status messages
+		menuBar = wx.MenuBar()
+		menu = wx.Menu()
+		m_exit = menu.Append(wx.ID_EXIT, "E&xit\tAlt-X", "Close window and exit program.")
+		self.Bind(wx.EVT_MENU, self.OnClose, m_exit)
+		menuBar.Append(menu, "&File")
+		menu = wx.Menu()
+		#m_band = menu.Append(wx.ID_ABOUT, "&Band", "Frequency band for AM receiver")
+		#self.Bind(wx.EVT_MENU, self.OnBand, m_band)
+		#menuBar.Append(menu, "&Band")
+		#menu = wx.Menu()
+		m_about = menu.Append(wx.ID_ABOUT, "&About", "Information about this program")
+		self.Bind(wx.EVT_MENU, self.OnAbout, m_about)	
+		menuBar.Append(menu, "&Help")
+		self.SetMenuBar(menuBar)
+		self.statusbar = self.CreateStatusBar()
+		
+		# Default frequencies (in Hz)
+		self.AMFrequency = 1430000
+		self.NBFMFrequency = 162475000
+		self.WBFMFrequency = 89100000
+
+		# Audio volume multipliers
+		self.AMVolumeMultiplier = 0.5
+		self.NBFMVolumeMultiplier = 0.5
+		self.WBFMVolumeMultiplier = 0.03
+		
+		# Status flags
+		self.isStopped=True
+		self.nodeBooterStarted=False
+		self.controllerIsRunning=False
+		self.runningAMWaveform=False
+		self.runningNBFMWaveform=False
+		self.runningWBFMWaveform=False
+
+	def OnClose(self, event):
+		dlg = wx.MessageDialog(self,
+		"Do you really want to close this application?",
+		"Confirm Exit", wx.OK | wx.CANCEL | wx.ICON_QUESTION)
+		result = dlg.ShowModal()
+		dlg.Destroy()
+		if result == wx.ID_OK:
+			print 'Uninstalling waveforms'
+			self.UninstallAMWaveform()
+			self.UninstallNBFMWaveform(1)
+			self.UninstallWBFMWaveform(1)
+			self.StopAll(True)
+			self.Destroy()
+
+	def OnAbout(self, event):
+		dlg = wx.MessageDialog(self,
+		"This program allows you to run and configure AM and FM receiver waveform applications using OSSIE and the controller from WaveDash.  "
+		"It is designed to work with OSSIE 0.8.2 and Ettus USRP 1 RF front end, and requires the AMReceiverDemo2USRP1 and FMReceiverDemo2USRP1 waveforms.",
+			"About the OSSIE Demo SDR Receiver", wx.OK)
+		dlg.ShowModal()
+		dlg.Destroy()
+
+	def OnBand(self, event):
+		pass
+
+	def pushTalk(self,event):
+		self.SetStatusText("Transmitting......")
+
+	# Function to toggle between start and stop
+	def OnToggle(self, event):
+		print 'In OnToggle'
+		buttonLabel = self.toggleButton.GetLabel()
+		if self.controllerIsRunning == True:
+			print 'self.controllerIsRunning is True'
+			if buttonLabel == "Start":
+				print 'Toggle label was Start: starting selected waveform and changing label to Stop'
+				self.isStopped=False
+				self.StartSelectedWaveform()
+				self.toggleButton.SetLabel("Stop")
+			elif buttonLabel == "Stop":
+				print 'Toggle label was Stop:  Uninstalling waveform(s)'
+				self.UninstallAMWaveform()	
+				self.UninstallNBFMWaveform(1) 
+				self.UninstallWBFMWaveform(1) 
+				self.toggleButton.SetLabel("Start")
+				self.isStopped=True
+		else:
+			print 'self.controllerIsRunning is False'
+			if buttonLabel == "Stop":
+				print 'Toggle label was Stop, changing it to Start.  This should not happen.'
+				self.toggleButton.SetLabel("Start")
+				self.isStopped=True
+			else:
+				print 'Label was Start, controller was not running.'
+				if self.nodeBooterStarted == False:
+					print 'self.nodeBooterStarted is False'
+					self.StopAll(True)
+					self.StartNodeBooter()
+				self.StartController()
+				self.isStopped=False		
+				self.StartSelectedWaveform()
+				self.toggleButton.SetLabel("Stop")
+
+	def StartAMWaveform(self, event):
+		print 'In StartAMWaveform()'
+		# Hide NBFM and WBFM controls and text
+		self.HideNBFMControls()
+		self.HideWBFMControls()
+
+		# Show AM waveform text and slider
+		self.AMFrequencySlider.Show()
+		self.AMTitle.Show()
+		self.AMText.Show()
+
+		self.volumeVal = self.volumeSlider.GetValue()
+		
+		if self.isStopped==False:
+			if self.runningNBFMWaveform:
+				self.UninstallNBFMWaveform(1)
+			if self.runningWBFMWaveform:
+				self.UninstallWBFMWaveform(1)
+			if self.runningAMWaveform == False:
+				# Install and Start AM Waveform 
+				waveformInstance=self.ctrlr.installWaveform ('AMReceiverDemo2USRP1', True)
+				self.runningAMWaveform = True
+				self.toggleButton.SetLabel("Stop")
+				# Get reference to waveform and configure properties
+				self.waveform = self.ctrlr.model.getWaveform(waveformInstance, 2)
+				USRP_Commander_1 = self.waveform.getComponent('USRP_Commander_1')
+				rx_freq=USRP_Commander_1.findPropertyByName('rx_freq')
+				#rx_freq_value=int(rx_freq.getValue())	
+				self.AMFrequencySlider.SetValue(self.AMFrequency/1000)
+				USRP_Commander_1.configureProperty('rx_freq', self.AMFrequency)
+				self.VolumeSliderUpdate(True)
+				#os.system("python /usr/local/lib/python2.6/dist-packages/alf_plugins/plot/plot.py standardInterfaces complexShort DomainName1 OSSIE::AMReceiverDemo2USRP1_1 amplifier_1 dataOut &")
+
+	def StartNBFMWaveform(self, event):
+		print 'In StartNBFMWaveform()'
+
+		# Hide AM and WBFM controls and text
+		self.HideAMControls()
+		self.HideWBFMControls()
+
+		# Show NBFM waveform text and slider
+		self.NBFMFrequencySlider.Show()
+		self.NBFMTitle.Show()
+		self.NBFMText.Show()
+
+		self.volumeVal = self.volumeSlider.GetValue()
+		
+		if self.isStopped==False:
+			if self.runningNBFMWaveform == False:
+				if self.runningWBFMWaveform:
+					self.UninstallWBFMWaveform(0) # stop but do not uninstall FM receiver waveform
+				else:
+					if self.runningAMWaveform:
+						self.UninstallAMWaveform()				
+					# Install FM receiver waveform but do not start it
+					waveformInstance=self.ctrlr.installWaveform ('FMReceiverDemo2USRP1', False)
+					print 'FM Receiver waveform installed'
+					# Get reference to waveform
+					self.waveform = self.ctrlr.model.getWaveform(waveformInstance,2)
+					print "self.runningNBFMWaveform == False in installNBFMWaveform()"
+					#os.system("python /usr/local/lib/python2.6/dist-packages/alf_plugins/plot/plot.py standardInterfaces complexShort DomainName1 OSSIE::FMReceiverDemo2USRP1_1 amplifier_1 dataOut &")	
+			
+				# Get references to and configure components for NBFM
+				USRP_Commander_1 = self.waveform.getComponent('USRP_Commander_1')
+				USRP_Commander_1.configureProperty('rx_decim', 256)
+				#rx_freq=USRP_Commander_1.findPropertyByName('rx_freq')
+				self.NBFMFrequencySlider.SetValue(self.NBFMFrequency/1000)
+				USRP_Commander_1.configureProperty('rx_freq', self.NBFMFrequency)
+				#rx_freq_value=int(rx_freq.getValue())	
+				self.Decimator_1 = self.waveform.getComponent('Decimator_1')
+				self.Decimator_1.configureProperty('DecimateBy', 10)
+				self.Decimator_2 = self.waveform.getComponent('Decimator_2')
+				self.Decimator_2.configureProperty('DecimateBy', 1)
+				# Now start the waveform
+				self.ctrlr.startWaveform('FMReceiverDemo2USRP1_1')
+				self.runningNBFMWaveform = True
+				self.VolumeSliderUpdate(True)
+				self.toggleButton.SetLabel("Stop")
+
+	def StartWBFMWaveform(self, event):
+		print 'In StartWBFMWaveform()'
+		print 'self.runningWBFMWaveform = ' + str(self.runningWBFMWaveform)
+		print 'self.isStopped = ' + str(self.isStopped)
+
+		# Hide AM and NBFM controls and text
+		self.HideAMControls()
+		self.HideNBFMControls()
+		
+		# Show WBFM waveform text and slider
+		self.WBFMFrequencySlider.Show()
+		self.WBFMTitle.Show()
+		self.WBFMText.Show()
+
+		self.volumeVal = self.volumeSlider.GetValue()
+			
+		if self.isStopped==False:
+			if self.runningWBFMWaveform==False:
+				if self.runningNBFMWaveform:
+					self.UninstallNBFMWaveform(0) # stop but do not uninstall FM receiver waveform
+				else:
+					if self.runningAMWaveform:
+						self.UninstallAMWaveform()
+					# Install FM receiver waveform but do not start it
+					waveformInstance=self.ctrlr.installWaveform ('FMReceiverDemo2USRP1', False)
+					print 'FM Receiver waveform installed'
+					# Get reference to waveform
+					self.waveform = self.ctrlr.model.getWaveform(waveformInstance,2)
+					#os.system("python /usr/local/lib/python2.6/dist-packages/alf_plugins/plot/plot.py standardInterfaces complexShort DomainName1 OSSIE::AMReceiverDemo2USRP1_1 amplifier_1 dataOut &")
+
+				# Get references to and configure components for WBFM
+				USRP_Commander_1 = self.waveform.getComponent('USRP_Commander_1')
+				USRP_Commander_1.configureProperty('rx_decim', 160)
+				#rx_freq=USRP_Commander_1.findPropertyByName('rx_freq')
+				self.WBFMFrequencySlider.SetValue(self.WBFMFrequency/1000)
+				USRP_Commander_1.configureProperty('rx_freq', self.WBFMFrequency)
+				#rx_freq_value=int(rx_freq.getValue())	
+				self.Decimator_1 = self.waveform.getComponent('Decimator_1')
+				self.Decimator_1.configureProperty('DecimateBy', 2)
+				self.Decimator_2 = self.waveform.getComponent('Decimator_2')
+				self.Decimator_2.configureProperty('DecimateBy', 8)
+				# Now start the waveform
+				self.ctrlr.startWaveform('FMReceiverDemo2USRP1_1')
+				self.runningWBFMWaveform = True
+				self.VolumeSliderUpdate(True)
+				self.toggleButton.SetLabel("Stop")
+
+	def StartSelectedWaveform(self):
+		print 'In StartSelectedWaveform()'
+		if self.AMSelectButton.GetValue():
+			self.StartAMWaveform(True)
+		elif self.NBFMSelectButton.GetValue():
+			self.StartNBFMWaveform(True)
+		elif self.WBFMSelectButton.GetValue():
+			self.StartWBFMWaveform(True)
+		else:
+			print 'No waveform selected.'
+
+	# RSSI threshold (Squelch)
+ 	def RssiSlideUpdate(self, event):
+		self.rssiVal = self.squelchSlider.GetValue()
+		self.AutomaticGainControl_1 = self.waveform.getComponent('AutomaticGainControl_1')
+		rssi_update = self.rssiVal
+		self.AutomaticGainControl_1.configureProperty('rssi_pass', rssi_update)
+		print self.rssiVal
+
+	def VolumeSliderUpdate(self, event):
+		self.Mute(True)
+
+	# Adjust volume taking into account mute and audio boost settings
+	# As is, requires that audio gain is provided by a component instance 'amplifier_2' in all waveforms used
+	def Mute(self, event):
+		print "In Mute()"
+		if self.muteButton.IsChecked():
+			self.amplifier_2 = self.waveform.getComponent('amplifier_2')
+			self.amplifier_2.configureProperty('I_gain', 0)
+			self.amplifier_2.configureProperty('Q_gain', 0)
+		else:
+			self.volumeVal = (self.volumeSlider.GetValue())
+			self.amplifier_2 = self.waveform.getComponent('amplifier_2')
+			if self.boostButton.IsChecked():
+				vol_update = 10*self.volumeVal
+			else:
+				vol_update = self.volumeVal
+			if self.runningAMWaveform:
+				print "Running AMWaveform, using AMVolumeMultiplier"
+				self.amplifier_2.configureProperty('I_gain', self.AMVolumeMultiplier*float(vol_update))
+				self.amplifier_2.configureProperty('Q_gain', self.AMVolumeMultiplier*float(vol_update))
+			elif self.runningNBFMWaveform:
+				print "Running NBFMWaveform, using NBFMVolumeMultiplier"
+				self.amplifier_2.configureProperty('I_gain', self.NBFMVolumeMultiplier*float(vol_update))
+				self.amplifier_2.configureProperty('Q_gain', self.NBFMVolumeMultiplier*float(vol_update))
+			else:
+				print "Running WBFMWaveform, using WBFMVolumeMultiplier"
+				self.amplifier_2.configureProperty('I_gain', self.WBFMVolumeMultiplier*float(vol_update))
+				self.amplifier_2.configureProperty('Q_gain', self.WBFMVolumeMultiplier*float(vol_update))
+			if self.boostButton.IsChecked():
+				vol_update = float(vol_update)/10
+			self.volumeSlider.SetValue(vol_update)
+
+	def AMSliderUpdate(self, event):
+		self.AMFrequency = 1000 * self.AMFrequencySlider.GetValue()
+		self.USRP_Commander_1 = self.waveform.getComponent('USRP_Commander_1')
+		self.USRP_Commander_1.configureProperty('rx_freq', self.AMFrequency)
+
+	def NBFMSliderUpdate(self, event):
+		self.NBFMFrequency = 1000 * self.NBFMFrequencySlider.GetValue()
+		self.USRP_Commander_1 = self.waveform.getComponent('USRP_Commander_1')
+		self.USRP_Commander_1.configureProperty('rx_freq', self.NBFMFrequency)
+
+	def WBFMSliderUpdate(self, event):
+		self.WBFMFrequency = 1000 * self.WBFMFrequencySlider.GetValue()
+		self.USRP_Commander_1 = self.waveform.getComponent('USRP_Commander_1')
+		self.USRP_Commander_1.configureProperty('rx_freq', self.WBFMFrequency)
+	
+	def Transmit(self, event):
+		self.USRP_Commander_1.configureProperty('Tx_Start', 1)
+		self.USRP_Commander_1.configureProperty('rx_freq', 1)
+		self.SetStatusText("Transmitting......")
+
+	def Receive(self, event):
+		self.USRP_Commander_1.configureProperty('rx_start', 1)
+		self.USRP_Commander_1.configureProperty('Tx_Start', 0)
+		self.SetStatusText("Receiving......")
+
+	def UninstallAMWaveform(self):
+		print 'In UninstallAMWaveform()'
+		try:
+			self.ctrlr.stopWaveform("AMReceiverDemo2USRP1_1")
+			time.sleep(.5)
+			self.ctrlr.uninstallWaveform("AMReceiverDemo2USRP1_1")
+			time.sleep(.5)
+		except:
+			print "In UninstallAMWaveform(): Unable to uninstall waveform."
+		self.runningAMWaveform=False
+		#time.sleep(.5)
+
+	def UninstallNBFMWaveform(self, uninstall):
+		print 'In UninstallNBFMWaveform()'
+		try:
+			self.ctrlr.stopWaveform("FMReceiverDemo2USRP1_1")
+			time.sleep(.5)
+			if uninstall:
+				self.ctrlr.uninstallWaveform("FMReceiverDemo2USRP1_1")
+				time.sleep(.5)
+		except:
+			print "In UninstallNBFMWaveform(): Unable to uninstall waveform."			
+		self.runningNBFMWaveform=False
+		#time.sleep(.5)
+
+	def UninstallWBFMWaveform(self, uninstall):
+		print 'In UninstallWBFMWaveform()'
+		try:
+			self.ctrlr.stopWaveform("FMReceiverDemo2USRP1_1")
+			time.sleep(.5)
+			if uninstall:
+				self.ctrlr.uninstallWaveform("FMReceiverDemo2USRP1_1")
+				time.sleep(.5)
+		except:
+			print "In UninstallWBFMWaveform(): Unable to uninstall waveform."
+		self.runningWBFMWaveform=False
+		#time.sleep(.5)
+
+	def StopAll(self, event):
+		print 'In StopAll():  Terminating nodeBooter and OSSIE GPP, USRP, soundCardPlayback, and soundCardCapture devices.'
+		cmd = 'killall nodeBooter USRP GPP soundCardPlayback soundCardCapture'
+		os.system(cmd)
+		self.nodeBooterStarted=False
+		self.controllerIsRunning=False
+		self.runningAMWaveform=False
+		self.runningNBFMWaveform=False
+		self.runningWBFMWaveform=False
+		self.isStopped=True
+		self.toggleButton.SetLabel("Start")
+
+	def StartNodeBooter(self):
+		print 'In StartNodeBooter()'
+		nodeboot = 'cd /sdr; nodeBooter -D -d dev/nodes/default_GPP_USRP_sound_node/DeviceManager.dcd.xml &'
+		os.system(nodeboot)
+		time.sleep(5)
+		self.nodeBooterStarted=True
+
+	def StartController(self):
+		print 'In StartController()'
+		self.ctrlr = Controller(False)
+		print 'Controller instantiated'
+		#An instance of WaveAppCORBA() will be created as a part of Controller initilization itself
+		#self.ctrlr.OnInit()
+		self.ctrlr.createWidgetContainer()
+		self.ctrlr.CORBAutils.init_CORBA(False)
+		self.ctrlr.buildModel()
+		self.controllerIsRunning = True
+		self.isStopped=False
+
+	def HideAMControls(self):
+		#hides AM slider and text
+		self.AMTitle.Hide()
+		self.AMText.Hide()
+		self.AMFrequencySlider.Hide()
+
+	def HideNBFMControls(self):
+		#hides NBFM slider and text
+		self.NBFMTitle.Hide()
+		self.NBFMText.Hide()
+		self.NBFMFrequencySlider.Hide()
+
+	def HideWBFMControls(self):
+		#hides WBFM slider and text
+		self.WBFMTitle.Hide()
+		self.WBFMText.Hide()
+		self.WBFMFrequencySlider.Hide()
+
+	def UpdateAMFrequencySlider(self, bandLabel, minFrequency, maxFrequency):
+		self.AMfrequency=minFrequency
+		self.AMTitle = wx.StaticText(self.panel2, -1, bandLabel , (20, 10))
+		AMFont = self.AMTitle.GetFont()
+		AMFont.SetWeight(wx.FONTWEIGHT_BOLD)
+		self.AMTitle.SetFont(AMFont)
+		self.AMFrequencySlider = wx.Slider(self.panel2, -1, 0, minFrequency, maxFrequency, (20, 40), (450, -1),
+			wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_LABELS)
+		self.AMFrequencySlider.SetLineSize(10)
+		self.AMFrequencySlider.SetPageSize(100)
+		self.AMFrequencySlider.SetValue(minFrequency)
+		self.AMFrequency=minFrequency*1000
+		self.AMText = wx.StaticText(self.panel2, -1, "Frequency (kHz) " , (20,80))
+
+
+app = wx.App()
+Messages(None, -1, 'OSSIE AM/FM Receiver')
+app.MainLoop()
