FreeCalypso > hg > ice1-trau-tester
view ater/activate.c @ 37:26c9535df39e
rm abis subdir: moved to e1-fake-trau repository
The present code repository is meant to contain code for talking
to a TRAU DUT, hence the name ice1-trau-tester. The different and
separate function of talking to an E1 BTS (Abis instead of Ater,
and in the opposite role) was never in scope for this project, but
that code got added here in a haste when the InSite BTS arrived
while the TRAU bring-up was still blocked. Now that we have our
Nokia TCSM2 system working and are doing TRAU experiments, let's
keep the code clean.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 29 Aug 2024 19:02:02 +0000 |
parents | 237687e2be6c |
children | 16715bd149e0 |
line wrap: on
line source
/* * Here we implement the operation of activating a new TRAU channel * on a sub-timeslot. */ #include <stdint.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.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 "read_file.h" #include "out_frame.h" void cmd_activate(int argc, char **argv) { int nr, rc; bool is_efr, dtxd; struct ater_subslot *at; uint8_t *init_frame; unsigned init_frame_count; if (argc < 4 || argc > 5) { usage: fprintf(stderr, "usage: %s 0|1|2|3 fr|efr initial-frame.tul [dtxd]\n", argv[0]); return; } if (argv[1][0] < '0' || argv[1][0] > '3' || argv[1][1]) goto usage; nr = argv[1][0] - '0'; if (!strcmp(argv[2], "fr")) is_efr = false; else if (!strcmp(argv[2], "efr")) is_efr = true; else goto usage; if (argv[4]) { if (strcmp(argv[4], "dtxd")) goto usage; dtxd = true; } else dtxd = false; at = &subslots[nr]; if (at->is_active) { fprintf(stderr, "error: subslot %d is already active\n", nr); return; } rc = read_binary_file(argv[3], is_efr, &init_frame, &init_frame_count); if (rc < 0) return; /* error msg already printed */ if (init_frame_count != 1) { free(init_frame); fprintf(stderr, "error: %s contains more than one frame\n", argv[3]); return; } /* good to proceed now */ at->is_active = true; at->is_efr = is_efr; init_trau_ul_frame(nr); at->ul_frame.c_bits[16] = dtxd; trau_frame_from_record(init_frame, is_efr, &at->ul_frame); free(init_frame); } void cmd_deact(int argc, char **argv) { int nr; struct ater_subslot *at; if (argc != 2) { usage: fprintf(stderr, "usage: %s 0|1|2|3\n", argv[0]); return; } if (argv[1][0] < '0' || argv[1][0] > '3' || argv[1][1]) goto usage; nr = argv[1][0] - '0'; at = &subslots[nr]; if (!at->is_active) { fprintf(stderr, "error: subslot %d is not active\n", nr); return; } at->is_active = false; if (at->play_buffer) { free(at->play_buffer); at->play_buffer = NULL; } }