#!/usr/bin/env python

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


class tuner(gr.feval_dd):
    def __init__(self, top_block):
        gr.feval_dd.__init__(self)
        self.top_block = top_block
    def eval(self, freq_offet):
        self.top_block.set_center_frequency(freq_offet)
        return freq_offet

class receiver_hier(gr.hier_block2):
    def __init__(self, input_rate, osr=4):
        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.input_rate = input_rate
        self.osr = osr
        self.sps = input_rate / gsm_symb_rate / osr

        #create callbacks
        self.tuner_callback = tuner(self)
        #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)

    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.tuner_callback, self.osr)
        return receiver

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

    def set_timing(self, timing_offset):
        pass
        
