Index: /vtcross/trunk/src/cognitive_engines/DSA_CE/DSA_CognitiveEngine.cpp
===================================================================
--- /vtcross/trunk/src/cognitive_engines/DSA_CE/DSA_CognitiveEngine.cpp	(revision 375)
+++ /vtcross/trunk/src/cognitive_engines/DSA_CE/DSA_CognitiveEngine.cpp	(revision 389)
@@ -27,4 +27,11 @@
 #include "sqlite3.h"
 #include "sqlite3ext.h"
+
+#define INTERFERENCE 0
+#define COMMUNICATION_TIME 1
+#define CHANNEL 2
+#define ENERGY 3
+#define FITNESS 4
+
 
 
@@ -632,4 +639,7 @@
 }
 
+
+/* The core of the CE is this function */
+
 Parameter* 
 CognitiveEngine::GetSolution(Observable *observables, Parameter *currentParameters)
@@ -637,32 +647,16 @@
     LOG("Cognitive Engine:: Generating solution.\n");
 
-    char *searchNames[radioInfo->numUtilities];
+    /* Put together the CBR search array */
+
+    char *searchNames[radioInfo->numUtilities + 1];
+    float searchVals[radioInfo->numUtilities + 1];
+    int searchOps[radioInfo->numUtilities + 1];
+    uint32_t numberColumns = radioInfo->numUtilities +
+        			radioInfo->numParameters +
+        			radioInfo->numObservables + 1;
 
     for(size_t i = 0; i < radioInfo->numUtilities; i++) {
-        searchNames[i] = (char*)observables[i].name.c_str();
-    }
-
-    float searchVals[radioInfo->numUtilities];
-
-    for(size_t i = 0; i < radioInfo->numUtilities; i++) {
-        searchVals[i] = uList[i].target;
-    }
-
-    uint32_t numberColumns = 
-        radioInfo->numUtilities +
-        radioInfo->numParameters +
-        radioInfo->numObservables + 1;
-    
-    float returnValues[numberColumns];
-    
-    int searchOps[radioInfo->numUtilities];
-    for(size_t i = 0; i < radioInfo->numUtilities; i++) {
-
-        /* If the goal is to maximum, set the search operation to
-         * return values greater than the target.
-         *
-         * If the goal is to minimize, set the search operation to
-         * return values less than the target.
-         */
+        searchNames[i] = (char*)uList[i].name.c_str();
+        
         if(strcmp(uList[i].goal.c_str(), "max") == 0) {
             searchOps[i] = GT;
@@ -670,32 +664,61 @@
             searchOps[i] = LT;
         }
-    }
-
-    /* CBR specific call */
+   
+	/* Set search target to utility target */
+	/* This may be bad if no target is set */ 
+        searchVals[i] = uList[i].target;
+    }
+   
+
+    /* Make sure we do not return any entries for the current channel */
+    searchNames[radioInfo->numUtilities+1] = "channel";
+    searchOps[radioInfo->numUtilities+1] = NE;
+    searchVals[radioInfo->numUtilities+1] = currentParameters[0].value; 
+ 
+    float returnValues[numberColumns];
+    
+    /* Execute CBR search and put output into returnValues */
     uint32_t rc = cbr_search(myCBR, searchNames, searchOps, searchVals,
             radioInfo->numUtilities, returnValues);
 
     if(rc == 0){
-        /* Adapt the returned parameters to meet the objective */
-        LOG("Cognitive Engine:: Found\n");
-
-        /* Should do a random adaptation.. */
+        /* Similiar environment was found. Adapt the returned parameters to 
+           meet the objective */
+
+        LOG("Cognitive Engine:: Previous similar environment found\n");
+
         if(returnValues[numberColumns-1] < 0) {
+        
             returnValues[2] = returnValues[2] - 15;
             returnValues[3] = returnValues[3] - 2;
+        
         } else {
+       
             returnValues[2] = returnValues[2] + 15;
             returnValues[3] = returnValues[3] + 2;
+        
         }
     } else if(rc == 31337) {
-        LOG("Cognitive Engine:: Not Found.\n");
-        /* No rows in the CBR, pick default parameters */
-        /* Currently this is hard coded and implementation specific! */
-        returnValues[2] = currentParameters[0].value + 5;
-        returnValues[3] = currentParameters[1].value + 10;
-        
+        /* No previous similar solution was found, use default. */
+        LOG("Cognitive Engine:: No previous similar environment found.\n");
+     
+	/* In the DSA case, the default is to select a random channel */
+ 
+  	/* initialize random seed: */
+  	srand ( time(NULL) );
+
+  	/* generate random channel */
+	//returnValues[CHANNEL] = rand() % currentParameters[0].max + currentParameters[0].min; 
+	returnValues[CHANNEL] = rand() % 5; 
+       
+	printf("One: %i Two: %i\n",(int)currentParameters[0].max,(int)currentParameters[0].min);
+ 
     } else {
         LOG("Cognitive Engine:: Search return an invalid value.\n");
     }
+
+
+    /* Package up the new set of parameters in order to add
+       the new entry into the CBR database.  */
 
     size_t returnValueIndex = 0;
@@ -732,7 +755,8 @@
     allNames[allNameIndex] = "utility";
 
-    // Add row to CBR. 
+    /* Add the new optimized set to the CBR database */
     cbr_add_row(myCBR, allNames, returnValues, returnValueIndex+1);
 
+    /* Return the set of new parameter values.  */
     return pList;
 }
Index: /vtcross/trunk/src/cognitive_engines/DSA_CE/cbr.c
===================================================================
--- /vtcross/trunk/src/cognitive_engines/DSA_CE/cbr.c	(revision 375)
+++ /vtcross/trunk/src/cognitive_engines/DSA_CE/cbr.c	(revision 389)
@@ -57,5 +57,5 @@
     char *zErrMsg = 0;
 
