view ater/tx_func.c @ 19:1e375472d5a5

ater: implement TRAU frame output
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 24 Jun 2024 08:07:45 +0000
parents 61862af2247f
children 0d70444b5070
line wrap: on
line source

/*
 * 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/msgb.h>
#include <osmocom/core/select.h>
#include <osmocom/isdn/i460_mux.h>

#include "globals.h"
#include "submux.h"

void init_trau_ul_frame(int nr)
{
	struct ater_subslot *at = &subslots[nr];
	struct osmo_trau_frame *fr = &at->ul_frame;

	fr->type = at->is_efr ? OSMO_TRAU16_FT_EFR : OSMO_TRAU16_FT_FR;
	fr->dir = OSMO_TRAU_DIR_UL;
	memset(fr->c_bits + 5, 0, 6);
	memset(fr->c_bits + 15, 1, 6);
	memset(fr->t_bits, 1, 4);
}

static void tx_service_subslot(int nr)
{
	struct ater_subslot *at = &subslots[nr];
	struct osmo_trau_frame *fr = &at->ul_frame;
	struct msgb *msg;
	int len;

	if (!at->is_active)
		return;
	at->mfrm_count++;
	if (at->mfrm_count >= 24) {
		at->mfrm_count = 0;
		fr->c_bits[14] = 1;
	} else {
		fr->c_bits[14] = 0;
	}
	msg = msgb_alloc_c(g_ctx, 640, "TRAU-UL-frame");
	if (!msg)
		return;
	len = osmo_trau_frame_encode(msg->tail, msgb_tailroom(msg), fr);
	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);
}