added arfcn parameter to the receiver
diff --git a/lib/receiver_impl.cc b/lib/receiver_impl.cc
index 90eccc2..09461c6 100644
--- a/lib/receiver_impl.cc
+++ b/lib/receiver_impl.cc
@@ -36,8 +36,8 @@
 #include <sch.h>
 #include <iostream>
 #include <iomanip>
-
 #include <assert.h>
+#include <boost/scoped_ptr.hpp>
 
 #define SYNC_SEARCH_RANGE 30
 
@@ -52,16 +52,16 @@
 typedef boost::circular_buffer<float> circular_buffer_float;
 
 receiver::sptr
-receiver::make(feval_dd * tuner, int osr)
+receiver::make(feval_dd * tuner, int osr, int arfcn)
 {
     return gnuradio::get_initial_sptr
-           (new receiver_impl(tuner, osr));
+           (new receiver_impl(tuner, osr, arfcn));
 }
 
 /*
  * The private constructor
  */
-receiver_impl::receiver_impl(feval_dd * tuner, int osr)
+receiver_impl::receiver_impl(feval_dd * tuner, int osr, int arfcn)
     : gr::block("receiver",
                 gr::io_signature::make(1, 1, sizeof(gr_complex)),
                 gr::io_signature::make(0, 0, 0)),
@@ -73,9 +73,10 @@
     d_freq_offset(0),
     d_state(first_fcch_search),
     d_burst_nr(osr),
