diff --git a/grc/gsm_block_tree.xml b/grc/gsm_block_tree.xml index 85a89c2..0ceec47 100644 --- a/grc/gsm_block_tree.xml +++ b/grc/gsm_block_tree.xml @@ -21,6 +21,10 @@ gsm_clock_offset_control gsm_input + + Transmitter + gsm_txtime_bursts_tagger + Logical channels demapping gsm_universal_ctrl_chans_demapper diff --git a/grc/transmitter/gsm_txtime_bursts_tagger.xml b/grc/transmitter/gsm_txtime_bursts_tagger.xml index 6e72e03..8c3a203 100644 --- a/grc/transmitter/gsm_txtime_bursts_tagger.xml +++ b/grc/transmitter/gsm_txtime_bursts_tagger.xml @@ -2,14 +2,14 @@ txtime_bursts_tagger gsm_txtime_bursts_tagger - GSM import grgsm - grgsm.txtime_bursts_tagger() + grgsm.txtime_bursts_tagger($init_fn, $init_time, $time_hint) + set_time_hint($time_hint) init_fn init_fn - 20 + 0 int part @@ -17,8 +17,16 @@ init_time init_time - [10 0.1] - none + 0 + float + part + + + + time_hint + time_hint + 0 + float part @@ -28,6 +36,8 @@ 1 + + bursts message diff --git a/python/qa_txtime_bursts_tagger.py b/python/qa_txtime_bursts_tagger.py index 80257fa..bdbf1af 100755 --- a/python/qa_txtime_bursts_tagger.py +++ b/python/qa_txtime_bursts_tagger.py @@ -24,6 +24,14 @@ from gnuradio import gr, gr_unittest from gnuradio import blocks from txtime_bursts_tagger import txtime_bursts_tagger +#from transmitter.txtime_bursts_tagger import txtime_bursts_tagger +from pmt import * + +def make_time_hint_msg(time_hint): + return cons( dict_add(make_dict(), intern("time_hint"), from_double(time_hint)),PMT_NIL) + +def make_fn_time_msg(fn_ref, time_ref): + return cons( dict_add(make_dict(), intern("fn_time"), cons(from_uint64(fn_ref), from_double(time_ref))),PMT_NIL) class qa_txtime_bursts_tagger (gr_unittest.TestCase): @@ -34,9 +42,64 @@ class qa_txtime_bursts_tagger (gr_unittest.TestCase): self.tb = None def test_001_t (self): - # set up fg - self.tb.run () - # check data + tb = self.tb + time_ref = 0 + fn_ref = 0 + dut = txtime_bursts_tagger(fn_ref, time_ref) + + framenumbers_input = [1259192, 1076346, 1076242, 235879, 1259218] + timeslots_input = [6, 3, 4, 3, 5] + bursts_input = [ + "0001100001000111100111101111100101000100101011000010011110011101001111101100010100111111100000110100011111101011101100100111110011000100010001010000", + "0001000101000000001001111110000110010110110111110111101000001101001111101100010100111111001110001001110101110001010001000111011010010001011011000000", + "0001001101101101000111001000101011001101001110110001001100111101001111101100010100111111111001001010011010011111010010010101011001001011011100110000", + "0000010010100000001001101010100001011100010001101100111111101101001111101100010100111111101101001110100010101110010110101111100010010000110010110000", + ] + + src = grgsm.burst_source(framenumbers_input, timeslots_input, bursts_input) + sink = grgsm.burst_sink() + + self.tb.msg_connect(src, "out", dut, "bursts") + self.tb.msg_connect(dut, "bursts", sink, "in") + + tb.start() + tb.wait() + print "Dupa" + print sink + + +# msg1 = make_msg(1,"lol1") +# msg2 = make_msg(1,"lol2") +# msg3 = make_msg(2,"lol1") +# msg4 = make_msg(2,"lol1") +# +# port = intern("msgs") + +# tb.msg_connect(g,"msgs",dbg,"store") +# #tb.msg_connect(g,"msgs",dbg,"print_pdu") + +# tb.start() + +# g.to_basic_block()._post(port, msg1) +# g.to_basic_block()._post(port, msg3) +# g.to_basic_block()._post(port, msg2) +# g.to_basic_block()._post(port, msg4) + + + +# while dbg.num_messages() < 4: +# time.sleep(0.1) + +# tb.stop() +# tb.wait() +# print dbg.get_message(0) +# print get_id(dbg.get_message(0)) +# +# self.assertEqual(get_id(dbg.get_message(0)),1) +# self.assertEqual(get_id(dbg.get_message(1)),1) +# self.assertEqual(get_id(dbg.get_message(2)),2) +# self.assertEqual(get_id(dbg.get_message(3)),2) + if __name__ == '__main__': diff --git a/python/transmitter/CMakeLists.txt b/python/transmitter/CMakeLists.txt index 38a8c39..121ac8a 100644 --- a/python/transmitter/CMakeLists.txt +++ b/python/transmitter/CMakeLists.txt @@ -17,6 +17,7 @@ # the Free Software Foundation, Inc., 51 Franklin Street, # Boston, MA 02110-1301, USA. -install(FILES +GR_PYTHON_INSTALL( + FILES txtime_bursts_tagger.py DESTINATION ${GR_PYTHON_DIR}/grgsm ) diff --git a/python/transmitter/txtime_bursts_tagger.py b/python/transmitter/txtime_bursts_tagger.py index ce57e55..41cb53b 100644 --- a/python/transmitter/txtime_bursts_tagger.py +++ b/python/transmitter/txtime_bursts_tagger.py @@ -21,27 +21,55 @@ # # -import numpy from gnuradio import gr +from fn_time import fn_time_delta +import pmt +import numpy class txtime_bursts_tagger(gr.basic_block): """ A block that adds txtime metadata to a burst """ - def __init__(self): + def __init__(self, init_fn=0, init_time=0, time_hint=None): gr.basic_block.__init__(self, name="txtime_bursts_tagger", in_sig=[], out_sig=[]) + self.set_fn_time_reference(init_fn, init_time) + if time_hint is not None: + self.set_time_hint(time_hint) + self.message_port_register_in(pmt.intern("fn_time")) self.message_port_register_in(pmt.intern("bursts")) self.message_port_register_out(pmt.intern("bursts")) - - self.set_msg_handler(pmt.intern("fn_time"), self.set_fn_time_reference) - self.set_msg_handler(pmt.intern("bursts"), self.set_txtime_of_burst) + + self.set_msg_handler(pmt.intern("fn_time"), self.process_fn_time_reference) + self.set_msg_handler(pmt.intern("bursts"), self.process_txtime_of_burst) - def set_fn_time_reference(self, msg): - pass + def process_fn_time_reference(self, msg): + time_hint = pmt.to_python(pmt.dict_ref(pmt.car(msg), (pmt.intern("time_hint"),PMT_NIL))) + fn_time = pmt.to_python(pmt.dict_ref(pmt.car(msg), (pmt.intern("fn_time"),PMT_NIL))) + if time_hint is not None: + self.time_hint = time_hint + elif fn_time is not None: + self.fn_ref = pmt.car(fn_time) + self.time_ref = pmt.cdr(fn_time) + self.time_hint = self.time_ref + + def process_txtime_of_burst(self, msg): + burst_with_header = pmt.to_python(pmt.cdr(msg)) + fn = burst_with_header[11]+burst_with_header[10]*2**8+burst_with_header[9]*2**16+burst_with_header[8]*2**24 + ts_num = burst_with_header[3] + fn_delta, txtime = fn_time_delta(self.fn_ref, self.time_ref, fn, self.time_hint, ts_num) + tags_dict = pmt.dict_add(pmt.make_dict(), pmt.intern("txtime"), pmt.from_double(txtime)) + new_msg = pmt.cons(tags_dict, pmt.cdr(msg)) + self.message_port_pub(pmt.intern("bursts"), new_msg) - def set_txtime_of_burst() - pass + def set_fn_time_reference(self, init_fn, init_time): + self.fn_ref = init_fn + self.time_ref = init_time + self.set_time_hint(init_time) + + def set_time_hint(self, time_hint): + self.time_hint = time_hint +