diff options
author | Piotr Krysik <ptrkrysik@gmail.com> | 2016-05-20 12:45:54 +0200 |
---|---|---|
committer | Piotr Krysik <ptrkrysik@gmail.com> | 2016-05-20 12:45:54 +0200 |
commit | 773a194c327c89161b3d11e5246dfea04d9b45dc (patch) | |
tree | d81ba89769c7a807a4b155b84e8d4bfb3e2bae16 | |
parent | bac8284599e137981f178e8998d6426f011d9dab (diff) |
Big change of the universal control channels demapper:
-simplification of the universal demapper,
-addition of hierarhical blocks for each of the demappers - so they also look well and readable in python,
-addition of helper script for compilation of the demappers.
-rwxr-xr-x | apps/grgsm_decode | 12 | ||||
-rwxr-xr-x | apps/grgsm_livemon | 4 | ||||
-rwxr-xr-x | apps/grgsm_scanner | 2 | ||||
-rw-r--r-- | grc/demapping/gsm_bcch_ccch_demapper.xml | 59 | ||||
-rw-r--r-- | grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml | 60 | ||||
-rw-r--r-- | grc/demapping/gsm_sdcch8_demapper.xml | 57 | ||||
-rw-r--r-- | grc/demapping/gsm_universal_ctrl_chans_demapper.xml | 27 | ||||
-rwxr-xr-x | hier_blocks/compile_demappers | 37 | ||||
-rw-r--r-- | hier_blocks/demapping/gsm_bcch_ccch_demapper.grc | 292 | ||||
-rw-r--r-- | hier_blocks/demapping/gsm_bcch_ccch_sdcch4_demapper.grc | 292 | ||||
-rw-r--r-- | hier_blocks/demapping/gsm_sdcch8_demapper.grc | 292 | ||||
-rw-r--r-- | include/grgsm/demapping/universal_ctrl_chans_demapper.h | 2 | ||||
-rw-r--r-- | lib/demapping/universal_ctrl_chans_demapper_impl.cc | 300 | ||||
-rw-r--r-- | lib/demapping/universal_ctrl_chans_demapper_impl.h | 31 | ||||
-rw-r--r-- | python/CMakeLists.txt | 3 | ||||
-rw-r--r-- | python/__init__.py | 3 | ||||
-rw-r--r-- | python/demapping/gsm_bcch_ccch_demapper.py | 46 | ||||
-rw-r--r-- | python/demapping/gsm_bcch_ccch_sdcch4_demapper.py | 46 | ||||
-rw-r--r-- | python/demapping/gsm_sdcch8_demapper.py | 46 |
19 files changed, 1223 insertions, 388 deletions
diff --git a/apps/grgsm_decode b/apps/grgsm_decode index 4be199d..8f412bf 100755 --- a/apps/grgsm_decode +++ b/apps/grgsm_decode @@ -88,17 +88,11 @@ class grgsm_decoder(gr.top_block): self.subslot_filter = grgsm.burst_sdcch_subslot_filter(grgsm.SS_FILTER_SDCCH8, self.subslot) if self.chan_mode == 'BCCH': - self.bcch_demapper = grgsm.universal_ctrl_chans_demapper(self.timeslot, - ([2, 6, 12, 16, 22, 26, 32, 36, 42, 46]), - ([1, 2, 2, 2, 2, 2, 2, 2, 2, 2])) + self.bcch_demapper = grgsm.gsm_bcch_ccch_demapper(self.timeslot) elif self.chan_mode == 'BCCH_SDCCH4': - self.bcch_sdcch4_demapper = grgsm.universal_ctrl_chans_demapper(self.timeslot, - ([2, 6, 12, 16, 22, 26, 32, 36, 42, 46]), - ([1, 2, 2, 2, 7, 7, 7, 7, 135, 135])) + self.bcch_sdcch4_demapper = grgsm.gsm_bcch_ccch_sdcch4_demapper(self.timeslot) elif self.chan_mode == 'SDCCH8': - self.sdcch8_demapper = grgsm.universal_ctrl_chans_demapper(self.timeslot, - ([0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44]), - ([8, 8, 8, 8, 8, 8, 8, 8, 136, 136, 136, 136])) + self.sdcch8_demapper = grgsm.gsm_sdcch8_demapper(self.timeslot) elif self.chan_mode == 'TCHF': self.tch_f_demapper = grgsm.tch_f_chans_demapper(self.timeslot) self.tch_f_decoder = grgsm.tch_f_decoder(speech_codec, speech_file) diff --git a/apps/grgsm_livemon b/apps/grgsm_livemon index 6c58e08..1d37970 100755 --- a/apps/grgsm_livemon +++ b/apps/grgsm_livemon @@ -140,7 +140,7 @@ class grgsm_livemon(gr.top_block, Qt.QWidget): self._qtgui_freq_sink_x_0_win = sip.wrapinstance(self.qtgui_freq_sink_x_0.pyqwidget(), Qt.QWidget) self.top_layout.addWidget(self._qtgui_freq_sink_x_0_win) - self.gsm_sdcch8_demapper_0 = grgsm.universal_ctrl_chans_demapper(1, ([0,4,8,12,16,20,24,28,32,36,40,44]), ([8,8,8,8,8,8,8,8,136,136,136,136])) + self.gsm_sdcch8_demapper_0 = grgsm.gsm_sdcch8_demapper(1) self.gsm_receiver_0 = grgsm.receiver(4, ([0]), ([])) self.gsm_message_printer_1 = grgsm.message_printer(pmt.intern(""), False) self.gsm_input_0 = grgsm.gsm_input( @@ -153,7 +153,7 @@ class grgsm_livemon(gr.top_block, Qt.QWidget): self.gsm_control_channels_decoder_0_0 = grgsm.control_channels_decoder() self.gsm_control_channels_decoder_0 = grgsm.control_channels_decoder() self.gsm_clock_offset_control_0 = grgsm.clock_offset_control(fc-shiftoff) - self.gsm_bcch_ccch_demapper_0 = grgsm.universal_ctrl_chans_demapper(0, ([2,6,12,16,22,26,32,36,42,46]), ([1,2,2,2,2,2,2,2,2,2])) + self.gsm_bcch_ccch_demapper_0 = grgsm.gsm_bcch_ccch_demapper(0) self.blocks_socket_pdu_0_0 = blocks.socket_pdu("UDP_SERVER", "127.0.0.1", "4729", 10000) self.blocks_socket_pdu_0 = blocks.socket_pdu("UDP_CLIENT", "127.0.0.1", "4729", 10000) self.blocks_rotator_cc_0 = blocks.rotator_cc(-2*pi*shiftoff/samp_rate) diff --git a/apps/grgsm_scanner b/apps/grgsm_scanner index 94bba43..ebfdb7a 100755 --- a/apps/grgsm_scanner +++ b/apps/grgsm_scanner @@ -77,7 +77,7 @@ class receiver_with_decoder(grgsm.hier_block): ) self.gsm_control_channels_decoder_0 = grgsm.control_channels_decoder() self.gsm_clock_offset_control_0 = grgsm.clock_offset_control(fc) - self.gsm_bcch_ccch_demapper_0 = grgsm.universal_ctrl_chans_demapper(0, ([2,6,12,16,22,26,32,36,42,46]), ([1,2,2,2,2,2,2,2,2,2])) + self.gsm_bcch_ccch_demapper_0 = grgsm.gsm_bcch_ccch_demapper(0) ################################################## # Connections diff --git a/grc/demapping/gsm_bcch_ccch_demapper.xml b/grc/demapping/gsm_bcch_ccch_demapper.xml index b295ce1..ff392f1 100644 --- a/grc/demapping/gsm_bcch_ccch_demapper.xml +++ b/grc/demapping/gsm_bcch_ccch_demapper.xml @@ -1,61 +1,30 @@ -<?xml version="1.0"?> <block> <name>BCCH + CCCH demapper</name> <key>gsm_bcch_ccch_demapper</key> + <category></category> <import>import grgsm</import> - <make>grgsm.universal_ctrl_chans_demapper($timeslot_nr, $downlink_starts_fn_mod51, $downlink_channel_types, $uplink_starts_fn_mod51, $uplink_channel_types)</make> - + <make>grgsm.gsm_bcch_ccch_demapper( + timeslot_nr=$timeslot_nr, +)</make> + <callback>set_timeslot_nr($timeslot_nr)</callback> <param> - <name>Timeslot</name> + <name>timeslot_nr</name> <key>timeslot_nr</key> <value>0</value> - <type>int</type> - <hide>none</hide> + <type>raw</type> </param> - - <param> - <name>downlink_starts_fn_mod51</name> - <key>downlink_starts_fn_mod51</key> - <value>[2,6,12,16,22,26,32,36,42,46]</value> - <type>int_vector</type> - <hide>all</hide> - </param> - - <param> - <name>downlink_channel_types</name> - <key>downlink_channel_types</key> - <value>[1,2,2,2,2,2,2,2,2,2]</value> - <type>int_vector</type> - <hide>all</hide> - </param> - - <param> - <name>uplink_starts_fn_mod51</name> - <key>uplink_starts_fn_mod51</key> - <value>[]</value> - <type>int_vector</type> - <hide>all</hide> - </param> - - <param> - <name>uplink_channel_types</name> - <key>uplink_channel_types</key> - <value>[]</value> - <type>int_vector</type> - <hide>all</hide> - </param> - <sink> <name>bursts</name> <type>message</type> + <optional>1</optional> </sink> <source> <name>bursts</name> <type>message</type> + <optional>1</optional> </source> - - <doc> - Demapper for BCCH + CCCH control channels. - This corresponds to channel combination iv specified in GSM 05.02, section 6.4 - </doc> -</block> + <doc>Piotr Krysik +Demapper for BCCH + CCCH control channels. This corresponds to channel combination iv specified in GSM 05.02, section 6.4 +</doc> + <grc_source>gr-gsm/hier_blocks/demapping/gsm_bcch_ccch_demapper.grc</grc_source> +</block> diff --git a/grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml b/grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml index 90b33ce..94a433e 100644 --- a/grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml +++ b/grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml @@ -1,62 +1,30 @@ -<?xml version="1.0"?> <block> <name>BCCH + CCCH + SDCCH/4 demapper</name> <key>gsm_bcch_ccch_sdcch4_demapper</key> + <category></category> <import>import grgsm</import> - <make>grgsm.universal_ctrl_chans_demapper($timeslot_nr, $downlink_starts_fn_mod51, $downlink_channel_types, $uplink_starts_fn_mod51, $uplink_channel_types)</make> - + <make>grgsm.gsm_bcch_ccch_sdcch4_demapper( + timeslot_nr=$timeslot_nr, +)</make> + <callback>set_timeslot_nr($timeslot_nr)</callback> <param> - <name>Timeslot</name> + <name>timeslot_nr</name> <key>timeslot_nr</key> <value>0</value> - <type>int</type> - <hide>none</hide> + <type>raw</type> </param> - - <param> - <name>downlink_starts_fn_mod51</name> - <key>downlink_starts_fn_mod51</key> - <value>[2,6,12,16,22,26,32,36,42,46]</value> - <type>int_vector</type> - <hide>all</hide> - </param> - - <param> - <name>downlink_channel_types</name> - <key>downlink_channel_types</key> - <value>[1,2,2,2,7,7,7,7,135,135]</value> - <type>int_vector</type> - <hide>all</hide> - </param> - - <param> - <name>uplink_starts_fn_mod51</name> - <key>uplink_starts_fn_mod51</key> - <value>[0,6,10,37,41,47]</value> - <type>int_vector</type> - <hide>all</hide> - </param> - - <param> - <name>uplink_channel_types</name> - <key>uplink_channel_types</key> - <value>[7,135,135,7,7,7]</value> - <type>int_vector</type> - <hide>all</hide> - </param> - <sink> <name>bursts</name> <type>message</type> + <optional>1</optional> </sink> <source> <name>bursts</name> <type>message</type> + <optional>1</optional> </source> - - <doc> - Demapper for BCCH + CCCH + SDCCH/4 + SACCH/C4 control channels. - This corresponds to channel combination v specified in GSM 05.02, section 6.4 - </doc> -</block> - + <doc>Piotr Krysik +Demapper for BCCH + CCCH + SDCCH/4 + SACCH/C4 control channels. This corresponds to channel combination v specified in GSM 05.02, section 6.4 +</doc> + <grc_source>gr-gsm/hier_blocks/demapping/gsm_bcch_ccch_sdcch4_demapper.grc</grc_source> +</block> diff --git a/grc/demapping/gsm_sdcch8_demapper.xml b/grc/demapping/gsm_sdcch8_demapper.xml index c81032a..7507065 100644 --- a/grc/demapping/gsm_sdcch8_demapper.xml +++ b/grc/demapping/gsm_sdcch8_demapper.xml @@ -1,61 +1,30 @@ -<?xml version="1.0"?> <block> <name>SDCCH/8 demapper</name> <key>gsm_sdcch8_demapper</key> + <category></category> <import>import grgsm</import> - <make>grgsm.universal_ctrl_chans_demapper($timeslot_nr, $downlink_starts_fn_mod51, $downlink_channel_types, $uplink_starts_fn_mod51, $uplink_channel_types)</make> - + <make>grgsm.gsm_sdcch8_demapper( + timeslot_nr=$timeslot_nr, +)</make> + <callback>set_timeslot_nr($timeslot_nr)</callback> <param> - <name>Timeslot</name> + <name>timeslot_nr</name> <key>timeslot_nr</key> <value>1</value> - <type>int</type> - <hide>none</hide> + <type>raw</type> </param> - - <param> - <name>downlink_starts_fn_mod51</name> - <key>downlink_starts_fn_mod51</key> - <value>[0,4,8,12,16,20,24,28,32,36,40,44]</value> - <type>int_vector</type> - <hide>all</hide> - </param> - - <param> - <name>downlink_channel_types</name> - <key>downlink_channel_types</key> - <value>[8,8,8,8,8,8,8,8,136,136,136,136]</value> - <type>int_vector</type> - <hide>all</hide> - </param> - - <param> - <name>uplink_starts_fn_mod51</name> - <key>uplink_starts_fn_mod51</key> - <value>[15,19,23,27,31,35,39,43,47,0,4,8]</value> - <type>int_vector</type> - <hide>all</hide> - </param> - - <param> - <name>uplink_channel_types</name> - <key>uplink_channel_types</key> - <value>[8,8,8,8,8,8,8,8,136,136,136,136]</value> - <type>int_vector</type> - <hide>all</hide> - </param> - <sink> <name>bursts</name> <type>message</type> + <optional>1</optional> </sink> <source> <name>bursts</name> <type>message</type> + <optional>1</optional> </source> - - <doc> - Demapper for SDCCH/8 + SACCH/C8 control channels. - This corresponds to channel combination vii specified in GSM 05.02, section 6.4 - </doc> + <doc>Piotr Krysik +Demapper for SDCCH/8 + SACCH/C8 control channels. This corresponds to channel combination vii specified in GSM 05.02, section 6.4 +</doc> + <grc_source>gr-gsm/hier_blocks/demapping/gsm_sdcch8_demapper.grc</grc_source> </block> diff --git a/grc/demapping/gsm_universal_ctrl_chans_demapper.xml b/grc/demapping/gsm_universal_ctrl_chans_demapper.xml index 3b522be..f173752 100644 --- a/grc/demapping/gsm_universal_ctrl_chans_demapper.xml +++ b/grc/demapping/gsm_universal_ctrl_chans_demapper.xml @@ -3,7 +3,7 @@ <name>Universal ctrl chans demapper</name> <key>gsm_universal_ctrl_chans_demapper</key> <import>import grgsm</import> - <make>grgsm.universal_ctrl_chans_demapper($timeslot_nr, $downlink_starts_fn_mod51, $downlink_channel_types, $uplink_starts_fn_mod51, $uplink_channel_types)</make> + <make>grgsm.universal_ctrl_chans_demapper($timeslot_nr, $downlink_starts_fn_mod51, $downlink_channel_types, $downlink_subslots, $uplink_starts_fn_mod51, $uplink_channel_types, $uplink_subslots)</make> <param> <name>timeslot_nr</name> @@ -16,7 +16,7 @@ <param> <name>downlink_starts_fn_mod51</name> <key>downlink_starts_fn_mod51</key> - <value>[2,6,12,16,22,26,32,36,42,46]</value> + <value>[0,0,2,2,2,2,6,6,6,6,0,0,12,12,12,12,16,16,16,16,0,0,22,22,22,22,26,26,26,26,0,0,32,32,32,32,36,36,36,36,0,0,42,42,42,42,46,46,46,46,0,]</value> <type>int_vector</type> <hide>part</hide> </param> @@ -24,7 +24,15 @@ <param> <name>downlink_channel_types</name> <key>downlink_channel_types</key> - <value>[1,2,2,2,2,2,2,2,2,2]</value> + <value>[0,0,1,1,1,1,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,]</value> + <type>int_vector</type> + <hide>part</hide> + </param> + + <param> + <name>downlink_subslots</name> + <key>downlink_subslots</key> + <value>[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,]</value> <type>int_vector</type> <hide>part</hide> </param> @@ -32,7 +40,7 @@ <param> <name>uplink_starts_fn_mod51</name> <key>uplink_starts_fn_mod51</key> - <value>[0,6,10,37,41,47]</value> + <value>[0,0,0,0,0,0,6,6,6,6,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,37,41,41,41,41,0,0,47,47,47,47]</value> <type>int_vector</type> <hide>part</hide> </param> @@ -40,10 +48,18 @@ <param> <name>uplink_channel_types</name> <key>uplink_channel_types</key> - <value>[2,2,2,2,2,2]</value> + <value>[2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,]</value> <type>int_vector</type> <hide>part</hide> </param> + + <param> + <name>uplink_subslots</name> + <key>uplink_subslots</key> + <value>[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,]</value> + <type>int_vector</type> + <hide>part</hide> + </param> <sink> <name>bursts</name> @@ -55,5 +71,6 @@ </source> <doc> Universal demapper for control channels. + Author: Piotr Krysik </doc> </block> diff --git a/hier_blocks/compile_demappers b/hier_blocks/compile_demappers new file mode 100755 index 0000000..96d652b --- /dev/null +++ b/hier_blocks/compile_demappers @@ -0,0 +1,37 @@ +#!/bin/bash + +#This is just helper script for manual compilation of hierarhical blocks +#by gr-gsm developers +#Author: Piotr Krysik + +cd demapping +for p in *.grc +do + echo $p + grcc $p -d `pwd` +done +cd .. + +mv ~/.grc_gnuradio/gsm_* . + +for file in *.py.xml +do + cat $file | sed 's/.*\<import\>.*/ <import>import grgsm<\/import>/' \ + | sed 's/<make>/<make>grgsm./' \ + | sed "s/.*.py//" \ + | sed 's/<grc_source>.*hier_blocks/<grc_source>gr-gsm\/hier_blocks/' \ + > ${file}2 + + mv ${file}2 $file + + mv "$file" "`basename $file .py.xml`.xml" +done + +for py in *.py +do + cat $py |sed 's/gr.hier_block2/grgsm.hier_block/' > ${py}2 + mv ${py}2 $py +done + +mv *.py ../python/demapping +mv *.xml ../grc/demapping
\ No newline at end of file diff --git a/hier_blocks/demapping/gsm_bcch_ccch_demapper.grc b/hier_blocks/demapping/gsm_bcch_ccch_demapper.grc new file mode 100644 index 0000000..faef3dd --- /dev/null +++ b/hier_blocks/demapping/gsm_bcch_ccch_demapper.grc @@ -0,0 +1,292 @@ +<?xml version='1.0' encoding='utf-8'?> +<?grc format='1' created='3.7.9'?> +<flow_graph> + <timestamp>Tue May 17 17:08:42 2016</timestamp> + <block> + <key>options</key> + <param> + <key>author</key> + <value>Piotr Krysik</value> + </param> + <param> + <key>window_size</key> + <value></value> + </param> + <param> + <key>category</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>description</key> + <value>Demapper for BCCH + CCCH control channels. This corresponds to channel combination iv specified in GSM 05.02, section 6.4</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(8, 8)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>generate_options</key> + <value>hb</value> + </param> + <param> + <key>hier_block_src_path</key> + <value>.:</value> + </param> + <param> + <key>id</key> + <value>gsm_bcch_ccch_demapper</value> + </param> + <param> + <key>max_nouts</key> + <value>0</value> + </param> + <param> + <key>qt_qss_theme</key> + <value></value> + </param> + <param> + <key>realtime_scheduling</key> + <value></value> + </param> + <param> + <key>run_command</key> + <value>{python} -u {filename}</value> + </param> + <param> + <key>run_options</key> + <value>prompt</value> + </param> + <param> + <key>run</key> + <value>True</value> + </param> + <param> + <key>thread_safe_setters</key> + <value></value> + </param> + <param> + <key>title</key> + <value>BCCH + CCCH demapper</value> + </param> + </block> + <block> + <key>gsm_universal_ctrl_chans_demapper</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(168, 193)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>gsm_universal_ctrl_chans_demapper_0</value> + </param> + <param> + <key>maxoutbuf</key> + <value>0</value> + </param> + <param> + <key>minoutbuf</key> + <value>0</value> + </param> + <param> + <key>downlink_channel_types</key> + <value>[0,0,1,1,1,1,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,]</value> + </param> + <param> + <key>downlink_starts_fn_mod51</key> + <value>[0,0,2,2,2,2,6,6,6,6,0,0,12,12,12,12,16,16,16,16,0,0,22,22,22,22,26,26,26,26,0,0,32,32,32,32,36,36,36,36,0,0,42,42,42,42,46,46,46,46,0,]</value> + </param> + <param> + <key>downlink_subslots</key> + <value>[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,]</value> + </param> + <param> + <key>timeslot_nr</key> + <value>timeslot_nr</value> + </param> + <param> + <key>uplink_channel_types</key> + <value>[2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,]</value> + </param> + <param> + <key>uplink_starts_fn_mod51</key> + <value>[0,0,0,0,0,0,6,6,6,6,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,37,41,41,41,41,0,0,47,47,47,47]</value> + </param> + <param> + <key>uplink_subslots</key> + <value>[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,]</value> + </param> + </block> + <block> + <key>pad_sink</key> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(424, 188)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>pad_sink_0</value> + </param> + <param> + <key>type</key> + <value>message</value> + </param> + <param> + <key>label</key> + <value>bursts</value> + </param> + <param> + <key>num_streams</key> + <value>1</value> + </param> + <param> + <key>optional</key> + <value>True</value> + </param> + <param> + <key>vlen</key> + <value>1</value> + </param> + </block> + <block> + <key>pad_source</key> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(32, 188)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>pad_source_0</value> + </param> + <param> + <key>label</key> + <value>bursts</value> + </param> + <param> + <key>num_streams</key> + <value>1</value> + </param> + <param> + <key>optional</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>message</value> + </param> + <param> + <key>vlen</key> + <value>1</value> + </param> + </block> + <block> + <key>parameter</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(192, 7)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>timeslot_nr</value> + </param> + <param> + <key>label</key> + <value>timeslot_nr</value> + </param> + <param> + <key>short_id</key> + <value></value> + </param> + <param> + <key>type</key> + <value>intx</value> + </param> + <param> + <key>value</key> + <value>0</value> + </param> + </block> + <connection> + <source_block_id>gsm_universal_ctrl_chans_demapper_0</source_block_id> + <sink_block_id>pad_sink_0</sink_block_id> + <source_key>bursts</source_key> + <sink_key>in</sink_key> + </connection> + <connection> + <source_block_id>pad_source_0</source_block_id> + <sink_block_id>gsm_universal_ctrl_chans_demapper_0</sink_block_id> + <source_key>out</source_key> + <sink_key>bursts</sink_key> + </connection> +</flow_graph> diff --git a/hier_blocks/demapping/gsm_bcch_ccch_sdcch4_demapper.grc b/hier_blocks/demapping/gsm_bcch_ccch_sdcch4_demapper.grc new file mode 100644 index 0000000..ad5c751 --- /dev/null +++ b/hier_blocks/demapping/gsm_bcch_ccch_sdcch4_demapper.grc @@ -0,0 +1,292 @@ +<?xml version='1.0' encoding='utf-8'?> +<?grc format='1' created='3.7.9'?> +<flow_graph> + <timestamp>Tue May 17 17:08:42 2016</timestamp> + <block> + <key>options</key> + <param> + <key>author</key> + <value>Piotr Krysik</value> + </param> + <param> + <key>window_size</key> + <value></value> + </param> + <param> + <key>category</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>description</key> + <value>Demapper for BCCH + CCCH + SDCCH/4 + SACCH/C4 control channels. This corresponds to channel combination v specified in GSM 05.02, section 6.4</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(8, 8)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>generate_options</key> + <value>hb</value> + </param> + <param> + <key>hier_block_src_path</key> + <value>.:</value> + </param> + <param> + <key>id</key> + <value>gsm_bcch_ccch_sdcch4_demapper</value> + </param> + <param> + <key>max_nouts</key> + <value>0</value> + </param> + <param> + <key>qt_qss_theme</key> + <value></value> + </param> + <param> + <key>realtime_scheduling</key> + <value></value> + </param> + <param> + <key>run_command</key> + <value>{python} -u {filename}</value> + </param> + <param> + <key>run_options</key> + <value>prompt</value> + </param> + <param> + <key>run</key> + <value>True</value> + </param> + <param> + <key>thread_safe_setters</key> + <value></value> + </param> + <param> + <key>title</key> + <value>BCCH + CCCH + SDCCH/4 demapper</value> + </param> + </block> + <block> + <key>gsm_universal_ctrl_chans_demapper</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(168, 193)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>gsm_universal_ctrl_chans_demapper_0</value> + </param> + <param> + <key>maxoutbuf</key> + <value>0</value> + </param> + <param> + <key>minoutbuf</key> + <value>0</value> + </param> + <param> + <key>downlink_channel_types</key> + <value>[0,0,1,1,1,1,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,7,7,7,7,7,7,7,7,0,0,7,7,7,7,7,7,7,7,0,0,135,135,135,135,135,135,135,135,0]</value> + </param> + <param> + <key>downlink_starts_fn_mod51</key> + <value>[0,0,2,2,2,2,6,6,6,6,0,0,12,12,12,12,16,16,16,16,0,0,22,22,22,22,26,26,26,26,0,0,32,32,32,32,36,36,36,36,0,0,42,42,42,42,46,46,46,46,0,]</value> + </param> + <param> + <key>downlink_subslots</key> + <value>[0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,0,0,0,0,0,0,1,1,1,1,0,0,2,2,2,2,3,3,3,3,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,0,0,0,0,0,0,1,1,1,1,0,0,2,2,2,2,3,3,3,3,0,0,2,2,2,2,3,3,3,3,0,]</value> + </param> + <param> + <key>timeslot_nr</key> + <value>timeslot_nr</value> + </param> + <param> + <key>uplink_channel_types</key> + <value>[7,7,7,7,0,0,135,135,135,135,135,135,135,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,7,7,7,7,0,0,7,7,7,7,]</value> + </param> + <param> + <key>uplink_starts_fn_mod51</key> + <value>[0,0,0,0,0,0,6,6,6,6,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,37,41,41,41,41,0,0,47,47,47,47,]</value> + </param> + <param> + <key>uplink_subslots</key> + <value>[0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,0,0,3,3,3,3,0,0,0,0,0,0,2,2,2,2,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,0,0,3,3,3,3,]</value> + </param> + </block> + <block> + <key>pad_sink</key> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(416, 188)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>pad_sink_0</value> + </param> + <param> + <key>type</key> + <value>message</value> + </param> + <param> + <key>label</key> + <value>bursts</value> + </param> + <param> + <key>num_streams</key> + <value>1</value> + </param> + <param> + <key>optional</key> + <value>True</value> + </param> + <param> + <key>vlen</key> + <value>1</value> + </param> + </block> + <block> + <key>pad_source</key> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(32, 188)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>pad_source_0</value> + </param> + <param> + <key>label</key> + <value>bursts</value> + </param> + <param> + <key>num_streams</key> + <value>1</value> + </param> + <param> + <key>optional</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>message</value> + </param> + <param> + <key>vlen</key> + <value>1</value> + </param> + </block> + <block> + <key>parameter</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(192, 7)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>timeslot_nr</value> + </param> + <param> + <key>label</key> + <value>timeslot_nr</value> + </param> + <param> + <key>short_id</key> + <value></value> + </param> + <param> + <key>type</key> + <value>intx</value> + </param> + <param> + <key>value</key> + <value>0</value> + </param> + </block> + <connection> + <source_block_id>gsm_universal_ctrl_chans_demapper_0</source_block_id> + <sink_block_id>pad_sink_0</sink_block_id> + <source_key>bursts</source_key> + <sink_key>in</sink_key> + </connection> + <connection> + <source_block_id>pad_source_0</source_block_id> + <sink_block_id>gsm_universal_ctrl_chans_demapper_0</sink_block_id> + <source_key>out</source_key> + <sink_key>bursts</sink_key> + </connection> +</flow_graph> diff --git a/hier_blocks/demapping/gsm_sdcch8_demapper.grc b/hier_blocks/demapping/gsm_sdcch8_demapper.grc new file mode 100644 index 0000000..3cc5f7e --- /dev/null +++ b/hier_blocks/demapping/gsm_sdcch8_demapper.grc @@ -0,0 +1,292 @@ +<?xml version='1.0' encoding='utf-8'?> +<?grc format='1' created='3.7.9'?> +<flow_graph> + <timestamp>Tue May 17 17:08:42 2016</timestamp> + <block> + <key>options</key> + <param> + <key>author</key> + <value>Piotr Krysik</value> + </param> + <param> + <key>window_size</key> + <value></value> + </param> + <param> + <key>category</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>description</key> + <value>Demapper for SDCCH/8 + SACCH/C8 control channels. This corresponds to channel combination vii specified in GSM 05.02, section 6.4</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(8, 8)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>generate_options</key> + <value>hb</value> + </param> + <param> + <key>hier_block_src_path</key> + <value>.:</value> + </param> + <param> + <key>id</key> + <value>gsm_sdcch8_demapper</value> + </param> + <param> + <key>max_nouts</key> + <value>0</value> + </param> + <param> + <key>qt_qss_theme</key> + <value></value> + </param> + <param> + <key>realtime_scheduling</key> + <value></value> + </param> + <param> + <key>run_command</key> + <value>{python} -u {filename}</value> + </param> + <param> + <key>run_options</key> + <value>prompt</value> + </param> + <param> + <key>run</key> + <value>True</value> + </param> + <param> + <key>thread_safe_setters</key> + <value></value> + </param> + <param> + <key>title</key> + <value>SDCCH/8 demapper</value> + </param> + </block> + <block> + <key>gsm_universal_ctrl_chans_demapper</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(168, 193)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>gsm_universal_ctrl_chans_demapper_0</value> + </param> + <param> + <key>maxoutbuf</key> + <value>0</value> + </param> + <param> + <key>minoutbuf</key> + <value>0</value> + </param> + <param> + <key>downlink_channel_types</key> + <value>[0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,0,0,0]</value> + </param> + <param> + <key>downlink_starts_fn_mod51</key> + <value>[0,0,0,0,4,4,4,4,8,8,8,8,12,12,12,12,16,16,16,16,20,20,20,20,24,24,24,24,28,28,28,28,32,32,32,32,36,36,36,36,40,40,40,40,44,44,44,44,0,0,0]</value> + </param> + <param> + <key>downlink_subslots</key> + <value>[0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,0,0,0,]</value> + </param> + <param> + <key>timeslot_nr</key> + <value>timeslot_nr</value> + </param> + <param> + <key>uplink_channel_types</key> + <value>[1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,0,0,0,0,5,5,5,5,6,6,6,6,7,7,7,7,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,4,4,4,4]</value> + </param> + <param> + <key>uplink_starts_fn_mod51</key> + <value>[136,136,136,136,136,136,136,136,136,136,136,136,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,136,136,136,136]</value> + </param> + <param> + <key>uplink_subslots</key> + <value>[1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,0,0,0,0,5,5,5,5,6,6,6,6,7,7,7,7,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,4,4,4,4,]</value> + </param> + </block> + <block> + <key>pad_sink</key> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(416, 188)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>pad_sink_0</value> + </param> + <param> + <key>type</key> + <value>message</value> + </param> + <param> + <key>label</key> + <value>bursts</value> + </param> + <param> + <key>num_streams</key> + <value>1</value> + </param> + <param> + <key>optional</key> + <value>True</value> + </param> + <param> + <key>vlen</key> + <value>1</value> + </param> + </block> + <block> + <key>pad_source</key> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(32, 188)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>pad_source_0</value> + </param> + <param> + <key>label</key> + <value>bursts</value> + </param> + <param> + <key>num_streams</key> + <value>1</value> + </param> + <param> + <key>optional</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>message</value> + </param> + <param> + <key>vlen</key> + <value>1</value> + </param> + </block> + <block> + <key>parameter</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(192, 7)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>timeslot_nr</value> + </param> + <param> + <key>label</key> + <value>timeslot_nr</value> + </param> + <param> + <key>short_id</key> + <value></value> + </param> + <param> + <key>type</key> + <value>intx</value> + </param> + <param> + <key>value</key> + <value>1</value> + </param> + </block> + <connection> + <source_block_id>gsm_universal_ctrl_chans_demapper_0</source_block_id> + <sink_block_id>pad_sink_0</sink_block_id> + <source_key>bursts</source_key> + <sink_key>in</sink_key> + </connection> + <connection> + <source_block_id>pad_source_0</source_block_id> + <sink_block_id>gsm_universal_ctrl_chans_demapper_0</sink_block_id> + <source_key>out</source_key> + <sink_key>bursts</sink_key> + </connection> +</flow_graph> diff --git a/include/grgsm/demapping/universal_ctrl_chans_demapper.h b/include/grgsm/demapping/universal_ctrl_chans_demapper.h index c1778af..eea2bde 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<int> &downlink_starts_fn_mod51, const std::vector<int> &downlink_channel_types, const std::vector<int> &uplink_starts_fn_mod51=std::vector<int>(), const std::vector<int> &uplink_channel_types=std::vector<int>()); + static sptr make(unsigned int timeslot_nr, const std::vector<int> &downlink_starts_fn_mod51, const std::vector<int> &downlink_channel_types, const std::vector<int> &downlink_subslots, const std::vector<int> &uplink_starts_fn_mod51=std::vector<int>(), const std::vector<int> &uplink_channel_types=std::vector<int>(), const std::vector<int> &uplink_subslots=std::vector<int>()); }; } // namespace gsm diff --git a/lib/demapping/universal_ctrl_chans_demapper_impl.cc b/lib/demapping/universal_ctrl_chans_demapper_impl.cc index cbbbc32..32987ca 100644 --- a/lib/demapping/universal_ctrl_chans_demapper_impl.cc +++ b/lib/demapping/universal_ctrl_chans_demapper_impl.cc @@ -36,158 +36,34 @@ namespace gr { namespace gsm { universal_ctrl_chans_demapper::sptr - universal_ctrl_chans_demapper::make(unsigned int timeslot_nr, const std::vector<int> &downlink_starts_fn_mod51, const std::vector<int> &downlink_channel_types, const std::vector<int> &uplink_starts_fn_mod51, const std::vector<int> &uplink_channel_types) - { + universal_ctrl_chans_demapper::make(unsigned int timeslot_nr, const std::vector<int> &downlink_starts_fn_mod51, const std::vector<int> &downlink_channel_types, const std::vector<int> &downlink_subslots, const std::vector<int> &uplink_starts_fn_mod51, const std::vector<int> &uplink_channel_types, const std::vector<int> &uplink_subslots) + { return gnuradio::get_initial_sptr - (new universal_ctrl_chans_demapper_impl(timeslot_nr, downlink_starts_fn_mod51, downlink_channel_types, uplink_starts_fn_mod51, uplink_channel_types)); + (new universal_ctrl_chans_demapper_impl(timeslot_nr, downlink_starts_fn_mod51, downlink_channel_types, downlink_subslots, uplink_starts_fn_mod51, uplink_channel_types, uplink_subslots)); } /* * The private constructor */ - universal_ctrl_chans_demapper_impl::universal_ctrl_chans_demapper_impl(unsigned int timeslot_nr, const std::vector<int> &downlink_starts_fn_mod51, const std::vector<int> &downlink_channel_types, const std::vector<int> &uplink_starts_fn_mod51, const std::vector<int> &uplink_channel_types) + universal_ctrl_chans_demapper_impl::universal_ctrl_chans_demapper_impl(unsigned int timeslot_nr, const std::vector<int> &downlink_starts_fn_mod51, const std::vector<int> &downlink_channel_types, const std::vector<int> &downlink_subslots, const std::vector<int> &uplink_starts_fn_mod51, const std::vector<int> &uplink_channel_types, const std::vector<int> &uplink_subslots) : gr::block("universal_ctrl_chans_demapper", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)), - d_timeslot(timeslot_nr) - + d_timeslot_nr(timeslot_nr), + d_downlink_starts_fn_mod51(51, 0), + d_downlink_channel_types(51, 0), + d_downlink_subslots(102, 0), + d_uplink_starts_fn_mod51(51, 0), + d_uplink_channel_types(51, 0), + d_uplink_subslots(102, 0) { - - - for(int ii=0; ii<51; ii++) - { - 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<int>::const_iterator s; - std::vector<int>::const_iterator ch_type; - - 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_downlink_starts_fn_mod51[*s+ii] = *s; - if(ch_type!=downlink_channel_types.end()) - { - d_downlink_channel_types[*s+ii] = *ch_type; - } - } - if(ch_type!=downlink_channel_types.end()) - { - ch_type++; - } - } - } - - 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<int> distinct_downlink_channels(downlink_channel_types.begin(), downlink_channel_types.end()); - std::set<int>::iterator it; - unsigned int 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<int> 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++; - } - } - } - } - - + std::copy(downlink_starts_fn_mod51.begin(), downlink_starts_fn_mod51.end(), d_downlink_starts_fn_mod51.begin()); + std::copy(downlink_channel_types.begin(), downlink_channel_types.end(), d_downlink_channel_types.begin()); + std::copy(downlink_subslots.begin(), downlink_subslots.end(), d_downlink_subslots.begin()); + std::copy(uplink_starts_fn_mod51.begin(), uplink_starts_fn_mod51.end(), d_uplink_starts_fn_mod51.begin()); + std::copy(uplink_channel_types.begin(), uplink_channel_types.end(), d_uplink_channel_types.begin()); + std::copy(uplink_subslots.begin(), uplink_subslots.end(), d_uplink_subslots.begin()); + 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)); message_port_register_out(pmt::mp("bursts")); @@ -205,99 +81,79 @@ namespace gr { pmt::pmt_t header_plus_burst = pmt::cdr(msg); gsmtap_hdr * header = (gsmtap_hdr *)pmt::blob_data(header_plus_burst); - uint32_t frame_nr = be32toh(header->frame_number); - uint32_t fn_mod51 = frame_nr % 51; - - bool uplink_burst = (be16toh(header->arfcn) & 0x4000) ? true : false; - - if(header->timeslot==d_timeslot){ + if(header->timeslot==d_timeslot_nr) + { + int * starts_fn_mod51; + int * channel_types; + int * subslots; + uint32_t * frame_numbers; + pmt::pmt_t * bursts; + + uint32_t frame_nr = be32toh(header->frame_number); //get frame number + uint32_t fn_mod51 = frame_nr % 51; //frame number modulo 51 + + //crate new message int8_t new_msg[sizeof(gsmtap_hdr)+BURST_SIZE]; gsmtap_hdr * new_hdr = (gsmtap_hdr*)new_msg; memcpy(new_msg, header, sizeof(gsmtap_hdr)+BURST_SIZE); pmt::pmt_t msg_binary_blob = pmt::make_blob(new_msg,sizeof(gsmtap_hdr)+BURST_SIZE); pmt::pmt_t msg_out = pmt::cons(pmt::PMT_NIL, msg_binary_blob); - - if(uplink_burst) - { - 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) - { - new_hdr->sub_type = ch_type; - } - new_hdr->sub_slot = d_uplink_subslots[fn_mod51 + (51 * (frame_nr % 2))]; - - if(fn_mod51>=fn51_start && fn_mod51<=fn51_stop) - { - uint32_t ii = fn_mod51 - fn51_start; - d_uplink_frame_numbers[ii] = frame_nr; - d_uplink_bursts[ii] = msg_out; - } - - 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++) - { - 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]); - } - } - } + //get information if burst is from uplink or downlink + bool uplink_burst = (be16toh(header->arfcn) & 0x4000) ? true : false; + + //select right set of configuration and history for uplink or downlink + if(uplink_burst) { + starts_fn_mod51 = &d_uplink_starts_fn_mod51[0]; + channel_types = &d_uplink_channel_types[0]; + subslots = &d_uplink_subslots[0]; + frame_numbers = d_uplink_frame_numbers; + bursts = d_uplink_bursts; + } else { + starts_fn_mod51 = &d_downlink_starts_fn_mod51[0]; + channel_types = &d_downlink_channel_types[0]; + subslots = &d_downlink_subslots[0]; + frame_numbers = d_downlink_frame_numbers; + bursts = d_downlink_bursts; } - 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]; + + uint32_t fn51_start = starts_fn_mod51[fn_mod51]; + uint32_t fn51_stop = fn51_start + 3; + uint32_t ch_type = channel_types[fn_mod51]; - if(ch_type != 0) - { - new_hdr->sub_type = ch_type; - } - new_hdr->sub_slot = d_downlink_subslots[fn_mod51 + (51 * (frame_nr % 2))]; - - if(fn_mod51>=fn51_start && fn_mod51<=fn51_stop) + if(ch_type != 0) + { + new_hdr->sub_type = ch_type; + } + new_hdr->sub_slot = subslots[fn_mod51 + (51 * (frame_nr % 2))]; + + if(fn_mod51>=fn51_start && fn_mod51<=fn51_stop) + { + uint32_t ii = fn_mod51 - fn51_start; + frame_numbers[ii] = frame_nr; + bursts[ii] = msg_out; + } + + 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++) { - uint32_t ii = fn_mod51 - fn51_start; - d_downlink_frame_numbers[ii] = frame_nr; - d_downlink_bursts[ii] = msg_out; + if((frame_numbers[jj] - frame_numbers[jj-1])!=1) + { + frames_are_consecutive = false; + } } - - if(fn_mod51==fn51_stop) + if(frames_are_consecutive) { - //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++) + //send bursts to the output + for(int jj=0; jj<4; jj++) { - if((d_downlink_frame_numbers[jj]-d_downlink_frame_numbers[jj-1])!=1) - { - frames_are_consecutive = false; - } + message_port_pub(pmt::mp("bursts"), bursts[jj]); } - 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 0316bf4..9545ab6 100644 --- a/lib/demapping/universal_ctrl_chans_demapper_impl.h +++ b/lib/demapping/universal_ctrl_chans_demapper_impl.h @@ -29,23 +29,28 @@ namespace gr { namespace gsm { + typedef enum {downlink=0,uplink=1} um_radio_link_direction; class universal_ctrl_chans_demapper_impl : public universal_ctrl_chans_demapper { private: - 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_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]; + //configuration of the block + unsigned int d_timeslot_nr; + std::vector<int> d_downlink_starts_fn_mod51; + std::vector<int> d_downlink_channel_types; + std::vector<int> d_downlink_subslots; + + std::vector<int> d_uplink_starts_fn_mod51; + std::vector<int> d_uplink_channel_types; + std::vector<int> d_uplink_subslots; + + //history of the downlink and uplink bursts + uint32_t d_downlink_frame_numbers[4]; + pmt::pmt_t d_downlink_bursts[4]; + uint32_t d_uplink_frame_numbers[4]; + pmt::pmt_t d_uplink_bursts[4]; public: - universal_ctrl_chans_demapper_impl(unsigned int timeslot_nr, const std::vector<int> &downlink_starts_fn_mod51, const std::vector<int> &downlink_channel_types, const std::vector<int> &uplink_starts_fn_mod51, const std::vector<int> &uplink_channel_types); - ~universal_ctrl_chans_demapper_impl(); + universal_ctrl_chans_demapper_impl(unsigned int timeslot_nr, const std::vector<int> &downlink_starts_fn_mod51, const std::vector<int> &downlink_channel_types, const std::vector<int> &downlink_subslots, const std::vector<int> &uplink_starts_fn_mod51, const std::vector<int> &uplink_channel_types, const std::vector<int> &uplink_subslots); + ~universal_ctrl_chans_demapper_impl(); void filter_ctrl_chans(pmt::pmt_t msg); }; diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 04a97c2..8fc48de 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -31,6 +31,9 @@ endif() GR_PYTHON_INSTALL( FILES __init__.py + demapping/gsm_bcch_ccch_demapper.py + demapping/gsm_bcch_ccch_sdcch4_demapper.py + demapping/gsm_sdcch8_demapper.py receiver/gsm_input.py receiver/gsm_wideband_input.py receiver/fcch_burst_tagger.py diff --git a/python/__init__.py b/python/__init__.py index 247c040..dfa7a0e 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -53,6 +53,9 @@ from fcch_detector import fcch_detector from clock_offset_corrector import clock_offset_corrector from gsm_input import gsm_input from gsm_wideband_input import gsm_wideband_input +from gsm_bcch_ccch_demapper import gsm_bcch_ccch_demapper +from gsm_bcch_ccch_sdcch4_demapper import gsm_bcch_ccch_sdcch4_demapper +from gsm_sdcch8_demapper import gsm_sdcch8_demapper import arfcn diff --git a/python/demapping/gsm_bcch_ccch_demapper.py b/python/demapping/gsm_bcch_ccch_demapper.py new file mode 100644 index 0000000..adb4c12 --- /dev/null +++ b/python/demapping/gsm_bcch_ccch_demapper.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +################################################## +# GNU Radio Python Flow Graph +# Title: BCCH + CCCH demapper +# Author: Piotr Krysik +# Description: Demapper for BCCH + CCCH control channels. This corresponds to channel combination iv specified in GSM 05.02, section 6.4 +# Generated: Fri May 20 12:11:59 2016 +################################################## + +from gnuradio import gr +from gnuradio.filter import firdes +import grgsm + + +class gsm_bcch_ccch_demapper(grgsm.hier_block): + + def __init__(self, timeslot_nr=0): + grgsm.hier_block.__init__( + self, "BCCH + CCCH demapper", + gr.io_signature(0, 0, 0), + gr.io_signature(0, 0, 0), + ) + self.message_port_register_hier_in("bursts") + self.message_port_register_hier_out("bursts") + + ################################################## + # Parameters + ################################################## + self.timeslot_nr = timeslot_nr + + ################################################## + # Blocks + ################################################## + self.gsm_universal_ctrl_chans_demapper_0 = grgsm.universal_ctrl_chans_demapper(timeslot_nr, ([0,0,2,2,2,2,6,6,6,6,0,0,12,12,12,12,16,16,16,16,0,0,22,22,22,22,26,26,26,26,0,0,32,32,32,32,36,36,36,36,0,0,42,42,42,42,46,46,46,46,0,]), ([0,0,1,1,1,1,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,]), ([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,]), ([0,0,0,0,0,0,6,6,6,6,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,37,41,41,41,41,0,0,47,47,47,47]), ([2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,]), ([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,])) + + ################################################## + # Connections + ################################################## + self.msg_connect((self.gsm_universal_ctrl_chans_demapper_0, 'bursts'), (self, 'bursts')) + self.msg_connect((self, 'bursts'), (self.gsm_universal_ctrl_chans_demapper_0, 'bursts')) + + def get_timeslot_nr(self): + return self.timeslot_nr + + def set_timeslot_nr(self, timeslot_nr): + self.timeslot_nr = timeslot_nr diff --git a/python/demapping/gsm_bcch_ccch_sdcch4_demapper.py b/python/demapping/gsm_bcch_ccch_sdcch4_demapper.py new file mode 100644 index 0000000..92fb5f0 --- /dev/null +++ b/python/demapping/gsm_bcch_ccch_sdcch4_demapper.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +################################################## +# GNU Radio Python Flow Graph +# Title: BCCH + CCCH + SDCCH/4 demapper +# Author: Piotr Krysik +# Description: Demapper for BCCH + CCCH + SDCCH/4 + SACCH/C4 control channels. This corresponds to channel combination v specified in GSM 05.02, section 6.4 +# Generated: Fri May 20 12:12:01 2016 +################################################## + +from gnuradio import gr +from gnuradio.filter import firdes +import grgsm + + +class gsm_bcch_ccch_sdcch4_demapper(grgsm.hier_block): + + def __init__(self, timeslot_nr=0): + grgsm.hier_block.__init__( + self, "BCCH + CCCH + SDCCH/4 demapper", + gr.io_signature(0, 0, 0), + gr.io_signature(0, 0, 0), + ) + self.message_port_register_hier_in("bursts") + self.message_port_register_hier_out("bursts") + + ################################################## + # Parameters + ################################################## + self.timeslot_nr = timeslot_nr + + ################################################## + # Blocks + ################################################## + self.gsm_universal_ctrl_chans_demapper_0 = grgsm.universal_ctrl_chans_demapper(timeslot_nr, ([0,0,2,2,2,2,6,6,6,6,0,0,12,12,12,12,16,16,16,16,0,0,22,22,22,22,26,26,26,26,0,0,32,32,32,32,36,36,36,36,0,0,42,42,42,42,46,46,46,46,0,]), ([0,0,1,1,1,1,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,7,7,7,7,7,7,7,7,0,0,7,7,7,7,7,7,7,7,0,0,135,135,135,135,135,135,135,135,0]), ([0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,0,0,0,0,0,0,1,1,1,1,0,0,2,2,2,2,3,3,3,3,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,0,0,0,0,0,0,1,1,1,1,0,0,2,2,2,2,3,3,3,3,0,0,2,2,2,2,3,3,3,3,0,]), ([0,0,0,0,0,0,6,6,6,6,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,37,41,41,41,41,0,0,47,47,47,47,]), ([7,7,7,7,0,0,135,135,135,135,135,135,135,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,7,7,7,7,0,0,7,7,7,7,]), ([0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,0,0,3,3,3,3,0,0,0,0,0,0,2,2,2,2,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,0,0,3,3,3,3,])) + + ################################################## + # Connections + ################################################## + self.msg_connect((self.gsm_universal_ctrl_chans_demapper_0, 'bursts'), (self, 'bursts')) + self.msg_connect((self, 'bursts'), (self.gsm_universal_ctrl_chans_demapper_0, 'bursts')) + + def get_timeslot_nr(self): + return self.timeslot_nr + + def set_timeslot_nr(self, timeslot_nr): + self.timeslot_nr = timeslot_nr diff --git a/python/demapping/gsm_sdcch8_demapper.py b/python/demapping/gsm_sdcch8_demapper.py new file mode 100644 index 0000000..e69d277 --- /dev/null +++ b/python/demapping/gsm_sdcch8_demapper.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +################################################## +# GNU Radio Python Flow Graph +# Title: SDCCH/8 demapper +# Author: Piotr Krysik +# Description: Demapper for SDCCH/8 + SACCH/C8 control channels. This corresponds to channel combination vii specified in GSM 05.02, section 6.4 +# Generated: Fri May 20 12:12:04 2016 +################################################## + +from gnuradio import gr +from gnuradio.filter import firdes +import grgsm + + +class gsm_sdcch8_demapper(grgsm.hier_block): + + def __init__(self, timeslot_nr=1): + grgsm.hier_block.__init__( + self, "SDCCH/8 demapper", + gr.io_signature(0, 0, 0), + gr.io_signature(0, 0, 0), + ) + self.message_port_register_hier_in("bursts") + self.message_port_register_hier_out("bursts") + + ################################################## + # Parameters + ################################################## + self.timeslot_nr = timeslot_nr + + ################################################## + # Blocks + ################################################## + self.gsm_universal_ctrl_chans_demapper_0 = grgsm.universal_ctrl_chans_demapper(timeslot_nr, ([0,0,0,0,4,4,4,4,8,8,8,8,12,12,12,12,16,16,16,16,20,20,20,20,24,24,24,24,28,28,28,28,32,32,32,32,36,36,36,36,40,40,40,40,44,44,44,44,0,0,0]), ([0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,0,0,0]), ([0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,0,0,0,]), ([136,136,136,136,136,136,136,136,136,136,136,136,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,136,136,136,136]), ([1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,0,0,0,0,5,5,5,5,6,6,6,6,7,7,7,7,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,4,4,4,4]), ([1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,0,0,0,0,5,5,5,5,6,6,6,6,7,7,7,7,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,4,4,4,4,])) + + ################################################## + # Connections + ################################################## + self.msg_connect((self.gsm_universal_ctrl_chans_demapper_0, 'bursts'), (self, 'bursts')) + self.msg_connect((self, 'bursts'), (self.gsm_universal_ctrl_chans_demapper_0, 'bursts')) + + def get_timeslot_nr(self): + return self.timeslot_nr + + def set_timeslot_nr(self, timeslot_nr): + self.timeslot_nr = timeslot_nr |