From 202788ec37989d07b0848590089227428265a3c9 Mon Sep 17 00:00:00 2001 From: ptrkrysik Date: Thu, 6 Aug 2015 10:09:43 +0200 Subject: Added function for subtraction of timeslots from bursts counter --- lib/receiver/receiver_config.cc | 27 +++++++++++++++++++++++++++ lib/receiver/receiver_config.h | 4 +++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/lib/receiver/receiver_config.cc b/lib/receiver/receiver_config.cc index c8b85c7..0abf200 100644 --- a/lib/receiver/receiver_config.cc +++ b/lib/receiver/receiver_config.cc @@ -46,6 +46,33 @@ burst_counter & burst_counter::operator++(int) return (*this); } +burst_counter burst_counter::subtract_timeslots(unsigned int number_of_timeslots) +{ + int timeslot_nr = (int)d_timeslot_nr - (int)number_of_timeslots; + int t1,t2,t3; + if (timeslot_nr < 0) { + timeslot_nr = timeslot_nr + 8; + + t2 = (d_t2 - 1) % 26; + t3 = (d_t3 - 1) % 51; + + if ((d_t2 == 0) && (d_t3 == 0)) { + t1 = (d_t1 - 1) % (1 << 11); + } else + { + t1 = d_t1; + } + } + else + { + t1 = d_t1; + t2 = d_t2; + t3 = d_t3; + } + + return burst_counter(d_OSR, t1, t2, t3, timeslot_nr); +} + void burst_counter::set(uint32_t t1, uint32_t t2, uint32_t t3, uint32_t timeslot_nr) { d_t1 = t1; diff --git a/lib/receiver/receiver_config.h b/lib/receiver/receiver_config.h index 496e1fe..17b98c8 100644 --- a/lib/receiver/receiver_config.h +++ b/lib/receiver/receiver_config.h @@ -89,12 +89,14 @@ class burst_counter d_t3(t3), d_timeslot_nr(timeslot_nr), d_offset_fractional(0.0), - d_offset_integer(0.0) { + d_offset_integer(0.0) + { d_offset_integer = 0; d_offset_fractional = 0; } burst_counter & operator++(int); + burst_counter subtract_timeslots(unsigned int number_of_timeslots); void set(uint32_t t1, uint32_t t2, uint32_t t3, uint32_t timeslot_nr); uint32_t get_t1() { -- cgit v1.2.3 From 380dea8a76ea27f195631bc992c640d1758a86a6 Mon Sep 17 00:00:00 2001 From: ptrkrysik Date: Thu, 6 Aug 2015 10:11:58 +0200 Subject: Added uplink processing to the receiver --- include/grgsm/receiver/receiver.h | 2 +- lib/receiver/receiver_impl.cc | 36 +++++++++++++++++++++++++++--------- lib/receiver/receiver_impl.h | 3 ++- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/include/grgsm/receiver/receiver.h b/include/grgsm/receiver/receiver.h index 80124f7..00e749e 100644 --- a/include/grgsm/receiver/receiver.h +++ b/include/grgsm/receiver/receiver.h @@ -51,7 +51,7 @@ namespace gr { * class. gsm::receiver::make is the public interface for * creating new instances. */ - static sptr make(int osr, const std::vector &cell_allocation, const std::vector &seq_nums); + static sptr make(int osr, const std::vector &cell_allocation, const std::vector &seq_nums, bool process_uplink); virtual void set_cell_allocation(const std::vector &cell_allocation) = 0; virtual void set_tseq_nums(const std::vector & tseq_nums) = 0; diff --git a/lib/receiver/receiver_impl.cc b/lib/receiver/receiver_impl.cc index 97402b2..186e437 100644 --- a/lib/receiver/receiver_impl.cc +++ b/lib/receiver/receiver_impl.cc @@ -52,20 +52,21 @@ namespace gr namespace gsm { receiver::sptr -receiver::make(int osr, const std::vector &cell_allocation, const std::vector &tseq_nums) +receiver::make(int osr, const std::vector &cell_allocation, const std::vector &tseq_nums, bool process_uplink) { return gnuradio::get_initial_sptr - (new receiver_impl(osr, cell_allocation, tseq_nums)); + (new receiver_impl(osr, cell_allocation, tseq_nums, process_uplink)); } /* * The private constructor */ -receiver_impl::receiver_impl(int osr, const std::vector &cell_allocation, const std::vector &tseq_nums) +receiver_impl::receiver_impl(int osr, const std::vector &cell_allocation, const std::vector &tseq_nums, bool process_uplink) : gr::sync_block("receiver", gr::io_signature::make(1, -1, sizeof(gr_complex)), gr::io_signature::make(0, 0, 0)), d_OSR(osr), + d_process_uplink(process_uplink), d_chan_imp_length(CHAN_IMP_RESP_LENGTH), d_counter(0), d_fcch_start_pos(0), @@ -88,6 +89,7 @@ receiver_impl::receiver_impl(int osr, const std::vector &cell_allocation, c //if first bit of the seqeunce ==1 first symbol ==-1 gmsk_mapper(train_seq[i], N_TRAIN_BITS, d_norm_training_seq[i], startpoint); } + message_port_register_out(pmt::mp("C0")); message_port_register_out(pmt::mp("CX")); message_port_register_out(pmt::mp("measurements")); @@ -198,10 +200,15 @@ receiver_impl::work(int noutput_items, int offset = 0; int to_consume = 0; unsigned char output_binary[BURST_SIZE]; - burst_type b_type; + unsigned int inputs_to_process=d_cell_allocation.size(); + + if(d_process_uplink) + { + inputs_to_process = 2*inputs_to_process; + } - for(int input_nr=0; input_nr=0.9){ + if((normal_corr_max/sqrt(signal_pwr))>=0.8){ detect_burst(input, &channel_imp_resp[0], burst_start, output_binary); send_burst(d_burst_nr, output_binary, GSMTAP_BURST_NORMAL, input_nr); } @@ -824,10 +831,21 @@ void receiver_impl::send_burst(burst_counter burst_nr, const unsigned char * bur tap_header->version = GSMTAP_VERSION; tap_header->hdr_len = sizeof(gsmtap_hdr)/4; tap_header->type = GSMTAP_TYPE_UM_BURST; - tap_header->timeslot = static_cast(d_burst_nr.get_timeslot_nr()); - tap_header->frame_number = htobe32(d_burst_nr.get_frame_nr()); tap_header->sub_type = burst_type; - tap_header->arfcn = htobe16(d_cell_allocation[input_nr]) ; + bool uplink_burst = (input_nr >= d_cell_allocation.size()); + if(!uplink_burst) // downlink burst + { + tap_header->timeslot = static_cast(d_burst_nr.get_timeslot_nr()); + tap_header->frame_number = htobe32(d_burst_nr.get_frame_nr()); + tap_header->arfcn = htobe16(d_cell_allocation[input_nr]) ; + } + else //uplink burst + { + tap_header->timeslot = static_cast(d_burst_nr.subtract_timeslots(3).get_timeslot_nr()); + tap_header->frame_number = htobe32(d_burst_nr.subtract_timeslots(3).get_frame_nr()); + input_nr = input_nr - d_cell_allocation.size(); + tap_header->arfcn = htobe16(d_cell_allocation[input_nr] | 0x4000); + } tap_header->signal_dbm = static_cast(d_signal_dbm); tap_header->snr_db = 0; diff --git a/lib/receiver/receiver_impl.h b/lib/receiver/receiver_impl.h index d668e14..c8d71f9 100644 --- a/lib/receiver/receiver_impl.h +++ b/lib/receiver/receiver_impl.h @@ -39,6 +39,7 @@ namespace gr { /**@name Configuration of the receiver */ //@{ const int d_OSR; ///< oversampling ratio + bool d_process_uplink; const int d_chan_imp_length; ///< channel impulse length float d_signal_dbm; std::vector d_tseq_nums; ///< stores training sequence numbers for channels different than C0 @@ -203,7 +204,7 @@ namespace gr { public: - receiver_impl(int osr, const std::vector &cell_allocation, const std::vector &tseq_nums); + receiver_impl(int osr, const std::vector &cell_allocation, const std::vector &tseq_nums, bool process_uplink); ~receiver_impl(); int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); -- cgit v1.2.3 From 7a85170a6342187fa462017c51317ffa7004cb42 Mon Sep 17 00:00:00 2001 From: Piotr Krysik Date: Thu, 6 Aug 2015 10:22:20 +0200 Subject: Added grc receiver block that supports uplink and changed block that supports downlink only --- grc/gsm_block_tree.xml | 1 + grc/receiver/CMakeLists.txt | 1 + grc/receiver/gsm_receiver.xml | 2 +- grc/receiver/gsm_receiver_with_uplink.xml | 71 +++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 grc/receiver/gsm_receiver_with_uplink.xml diff --git a/grc/gsm_block_tree.xml b/grc/gsm_block_tree.xml index 26f607f..86c5ef9 100644 --- a/grc/gsm_block_tree.xml +++ b/grc/gsm_block_tree.xml @@ -13,6 +13,7 @@ Receiver gsm_receiver + gsm_receiver_with_uplink gsm_cx_channel_hopper gsm_fcch_burst_tagger gsm_sch_detector diff --git a/grc/receiver/CMakeLists.txt b/grc/receiver/CMakeLists.txt index bcef03d..7b51226 100644 --- a/grc/receiver/CMakeLists.txt +++ b/grc/receiver/CMakeLists.txt @@ -20,6 +20,7 @@ install(FILES gsm_input.xml gsm_receiver.xml + gsm_receiver_with_uplink.xml gsm_fcch_burst_tagger.xml gsm_sch_detector.xml gsm_fcch_detector.xml diff --git a/grc/receiver/gsm_receiver.xml b/grc/receiver/gsm_receiver.xml index 2119fd2..2988243 100644 --- a/grc/receiver/gsm_receiver.xml +++ b/grc/receiver/gsm_receiver.xml @@ -3,7 +3,7 @@ GSM Receiver gsm_receiver import grgsm - grgsm.receiver($osr, $cell_allocation, $tseq_nums) + grgsm.receiver($osr, $cell_allocation, $tseq_nums, False) Oversampling ratio diff --git a/grc/receiver/gsm_receiver_with_uplink.xml b/grc/receiver/gsm_receiver_with_uplink.xml new file mode 100644 index 0000000..4b68336 --- /dev/null +++ b/grc/receiver/gsm_receiver_with_uplink.xml @@ -0,0 +1,71 @@ + + + GSM Receiver (with uplink) + gsm_receiver_with_uplink + import grgsm + grgsm.receiver($osr, $cell_allocation, $tseq_nums, True) + + + Oversampling ratio + osr + 4 + int + + + + Cell allocation + cell_allocation + [0] + float_vector + part + + + + TSEQ numbers + tseq_nums + [] + int_vector + part + + + + Num Streams + num_streams + 1 + int + part + + + $num_streams >= 0 + + + C + complex + $num_streams + + + + + C_up + complex + $num_streams + + + + C0 + message + 1 + + + + CX + message + 1 + + + + measurements + message + 1 + + -- cgit v1.2.3 From 9f723fd77151aaf13d1c87b33e153776f6b49804 Mon Sep 17 00:00:00 2001 From: Piotr Krysik Date: Thu, 6 Aug 2015 10:23:52 +0200 Subject: Changed control channels demappers in order to support uplink. Values of parameters for uplink are incorrect at this stage. --- grc/demapping/gsm_bcch_ccch_demapper.xml | 22 +- grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml | 22 +- grc/demapping/gsm_sdcch8_demapper.xml | 24 +- .../gsm_universal_ctrl_chans_demapper.xml | 29 ++- .../universal_ctrl_chans_demapper_impl.cc | 266 +++++++++++++++------ lib/demapping/universal_ctrl_chans_demapper_impl.h | 17 +- 6 files changed, 282 insertions(+), 98 deletions(-) diff --git a/grc/demapping/gsm_bcch_ccch_demapper.xml b/grc/demapping/gsm_bcch_ccch_demapper.xml index f027f8e..b030563 100644 --- a/grc/demapping/gsm_bcch_ccch_demapper.xml +++ b/grc/demapping/gsm_bcch_ccch_demapper.xml @@ -3,7 +3,7 @@ BCCH + CCCH demapper gsm_bcch_ccch_demapper import grgsm - grgsm.universal_ctrl_chans_demapper($timeslot_nr, $starts_fn_mod51, $channel_types) + grgsm.universal_ctrl_chans_demapper($timeslot_nr, $downlink_starts_fn_mod51, $downlink_channel_types, $uplink_starts_fn_mod51, $uplink_channel_types) Timeslot @@ -14,7 +14,7 @@ - starts_fn_mod51 + downlink_starts_fn_mod51 starts_fn_mod51 [2,6,12,16,22,26,32,36,42,46] int_vector @@ -22,7 +22,23 @@ - channel_types + downlink_channel_types + channel_types + [1,2,2,2,2,2,2,2,2,2] + int_vector + all + + + + uplink_starts_fn_mod51 + starts_fn_mod51 + [2,6,12,16,22,26,32,36,42,46] + int_vector + all + + + + uplink_channel_types channel_types [1,2,2,2,2,2,2,2,2,2] int_vector diff --git a/grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml b/grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml index 80e67d5..f611040 100644 --- a/grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml +++ b/grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml @@ -3,7 +3,7 @@ BCCH + CCCH + SDCCH/4 demapper gsm_bcch_ccch_sdcch4_demapper import grgsm - grgsm.universal_ctrl_chans_demapper($timeslot_nr, $starts_fn_mod51, $channel_types) + grgsm.universal_ctrl_chans_demapper($timeslot_nr, $downlink_starts_fn_mod51, $downlink_channel_types, $uplink_starts_fn_mod51, $uplink_channel_types) Timeslot @@ -14,7 +14,7 @@ - starts_fn_mod51 + downlink_starts_fn_mod51 starts_fn_mod51 [2,6,12,16,22,26,32,36,42,46] int_vector @@ -22,7 +22,23 @@ - channel_types + downlink_channel_types + channel_types + [1,2,2,2,7,7,7,7,135,135] + int_vector + all + + + + uplink_starts_fn_mod51 + starts_fn_mod51 + [2,6,12,16,22,26,32,36,42,46] + int_vector + all + + + + uplink_channel_types channel_types [1,2,2,2,7,7,7,7,135,135] int_vector diff --git a/grc/demapping/gsm_sdcch8_demapper.xml b/grc/demapping/gsm_sdcch8_demapper.xml index 38a8112..ab11d64 100644 --- a/grc/demapping/gsm_sdcch8_demapper.xml +++ b/grc/demapping/gsm_sdcch8_demapper.xml @@ -3,7 +3,7 @@ SDCCH/8 demapper gsm_sdcch8_demapper import grgsm - grgsm.universal_ctrl_chans_demapper($timeslot_nr, $starts_fn_mod51, $channel_types) + grgsm.universal_ctrl_chans_demapper($timeslot_nr, $downlink_starts_fn_mod51, $downlink_channel_types, $uplink_starts_fn_mod51, $uplink_channel_types) Timeslot @@ -14,7 +14,7 @@ - starts_fn_mod51 + downlink_starts_fn_mod51 starts_fn_mod51 [0,4,8,12,16,20,24,28,32,36,40,44] int_vector @@ -22,7 +22,23 @@ - channel_types + downlink_channel_types + channel_types + [8,8,8,8,8,8,8,8,136,136,136,136] + int_vector + all + + + + uplink_starts_fn_mod51 + starts_fn_mod51 + [0,4,8,12,16,20,24,28,32,36,40,44] + int_vector + all + + + + uplink_channel_types channel_types [8,8,8,8,8,8,8,8,136,136,136,136] int_vector @@ -42,4 +58,4 @@ Demapper for SDCCH/8 + SACCH/C8 control channels. This corresponds to channel combination vii specified in GSM 05.02, section 6.4 - \ No newline at end of file + diff --git a/grc/demapping/gsm_universal_ctrl_chans_demapper.xml b/grc/demapping/gsm_universal_ctrl_chans_demapper.xml index 1d8d202..a5e9272 100644 --- a/grc/demapping/gsm_universal_ctrl_chans_demapper.xml +++ b/grc/demapping/gsm_universal_ctrl_chans_demapper.xml @@ -3,7 +3,7 @@ Universal ctrl chans demapper gsm_universal_ctrl_chans_demapper import grgsm - grgsm.universal_ctrl_chans_demapper($timeslot_nr, $starts_fn_mod51, $channel_types) + grgsm.universal_ctrl_chans_demapper($timeslot_nr, $downlink_starts_fn_mod51, $downlink_channel_types, $uplink_starts_fn_mod51, $uplink_channel_types) timeslot_nr @@ -14,16 +14,32 @@ - starts_fn_mod51 - starts_fn_mod51 + downlink_starts_fn_mod51 + downlink_starts_fn_mod51 [2,6,12,16,22,26,32,36,42,46] int_vector part - channel_types - channel_types + downlink_channel_types + downlink_channel_types + [1,2,2,2,2,2,2,2,2,2] + int_vector + part + + + + uplink_starts_fn_mod51 + uplink_starts_fn_mod51 + [2,6,12,16,22,26,32,36,42,46] + int_vector + part + + + + uplink_channel_types + uplink_channel_types [1,2,2,2,2,2,2,2,2,2] int_vector part @@ -37,4 +53,7 @@ bursts message + + Universal demapper for control channels. + diff --git a/lib/demapping/universal_ctrl_chans_demapper_impl.cc b/lib/demapping/universal_ctrl_chans_demapper_impl.cc index 8a6bfb5..85cb0c6 100644 --- a/lib/demapping/universal_ctrl_chans_demapper_impl.cc +++ b/lib/demapping/universal_ctrl_chans_demapper_impl.cc @@ -34,16 +34,16 @@ namespace gr { namespace gsm { universal_ctrl_chans_demapper::sptr - universal_ctrl_chans_demapper::make(unsigned int timeslot_nr, const std::vector &starts_fn_mod51, const std::vector &channel_types) + universal_ctrl_chans_demapper::make(unsigned int timeslot_nr, const std::vector &downlink_starts_fn_mod51, const std::vector &downlink_channel_types, const std::vector &uplink_starts_fn_mod51, const std::vector &uplink_channel_types) { return gnuradio::get_initial_sptr - (new universal_ctrl_chans_demapper_impl(timeslot_nr, starts_fn_mod51, channel_types)); + (new universal_ctrl_chans_demapper_impl(timeslot_nr, downlink_starts_fn_mod51, downlink_channel_types, uplink_starts_fn_mod51, uplink_channel_types)); } /* * The private constructor */ - universal_ctrl_chans_demapper_impl::universal_ctrl_chans_demapper_impl(unsigned int timeslot_nr, const std::vector &starts_fn_mod51, const std::vector &channel_types) + universal_ctrl_chans_demapper_impl::universal_ctrl_chans_demapper_impl(unsigned int timeslot_nr, const std::vector &downlink_starts_fn_mod51, const std::vector &downlink_channel_types, const std::vector &uplink_starts_fn_mod51, const std::vector &uplink_channel_types) : gr::block("universal_ctrl_chans_demapper", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)), @@ -54,75 +54,137 @@ namespace gr { for(int ii=0; ii<51; ii++) { - d_starts_fn_mod51[ii]=0; - d_channel_types[ii]=0; - d_subslots[ii] = 0; - d_subslots[ii+51] = 0; + d_downlink_starts_fn_mod51[ii]=0; + d_downlink_channel_types[ii]=0; + d_downlink_subslots[ii] = 0; + d_downlink_subslots[ii+51] = 0; + + d_uplink_starts_fn_mod51[ii]=0; + d_uplink_channel_types[ii]=0; + d_uplink_subslots[ii] = 0; + d_uplink_subslots[ii+51] = 0; } std::vector::const_iterator s; std::vector::const_iterator ch_type; - for(s=starts_fn_mod51.begin(), ch_type=channel_types.begin();s != starts_fn_mod51.end(); s++) + for(s=downlink_starts_fn_mod51.begin(), ch_type=downlink_channel_types.begin();s != downlink_starts_fn_mod51.end(); s++) { if((*s >= 0) and (*s <= (51-4))) { for(int ii=0; ii<4; ii++){ - d_starts_fn_mod51[*s+ii] = *s; - if(ch_type!=channel_types.end()) + d_downlink_starts_fn_mod51[*s+ii] = *s; + if(ch_type!=downlink_channel_types.end()) { - d_channel_types[*s+ii] = *ch_type; + d_downlink_channel_types[*s+ii] = *ch_type; } } - if(ch_type!=channel_types.end()) + if(ch_type!=downlink_channel_types.end()) { ch_type++; } } } - std::set distinct_channels(channel_types.begin(), channel_types.end()); - std::set::iterator it; + for(s=uplink_starts_fn_mod51.begin(), ch_type=uplink_channel_types.begin();s != uplink_starts_fn_mod51.end(); s++) + { + if((*s >= 0) and (*s <= (51-4))) + { + for(int ii=0; ii<4; ii++){ + d_uplink_starts_fn_mod51[*s+ii] = *s; + if(ch_type!=uplink_channel_types.end()) + { + d_uplink_channel_types[*s+ii] = *ch_type; + } + } + if(ch_type!=uplink_channel_types.end()) + { + ch_type++; + } + } + } + + std::set distinct_downlink_channels(downlink_channel_types.begin(), downlink_channel_types.end()); + std::set::iterator it; unsigned int subslot; - - for (it=distinct_channels.begin(); it != distinct_channels.end(); it++) - { - subslot = 0; - for(s=starts_fn_mod51.begin();s != starts_fn_mod51.end(); s++) - { - if ((d_channel_types[*s] == *it) and (*s >= 0) and (*s <= (51-4))) - { - for(int ii=0; ii<4; ii++) - { - d_subslots[*s+ii] = subslot; - d_subslots[*s+ii+51] = subslot; - } - subslot++; - } - } - - if (*it == GSMTAP_CHANNEL_ACCH or - *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_SDCCH) or - *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_SDCCH4) or - *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_SDCCH8) or - *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_TCH_F) or - *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_TCH_H) - ) - { - for(s=starts_fn_mod51.begin();s != starts_fn_mod51.end(); s++) - { - if ((d_channel_types[*s] == *it) and (*s >= 0) and (*s <= (51-4))) - { - for(int ii=0; ii<4; ii++) - { - d_subslots[*s+ii+51] = subslot; - } - subslot++; - } - } - } - } + for (it=distinct_downlink_channels.begin(); it != distinct_downlink_channels.end(); it++) + { + subslot = 0; + for(s=downlink_starts_fn_mod51.begin();s != downlink_starts_fn_mod51.end(); s++) + { + if ((d_downlink_channel_types[*s] == *it) and (*s >= 0) and (*s <= (51-4))) + { + for(int ii=0; ii<4; ii++) + { + d_downlink_subslots[*s+ii] = subslot; + d_downlink_subslots[*s+ii+51] = subslot; + } + subslot++; + } + } + + if (*it == GSMTAP_CHANNEL_ACCH or + *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_SDCCH) or + *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_SDCCH4) or + *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_SDCCH8) or + *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_TCH_F) or + *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_TCH_H) + ) + { + for(s=downlink_starts_fn_mod51.begin();s != downlink_starts_fn_mod51.end(); s++) + { + if ((d_downlink_channel_types[*s] == *it) and (*s >= 0) and (*s <= (51-4))) + { + for(int ii=0; ii<4; ii++) + { + d_downlink_subslots[*s+ii+51] = subslot; + } + subslot++; + } + } + } + } + + std::set distinct_uplink_channels(uplink_channel_types.begin(), uplink_channel_types.end()); + for (it=distinct_uplink_channels.begin(); it != distinct_uplink_channels.end(); it++) + { + subslot = 0; + for(s=uplink_starts_fn_mod51.begin();s != uplink_starts_fn_mod51.end(); s++) + { + if ((d_uplink_channel_types[*s] == *it) and (*s >= 0) and (*s <= (51-4))) + { + for(int ii=0; ii<4; ii++) + { + d_uplink_subslots[*s+ii] = subslot; + d_uplink_subslots[*s+ii+51] = subslot; + } + subslot++; + } + } + + if (*it == GSMTAP_CHANNEL_ACCH or + *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_SDCCH) or + *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_SDCCH4) or + *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_SDCCH8) or + *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_TCH_F) or + *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_TCH_H) + ) + { + for(s=uplink_starts_fn_mod51.begin();s != uplink_starts_fn_mod51.end(); s++) + { + if ((d_uplink_channel_types[*s] == *it) and (*s >= 0) and (*s <= (51-4))) + { + for(int ii=0; ii<4; ii++) + { + d_uplink_subslots[*s+ii+51] = subslot; + } + subslot++; + } + } + } + } + message_port_register_in(pmt::mp("bursts")); set_msg_handler(pmt::mp("bursts"), boost::bind(&universal_ctrl_chans_demapper_impl::filter_ctrl_chans, this, _1)); @@ -143,41 +205,91 @@ namespace gr { uint32_t frame_nr = be32toh(header->frame_number); uint32_t fn_mod51 = frame_nr % 51; - uint32_t fn51_start = d_starts_fn_mod51[fn_mod51]; - uint32_t fn51_stop = fn51_start + 3; - uint32_t ch_type = d_channel_types[fn_mod51]; + bool uplink_burst = (be16toh(header->arfcn) & 0x4000) ? true : false; + if(header->timeslot==d_timeslot){ - header->sub_type = ch_type; - header->sub_slot = d_subslots[fn_mod51 + (51 * (frame_nr % 2))]; - - if(fn_mod51>=fn51_start && fn_mod51<=fn51_stop) - { - uint32_t ii = fn_mod51 - fn51_start; - d_frame_numbers[ii] = frame_nr; - d_bursts[ii] = msg; - } - - if(fn_mod51==fn51_stop) + if(uplink_burst) { - //check for a situation where some bursts were lost - //in this situation frame numbers won't be consecutive - bool frames_are_consecutive = true; - for(int jj=1; jj<4; jj++) + uint32_t fn51_start = d_uplink_starts_fn_mod51[fn_mod51]; + uint32_t fn51_stop = fn51_start + 3; + uint32_t ch_type = d_uplink_channel_types[fn_mod51]; + + if(ch_type != 0) + { + header->sub_type = ch_type; + } + header->sub_slot = d_uplink_subslots[fn_mod51 + (51 * (frame_nr % 2))]; + + if(fn_mod51>=fn51_start && fn_mod51<=fn51_stop) { - if((d_frame_numbers[jj]-d_frame_numbers[jj-1])!=1) + uint32_t ii = fn_mod51 - fn51_start; + d_uplink_frame_numbers[ii] = frame_nr; + d_uplink_bursts[ii] = msg; + } + + if(fn_mod51==fn51_stop) + { + //check for a situation where some bursts were lost + //in this situation frame numbers won't be consecutive + bool frames_are_consecutive = true; + for(int jj=1; jj<4; jj++) { - frames_are_consecutive = false; + if((d_uplink_frame_numbers[jj]-d_uplink_frame_numbers[jj-1])!=1) + { + frames_are_consecutive = false; + } } + if(frames_are_consecutive) + { + //send bursts to the output + for(int jj=0; jj<4; jj++) + { + message_port_pub(pmt::mp("bursts"), d_uplink_bursts[jj]); + } + } + } + } + else + { + uint32_t fn51_start = d_downlink_starts_fn_mod51[fn_mod51]; + uint32_t fn51_stop = fn51_start + 3; + uint32_t ch_type = d_downlink_channel_types[fn_mod51]; + + if(ch_type != 0) + { + header->sub_type = ch_type; } - if(frames_are_consecutive) + header->sub_slot = d_downlink_subslots[fn_mod51 + (51 * (frame_nr % 2))]; + + if(fn_mod51>=fn51_start && fn_mod51<=fn51_stop) { - //send bursts to the output - for(int jj=0; jj<4; jj++) + uint32_t ii = fn_mod51 - fn51_start; + d_downlink_frame_numbers[ii] = frame_nr; + d_downlink_bursts[ii] = msg; + } + + if(fn_mod51==fn51_stop) + { + //check for a situation where some bursts were lost + //in this situation frame numbers won't be consecutive + bool frames_are_consecutive = true; + for(int jj=1; jj<4; jj++) { - message_port_pub(pmt::mp("bursts"), d_bursts[jj]); + if((d_downlink_frame_numbers[jj]-d_downlink_frame_numbers[jj-1])!=1) + { + frames_are_consecutive = false; + } } - } + if(frames_are_consecutive) + { + //send bursts to the output + for(int jj=0; jj<4; jj++) + { + message_port_pub(pmt::mp("bursts"), d_downlink_bursts[jj]); + } + } + } } } } diff --git a/lib/demapping/universal_ctrl_chans_demapper_impl.h b/lib/demapping/universal_ctrl_chans_demapper_impl.h index d4e1440..0316bf4 100644 --- a/lib/demapping/universal_ctrl_chans_demapper_impl.h +++ b/lib/demapping/universal_ctrl_chans_demapper_impl.h @@ -32,14 +32,19 @@ namespace gr { class universal_ctrl_chans_demapper_impl : public universal_ctrl_chans_demapper { private: - unsigned int d_starts_fn_mod51[51]; - unsigned int d_channel_types[51]; - unsigned int d_subslots[102]; + unsigned int d_downlink_starts_fn_mod51[51]; + unsigned int d_uplink_starts_fn_mod51[51]; + unsigned int d_downlink_channel_types[51]; + unsigned int d_uplink_channel_types[51]; + unsigned int d_downlink_subslots[102]; + unsigned int d_uplink_subslots[102]; unsigned int d_timeslot; - uint32_t d_frame_numbers[4]; - pmt::pmt_t d_bursts[4]; + uint32_t d_downlink_frame_numbers[4]; + uint32_t d_uplink_frame_numbers[4]; + pmt::pmt_t d_downlink_bursts[4]; + pmt::pmt_t d_uplink_bursts[4]; public: - universal_ctrl_chans_demapper_impl(unsigned int timeslot_nr, const std::vector &starts_fn_mod51, const std::vector &channel_types); + universal_ctrl_chans_demapper_impl(unsigned int timeslot_nr, const std::vector &downlink_starts_fn_mod51, const std::vector &downlink_channel_types, const std::vector &uplink_starts_fn_mod51, const std::vector &uplink_channel_types); ~universal_ctrl_chans_demapper_impl(); void filter_ctrl_chans(pmt::pmt_t msg); -- cgit v1.2.3 From c6b3dce5cfeaa7aca94f2f584ca3a325c5563c62 Mon Sep 17 00:00:00 2001 From: Piotr Krysik Date: Thu, 6 Aug 2015 12:17:26 +0200 Subject: Set parameters of demappers for uplink channels --- grc/demapping/gsm_bcch_ccch_demapper.xml | 4 ++-- grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml | 4 ++-- grc/demapping/gsm_sdcch8_demapper.xml | 2 +- grc/demapping/gsm_universal_ctrl_chans_demapper.xml | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/grc/demapping/gsm_bcch_ccch_demapper.xml b/grc/demapping/gsm_bcch_ccch_demapper.xml index b030563..829daf9 100644 --- a/grc/demapping/gsm_bcch_ccch_demapper.xml +++ b/grc/demapping/gsm_bcch_ccch_demapper.xml @@ -32,7 +32,7 @@ uplink_starts_fn_mod51 starts_fn_mod51 - [2,6,12,16,22,26,32,36,42,46] + [] int_vector all @@ -40,7 +40,7 @@ uplink_channel_types channel_types - [1,2,2,2,2,2,2,2,2,2] + [] int_vector all diff --git a/grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml b/grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml index f611040..e60356e 100644 --- a/grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml +++ b/grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml @@ -32,7 +32,7 @@ uplink_starts_fn_mod51 starts_fn_mod51 - [2,6,12,16,22,26,32,36,42,46] + [0,6,10,37,41,47] int_vector all @@ -40,7 +40,7 @@ uplink_channel_types channel_types - [1,2,2,2,7,7,7,7,135,135] + [7,135,135,7,7,7] int_vector all diff --git a/grc/demapping/gsm_sdcch8_demapper.xml b/grc/demapping/gsm_sdcch8_demapper.xml index ab11d64..588820f 100644 --- a/grc/demapping/gsm_sdcch8_demapper.xml +++ b/grc/demapping/gsm_sdcch8_demapper.xml @@ -32,7 +32,7 @@ uplink_starts_fn_mod51 starts_fn_mod51 - [0,4,8,12,16,20,24,28,32,36,40,44] + [15,19,23,27,31,35,39,43,47,0,4,8] int_vector all diff --git a/grc/demapping/gsm_universal_ctrl_chans_demapper.xml b/grc/demapping/gsm_universal_ctrl_chans_demapper.xml index a5e9272..3b522be 100644 --- a/grc/demapping/gsm_universal_ctrl_chans_demapper.xml +++ b/grc/demapping/gsm_universal_ctrl_chans_demapper.xml @@ -32,7 +32,7 @@ uplink_starts_fn_mod51 uplink_starts_fn_mod51 - [2,6,12,16,22,26,32,36,42,46] + [0,6,10,37,41,47] int_vector part @@ -40,7 +40,7 @@ uplink_channel_types uplink_channel_types - [1,2,2,2,2,2,2,2,2,2] + [2,2,2,2,2,2] int_vector part -- cgit v1.2.3 From 2547f604ec57c1c5595b363b8798a9262a2e4cb8 Mon Sep 17 00:00:00 2001 From: Piotr Krysik Date: Mon, 10 Aug 2015 11:14:29 +0200 Subject: Corrected constructor declaration --- include/grgsm/demapping/universal_ctrl_chans_demapper.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/grgsm/demapping/universal_ctrl_chans_demapper.h b/include/grgsm/demapping/universal_ctrl_chans_demapper.h index d8114f7..9d7240c 100644 --- a/include/grgsm/demapping/universal_ctrl_chans_demapper.h +++ b/include/grgsm/demapping/universal_ctrl_chans_demapper.h @@ -49,7 +49,7 @@ namespace gr { * class. gsm::universal_ctrl_chans_demapper::make is the public interface for * creating new instances. */ - static sptr make(unsigned int timeslot_nr, const std::vector &starts_fn_mod51, const std::vector &channel_types); + static sptr make(unsigned int timeslot_nr, const std::vector &downlink_starts_fn_mod51, const std::vector &downlink_channel_types, const std::vector &uplink_starts_fn_mod51, const std::vector &uplink_channel_types); }; } // namespace gsm -- cgit v1.2.3 From 5d6ae655574947444b713f1d34fab85167554b8c Mon Sep 17 00:00:00 2001 From: Piotr Krysik Date: Mon, 10 Aug 2015 11:15:25 +0200 Subject: Corrected syntax of control channels demappers --- grc/demapping/gsm_bcch_ccch_demapper.xml | 8 ++++---- grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml | 8 ++++---- grc/demapping/gsm_sdcch8_demapper.xml | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/grc/demapping/gsm_bcch_ccch_demapper.xml b/grc/demapping/gsm_bcch_ccch_demapper.xml index 829daf9..b295ce1 100644 --- a/grc/demapping/gsm_bcch_ccch_demapper.xml +++ b/grc/demapping/gsm_bcch_ccch_demapper.xml @@ -15,7 +15,7 @@ downlink_starts_fn_mod51 - starts_fn_mod51 + downlink_starts_fn_mod51 [2,6,12,16,22,26,32,36,42,46] int_vector all @@ -23,7 +23,7 @@ downlink_channel_types - channel_types + downlink_channel_types [1,2,2,2,2,2,2,2,2,2] int_vector all @@ -31,7 +31,7 @@ uplink_starts_fn_mod51 - starts_fn_mod51 + uplink_starts_fn_mod51 [] int_vector all @@ -39,7 +39,7 @@ uplink_channel_types - channel_types + uplink_channel_types [] int_vector all diff --git a/grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml b/grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml index e60356e..90b33ce 100644 --- a/grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml +++ b/grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml @@ -15,7 +15,7 @@ downlink_starts_fn_mod51 - starts_fn_mod51 + downlink_starts_fn_mod51 [2,6,12,16,22,26,32,36,42,46] int_vector all @@ -23,7 +23,7 @@ downlink_channel_types - channel_types + downlink_channel_types [1,2,2,2,7,7,7,7,135,135] int_vector all @@ -31,7 +31,7 @@ uplink_starts_fn_mod51 - starts_fn_mod51 + uplink_starts_fn_mod51 [0,6,10,37,41,47] int_vector all @@ -39,7 +39,7 @@ uplink_channel_types - channel_types + uplink_channel_types [7,135,135,7,7,7] int_vector all diff --git a/grc/demapping/gsm_sdcch8_demapper.xml b/grc/demapping/gsm_sdcch8_demapper.xml index 588820f..c81032a 100644 --- a/grc/demapping/gsm_sdcch8_demapper.xml +++ b/grc/demapping/gsm_sdcch8_demapper.xml @@ -15,7 +15,7 @@ downlink_starts_fn_mod51 - starts_fn_mod51 + downlink_starts_fn_mod51 [0,4,8,12,16,20,24,28,32,36,40,44] int_vector all @@ -23,7 +23,7 @@ downlink_channel_types - channel_types + downlink_channel_types [8,8,8,8,8,8,8,8,136,136,136,136] int_vector all @@ -31,7 +31,7 @@ uplink_starts_fn_mod51 - starts_fn_mod51 + uplink_starts_fn_mod51 [15,19,23,27,31,35,39,43,47,0,4,8] int_vector all @@ -39,7 +39,7 @@ uplink_channel_types - channel_types + uplink_channel_types [8,8,8,8,8,8,8,8,136,136,136,136] int_vector all -- cgit v1.2.3