# HG changeset patch # User Mychaela Falconia # Date 1669257302 0 # Node ID 3b5958f28a40a1d58bcb2861aa67680b68ea08eb # Parent 69b9cbca075ba0fc5de7754d4c1b48b77e0ad573 dev: efr-sid-insert helper program diff -r 69b9cbca075b -r 3b5958f28a40 .hgignore --- a/.hgignore Thu Nov 24 02:02:28 2022 +0000 +++ b/.hgignore Thu Nov 24 02:35:02 2022 +0000 @@ -4,6 +4,8 @@ ^dev/efr-bit-packing$ ^dev/efr-bit-packing\.out$ +^dev/efr-sid-insert$ +^dev/efr-sid-insert\.out$ ^dev/gsm0611-silence-fr$ ^dev/gsm0611-silence-fr\.out$ diff -r 69b9cbca075b -r 3b5958f28a40 dev/Makefile --- a/dev/Makefile Thu Nov 24 02:02:28 2022 +0000 +++ b/dev/Makefile Thu Nov 24 02:35:02 2022 +0000 @@ -1,7 +1,7 @@ CC= gcc CFLAGS= -O2 -PROGS= efr-bit-packing gsm0611-silence-fr -DATAOUT=efr-bit-packing.out gsm0611-silence-fr.out +PROGS= efr-bit-packing efr-sid-insert gsm0611-silence-fr +DATAOUT=efr-bit-packing.out efr-sid-insert.out gsm0611-silence-fr.out all: ${PROGS} ${DATAOUT} @@ -11,6 +11,12 @@ efr-bit-packing.out: efr-bit-packing ./efr-bit-packing > $@ +efr-sid-insert: efr-sid-insert.c + ${CC} ${CFLAGS} -o $@ $@.c + +efr-sid-insert.out: efr-sid-insert + ./efr-sid-insert > $@ + gsm0611-silence-fr: gsm0611-silence-fr.c ${CC} ${CFLAGS} -o $@ $@.c -lgsm diff -r 69b9cbca075b -r 3b5958f28a40 dev/efr-sid-insert.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dev/efr-sid-insert.c Thu Nov 24 02:35:02 2022 +0000 @@ -0,0 +1,49 @@ +/* + * We need to implement a function that inserts the 95 bit wide SID + * codeword into the frame, and we would like to do it more efficiently + * than calling a "set bit" function for each of the 95 bits. This + * program will produce a more efficient solution. + */ + +#include +#include +#include +#include + +static const uint8_t SID_codeword_bit_idx[95] = +{ + 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 94, 95, 96, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221 +}; + +static void set_bit(uint8_t *frame, unsigned bitnum) +{ + unsigned bytenum = bitnum >> 3; + unsigned bit_in_byte = 7 - (bitnum & 7); + unsigned bitmask = 1 << bit_in_byte; + + frame[bytenum] |= bitmask; +} + +main(argc, argv) + char **argv; +{ + uint8_t bytes[31]; + unsigned n; + + memset(bytes, 0, 31); + for (n = 0; n < 95; n++) + set_bit(bytes, SID_codeword_bit_idx[n] + 4); + for (n = 0; n < 31; n++) + if (bytes[n]) + printf("\tframe[%u] |= 0x%02X;\n", n, bytes[n]); + exit(0); +}