comparison trau-decode/hr-guts.c @ 74:e78c6b1ecb91

trau-decode: refactor trau-hr-dump The desire is to create a companion program that will read hex lines representing TRAU-8k frames and then decode those frames in exactly the same way how we currently decode frames read from binary capture files. Hence the decoder portion of trau-hr-dump needs to be factored out.
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 08 Feb 2025 03:00:31 +0000
parents trau-decode/trau-hr-dump.c@06f241846c67
children
comparison
equal deleted inserted replaced
73:06f241846c67 74:e78c6b1ecb91
1 /*
2 * This module contains the guts of trau-hr-dump program in terms of
3 * HRv1 frame decoding. It has been factored out to facilitate creation
4 * of trau-hr-dump-hex version.
5 */
6
7 #include <stdio.h>
8 #include <stdint.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include <strings.h>
12 #include "gsmhr_unpack.h"
13 #include "osmo_bits.h"
14
15 /*
16 * EFR TRAU parity (also used for HR)
17 *
18 * g(x) = x^3 + x^1 + 1
19 */
20 static const struct osmo_crc8gen_code gsm0860_efr_crc3 = {
21 .bits = 3,
22 .poly = 0x3,
23 .init = 0x0,
24 .remainder = 0x7,
25 };
26
27 static int
28 bit_parity(bits, nbits)
29 ubit_t *bits;
30 unsigned nbits;
31 {
32 unsigned n, sum;
33
34 sum = 0;
35 for (n = 0; n < nbits; n++)
36 sum += bits[n];
37 return sum & 1;
38 }
39
40 static void
41 bits2bytes(bits, bytes, nbytes)
42 ubit_t *bits;
43 uint8_t *bytes;
44 unsigned nbytes;
45 {
46 unsigned n, m, acc;
47
48 for (n = 0; n < nbytes; n++) {
49 acc = 0;
50 for (m = 0; m < 8; m++) {
51 acc <<= 1;
52 acc |= *bits++;
53 }
54 *bytes++ = acc;
55 }
56 }
57
58 void
59 print_gsmhr_frame(frame)
60 ubit_t *frame;
61 {
62 ubit_t xc_bits[6], dbits[112];
63 uint8_t hr_bytes[14];
64 int16_t params[18];
65 int crc_stat;
66
67 printf(" C1-C4: %u%u%u%u OP %s\n", frame[9], frame[10], frame[11],
68 frame[12], bit_parity(frame + 9, 5) ? "good" : "bad");
69 bcopy(frame + 14, xc_bits, 2);
70 bcopy(frame + 18, xc_bits + 2, 4);
71 printf(" XC1-XC5: %u%u%u%u%u OP %s\n", xc_bits[0], xc_bits[1],
72 xc_bits[2], xc_bits[3], xc_bits[4],
73 bit_parity(xc_bits, 6) ? "good" : "bad");
74 bcopy(frame + 22, dbits, 2);
75 bcopy(frame + 25, dbits + 2, 7);
76 bcopy(frame + 33, dbits + 9, 7);
77 bcopy(frame + 41, dbits + 16, 7);
78 bcopy(frame + 49, dbits + 23, 7);
79 bcopy(frame + 57, dbits + 30, 7);
80 bcopy(frame + 65, dbits + 37, 7);
81 bcopy(frame + 76, dbits + 44, 4);
82 bcopy(frame + 81, dbits + 48, 7);
83 bcopy(frame + 89, dbits + 55, 7);
84 bcopy(frame + 97, dbits + 62, 7);
85 bcopy(frame + 105, dbits + 69, 7);
86 bcopy(frame + 113, dbits + 76, 7);
87 bcopy(frame + 121, dbits + 83, 7);
88 bcopy(frame + 129, dbits + 90, 7);
89 bcopy(frame + 137, dbits + 97, 7);
90 bcopy(frame + 145, dbits + 104, 7);
91 dbits[111] = frame[153];
92 crc_stat = osmo_crc8gen_check_bits(&gsm0860_efr_crc3, dbits, 44,
93 frame + 73);
94 printf(" CRC %s\n", crc_stat ? "bad" : "good");
95 bits2bytes(dbits, hr_bytes, 14);
96 gsmhr_unpack_ts101318(hr_bytes, params);
97 printf(" R0=%02x LPC=%03x,%03x,%02x Int=%x Mode=%x\n", params[0],
98 params[1], params[2], params[3], params[4], params[5]);
99 printf(params[5] ? " s1=%02x,%03x,%02x" : " s1=%02x,%02x,%02x",
100 params[6], params[7], params[8]);
101 printf(params[5] ? " s2=%x,%03x,%02x" : " s2=%02x,%02x,%02x",
102 params[9], params[10], params[11]);
103 printf(params[5] ? " s3=%x,%03x,%02x" : " s3=%02x,%02x,%02x",
104 params[12], params[13], params[14]);
105 printf(params[5] ? " s4=%x,%03x,%02x\n" : " s4=%02x,%02x,%02x\n",
106 params[15], params[16], params[17]);
107 printf(" C6-C9: %u%u%u%u\n", frame[154], frame[155], frame[156],
108 frame[157]);
109 printf(" T1=%u T2=%u\n", frame[158], frame[159]);
110 }