comparison libtest/parse_dlcap.c @ 139:be57e06bed84

factor out common part of gsmfr-cvt-dlcap, in prep for EFR
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 13 Dec 2022 07:03:55 +0000
parents frtest/cvt-dlcap.c@b7ea278390eb
children
comparison
equal deleted inserted replaced
138:68215020852b 139:be57e06bed84
1 /*
2 * All TCH/F downlink capture files produced by fc-shell tch record
3 * (both FR and EFR, both old and new formats) include the same
4 * 81-character block in each line: 3 DSP status words followed by
5 * 33 bytes of frame data. Here we are factoring out the function
6 * for parsing this common part.
7 */
8
9 #include <ctype.h>
10 #include <stdint.h>
11
12 static
13 decode_hex_digit(ch)
14 {
15 if (isdigit(ch))
16 return(ch - '0');
17 else if (isupper(ch))
18 return(ch - 'A' + 10);
19 else
20 return(ch - 'a' + 10);
21 }
22
23 parse_dlcap_common(line, status_words, tidsp_bytes)
24 char *line;
25 uint16_t *status_words;
26 uint8_t *tidsp_bytes;
27 {
28 char *cp;
29 int i;
30
31 /* grok DSP status words */
32 cp = line;
33 for (i = 0; i < 3; i++) {
34 if (!isxdigit(cp[0]) || !isxdigit(cp[1]) ||
35 !isxdigit(cp[2]) || !isxdigit(cp[3]))
36 return -1;
37 status_words[i] = (decode_hex_digit(cp[0]) << 12) |
38 (decode_hex_digit(cp[1]) << 8) |
39 (decode_hex_digit(cp[2]) << 4) |
40 decode_hex_digit(cp[3]);
41 cp += 4;
42 if (*cp++ != ' ')
43 return -1;
44 }
45 /* read the frame bits */
46 for (i = 0; i < 33; i++) {
47 if (!isxdigit(cp[0]) || !isxdigit(cp[1]))
48 return -1;
49 tidsp_bytes[i] = (decode_hex_digit(cp[0]) << 4) |
50 decode_hex_digit(cp[1]);
51 cp += 2;
52 }
53 return 0;
54 }