#!/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()
        
