FreeCalypso > hg > gsm-net-reveng
comparison trau-decode/parse-main.c @ 46:f977027774cb
trau-parse: add support for D144 decoding
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 24 Sep 2024 17:02:59 +0000 |
parents | 59d1d15b6f7e |
children | 7119884f6afe |
comparison
equal
deleted
inserted
replaced
45:59d1d15b6f7e | 46:f977027774cb |
---|---|
17 HUNT_FOR_0, | 17 HUNT_FOR_0, |
18 HUNT_FOUND_0, | 18 HUNT_FOUND_0, |
19 GOT_8_ZEROS, | 19 GOT_8_ZEROS, |
20 SYNCED | 20 SYNCED |
21 } state; | 21 } state; |
22 static enum { | |
23 NOT_D144, | |
24 D144_SYNC, | |
25 D144_EDATA, | |
26 } d144_state; | |
22 static unsigned hunt_for_0_count, frame_pos_count; | 27 static unsigned hunt_for_0_count, frame_pos_count; |
23 static uint8_t in_frame_2bit[160], frame_bits[320], d_bits[260]; | 28 static uint8_t in_frame_2bit[160], frame_bits[320], d_bits[260]; |
24 | 29 |
25 static void | 30 static void |
26 unpack_dibits() | 31 unpack_dibits() |
163 fputs(" (HR data DL)", stdout); | 168 fputs(" (HR data DL)", stdout); |
164 break; | 169 break; |
165 case 0x14: | 170 case 0x14: |
166 fputs(" (D144 sync)", stdout); | 171 fputs(" (D144 sync)", stdout); |
167 break; | 172 break; |
173 case 0x1F: | |
174 fputs(" (E-TRAU)", stdout); | |
175 break; | |
168 } | 176 } |
169 putchar('\n'); | 177 putchar('\n'); |
170 c6_11 = bits_to_num(frame_bits + 22, 6); | 178 if (c1_5 == 0x14) |
171 printf(" C6-C11: %u\n", c6_11); | 179 d144_state = D144_SYNC; |
172 printf(" C12=%u C13=%u C14=%u C15=%u\n", frame_bits[28], | 180 else if (c1_5 == 0x1F && |
173 frame_bits[29], frame_bits[30], frame_bits[31]); | 181 (d144_state == D144_SYNC || d144_state == D144_EDATA)) |
182 d144_state = D144_EDATA; | |
183 else | |
184 d144_state = NOT_D144; | |
174 switch (c1_5) { | 185 switch (c1_5) { |
175 case 0x02: | 186 case 0x02: |
176 case 0x1C: | 187 case 0x1C: |
188 case 0x1A: | |
189 c6_11 = bits_to_num(frame_bits + 22, 6); | |
190 printf(" C6-C11: %u\n", c6_11); | |
191 printf(" C12=%u C13=%u C14=%u C15=%u\n", frame_bits[28], | |
192 frame_bits[29], frame_bits[30], frame_bits[31]); | |
177 collect_d_bits(); | 193 collect_d_bits(); |
178 print_fr_frame(d_bits); | |
179 break; | |
180 case 0x1A: | |
181 collect_d_bits(); | |
182 check_efr_crc(d_bits); | |
183 print_efr_frame(d_bits); | |
184 break; | 194 break; |
185 case 0x08: | 195 case 0x08: |
186 case 0x09: | 196 case 0x09: |
187 case 0x16: | 197 case 0x16: |
188 case 0x17: | 198 case 0x17: |
189 case 0x14: | 199 case 0x14: |
200 printf(" C6-C15: %u%u%u%u%u%u%u%u%u%u\n", frame_bits[22], | |
201 frame_bits[23], frame_bits[24], frame_bits[25], | |
202 frame_bits[26], frame_bits[27], frame_bits[28], | |
203 frame_bits[29], frame_bits[30], frame_bits[31]); | |
190 print_data_frame(); | 204 print_data_frame(); |
191 return; | 205 return; |
206 case 0x1F: | |
207 printf(" C6-C13: %u%u%u%u%u%u%u%u\n", frame_bits[22], | |
208 frame_bits[23], frame_bits[24], frame_bits[25], | |
209 frame_bits[26], frame_bits[27], frame_bits[28], | |
210 frame_bits[29]); | |
211 printf(" M1=%u M2=%u\n", frame_bits[30], frame_bits[31]); | |
212 return; | |
213 default: | |
214 printf(" C6-C15: %u%u%u%u%u%u%u%u%u%u\n", frame_bits[22], | |
215 frame_bits[23], frame_bits[24], frame_bits[25], | |
216 frame_bits[26], frame_bits[27], frame_bits[28], | |
217 frame_bits[29], frame_bits[30], frame_bits[31]); | |
218 } | |
219 switch (c1_5) { | |
220 case 0x02: | |
221 case 0x1C: | |
222 print_fr_frame(d_bits); | |
223 break; | |
224 case 0x1A: | |
225 check_efr_crc(d_bits); | |
226 print_efr_frame(d_bits); | |
227 break; | |
192 } | 228 } |
193 printf(" C16=%u C17=%u C18=%u C19=%u C20=%u C21=%u\n", | 229 printf(" C16=%u C17=%u C18=%u C19=%u C20=%u C21=%u\n", |
194 frame_bits[310], frame_bits[311], frame_bits[312], | 230 frame_bits[310], frame_bits[311], frame_bits[312], |
195 frame_bits[313], frame_bits[314], frame_bits[315]); | 231 frame_bits[313], frame_bits[314], frame_bits[315]); |
196 printf(" T1=%u T2=%u T3=%u T4=%u\n", frame_bits[316], frame_bits[317], | 232 printf(" T1=%u T2=%u T3=%u T4=%u\n", frame_bits[316], frame_bits[317], |
222 } | 258 } |
223 | 259 |
224 static void | 260 static void |
225 check_sync() | 261 check_sync() |
226 { | 262 { |
227 if (check_sync_zeros() && check_sync_ones()) | 263 int sync_res; |
264 | |
265 if (d144_state == D144_EDATA) | |
266 sync_res = check_sync_zeros() && frame_bits[16]; | |
267 else | |
268 sync_res = check_sync_zeros() && check_sync_ones(); | |
269 if (sync_res) | |
228 return; | 270 return; |
229 printf("Bad frame sync, returning to hunt state\n"); | 271 printf("Bad frame sync, returning to hunt state\n"); |
230 state = HUNT_FOR_0; | 272 state = HUNT_FOR_0; |
231 } | 273 } |
232 | 274 |
313 fprintf(stderr, "error: invalid subslot argument\n"); | 355 fprintf(stderr, "error: invalid subslot argument\n"); |
314 exit(1); | 356 exit(1); |
315 } | 357 } |
316 right_shift = (3 - subslot) * 2; | 358 right_shift = (3 - subslot) * 2; |
317 state = HUNT_FOR_0; | 359 state = HUNT_FOR_0; |
360 d144_state = NOT_D144; | |
318 for (file_offset = 0; ; file_offset++) { | 361 for (file_offset = 0; ; file_offset++) { |
319 inb = getc(inf); | 362 inb = getc(inf); |
320 if (inb < 0) | 363 if (inb < 0) |
321 break; | 364 break; |
322 inb >>= right_shift; | 365 inb >>= right_shift; |