-    d_failed_sch(0)
+    d_failed_sch(0),
+    d_arfcn((int)(arfcn)),
+    d_signal_dbm(-120)
 {
-
     int i;
     gmsk_mapper(SYNC_BITS, N_SYNC_BITS, d_sch_training_seq, gr_complex(0.0, -1.0));
     for (i = 0; i < TRAIN_SEQ_NUM; i++)
@@ -116,9 +117,6 @@
                             gr_vector_void_star &output_items)
 {
     const gr_complex *input = (const gr_complex *) input_items[0];
-    //float *out = (float *) output_items[0];
-    int produced_out = 0;  //how many output elements were produced - this isn't used yet
-    //probably the gsm receiver will be changed into sink so this variable won't be necessary
 
     switch (d_state)
     {
@@ -128,13 +126,11 @@
         if (find_fcch_burst(input, ninput_items[0]))   //find frequency correction burst in the input buffer
         {
             //set_frequency(d_freq_offset);                //if fcch search is successful set frequency offset
-            DCOUT("Freq offset " << d_freq_offset);
-            //produced_out = 0;
+            COUT("Freq offset " << d_freq_offset);
             d_state = next_fcch_search;
         }
         else
         {
-            //produced_out = 0;
             d_state = first_fcch_search;
         }
         break;
@@ -148,14 +144,12 @@
             if (abs(prev_freq_offset - d_freq_offset) > FCCH_MAX_FREQ_OFFSET)
             {
                 //set_frequency(d_freq_offset);              //call set_frequncy only frequency offset change is greater than some value
-                COUT("Freq offset " << d_freq_offset);
+                DCOUT("Freq offset " << d_freq_offset);
             }
-            //produced_out = 0;
             d_state = sch_search;
         }
         else
         {
-            //produced_out = 0;
             d_state = next_fcch_search;
         }
         break;
@@ -176,8 +170,8 @@
             detect_burst(input, &channel_imp_resp[0], burst_start, output_binary); //detect bits using MLSE detection
             if (decode_sch(&output_binary[3], &t1, &t2, &t3, &d_ncc, &d_bcc) == 0)   //decode SCH burst
             {
-                //COUT("sch burst_start: " << burst_start);
-                //COUT("bcc: " << d_bcc << " ncc: " << d_ncc << " t1: " << t1 << " t2: " << t2 << " t3: " << t3);
+                DCOUT("sch burst_start: " << burst_start);
+                DCOUT("bcc: " << d_bcc << " ncc: " << d_ncc << " t1: " << t1 << " t2: " << t2 << " t3: " << t3);
                 d_burst_nr.set(t1, t2, t3, 0);                                  //set counter of bursts value
 
                 //configure the receiver - tell him where to find which burst type
@@ -205,7 +199,7 @@
     //in this state receiver is synchronized and it processes bursts according to burst type for given burst number
     case synchronized:
     {
-        DCOUT("Synchronized")            ;
+        DCOUT("Synchronized");
         vector_complex channel_imp_resp(CHAN_IMP_RESP_LENGTH*d_OSR);
         int burst_start;
         int offset = 0;
@@ -213,7 +207,13 @@
         unsigned char output_binary[BURST_SIZE];
 
         burst_type b_type = d_channel_conf.get_burst_type(d_burst_nr); //get burst type for given burst number
-
+        double signal_pwr=0;
+        for(int ii=0;ii<ninput_items[0];ii++)
+        {
+            signal_pwr += abs(input[ii])*abs(input[ii]);
+        }
+        d_signal_dbm=static_cast<int8_t>(round(20*log10(signal_pwr)));
+        
         switch (b_type)
         {
         case fcch_burst:                                                                      //if it's FCCH  burst
@@ -223,7 +223,8 @@
             double freq_offset = compute_freq_offset(input, first_sample, last_sample);       //extract frequency offset from it
 
             d_freq_offset_vals.push_front(freq_offset);
-            send_burst(d_burst_nr, fc_fb);
+            send_burst(d_burst_nr, fc_fb, b_type);
+
             if (d_freq_offset_vals.size() >= 10)
             {
                 double sum = std::accumulate(d_freq_offset_vals.begin(), d_freq_offset_vals.end(), 0);
@@ -244,7 +245,7 @@
             int t1, t2, t3, d_ncc, d_bcc;
             burst_start = get_sch_chan_imp_resp(input, &channel_imp_resp[0]);                //get channel impulse response
             detect_burst(input, &channel_imp_resp[0], burst_start, output_binary);           //MLSE detection of bits
-            send_burst(d_burst_nr, output_binary);
+            send_burst(d_burst_nr, output_binary, b_type);
             if (decode_sch(&output_binary[3], &t1, &t2, &t3, &d_ncc, &d_bcc) == 0)           //and decode SCH data
             {
                 // d_burst_nr.set(t1, t2, t3, 0);                                              //but only to check if burst_start value is correct
@@ -259,7 +260,7 @@
                 d_failed_sch++;
                 if (d_failed_sch >= MAX_SCH_ERRORS)
                 {
-                    d_state = first_fcch_search;        //TODO: this isn't good, the receiver is going wild when it goes back to next_fcch_search from here
+                    d_state = next_fcch_search;        //TODO: this isn't good, the receiver is going wild when it goes back to next_fcch_search from here
                     d_freq_offset_vals.clear();
                     d_freq_offset=0;
                     //set_frequency(0);
@@ -274,7 +275,7 @@
             float normal_corr_max;                                                    //if it's normal burst
             burst_start = get_norm_chan_imp_resp(input, &channel_imp_resp[0], &normal_corr_max, d_bcc); //get channel impulse response for given training sequence number - d_bcc
             detect_burst(input, &channel_imp_resp[0], burst_start, output_binary);            //MLSE detection of bits
-            send_burst(d_burst_nr, output_binary); //TODO: this shouldn't be here - remove it when gsm receiver's interface will be ready
+            send_burst(d_burst_nr, output_binary, b_type); //TODO: this shouldn't be here - remove it when gsm receiver's interface will be ready
             break;
         }
         case dummy_or_normal:
@@ -290,17 +291,17 @@
             if (normal_corr_max > dummy_corr_max)
             {
                 detect_burst(input, &channel_imp_resp[0], normal_burst_start, output_binary);
-                send_burst(d_burst_nr, output_binary); //TODO: this shouldn't be here - remove it when gsm receiver's interface will be ready
+                send_burst(d_burst_nr, output_binary, b_type); //TODO: this shouldn't be here - remove it when gsm receiver's interface will be ready
             }
             else
             {
-                send_burst(d_burst_nr, dummy_burst);
+                send_burst(d_burst_nr, dummy_burst, b_type);
             }
         }
         case rach_burst:
             break;
         case dummy:
-            send_burst(d_burst_nr, dummy_burst);
+            send_burst(d_burst_nr, dummy_burst, b_type);
             break;
         case empty:   //if it's empty burst
             break;      //do nothing
@@ -316,7 +317,7 @@
     break;
     }
 
-    return produced_out;
+    return 0;
 }
 
 
@@ -339,7 +340,7 @@
     bool end = false;
     bool result = false;
     circular_buffer_float::iterator buffer_iter;
-
+    
     /**@name Possible states of FCCH search algorithm*/
     //@{
     enum states
@@ -487,7 +488,6 @@
     return result;
 }
 
-
 double receiver_impl::compute_freq_offset(const gr_complex * input, unsigned first_sample, unsigned last_sample)
 {
     double phase_sum = 0;
@@ -764,10 +764,10 @@
 
         window_energy_buffer.push_back(energy);
     }
-    //!why doesn't this work
-    int strongest_window_nr_new = max_element(window_energy_buffer.begin(), window_energy_buffer.end()) - window_energy_buffer.begin();
-    strongest_window_nr = strongest_window_nr_new-d_OSR; //! so I have to override it here
 
+    strongest_window_nr = max_element(window_energy_buffer.begin(), window_energy_buffer.end()) - window_energy_buffer.begin();
+    strongest_window_nr = strongest_window_nr-d_OSR; 
+    
     max_correlation = 0;
     for (int ii = 0; ii < (d_chan_imp_length)*d_OSR; ii++)
     {
@@ -788,38 +788,34 @@
     // training sequence, which is 3+57+1+6=67 bits into the burst. That is
     // we have that sync_t16 equals first sample in bit number 67.
 
-    burst_start = search_start_pos + chan_imp_resp_center + strongest_window_nr - TRAIN_POS * d_OSR;
-
-    // GMSK modulator introduces ISI - each bit is expanded for 3*Tb
-    // and it's maximum value is in the last bit period, so burst starts
-    // 2*Tb earlier
-    burst_start -= 2 * d_OSR;
-    burst_start += 2;
-    //COUT("Poczatek ###############################");
-    //std::cout << " burst_start: " << burst_start << " center: " << ((float)(search_start_pos + strongest_window_nr + chan_imp_resp_center)) / d_OSR << " stronegest window nr: " <<  strongest_window_nr << "\n";
-    //COUT("burst_start_new: " << (search_start_pos + strongest_window_nr_new - TRAIN_POS * d_OSR));
     DCOUT("strongest_window_nr_new: " << strongest_window_nr);
-    burst_start=(search_start_pos + strongest_window_nr - TRAIN_POS * d_OSR);
+    burst_start = search_start_pos + strongest_window_nr - TRAIN_POS * d_OSR;
 
     DCOUT("burst_start: " << burst_start);
     return burst_start;
 }
 
 
-void receiver_impl::send_burst(burst_counter burst_nr, const unsigned char * burst_binary)
+void receiver_impl::send_burst(burst_counter burst_nr, const unsigned char * burst_binary, burst_type b_type)
 {
-    int ii;
-    
-    static const int nelements = 148;
-    pmt::pmt_t burst = pmt::make_s8vector(nelements, 0);  // Initializes all 64 elements to 0
 
-    size_t vec_size;
-    int8_t *burst_elements = pmt::s8vector_writable_elements(burst, vec_size);  // Returns pointer, vec_size is set to 64
-  
-    memcpy(burst_elements, burst_binary, nelements);
-    message_port_pub(pmt::mp("bursts"), burst);
+    boost::scoped_ptr<gsmtap_hdr> tap_header(new gsmtap_hdr());
+
+    tap_header->version = GSMTAP_VERSION;
+    tap_header->hdr_len = BURST_SIZE/4;
+    tap_header->type = GSMTAP_TYPE_UM_BURST;
+    tap_header->timeslot = static_cast<uint8_t>(d_burst_nr.get_timeslot_nr());
+    tap_header->frame_number = d_burst_nr.get_frame_nr();
+    tap_header->sub_type = static_cast<uint8_t>(b_type);
+    tap_header->arfcn = d_arfcn;
+    tap_header->signal_dbm = static_cast<int8_t>(d_signal_dbm);
+    pmt::pmt_t header_blob=pmt::make_blob(tap_header.get(),sizeof(gsmtap_hdr));
+    pmt::pmt_t burst_binary_blob=pmt::make_blob(burst_binary,BURST_SIZE);
+    pmt::pmt_t msg = pmt::cons(header_blob, burst_binary_blob);
+
+    message_port_pub(pmt::mp("bursts"), msg);
 }
-//TODO: this shouldn't be here also - the same reason
+
 void receiver_impl::configure_receiver()
 {
     d_channel_conf.set_multiframe_type(TSC0, multiframe_51);