diff ater8/tx_func.c @ 42:ff94d7fc5891

new program itt-ater-8
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 30 Aug 2024 19:02:42 +0000
parents ater/tx_func.c@2742dbea95f1
children 3cc26391d24d
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ater8/tx_func.c	Fri Aug 30 19:02:42 2024 +0000
@@ -0,0 +1,112 @@
+/*
+ * Here we are going to implement Tx on Ater toward the TRAU.
+ */
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <osmocom/core/bits.h>
+#include <osmocom/core/msgb.h>
+#include <osmocom/core/select.h>
+#include <osmocom/isdn/i460_mux.h>
+#include <osmocom/trau/trau_frame.h>
+
+#include "globals.h"
+#include "submux.h"
+#include "out_frame.h"
+
+void init_trau_ul_frame(int nr)
+{
+	struct ater_subslot *at = &subslots[nr];
+	struct osmo_trau_frame *fr = &at->ul_frame;
+
+	fr->type = OSMO_TRAU8_SPEECH;
+	fr->dir = OSMO_TRAU_DIR_UL;
+	memset(fr->c_bits + 5, 1, 3);
+	fr->xc_bits[0] = 0;
+	memset(fr->t_bits, 1, 2);
+}
+
+static void handle_play(struct ater_subslot *at)
+{
+	if (at->play_wait_align) {
+		if (at->mfrm_count)
+			return;
+		at->play_wait_align = false;
+	}
+	trau_frame_from_record(at->play_buffer + at->play_buf_ptr * 22,
+				&at->ul_frame, &at->frame_has_taf);
+	at->play_buf_ptr++;
+	if (at->play_buf_ptr < at->play_buf_total)
+		return;
+	free(at->play_buffer);
+	at->play_buffer = NULL;
+	printf("file play finished\n");
+}
+
+/* compute the odd parity bit of the given input bit sequence */
+static ubit_t compute_odd_parity(const ubit_t *in, unsigned int num_bits)
+{
+	int i;
+	unsigned int sum = 0;
+
+	for (i = 0; i < num_bits; i++) {
+		if (in[i])
+			sum++;
+	}
+
+	if (sum & 1)
+		return 0;
+	else
+		return 1;
+}
+
+static void tx_service_subslot(int nr)
+{
+	struct ater_subslot *at = &subslots[nr];
+	struct osmo_trau_frame *fr = &at->ul_frame;
+	ubit_t taf;
+	struct msgb *msg;
+	int len;
+
+	if (!at->is_active)
+		return;
+	if (at->play_buffer)
+		handle_play(at);
+	at->mfrm_count++;
+	if (at->mfrm_count >= 12) {
+		at->mfrm_count = 0;
+		taf = 1;
+	} else {
+		taf = 0;
+	}
+	if (at->frame_has_taf)
+		fr->xc_bits[3] = taf;
+	fr->xc_bits[5] = compute_odd_parity(fr->xc_bits, 5);
+
+	msg = msgb_alloc_c(g_ctx, 320, "TRAU-UL-frame");
+	if (!msg)
+		return;
+	len = osmo_trau_frame_encode(msg->tail, msgb_tailroom(msg), fr);
+	if (len <= 0) {
+		msgb_free(msg);
+		return;
+	}
+	msgb_put(msg, len);
+	osmo_i460_mux_enqueue(at->schan, msg);
+}
+
+void transmit_e1_ts(void)
+{
+	uint8_t buf[160];
+	int nr;
+
+	for (nr = 0; nr < ATER_SUBSLOTS; nr++)
+		tx_service_subslot(nr);
+	osmo_i460_mux_out(&i460_ts, buf, 160);
+	write(ts_fd, buf, 160);
+}