-    //printf("command: %s\n", _cbr->command);
+    printf("command: %s\n", _cbr->command);
     rc = sqlite3_exec(_cbr->db, _cbr->command, callback, 0, &zErrMsg);
     if( rc!=SQLITE_OK){
@@ -212,8 +212,6 @@
         strcat(_cbr->command, _names[i]);
         strcat(_cbr->command, ops_str[_ops[i]]);
-    printf("search command: %s\n", _cbr->command);
         sprintf(str_buffer, "%E", _vals[i]);
         strcat(_cbr->command, str_buffer);
-
 
         if (i<_n-1)
@@ -225,5 +223,4 @@
     //printf("search command: %s\n", _cbr->command);
 
-    //ExecuteCommand(_cbr);
     rc = ExecuteSearchCommand(_cbr, _retvals);
     
Index: /vtcross/trunk/src/cognitive_engines/DSA_CE/examples/gnuradio-examples/transmit_path.py
===================================================================
--- /vtcross/trunk/src/cognitive_engines/DSA_CE/examples/gnuradio-examples/transmit_path.py	(revision 389)
+++ /vtcross/trunk/src/cognitive_engines/DSA_CE/examples/gnuradio-examples/transmit_path.py	(revision 389)
@@ -0,0 +1,217 @@
+#
+# Copyright 2005,2006,2007,2009 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+# 
+# GNU Radio 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 GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+# 
+
+from gnuradio import gr, gru, blks2
+from gnuradio import usrp
+from gnuradio import eng_notation
+
+import copy
+import sys
+
+# from current dir
+from pick_bitrate import pick_tx_bitrate
+import usrp_options
+
+# /////////////////////////////////////////////////////////////////////////////
+#                              transmit path
+# /////////////////////////////////////////////////////////////////////////////
+
+class transmit_path(gr.hier_block2): 
+    def __init__(self, modulator_class, options):
+        '''
+        See below for what options should hold
+        '''
+	gr.hier_block2.__init__(self, "transmit_path",
+                                gr.io_signature(0, 0, 0), # Input signature
+                                gr.io_signature(0, 0, 0)) # Output signature
+
+        options = copy.copy(options)    # make a copy so we can destructively modify
+
+        self._verbose            = options.verbose
+        self._tx_freq            = options.tx_freq         # tranmitter's center frequency
+        self._tx_amplitude       = options.tx_amplitude    # digital amplitude sent to USRP
+        self._bitrate            = options.bitrate         # desired bit rate
+        self._interp             = options.interp          # interpolating rate for the USRP (prelim)
+        self._samples_per_symbol = options.samples_per_symbol  # desired samples/baud
+        self._use_whitener_offset = options.use_whitener_offset # increment start of whitener XOR data
+        
+        self._modulator_class = modulator_class         # the modulator_class we are using
+    
+        if self._tx_freq is None:
+            sys.stderr.write("-f FREQ or --freq FREQ or --tx-freq FREQ must be specified\n")
+            raise SystemExit
+
+        # Set up USRP sink; also adjusts interp, samples_per_symbol, and bitrate
+        self._setup_usrp_sink(options)
+
+        if options.show_tx_ampl_range:
+            print "Tx Amplitude Range: minimum = %g, maximum = %g"%tuple(self.u.ampl_range())
+
+        # copy the final answers back into options for use by modulator
+        options.samples_per_symbol = self._samples_per_symbol
+        options.bitrate = self._bitrate
+        options.interp = self._interp
+
+        # Get mod_kwargs
+        mod_kwargs = self._modulator_class.extract_kwargs_from_options(options)
+
+        # Set center frequency of USRP
+        ok = self.set_freq(self._tx_freq)
+        if not ok:
+            print "Failed to set Tx frequency to %s" % (eng_notation.num_to_str(self._tx_freq),)
+            raise ValueError
+    
+        # transmitter
+        self.packet_transmitter = \
+            blks2.mod_pkts(self._modulator_class(**mod_kwargs),
+                           access_code=None,
+                           msgq_limit=4,
+                           pad_for_usrp=True,
+                           use_whitener_offset=options.use_whitener_offset)
+
+
+        # Set the USRP for maximum transmit gain
+        # (Note that on the RFX cards this is a nop.)
+        self.set_gain(self.u.gain_range()[1])
+
+        self.amp = gr.multiply_const_cc(1)
+        self.set_tx_amplitude(self._tx_amplitude)
+
+        # Display some information about the setup
+        if self._verbose:
+            self._print_verbage()
+
+        # Create and setup transmit path flow graph
+        self.connect(self.packet_transmitter, self.amp, self.u)
+
+    def _setup_usrp_sink(self, options):
+        """
+        Creates a USRP sink, determines the settings for best bitrate,
+        and attaches to the transmitter's subdevice.
+        """
+        self.u = usrp_options.create_usrp_sink(options)
+        dac_rate = self.u.dac_rate();
+
+        # derive values of bitrate, samples_per_symbol, and interp from desired info
+        (self._bitrate, self._samples_per_symbol, self._interp) = \
+            pick_tx_bitrate(self._bitrate, self._modulator_class.bits_per_symbol(),
+                            self._samples_per_symbol, self._interp, dac_rate)
+        
+        self.u.set_interp(self._interp)
+	print "printing interpolation ",self._interp,"\n"
+
+    def set_freq(self, target_freq):
+        """
+        Set the center frequency we're interested in.
+
+        @param target_freq: frequency in Hz
+        @rypte: bool
+
+        Tuning is a two step process.  First we ask the front-end to
+        tune as close to the desired frequency as it can.  Then we use
+        the result of that operation and our target_frequency to
+        determine the value for the digital up converter.
+        """
+        return self.u.set_center_freq(target_freq)
+        
+    def set_gain(self, gain):
+        """
+        Sets the analog gain in the USRP
+        """
+        return self.u.set_gain(gain)
+
+    def set_tx_amplitude(self, ampl):
+        """
+        Sets the transmit amplitude sent to the USRP
+        @param ampl the amplitude or None for automatic
+        """
+        ampl_range = self.u.ampl_range()
+        if ampl is None: ampl = (ampl_range[1] - ampl_range[0])*0.15 + ampl_range[0]
+        self._tx_amplitude = max(ampl_range[0], min(ampl, ampl_range[1]))
+        self.amp.set_k(self._tx_amplitude)
+
+    def send_pkt(self, payload='', eof=False):
+        """
+        Calls the transmitter method to send a packet
+        """
+        return self.packet_transmitter.send_pkt(payload, eof)
+        
+    def bitrate(self):
+        return self._bitrate
+
+    def samples_per_symbol(self):
+        return self._samples_per_symbol
+
+    def interp(self):
+        return self._interp
+
+    def add_options(normal, expert):
+        """
+        Adds transmitter-specific options to the Options Parser
+        """
+        add_freq_option(normal)
+        if not normal.has_option('--bitrate'):
+            normal.add_option("-r", "--bitrate", type="eng_float", default=None,
+                              help="specify bitrate.  samples-per-symbol and interp/decim will be derived.")
+        usrp_options.add_tx_options(normal, expert)
+        normal.add_option("--tx-amplitude", type="eng_float", default=None, metavar="AMPL",
+                          help="set transmitter digital amplitude [default=midpoint].  See also --show-tx-ampl-range")
+        normal.add_option("--show-tx-ampl-range", action="store_true", default=False, 
+                          help="print min and max Tx amplitude available")
+        normal.add_option("-v", "--verbose", action="store_true", default=False)
+        expert.add_option("-S", "--samples-per-symbol", type="int", default=None,
+                          help="set samples/symbol [default=%default]")
+        expert.add_option("", "--tx-freq", type="eng_float", default=None,
+                          help="set transmit frequency to FREQ [default=%default]", metavar="FREQ")
+        expert.add_option("", "--log", action="store_true", default=False,
+                          help="Log all parts of flow graph to file (CAUTION: lots of data)")
+        expert.add_option("","--use-whitener-offset", action="store_true", default=False,
+                          help="make sequential packets use different whitening")
+
+    # Make a static method to call before instantiation
+    add_options = staticmethod(add_options)
+
+    def _print_verbage(self):
+        """
+        Prints information about the transmit path
+        """
+        print "Using TX d'board %s"    % (self.u,)
+        print "Tx amplitude     %s"    % (self._tx_amplitude)
+        print "modulation:      %s"    % (self._modulator_class.__name__)
+        print "bitrate:         %sb/s" % (eng_notation.num_to_str(self._bitrate))
+        print "samples/symbol:  %3d"   % (self._samples_per_symbol)
+        print "interp:          %3d"   % (self._interp)
+        print "Tx Frequency:    %s"    % (eng_notation.num_to_str(self._tx_freq))
+        
+
+def add_freq_option(parser):
+    """
+    Hackery that has the -f / --freq option set both tx_freq and rx_freq
+    """
+    def freq_callback(option, opt_str, value, parser):
+        parser.values.rx_freq = value
+        parser.values.tx_freq = value
+
+    if not parser.has_option('--freq'):
+        parser.add_option('-f', '--freq', type="eng_float",
+                          action="callback", callback=freq_callback,
+                          help="set Tx and/or Rx frequency to FREQ [default=%default]",
+                          metavar="FREQ")
Index: /vtcross/trunk/src/cognitive_engines/DSA_CE/examples/gnuradio-examples/receive_path.py
===================================================================
--- /vtcross/trunk/src/cognitive_engines/DSA_CE/examples/gnuradio-examples/receive_path.py	(revision 389)
+++ /vtcross/trunk/src/cognitive_engines/DSA_CE/examples/gnuradio-examples/receive_path.py	(revision 389)
@@ -0,0 +1,228 @@
+#!/usr/bin/env python
+#
+# Copyright 2005,2006,2007,2009 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+# 
+# GNU Radio 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 GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+# 
+
+from gnuradio import gr, gru, blks2
+from gnuradio import usrp
+from gnuradio import eng_notation
+import copy
+import sys
+
+# from current dir
+from pick_bitrate import pick_rx_bitrate
+import usrp_options
+
+# /////////////////////////////////////////////////////////////////////////////
+#                              receive path
+# /////////////////////////////////////////////////////////////////////////////
+
+class receive_path(gr.hier_block2):
+    def __init__(self, demod_class, rx_callback, options):
+
+	gr.hier_block2.__init__(self, "receive_path",
+                                gr.io_signature(0, 0, 0), # Input signature
+                                gr.io_signature(0, 0, 0)) # Output signature
+
+        options = copy.copy(options)    # make a copy so we can destructively modify
+
+        self._verbose            = options.verbose
+        self._rx_freq            = options.rx_freq         # receiver's center frequency
+        self._rx_gain            = options.rx_gain         # receiver's gain
+        self._bitrate            = options.bitrate         # desired bit rate
+        self._decim              = options.decim           # Decimating rate for the USRP (prelim)
+        self._samples_per_symbol = options.samples_per_symbol  # desired samples/symbol
+
+        self._rx_callback   = rx_callback      # this callback is fired when there's a packet available
+        self._demod_class   = demod_class      # the demodulator_class we're using
+
+        if self._rx_freq is None:
+            sys.stderr.write("-f FREQ or --freq FREQ or --rx-freq FREQ must be specified\n")
+            raise SystemExit
+
+        # Set up USRP source; also adjusts decim, samples_per_symbol, and bitrate
+        self._setup_usrp_source(options)
+
+        if options.show_rx_gain_range:
+            print "Rx Gain Range: minimum = %g, maximum = %g, step size = %g"%tuple(self.u.gain_range())
+
+        self.set_gain(options.rx_gain)
+
+        # Set RF frequency
+        ok = self.set_freq(self._rx_freq)
+        if not ok:
+            print "Failed to set Rx frequency to %s" % (eng_notation.num_to_str(self._rx_freq))
+            raise ValueError, eng_notation.num_to_str(self._rx_freq)
+
+        # copy the final answers back into options for use by demodulator
+        options.samples_per_symbol = self._samples_per_symbol
+        options.bitrate = self._bitrate
+        options.decim = self._decim
+
+        # Get demod_kwargs
+        demod_kwargs = self._demod_class.extract_kwargs_from_options(options)
+
+        # Design filter to get actual channel we want
+        sw_decim = 1
+        chan_coeffs = gr.firdes.low_pass (1.0,                  # gain
+                                          sw_decim * self._samples_per_symbol, # sampling rate
+                                          1.0,                  # midpoint of trans. band
+                                          0.5,                  # width of trans. band
+                                          gr.firdes.WIN_HANN)   # filter type 
+
+        # Decimating channel filter
+        # complex in and out, float taps
+        self.chan_filt = gr.fft_filter_ccc(sw_decim, chan_coeffs)
+        #self.chan_filt = gr.fir_filter_ccf(sw_decim, chan_coeffs)
+
+        # receiver
+        self.packet_receiver = \
+            blks2.demod_pkts(self._demod_class(**demod_kwargs),
+                             access_code=None,
+                             callback=self._rx_callback,
+                             threshold=-1)
+    
+        # Carrier Sensing Blocks
+        alpha = 0.001
+        thresh = 30   # in dB, will have to adjust
+
+        if options.log_rx_power == True:
+            self.probe = gr.probe_avg_mag_sqrd_cf(thresh,alpha)
+            self.power_sink = gr.file_sink(gr.sizeof_float, "rxpower.dat")
+            self.connect(self.chan_filt, self.probe, self.power_sink)
+        else:
+            self.probe = gr.probe_avg_mag_sqrd_c(thresh,alpha)
+            self.connect(self.chan_filt, self.probe)
+
+        # Display some information about the setup
+        if self._verbose:
+            self._print_verbage()
+            
+        self.connect(self.u, self.chan_filt, self.packet_receiver)
+
+    def _setup_usrp_source(self, options):
+
+        self.u = usrp_options.create_usrp_source(options)
+        adc_rate = self.u.adc_rate()
+
+        # derive values of bitrate, samples_per_symbol, and decim from desired info
+        (self._bitrate, self._samples_per_symbol, self._decim) = \
+            pick_rx_bitrate(self._bitrate, self._demod_class.bits_per_symbol(), \
+                            self._samples_per_symbol, self._decim, adc_rate)
+
+        self.u.set_decim(self._decim)
+
+    def set_freq(self, target_freq):
+        """
+        Set the center frequency we're interested in.
+
+        @param target_freq: frequency in Hz
+        @rypte: bool
+
+        Tuning is a two step process.  First we ask the front-end to
+        tune as close to the desired frequency as it can.  Then we use
+        the result of that operation and our target_frequency to
+        determine the value for the digital up converter.
+        """
+        return self.u.set_center_freq(target_freq)
+
+    def set_gain(self, gain):
+        """
+        Sets the analog gain in the USRP
+        """
+        return self.u.set_gain(gain)
+        
+    def bitrate(self):
+        return self._bitrate
+
+    def samples_per_symbol(self):
+        return self._samples_per_symbol
+
+    def decim(self):
+        return self._decim
+
+    def carrier_sensed(self):
+        """
+        Return True if we think carrier is present.
+        """
+        #return self.probe.level() > X
+        return self.probe.unmuted()
+
+    def carrier_threshold(self):
+        """
+        Return current setting in dB.
+        """
+        return self.probe.threshold()
+
+    def set_carrier_threshold(self, threshold_in_db):
+        """
+        Set carrier threshold.
+
+        @param threshold_in_db: set detection threshold
+        @type threshold_in_db:  float (dB)
+        """
+        self.probe.set_threshold(threshold_in_db)
+    
+    @staticmethod
+    def add_options(normal, expert):
+        """
+        Adds receiver-specific options to the Options Parser
+        """
+        add_freq_option(normal)
+        if not normal.has_option("--bitrate"):
+            normal.add_option("-r", "--bitrate", type="eng_float", default=None,
+                              help="specify bitrate.  samples-per-symbol and interp/decim will be derived.")
+        usrp_options.add_rx_options(normal, expert)
+        normal.add_option("-v", "--verbose", action="store_true", default=False)
+        expert.add_option("-S", "--samples-per-symbol", type="int", default=None,
+                          help="set samples/symbol [default=%default]")
+        expert.add_option("", "--rx-freq", type="eng_float", default=None,
+                          help="set Rx frequency to FREQ [default=%default]", metavar="FREQ")
+        expert.add_option("", "--log", action="store_true", default=False,
+                          help="Log all parts of flow graph to files (CAUTION: lots of data)")
+        expert.add_option("", "--log-rx-power", action="store_true", default=False,
+                          help="Log receive signal power to file (CAUTION: lots of data)")
+
+    def _print_verbage(self):
+        """
+        Prints information about the receive path
+        """
+        print "\nReceive Path:"
+        print "USRP %s"    % (self.u,)
+        print "Rx gain:         %g"    % (self.u.gain(),)
+        print "modulation:      %s"    % (self._demod_class.__name__)
+        print "bitrate:         %sb/s" % (eng_notation.num_to_str(self._bitrate))
+        print "samples/symbol:  %3d"   % (self._samples_per_symbol)
+        print "decim:           %3d"   % (self._decim)
+        print "Rx Frequency:    %s"    % (eng_notation.num_to_str(self._rx_freq))
+
+def add_freq_option(parser):
+    """
+    Hackery that has the -f / --freq option set both tx_freq and rx_freq
+    """
+    def freq_callback(option, opt_str, value, parser):
+        parser.values.rx_freq = value
+        parser.values.tx_freq = value
+
+    if not parser.has_option('--freq'):
+        parser.add_option('-f', '--freq', type="eng_float",
+                          action="callback", callback=freq_callback,
+                          help="set Tx and/or Rx frequency to FREQ [default=%default]",
+                          metavar="FREQ")
Index: /vtcross/trunk/src/cognitive_engines/DSA_CE/examples/gnuradio-examples/pick_bitrate.py
===================================================================
--- /vtcross/trunk/src/cognitive_engines/DSA_CE/examples/gnuradio-examples/pick_bitrate.py	(revision 389)
+++ /vtcross/trunk/src/cognitive_engines/DSA_CE/examples/gnuradio-examples/pick_bitrate.py	(revision 389)
@@ -0,0 +1,149 @@
+#
+# Copyright 2005,2006 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+# 
+# GNU Radio 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 GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+# 
+
+from gnuradio import eng_notation
+
+_default_bitrate = 500e3
+
+_valid_samples_per_symbol = (2,3,4,5,6,7)
+
+def _gen_tx_info(converter_rate):
+    results = []
+    for samples_per_symbol in _valid_samples_per_symbol:
+        for interp in range(16, 512 + 1, 4):
+            bitrate = converter_rate / interp / samples_per_symbol
+            results.append((bitrate, samples_per_symbol, interp))
+    results.sort()
+    return results
+
+def _gen_rx_info(converter_rate):
+    results = []
+    for samples_per_symbol in _valid_samples_per_symbol:
+        for decim in range(8, 256 + 1, 2):
+            bitrate = converter_rate / decim / samples_per_symbol
+            results.append((bitrate, samples_per_symbol, decim))
+    results.sort()
+    return results
+    
+def _filter_info(info, samples_per_symbol, xrate):
+    if samples_per_symbol is not None:
+        info = [x for x in info if x[1] == samples_per_symbol]
+    if xrate is not None:
+        info = [x for x in info if x[2] == xrate]
+    return info
+
+def _pick_best(target_bitrate, bits_per_symbol, info):
+    """
+    @returns tuple (bitrate, samples_per_symbol, interp_rate_or_decim_rate)
+    """
+    if len(info) == 0:
+        raise RuntimeError, "info is zero length!"
+
+    if target_bitrate is None:     # return the fastest one
+        return info[-1]
+    
+    # convert bit rate to symbol rate
+    target_symbolrate = target_bitrate / bits_per_symbol
+    
+    # Find the closest matching symbol rate.
+    # In the event of a tie, the one with the lowest samples_per_symbol wins.
+    # (We already sorted them, so the first one is the one we take)
+
+    best = info[0]
+    best_delta = abs(target_symbolrate - best[0])
+    for x in info[1:]:
+        delta = abs(target_symbolrate - x[0])
+        if delta < best_delta:
+            best_delta = delta
+            best = x
+
+    # convert symbol rate back to bit rate
+    return ((best[0] * bits_per_symbol),) + best[1:]
+
+def _pick_bitrate(bitrate, bits_per_symbol, samples_per_symbol,
+                  xrate, converter_rate, gen_info):
+    """
+    @returns tuple (bitrate, samples_per_symbol, interp_rate_or_decim_rate)
+    """
+    if not isinstance(bits_per_symbol, int) or bits_per_symbol < 1:
+        raise ValueError, "bits_per_symbol must be an int >= 1"
+    
+    if samples_per_symbol is not None and xrate is not None:  # completely determined
+        return (float(converter_rate) / xrate / samples_per_symbol,
+                samples_per_symbol, xrate)
+
+    if bitrate is None and samples_per_symbol is None and xrate is None:
+        bitrate = _default_bitrate
+
+    # now we have a target bitrate and possibly an xrate or
+    # samples_per_symbol constraint, but not both of them.
+
+    ret = _pick_best(bitrate, bits_per_symbol,
+                      _filter_info(gen_info(converter_rate), samples_per_symbol, xrate))
+    print "Actual Bitrate:", eng_notation.num_to_str(ret[0])
+    return ret
+    
+# ---------------------------------------------------------------------------------------
+
+def pick_tx_bitrate(bitrate, bits_per_symbol, samples_per_symbol,
+                    interp_rate, converter_rate):
+    """
+    Given the 4 input parameters, return at configuration that matches
+
+    @param bitrate: desired bitrate or None
+    @type bitrate: number or None
+    @param bits_per_symbol: E.g., BPSK -> 1, QPSK -> 2, 8-PSK -> 3
+    @type bits_per_symbol: integer >= 1
+    @param samples_per_symbol: samples/baud (aka samples/symbol)
+    @type samples_per_symbol: number or None
+    @param interp_rate: USRP interpolation factor
+    @type interp_rate: integer or None
+    @param converter_rate: converter sample rate in Hz
+    @type converter_rate: number
+
+    @returns tuple (bitrate, samples_per_symbol, interp_rate)
+    """
+    print "Requested TX Bitrate:", bitrate and eng_notation.num_to_str(bitrate) or 'Auto'
+    return _pick_bitrate(bitrate, bits_per_symbol, samples_per_symbol,
+                         interp_rate, converter_rate, _gen_tx_info)
+
+
+def pick_rx_bitrate(bitrate, bits_per_symbol, samples_per_symbol,
+                    decim_rate, converter_rate):
+    """
+    Given the 4 input parameters, return at configuration that matches
+
+    @param bitrate: desired bitrate or None
+    @type bitrate: number or None
+    @param bits_per_symbol: E.g., BPSK -> 1, QPSK -> 2, 8-PSK -> 3
+    @type bits_per_symbol: integer >= 1
+    @param samples_per_symbol: samples/baud (aka samples/symbol)
+    @type samples_per_symbol: number or None
+    @param decim_rate: USRP decimation factor
+    @type decim_rate: integer or None
+    @param converter_rate: converter sample rate in Hz
+    @type converter_rate: number
+
+    @returns tuple (bitrate, samples_per_symbol, decim_rate)
+    """
+    print "Requested RX Bitrate:", bitrate and eng_notation.num_to_str(bitrate) or 'Auto'
+    return _pick_bitrate(bitrate, bits_per_symbol, samples_per_symbol,
+                         decim_rate, converter_rate, _gen_rx_info)
Index: /vtcross/trunk/src/cognitive_engines/DSA_CE/examples/gnuradio-examples/usrp_options.py
===================================================================
--- /vtcross/trunk/src/cognitive_engines/DSA_CE/examples/gnuradio-examples/usrp_options.py	(revision 389)
+++ /vtcross/trunk/src/cognitive_engines/DSA_CE/examples/gnuradio-examples/usrp_options.py	(revision 389)
@@ -0,0 +1,103 @@
+#
+# Copyright 2009 Free Software Foundation, Inc.
+#
+# This file is part of GNU Radio
+#
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GNU Radio 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 GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+#
+
+import generic_usrp
+
+def _add_options(parser, expert):
+    """
+    Add options to manually choose between usrp or usrp2.
+    Add options for usb. Add options common to source and sink.
+    @param parser: instance of OptionParser
+    """
+    #pick usrp or usrp2
+    parser.add_option("-u", "--usrpx", type="string", default=None,
+                      help="specify which usrp model: 1 for USRP, 2 for USRP2 [default=auto]")
+    #fast usb options
+    expert.add_option("-B", "--fusb-block-size", type="int", default=0,
+                      help="specify fast usb block size [default=%default]")
+    expert.add_option("-N", "--fusb-nblocks", type="int", default=0,
+                      help="specify number of fast usb blocks [default=%default]")
+    #usrp options
+    parser.add_option("-w", "--which", type="int", default=0,
+                      help="select USRP board [default=%default]")
+    #usrp2 options
+    parser.add_option("-e", "--interface", type="string", default="eth0",
+                      help="Use USRP2 at specified Ethernet interface [default=%default]")
+    parser.add_option("-m", "--mac-addr", type="string", default="",
+                      help="Use USRP2 at specified MAC address [default=None]")
+
+def add_rx_options(parser, expert=None):
+    """
+    Add receive specific usrp options.
+    @param parser: instance of OptionParser
+    """
+    parser.add_option("-R", "--rx-subdev-spec", type="subdev", default=None,
+                      help="select USRP Rx side A or B")
+    parser.add_option("--rx-gain", type="eng_float", default=None, metavar="GAIN",
+                      help="set receiver gain in dB [default=midpoint].  See also --show-rx-gain-range")
+    parser.add_option("--show-rx-gain-range", action="store_true", default=False, 
+                      help="print min and max Rx gain available on selected daughterboard")
+    parser.add_option("-d", "--decim", type="intx", default=None,
+                      help="set fpga decimation rate to DECIM [default=%default]")
+    _add_options(parser, expert)
+
+def create_usrp_source(options):
+    u = generic_usrp.generic_usrp_source_c(
+        usrpx=options.usrpx,
+        which=options.which,
+        subdev_spec=options.rx_subdev_spec,
+        interface=options.interface,
+        mac_addr=options.mac_addr,
+        fusb_block_size=options.fusb_block_size,
+        fusb_nblocks=options.fusb_nblocks,
+    )
+    if options.show_rx_gain_range:
+        print "Rx Gain Range: minimum = %g, maximum = %g, step size = %g"%tuple(u.gain_range())
+    return u
+
+def add_tx_options(parser, expert=None):
+    """
+    Add transmit specific usrp options.
+    @param parser: instance of OptionParser
+    """
+    parser.add_option("-T", "--tx-subdev-spec", type="subdev", default=None,
+                      help="select USRP Rx side A or B")
+    parser.add_option("--tx-gain", type="eng_float", default=None, metavar="GAIN",
+                      help="set transmitter gain in dB [default=midpoint].  See also --show-tx-gain-range")
+    parser.add_option("--show-tx-gain-range", action="store_true", default=False, 
+                      help="print min and max Tx gain available on selected daughterboard")
+    parser.add_option("-i", "--interp", type="intx", default=None,
+                      help="set fpga interpolation rate to INTERP [default=%default]")
+    _add_options(parser, expert)
+
+def create_usrp_sink(options):
+    u = generic_usrp.generic_usrp_sink_c(
+        usrpx=options.usrpx,
+        which=options.which,
+        subdev_spec=options.tx_subdev_spec,
+        interface=options.interface,
+        mac_addr=options.mac_addr,
+        fusb_block_size=options.fusb_block_size,
+        fusb_nblocks=options.fusb_nblocks,
+    )
+    if options.show_tx_gain_range:
+        print "Tx Gain Range: minimum = %g, maximum = %g, step size = %g"%tuple(u.gain_range())
+    return u
Index: /vtcross/trunk/src/cognitive_engines/DSA_CE/examples/gnuradio-examples/generic_usrp.py
===================================================================
--- /vtcross/trunk/src/cognitive_engines/DSA_CE/examples/gnuradio-examples/generic_usrp.py	(revision 389)
+++ /vtcross/trunk/src/cognitive_engines/DSA_CE/examples/gnuradio-examples/generic_usrp.py	(revision 389)
@@ -0,0 +1,187 @@
+#
+# Copyright 2009 Free Software Foundation, Inc.
+#
+# This file is part of GNU Radio
+#
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GNU Radio 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 GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+#
+
+USRP_TYPE = 'usrp'
+USRP2_TYPE = 'usrp2'
+
+from gnuradio import gr, usrp, usrp2
+
+########################################################################
+# generic usrp common stuff
+########################################################################
+class _generic_usrp_base(object):
+
+    def __init__(self, which=0, subdev_spec=None, interface="", mac_addr="", fusb_block_size=0, fusb_nblocks=0, usrpx=None):
+        self._gain = 0
+        self._usrpx = usrpx
+        #usrp options
+        self._which = which
+        self._subdev_spec = subdev_spec
+        #usrp2 options
+        self._interface = interface
+        self._mac_addr = mac_addr
+        #fusb options
+        self._fusb_block_size = fusb_block_size
+        self._fusb_nblocks = fusb_nblocks
+
+    def __str__(self):
+        if self._type == USRP_TYPE: return self._subdev.side_and_name()
+        elif self._type == USRP2_TYPE: return "D-Board ID 0x%x\n"%self._u.daughterboard_id()
+
+    def gain(self): return self._gain
+
+    def set_gain(self, gain=None):
+        if gain is None:
+            r = self.gain_range()
+            gain = (r[0] + r[1])/2               # set gain to midpoint
+        self._gain = gain
+        if self._type == USRP_TYPE: return self._subdev.set_gain(gain)
+        elif self._type == USRP2_TYPE: return self._u.set_gain(gain)
+
+    def gain_range(self):
+        if self._type == USRP_TYPE: return self._subdev.gain_range()
+        elif self._type == USRP2_TYPE: return self._u.gain_range()
+
+    def set_center_freq(self, target_freq):
+        if self._type == USRP_TYPE:
+            return bool(self._u.tune(self._dxc, self._subdev, target_freq))
+        elif self._type == USRP2_TYPE:
+            return self._u.set_center_freq(target_freq)
+
+    def set_auto_tr(self, enable):
+        if self._type == USRP_TYPE: return self._subdev.set_auto_tr(enable)
+
+    def __del__(self):
+        # Avoid weak reference error
+        if self._type == USRP_TYPE: del self._subdev
+
+########################################################################
+# generic usrp source
+########################################################################
+class generic_usrp_source_c(_generic_usrp_base, gr.hier_block2):
+    """
+    Create a generic usrp source that represents usrp and usrp2.
+    Take usrp and usrp2 constructor arguments and try to figure out usrp or usrp2.
+    Provide generic access methods so the API looks the same for both.
+    """
+
+    def __init__(self, **kwargs):
+        _generic_usrp_base.__init__(self, **kwargs)
+        gr.hier_block2.__init__(self, "generic_usrp_source",
+            gr.io_signature(0, 0, 0), # Input signature
+            gr.io_signature(1, 1, gr.sizeof_gr_complex)) # Output signature
+        #pick usrp or usrp2
+        if self._usrpx == '1' or self._subdev_spec:
+            self._setup_usrp_source()
+        elif self._usrpx == '2' or self._mac_addr:
+            self._setup_usrp2_source()
+        else: #automatic
+            try: self._setup_usrp2_source()
+            except: self._setup_usrp_source()
+        self.connect(self._u, self)
+        self.set_auto_tr(True)
+
+    ####################################################################
+    # generic access methods
+    ####################################################################
+    def set_decim(self, decim):
+        if self._type == USRP_TYPE: return self._u.set_decim_rate(decim)
+        elif self._type == USRP2_TYPE: return self._u.set_decim(decim)
+
+    def adc_rate(self): return self._u.adc_rate()
+
+    ####################################################################
+    # setup usrp methods
+    ####################################################################
+    def _setup_usrp_source(self):
+        self._u = usrp.source_c (self._which,
+                                fusb_block_size=self._fusb_block_size,
+                                fusb_nblocks=self._fusb_nblocks)
+        # determine the daughterboard subdevice we're using
+        if self._subdev_spec is None:
+            self._subdev_spec = usrp.pick_rx_subdevice(self._u)
+        self._subdev = usrp.selected_subdev(self._u, self._subdev_spec)
+        self._u.set_mux(usrp.determine_rx_mux_value(self._u, self._subdev_spec))
+        self._type = USRP_TYPE
+        self._dxc = 0
+
+    def _setup_usrp2_source(self):
+        self._u = usrp2.source_32fc(self._interface, self._mac_addr)
+        self._type = USRP2_TYPE
+
+########################################################################
+# generic usrp sink
+########################################################################
+class generic_usrp_sink_c(_generic_usrp_base, gr.hier_block2):
+    """
+    Create a generic usrp sink that represents usrp and usrp2.
+    Take usrp and usrp2 constructor arguments and try to figure out usrp or usrp2.
+    Provide generic access methods so the API looks the same for both.
+    """
+
+    def __init__(self, **kwargs):
+        _generic_usrp_base.__init__(self, **kwargs)
+        gr.hier_block2.__init__(self, "generic_usrp_sink",
+            gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature
+            gr.io_signature(0, 0, 0)) # Output signature
+
+        #pick usrp or usrp2
+        if self._usrpx == '1' or self._subdev_spec:
+            self._setup_usrp_source()
+        elif self._usrpx == '2' or self._mac_addr:
+            self._setup_usrp2_source()
+        else: #automatic
+            try: self._setup_usrp2_source()
+            except: self._setup_usrp_source()
+        self.connect(self, self._u)
+        self.set_auto_tr(True)
+
+    ####################################################################
+    # generic access methods
+    ####################################################################
+    def set_interp(self, interp):
+        if self._type == USRP_TYPE: return self._u.set_interp_rate(interp)
+        elif self._type == USRP2_TYPE: return self._u.set_interp(interp)
+
+    def dac_rate(self): return self._u.dac_rate()
+
+    def ampl_range(self):
+        if self._type == USRP_TYPE: return (0.0, 2.**15-1)
+        elif self._type == USRP2_TYPE: return (0.0, 1.0)
+
+    ####################################################################
+    # setup usrp methods
+    ####################################################################
+    def _setup_usrp_source(self):
+        self._u = usrp.sink_c (self._which,
+                                fusb_block_size=self._fusb_block_size,
+                                fusb_nblocks=self._fusb_nblocks)
+        # determine the daughterboard subdevice we're using
+        if self._subdev_spec is None:
+            self._subdev_spec = usrp.pick_tx_subdevice(self._u)
+        self._subdev = usrp.selected_subdev(self._u, self._subdev_spec)
+        self._u.set_mux(usrp.determine_tx_mux_value(self._u, self._subdev_spec))
+        self._type = USRP_TYPE
+        self._dxc = self._subdev.which()
+
+    def _setup_usrp2_source(self):
+        self._u = usrp2.sink_32fc(self._interface, self._mac_addr)
+        self._type = USRP2_TYPE
Index: /vtcross/trunk/src/cognitive_engines/DSA_CE/examples/gnuradio-examples/dsa.py
===================================================================
--- /vtcross/trunk/src/cognitive_engines/DSA_CE/examples/gnuradio-examples/dsa.py	(revision 389)
+++ /vtcross/trunk/src/cognitive_engines/DSA_CE/examples/gnuradio-examples/dsa.py	(revision 389)
@@ -0,0 +1,337 @@
+#!/usr/bin/env python
+#Transmission and reception, one ata a time on the same antena
+
+from gnuradio import gr, gru, modulation_utils
+from gnuradio import eng_notation
+from gnuradio.eng_option import eng_option
+from optparse import OptionParser
+from numpy import random
+import random, time, struct, sys, math
+from datetime import datetime
+
+# from current dir
+from transmit_path import transmit_path
+from receive_path import receive_path
+
+# import cross
+from cross import *
+
+
+global sync_status,mode,ch,traffic_flag,n_rcvd, n_right
+sync_status = False
+#Defining modes of operation
+# sync: the two nodes are trying to rendezvous on a common channel
+# traffic: the two node are communicating information to each other
+mode = "sync" #Default mode is sync
+traffic_flag = False
+class my_top_block(gr.top_block):
+
+    	def __init__(self, mod_class, demod_class,
+                 rx_callback, options_tx,options_rx):
+
+        	gr.top_block.__init__(self)
+        	self.rxpath = receive_path(demod_class, rx_callback, options_rx)
+		self.txpath = transmit_path(mod_class, options_tx)
+		self.connect(self.txpath);
+		self.connect(self.rxpath);
+
+
+def main():
+
+   	global n_rcvd, n_right,sync_status,mode,ch,traffic_flag,n_attempts,return_flag
+    	n_rcvd = 0
+    	n_right = 0
+	n_attempts = 5
+	return_flag = 0
+
+    	def send_pkt(self, payload='', eof=False):
+        	return self.txpath.send_pkt(payload, eof)
+	
+	def get_freq(hop_freq,probe_level,absent_time):
+
+		# Convert hop_freq to our unique channel list
+
+		if hop_freq == 462562500:
+			channel = 1
+		if hop_freq == 462712500:
+			channel = 7
+		if hop_freq == 467562500:
+			channel = 8
+		if hop_freq == 467712500:
+			channel = 14
+
+		p = Parameter(1)
+		currentParameters = Parameter(1)
+		o = Observable(1)
+
+		o[0].value = probe_level
+		o[0].name = "energy"
+
+		currentParameters[0].name = "channel"
+		currentParameters[0].value = channel;
+
+		p = GetOptimalParameters(o,1,currentParameters,1);
+		print p[0].name, p[0].value
+	
+		if channel < 8:
+			hop_freq = float(1e6 * (462.5625+(channel-1)*0.025))#setting the centre freq frequency for sending packets
+	 	else:
+			hop_freq = float(1e6 * (467.5625+(channel-8)*0.025))#setting the centre freq frequency for sending packets	
+
+		return channel,hop_freq #returning the channel number and hop frequency
+	
+
+	def rx_callback(ok, payload):
+		
+		global n_rcvd, n_right,sync_status,mode,ch,traffic_flag
+    		########################## sync ####################################
+		if mode == "sync":
+			if ok:
+        			(pktno,) = struct.unpack('!H', payload[0:2])
+       				(sync_signal,) = struct.unpack('!s', payload[2]) 
+        			(data_channel,) = struct.unpack('!H', payload[3:5])
+        							  
+        			if str(sync_signal) == 'o' and str(data_channel) == str(ch):
+        				
+					sync_status = True
+					#tb.stop()
+					                   		
+				if str(sync_signal) == 's' and str(data_channel) == str(ch): 
+					
+					sync_status = True
+					data = 'o'
+               				pktno=0
+	       				ack_payload = struct.pack('!HsH', pktno & 0xffff,data,ch & 0xffff) #+ data
+		      			send_pkt(tb,ack_payload) #sending back the acknowledgement
+			#else:
+			#	print "sync packet not ok\n"
+		###################################################################
+    		
+		######################### traffic #################################
+		if mode == "traffic":
+			if ok: 
+				(data_header,) = struct.unpack('!s', payload[0])
+				if data_header == 'd':
+					traffic_flag = True
+					comm = struct.unpack('!14s', payload[1:15])
+					data = 'dI am fine.....' #Sending this message
+					payload = struct.pack('!15s', data)
+					send_pkt(tb,payload)
+				
+			#else:
+			#	print "data packet not ok\n"
+		##############################################################
+
+       		n_rcvd += 1
+        	if ok:
+            		n_right += 1
+
+        	#print "ok = %5s  pktno = %4d  n_rcvd = %4d  n_right = %4d" % (
+        	#    ok, pktno, n_rcvd, n_right)
+		
+
+    	mods = modulation_utils.type_1_mods()
+    	demods = modulation_utils.type_1_demods()
+
+    	#setting up the tx options parser
+
+    	parser_tx = OptionParser(option_class=eng_option, conflict_handler="resolve")
+    	expert_grp_tx = parser_tx.add_option_group("Expert_tx")
+
+    	parser_tx.add_option("-m", "--modulation", type="choice", choices=mods.keys(),
+                      	default='gmsk',
+                      	help="Select modulation from: %s [default=%%default]"
+                            	% (', '.join(mods.keys()),))
+
+    	parser_tx.add_option("-s", "--size", type="eng_float", default=1500,
+                      	help="set packet size [default=%default]")
+    	parser_tx.add_option("-M", "--megabytes", type="eng_float", default=1.0,
+                      	help="set megabytes to transmit [default=%default]")
+    	parser_tx.add_option("","--discontinuous", action="store_true", default=False,
+                      	help="enable discontinous transmission (bursts of 5 packets)")
+    	parser_tx.add_option("","--from-file", default=None,
+                      	help="use file for packet contents")
+    	
+    	transmit_path.add_options(parser_tx, expert_grp_tx)
+
+    	for mod in mods.values():
+        	mod.add_options(expert_grp_tx)
+
+    	(options_tx, args_tx) = parser_tx.parse_args ()
+
+    	if len(args_tx) != 0:
+        	parser_tx.print_help()
+        	sys.exit(1)
+	
+    	############# Setting some default values for tx side of the block
+    	options_tx.tx_freq = 462.5625e6
+    	options_tx.samples_per_symbol =  2
+    	options_tx.modulation = 'dbpsk'
+    	options_tx.fusb_block_size = 4096
+    	options_tx.fusb_nblocks = 16
+    	options_tx.bitrate = 0.0125e6
+    	#############
+
+    	if options_tx.tx_freq is None:
+        	sys.stderr.write("You must specify -f FREQ or --freq FREQ\n")
+        	parser_tx.print_help(sys.stderr)
+        	sys.exit(1)
+
+    	if options_tx.from_file is not None:
+        	source_file = open(options_tx.from_file, 'r')
+    	    
+    	parser_rx = OptionParser (option_class=eng_option, conflict_handler="resolve")
+    	expert_grp_rx = parser_rx.add_option_group("Expert_rx")
+    	parser_rx.add_option("-m", "--modulation", type="choice", choices=demods.keys(),
+                      	default='gmsk',
+                      	help="Select modulation from: %s [default=%%default]"
+                            	% (', '.join(demods.keys()),))
+    	
+    	receive_path.add_options(parser_rx, expert_grp_rx)
+
+    	for mod in demods.values():
+        	mod.add_options(expert_grp_rx)
+
+    	(options_rx, args_rx) = parser_rx.parse_args ()
+
+    	if len(args_rx) != 0:
+        	parser_rx.print_help(sys.stderr)
+        	sys.exit(1)
+    	############# Setting some default values for rx side of the block
+    	options_rx.rx_freq = 462.5625e6 #setting default rx_freq value
+    	options_rx.samples_per_symbol =  2
+    	options_rx.modulation = 'dbpsk'
+    	options_rx.fusb_block_size = 4096
+    	options_rx.fusb_nblocks = 16
+    	options_rx.bitrate = 0.0125e6
+    	#############
+
+    	if options_rx.rx_freq is None:
+        	sys.stderr.write("You must specify -f FREQ or --freq FREQ\n")
+        	parser_rx.print_help(sys.stderr)
+        	sys.exit(1)
+    	
+	# build the graph
+
+    	tb = my_top_block(mods[options_tx.modulation],
+                      	demods[options_rx.modulation],
+                      	rx_callback,options_tx,
+                      	options_rx)
+    	r = gr.enable_realtime_scheduling()
+    	if r != gr.RT_OK:
+        	print "Warning: failed to enable realtime scheduling"
+    
+    	tb.start()
+
+    	#listening to random frequencies untill a match is found
+    	running = True
+    	ch_energy = tb.rxpath.probe.level() #setting initial value
+	hop_freq = options_tx.tx_freq #  = options_rx.rx_freq...same for tx and rx side
+   	while running:
+
+		################################################sync mode####################################
+		if mode == "sync":
+			if sync_status != True:
+	    			
+				if return_flag == 0:
+					ch,hop_freq = get_freq(hop_freq,ch_energy,0)
+				else:
+					ch,hop_freq = get_freq(hop_freq,ch_energy,elapsed_time)
+					return_flag = 0
+
+				tb.txpath.set_freq(hop_freq)
+	    			tb.rxpath.set_freq(hop_freq)
+      		
+				ch_energy = tb.rxpath.probe.level() #check if primary user is present
+				
+				if int(ch_energy) > 1.5e8: #if primary user is there then dont transmit on this channel
+					continue
+				
+	    			nbytes = 5 #int(1e6 * .0003)
+				pkt_size = 5
+	    			n = 0
+	    			pktno = 0
+    	    			while n < nbytes:
+                			if options_tx.from_file is None:
+                    				data = 's'
+	        			else:
+            	    				data = source_file.read(pkt_size - 2)
+            	    				if data == '':
+                        				break;
+
+                			payload = struct.pack('!HsH', pktno & 0xffff,data,ch & 0xffff) #+ data
+	        				
+                			send_pkt(tb,payload)
+					n += len(payload)
+                			sys.stderr.write('.')
+                			if options_tx.discontinuous and pktno % 5 == 4:
+                    				time.sleep(1)
+                				pktno += 1
+	    			time.sleep(0.1)
+            		
+			else:
+				print "sync channel found..channel ",ch,"\n"  
+				n_attempts_counter = 0
+				mode = "traffic"
+				traffic_flag = False
+				sync_status="False"
+				start_time = datetime.now() #measuring the time for which the primary user is away
+	
+		################################################end of sync mode####################################
+
+		################################################Communications mode#################################
+		if mode == "traffic":
+							
+			nbytes = 15
+    	    		pkt_size = 15
+			data_pktno = 0
+			n = 0
+			while n < nbytes:
+                		
+               			if options_tx.from_file is None:
+                 			data = 'dHi how are you' #Sending this message
+	        			
+                		else:
+            		    		data = source_file.read(pkt_size - 2)
+            		    		if data == '':
+                	        		break;
+	
+			
+                		payload = struct.pack('!15s', data)
+	       							
+                		send_pkt(tb,payload)
+				#print "printing payload",data,"**\n"
+                		n += len(payload)
+                		sys.stderr.write('.')
+                		if options_tx.discontinuous and data_pktno % 5 == 4:
+                			time.sleep(1)
+                		data_pktno += 1
+	    			time.sleep(0.2 + 0.05*int(random.choice([0,1,2,3])))
+
+				if traffic_flag != True:
+					n_attempts_counter += 1
+					if n_attempts_counter  > n_attempts: #get out of the data channel as it seems that the other node is still trying to rendezvous
+						mode = "sync"
+						continue
+
+				ch_energy = tb.rxpath.probe.level() #check if primary user is present
+				
+            			if int(ch_energy) > 1.5e8: #if primary user is there then dont transmit on this channel
+					stop_time = datetime.now()	
+					_elapsed_time  = start_time - stop_time
+					elapsed_time = _elapsed_time.seconds
+					print "primary user detected..moving out of this channel\n"
+					mode = "sync"
+					return_flag = 1
+                
+
+if __name__ == '__main__':
+    try:
+        main()
+    except KeyboardInterrupt:
+        pass
+
+
+
+
+		
Index: /vtcross/trunk/src/cognitive_engines/DSA_CE/examples/libcross_demo.py
===================================================================
--- /vtcross/trunk/src/cognitive_engines/DSA_CE/examples/libcross_demo.py	(revision 389)
+++ /vtcross/trunk/src/cognitive_engines/DSA_CE/examples/libcross_demo.py	(revision 389)
@@ -0,0 +1,27 @@
+# Simple Python demonstration script for using
+# the CROSS system.
+#
+# Use with demo.xml shell configuration file
+#   Instructions:
+# 	Start shell with demo.xml config from the examples directory
+#	Start cognitive engine
+#	Run this script
+#	
+
+from cross import *
+
+p = Parameter(1)
+currentParameters = Parameter(1)
+o = Observable(1)
+
+o[0].value = 15.00
+o[0].name = "energy"
+
+currentParameters[0].name = "channel"
+currentParameters[0].value = 3 
+
+p = GetOptimalParameters(o,1,currentParameters,1);
+
+print p[0].name, p[0].value
+
+
Index: /vtcross/trunk/src/include/vtcross/socketcomm.h
===================================================================
--- /vtcross/trunk/src/include/vtcross/socketcomm.h	(revision 255)
+++ /vtcross/trunk/src/include/vtcross/socketcomm.h	(revision 389)
@@ -18,5 +18,5 @@
 /* TODO
  */
-void ReadMessage(int32_t socketFD, char *msgBuffer);
+int32_t ReadMessage(int32_t socketFD, char *msgBuffer);
 
 /* TODO
Index: /vtcross/trunk/src/include/vtcross/components.h
===================================================================
--- /vtcross/trunk/src/include/vtcross/components.h	(revision 285)
+++ /vtcross/trunk/src/include/vtcross/components.h	(revision 389)
@@ -374,5 +374,5 @@
         /* Handle a message that is received from a component.
          */
-        void HandleMessage(int32_t socketFD);
+        int HandleMessage(int32_t socketFD);
        
         /* Send optimization request to primary port FD.
Index: /vtcross/trunk/src/lib/socketcomm/socketcomm.cpp
===================================================================
--- /vtcross/trunk/src/lib/socketcomm/socketcomm.cpp	(revision 232)
+++ /vtcross/trunk/src/lib/socketcomm/socketcomm.cpp	(revision 389)
@@ -34,5 +34,5 @@
 // TODO also, it appears that this function can, at maximum, receive 256 bytes
 // without causing a buffer overflow. can someone confirm/deny?
-void
+int32_t
 ReadMessage(int32_t socketFD, char* msgBuffer)
 {
@@ -41,9 +41,9 @@
     // Messages are termination with a "\0" to denote EOM.
     ssize_t msgLength = recv(socketFD, msgBuffer, 256, MSG_PEEK);
-    if(msgLength < 0)
-        ERROR(1, "Error reading from socket.\n");
-    if(msgLength == 0)
-        ERROR(1, "Remote component closed connection. 1\n");
-
+    if(msgLength <= 0) {
+        //ERROR(1, "Remote component closed connection. 1\n");
+        //LOG("Client closed connection.\n");
+	return -1;
+    }
     size_t i;
     for(i = 0; i < 256; i++) {
@@ -54,8 +54,11 @@
     // Read the message into msgBuffer
     msgLength = recv(socketFD, msgBuffer, i + 1, 0);
-    if(msgLength < 0)
-        ERROR(1, "Error reading from socket.\n");
-    if(msgLength == 0)
-        ERROR(1, "Remote component closed connection. 2\n");
+    if(msgLength <= 0) {
+        //ERROR(1, "Remote component closed connection. 1\n");
+        //LOG("Client closed connection.\n");
+	return -1;
+    }
+
+    return 1;
 }
 
@@ -93,25 +96,4 @@
 
     
-/* TODO I'm fairly certain this function is unnecessary, see function below for more details...
-int32_t
-SendMessage(int32_t socketFD, char* message) 
-{
-     
-    // TODO explain this. What, exactly, does the below line do and how does it
-    // affect the rest of the function?
-    strcat(message, "\0000");
-
-    ssize_t numSentBytes = send(socketFD, message, (strlen(message) + 1), 0);
-    if(numSentBytes < 0) {
-        ERROR(1, "Error sending to server.");
-    }
-    else if(numSentBytes == 0) {
-        LOG("socket_comm::SendMessage - Server closed the socket.\n");
-    }
-   
-    return numSentBytes;
-}
-*/
-
 // TODO this function is here to handle calls to send const char* messages. Note
 // that the std::string.c_str() function auto-appends a null character at the
@@ -217,5 +199,5 @@
     if(clientSocket < 0) { 
         //WARNING("ALERT: Could not establish connection with client socket.\n");
-        return -1;
+        return clientSocket;
     }
     //LOG("Handling client %s\n", inet_ntoa(echoClientAddr.sin_addr));
Index: /vtcross/trunk/src/shell/CognitiveRadioShell.cpp
===================================================================
--- /vtcross/trunk/src/shell/CognitiveRadioShell.cpp	(revision 316)
+++ /vtcross/trunk/src/shell/CognitiveRadioShell.cpp	(revision 389)
@@ -642,10 +642,14 @@
 
 
-void
+int
 CognitiveRadioShell::HandleMessage(int32_t socketFD)
 {
     char buffer[256];
-    //printf("here\n");
-    ReadMessage(socketFD, buffer);
+    int ret = 0;
+    
+    ret = ReadMessage(socketFD, buffer);
+    if(ret == -1) {
+	return ret;
+    }
 
     // TODO trying to read this code lock makes my eyes bleed
@@ -685,4 +689,6 @@
         //GetOptimalParametersService(socketFD);  
     }
+
+    return ret;
 }
 
