blob: cc0526740f79824cd1b27d5c7ab6830d10eb505c [file] [log] [blame]
Vasil Velichkovff88ba42019-07-20 23:33:08 +03001#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3# @file
4# @author (C) 2019 by Vasil Velichkov <vvvelichkov@gmail.com>
5# @section LICENSE
6#
7# Gr-gsm is free software; you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation; either version 3, or (at your option)
10# any later version.
11#
12# Gr-gsm is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with gr-gsm; see the file COPYING. If not, write to
19# the Free Software Foundation, Inc., 51 Franklin Street,
20# Boston, MA 02110-1301, USA.
21#
22#
23
24import unittest
25import numpy as np
26from gnuradio import gr, gr_unittest, blocks
27import grgsm
28import pmt
29import qa_gsm_demapper_data as test_data
30
31class qa_gsm_sdcch8_demapper (gr_unittest.TestCase):
32
33 def setUp (self):
34 self.tb = gr.top_block ()
35 self.maxDiff = None
36
37 def tearDown (self):
38 self.tb = None
39
Vasil Velichkovff88ba42019-07-20 23:33:08 +030040 def test_downlink (self):
41 """
42 SDCCH8 demapper downlink test
43 """
44 src = grgsm.burst_source(test_data.frames, test_data.timeslots, test_data.bursts)
45 src.set_arfcn(0); # downlink
46 demapper = grgsm.gsm_sdcch8_demapper(timeslot_nr=0)
47 dst = grgsm.burst_sink()
48
49 self.tb.msg_connect(src, "out", demapper, "bursts")
50 self.tb.msg_connect(demapper, "bursts", dst, "in")
51 self.tb.run ()
52
53 b = test_data.bursts
54 self.assertEqual([
55 b[ 0], b[ 1], b[ 2], b[ 3], #SDCCH 0
56 b[ 4], b[ 5], b[ 6], b[ 7], #SDCCH 1
57 b[ 8], b[ 9], b[ 10], b[ 11], #SDCCH 2
58 b[ 12], b[ 13], b[ 14], b[ 15], #SDCCH 3
59 b[ 16], b[ 17], b[ 18], b[ 19], #SDCCH 4
60 b[ 20], b[ 21], b[ 22], b[ 23], #SDCCH 5
61 b[ 24], b[ 25], b[ 26], b[ 27], #SDCCH 6
62 b[ 28], b[ 29], b[ 30], b[ 31], #SDCCH 7
63 b[ 32], b[ 33], b[ 34], b[ 35], #SACCH 0
64 b[ 36], b[ 37], b[ 38], b[ 39], #SACCH 1
65 b[ 40], b[ 41], b[ 42], b[ 43], #SACCH 2
66 b[ 44], b[ 45], b[ 46], b[ 47], #SACCH 3 #skip 48-50
67 b[ 51], b[ 52], b[ 53], b[ 54], #SDCCH 0
68 b[ 55], b[ 56], b[ 57], b[ 58], #SDCCH 1
69 b[ 59], b[ 60], b[ 61], b[ 62], #SDCCH 2
70 b[ 63], b[ 64], b[ 65], b[ 66], #SDCCH 3
71 b[ 67], b[ 68], b[ 69], b[ 70], #SDCCH 4
72 b[ 71], b[ 72], b[ 73], b[ 74], #SDCCH 5
73 b[ 75], b[ 76], b[ 77], b[ 78], #SDCCH 6
74 b[ 79], b[ 80], b[ 81], b[ 82], #SDCCH 7
75 b[ 83], b[ 84], b[ 85], b[ 86], #SACCH 4
76 b[ 87], b[ 88], b[ 89], b[ 90], #SACCH 5
77 b[ 91], b[ 92], b[ 93], b[ 94], #SACCH 6
78 b[ 95], b[ 96], b[ 97], b[ 98], #SACCH 7 #skip 99-101
79 b[102], b[103], b[104], b[105], #SDCCH
80 ], list(dst.get_burst_data()))
81
82 self.assertEqual([
83 8, 8, 8, 8,
84 8, 8, 8, 8,
85 8, 8, 8, 8,
86 8, 8, 8, 8,
87 8, 8, 8, 8,
88 8, 8, 8, 8,
89 8, 8, 8, 8,
90 8, 8, 8, 8,
91 136, 136, 136, 136,
92 136, 136, 136, 136,
93 136, 136, 136, 136,
94 136, 136, 136, 136,
95 8, 8, 8, 8,
96 8, 8, 8, 8,
97 8, 8, 8, 8,
98 8, 8, 8, 8,
99 8, 8, 8, 8,
100 8, 8, 8, 8,
101 8, 8, 8, 8,
102 8, 8, 8, 8,
103 136, 136, 136, 136,
104 136, 136, 136, 136,
105 136, 136, 136, 136,
106 136, 136, 136, 136,
107 8, 8, 8, 8,
108 ], list(dst.get_sub_types()))
109
110 self.assertEqual([
111 0, 0, 0, 0,
112 1, 1, 1, 1,
113 2, 2, 2, 2,
114 3, 3, 3, 3,
115 4, 4, 4, 4,
116 5, 5, 5, 5,
117 6, 6, 6, 6,
118 7, 7, 7, 7,
119 0, 0, 0, 0, #SACCH 0
120 1, 1, 1, 1, #SACCH 1
121 2, 2, 2, 2, #SACCH 2
122 3, 3, 3, 3, #SACCH 3
123 0, 0, 0, 0,
124 1, 1, 1, 1,
125 2, 2, 2, 2,
126 3, 3, 3, 3,
127 4, 4, 4, 4,
128 5, 5, 5, 5,
129 6, 6, 6, 6,
130 7, 7, 7, 7,
131 4, 4, 4, 4, #SACCH 4
132 5, 5, 5, 5, #SACCH 5
133 6, 6, 6, 6, #SACCH 6
134 7, 7, 7, 7, #SACCH 7
135 0, 0, 0, 0,
136 ], list(dst.get_sub_slots()))
137
Vasil Velichkovff88ba42019-07-20 23:33:08 +0300138 def test_uplink (self):
139 """
140 BCCH_CCCH_SDCCH4 demapper uplink test
141 """
142 src = grgsm.burst_source(test_data.frames, test_data.timeslots, test_data.bursts)
143 src.set_arfcn(0x2240); #uplink flag is 40
144 demapper = grgsm.gsm_sdcch8_demapper(timeslot_nr=0)
145 dst = grgsm.burst_sink()
146
147 self.tb.msg_connect(src, "out", demapper, "bursts")
148 self.tb.msg_connect(demapper, "bursts", dst, "in")
149 self.tb.run ()
150
151 b = test_data.bursts
152 self.assertEqual([
153 b[ 0], b[ 1], b[ 2], b[ 3], #SACCH 5
154 b[ 4], b[ 5], b[ 6], b[ 7], #SACCH 6
155 b[ 8], b[ 9], b[ 10], b[ 11], #SACCH 7 #skip 12-14
156 b[ 15], b[ 16], b[ 17], b[ 18], #SDCCH 0
157 b[ 19], b[ 20], b[ 21], b[ 22], #SDCCH 1
158 b[ 23], b[ 24], b[ 25], b[ 26], #SDCCH 2
159 b[ 27], b[ 28], b[ 29], b[ 30], #SDCCH 3
160 b[ 31], b[ 32], b[ 33], b[ 34], #SDCCH 4
161 b[ 35], b[ 36], b[ 37], b[ 38], #SDCCH 5
162 b[ 39], b[ 40], b[ 41], b[ 42], #SDCCH 6
163 b[ 43], b[ 44], b[ 45], b[ 46], #SDCCH 7
164 b[ 47], b[ 48], b[ 49], b[ 50], #SACCH 0
165 b[ 51], b[ 52], b[ 53], b[ 54], #SACCH 1
166 b[ 55], b[ 56], b[ 57], b[ 58], #SACCH 2
167 b[ 59], b[ 60], b[ 61], b[ 62], #SACCH 3 #skip 63-65
168 b[ 66], b[ 67], b[ 68], b[ 69], #SDCCH 0
169 b[ 70], b[ 71], b[ 72], b[ 73], #SDCCH 1
170 b[ 74], b[ 75], b[ 76], b[ 77], #SDCCH 2
171 b[ 78], b[ 79], b[ 80], b[ 81], #SDCCH 3
172 b[ 82], b[ 83], b[ 84], b[ 85], #SDCCH 4
173 b[ 86], b[ 87], b[ 88], b[ 89], #SDCCH 5
174 b[ 90], b[ 91], b[ 92], b[ 93], #SDCCH 6
175 b[ 94], b[ 95], b[ 96], b[ 97], #SDCCH 7
176 b[ 98], b[ 99], b[100], b[101], #SACCH 4
177 b[102], b[103], b[104], b[105], #SACCH 5
178 ], list(dst.get_burst_data()))
179
180 self.assertEqual([
181 136, 136, 136, 136,
182 136, 136, 136, 136,
183 136, 136, 136, 136,
184 8, 8, 8, 8,
185 8, 8, 8, 8,
186 8, 8, 8, 8,
187 8, 8, 8, 8,
188 8, 8, 8, 8,
189 8, 8, 8, 8,
190 8, 8, 8, 8,
191 8, 8, 8, 8,
192 136, 136, 136, 136,
193 136, 136, 136, 136,
194 136, 136, 136, 136,
195 136, 136, 136, 136,
196 8, 8, 8, 8,
197 8, 8, 8, 8,
198 8, 8, 8, 8,
199 8, 8, 8, 8,
200 8, 8, 8, 8,
201 8, 8, 8, 8,
202 8, 8, 8, 8,
203 8, 8, 8, 8,
204 136, 136, 136, 136,
205 136, 136, 136, 136,
206 ], list(dst.get_sub_types()))
207
208 self.assertEqual([
209 5, 5, 5, 5, #SACCH 5
210 6, 6, 6, 6, #SACCH 6
211 7, 7, 7, 7, #SACCH 7
212 0, 0, 0, 0,
213 1, 1, 1, 1,
214 2, 2, 2, 2,
215 3, 3, 3, 3,
216 4, 4, 4, 4,
217 5, 5, 5, 5,
218 6, 6, 6, 6,
219 7, 7, 7, 7,
220 0, 0, 0, 0, #SACCH 0
221 1, 1, 1, 1, #SACCH 1
222 2, 2, 2, 2, #SACCH 2
223 3, 3, 3, 3, #SACCH 3
224 0, 0, 0, 0,
225 1, 1, 1, 1,
226 2, 2, 2, 2,
227 3, 3, 3, 3,
228 4, 4, 4, 4,
229 5, 5, 5, 5,
230 6, 6, 6, 6,
231 7, 7, 7, 7,
232 4, 4, 4, 4, #SACCH 4
233 5, 5, 5, 5,
234 ], list(dst.get_sub_slots()))
235
236if __name__ == '__main__':
237 gr_unittest.run(qa_gsm_sdcch8_demapper, "qa_gsm_sdcch8_demapper.xml")