Changed directory structure.
Corrected clock_offset_corrector (for some streange and yet unknown reason fractional resampler eats strem tags for some values of sps).
(this commit may contain some changes that are not described)
diff --git a/python/receiver/clock_offset_control.py b/python/receiver/clock_offset_control.py
new file mode 100644
index 0000000..506b0fd
--- /dev/null
+++ b/python/receiver/clock_offset_control.py
@@ -0,0 +1,102 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# 
+# Copyright 2014 <+YOU OR YOUR COMPANY+>.
+# 
+# This 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.
+# 
+# This software 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 this software; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+# 
+
+from numpy import *
+from gnuradio import gr
+import pmt
+from threading import Timer
+
+class clock_offset_control(gr.basic_block):
+    """
+    docstring for block clock_offset_control
+    """
+    def __init__(self, fc, samp_rate):
+        gr.basic_block.__init__(self,
+            name="gsm_clock_offset_control",
+            in_sig=[],
+            out_sig=[])
+        self.fc = fc
+        self.samp_rate = samp_rate
+        self.message_port_register_in(pmt.intern("measurements"))
+        self.set_msg_handler(pmt.intern("measurements"), self.process_measurement)
+        self.message_port_register_out(pmt.intern("ppm"))
+        self.alfa = 0.3
+        self.ppm_estimate = -1e6
+        self.first_measurement = True
+        self.counter = 0
+        self.last_state = ""
+        self.timer = Timer(0.5, self.timed_reset)
+        self.last_ppm = -1e6
+        
+    def process_measurement(self,msg):
+        if pmt.is_tuple(msg):
+            key = pmt.symbol_to_string(pmt.tuple_ref(msg,0))
+            if key == "freq_offset":
+                freq_offset = pmt.to_double(pmt.tuple_ref(msg,1))
+                ppm = -freq_offset/self.fc*1.0e6
+                state = pmt.symbol_to_string(pmt.tuple_ref(msg,2))
+                
+                self.last_state = state
+                
+                if abs(ppm) > 100: #safeguard against flawed measurements
+                    ppm = 0
+                    self.reset()
+                    
+                if state == "fcch_search":
+                    msg_ppm = pmt.from_double(ppm)
+                    self.message_port_pub(pmt.intern("ppm"), msg_ppm)
+                    self.timer.cancel()
+                    self.timer = Timer(0.5, self.timed_reset)
+                    self.timer.start()
+                elif state == "synchronized":
+                    self.timer.cancel()
+                    if self.first_measurement:
+                        self.ppm_estimate = ppm
+                        self.first_measurement = False
+                    else:
+                        self.ppm_estimate = (1-self.alfa)*self.ppm_estimate+self.alfa*ppm
+                    
+                    if self.counter == 5:
+                        self.counter = 0
+                        if abs(self.last_ppm-self.ppm_estimate) > 0.1:
+                            msg_ppm = pmt.from_double(ppm)
+                            self.message_port_pub(pmt.intern("ppm"), msg_ppm)
+                            self.last_ppm = self.ppm_estimate
+                    else:
+                        self.counter=self.counter+1
+                elif state == "sync_loss":
+                    self.reset()
+                    msg_ppm = pmt.from_double(0.0)
+                    self.message_port_pub(pmt.intern("ppm"), msg_ppm)
+
+
+    def timed_reset(self):
+        if self.last_state != "synchronized":
+#            print "conditional reset"
+            self.reset()
+            msg_ppm = pmt.from_double(0.0)
+            self.message_port_pub(pmt.intern("ppm"), msg_ppm)
+        
+    def reset(self):
+        self.ppm_estimate = -1e6
+        self.counter = 0
+        self.first_measurement = True
+