changeset 35:3b5958f28a40

dev: efr-sid-insert helper program
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 24 Nov 2022 02:35:02 +0000
parents 69b9cbca075b
children b5726d659915
files .hgignore dev/Makefile dev/efr-sid-insert.c
diffstat 3 files changed, 59 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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$
 
--- 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
 
--- /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 <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+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);
+}