@@ -699,5 +705,8 @@
     int32_t desc_ready = 1;
     int32_t timeout = 10;
+    int32_t ret = 0;;
     fd_set sockSet;
+   
+
 
     int32_t *servSock = new int32_t[3];
@@ -726,8 +735,9 @@
         ERROR(1,"Error initializing command port\n");
 
+    FD_ZERO(&sockSet);
+    
     while (running) {
         /* Zero socket descriptor vector and set for server sockets */
         /* This must be reset every time select() is called */
-        //FD_ZERO(&sockSet);
         FD_SET(servSock[primary], &sockSet);
         FD_SET(servSock[policy], &sockSet);
@@ -740,6 +750,5 @@
 
         /* Suspend program until descriptor is ready or timeout */
-	//printf("Waiting for signal...\n");
-        rc = select(maxDescriptor + 1, &sockSet, NULL, NULL, NULL); 
+        rc = select(maxDescriptor + 1, &sockSet, NULL, NULL, &selTimeout); 
         if(rc == 0)
             LOG("No echo requests for %i secs...Server still alive\n", timeout);
@@ -754,6 +763,7 @@
                         do {
                             new_sd = AcceptTCPConnection(port);
-                            if(new_sd < 0) 
+                            if(new_sd < 0) {
                                 break;
+			    }
                            
                             if(port == servSock[primary])
@@ -764,14 +774,22 @@
                                 policySocketFD = new_sd;
 
-                            HandleMessage(new_sd);
-                            FD_SET(new_sd,&sockSet);
+                            ret = HandleMessage(new_sd);
+
+			    if(ret == -1) {
+				FD_CLR(new_sd,&sockSet);
+				close(new_sd);
+			    }
+
+			    FD_SET(new_sd,&sockSet);
                             if(new_sd > maxDescriptor) 
                                 maxDescriptor = new_sd;
-                            //LOG("New incoming connection - %i\n\n",new_sd);
                         } while(new_sd != -1);
-                    } 
+		    } 
                     else {
-                        //LOG("Request on already open descriptor.\n\n");
-                        HandleMessage(port);
+                        ret = HandleMessage(port);
+			if(ret == -1) {
+			    FD_CLR(port,&sockSet);
+			    close(port);
+			}
                     }
                 }
@@ -780,5 +798,5 @@
     }
 
-
+    LOG("Closing it all.\n\n");
     /* Close sockets */
     close(servSock[primary]);
Index: /vtcross/trunk/src/libvtcross/libvtcross.cpp
===================================================================
--- /vtcross/trunk/src/libvtcross/libvtcross.cpp	(revision 299)
+++ /vtcross/trunk/src/libvtcross/libvtcross.cpp	(revision 389)
@@ -149,4 +149,5 @@
     }   
 
+    close(socketFD);
     return pList;
 }
