#!/usr/bin/env python

import weakref
import gsm
from gnuradio.eng_option import eng_option
from gnuradio import gr, gru, blocks
from gnuradio import filter

class receiver_hier(gr.hier_block2):
    def __init__(self, input_rate, osr=4, arfcn=0):
        gr.hier_block2.__init__(self, 
                                "receiver_hier",
                                gr.io_signature(1, 1, gr.sizeof_gr_complex),
                                gr.io_signature(1, 1, 142*gr.sizeof_float))
        #set rates
        gsm_symb_rate = 1625000/6.0

        self.message_port_register_hier_in("bursts")
        self.message_port_register_hier_in("measurements")

        self.input_rate = input_rate
        self.osr = osr
        self.arfcn = arfcn
        self.sps = input_rate / gsm_symb_rate / osr

        #create accompaning blocks
        self.filtr = self._set_filter()
        self.interpolator = self._set_interpolator()
        self.receiver = self._set_receiver()
        self.connect(self, self.filtr,  self.interpolator, self.receiver,  self)
#        self.connect(self, self.interpolator, self.receiver,  self)
        self.msg_connect(self.receiver, "bursts", weakref.proxy(self), "bursts")
        self.msg_connect(self.receiver, "measurements", weakref.proxy(self), "measurements")

    def _set_filter(self):
        filter_cutoff   = 125e3	
        filter_t_width  = 10e3
        offset = 0

        filter_taps    = filter.firdes.low_pass(1.0, self.input_rate, filter_cutoff, filter_t_width, filter.firdes.WIN_HAMMING)
        filtr          = filter.freq_xlating_fir_filter_ccf(1, filter_taps, offset, self.input_rate)
        return filtr
    
    def _set_interpolator(self):
        interpolator = filter.fractional_resampler_cc(0, self.sps) 
        return interpolator
    
    def _set_receiver(self):
        receiver = gsm.receiver(self.osr, self.arfcn)
        return receiver

    def set_center_frequency(self, center_freq):
        self.filtr.set_center_freq(center_freq)

    def set_timing(self, timing_offset):
        pass
        
    def set_arfcn(self,arfcn):
        self.receiver.set_arfcn(arfcn)
        
    def reset(self):
        self.receiver.reset()
        
