view test-fsk/modem_rx.c @ 10:3c5734b88c20

sipout-test-v22 put together
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 07 Mar 2024 02:33:49 -0800
parents 6d832abad660
children
line wrap: on
line source

/*
 * In this module we implement modem Rx handling, revolving around
 * FSK demodulation via SpanDSP.
 */

#include <sys/types.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <spandsp.h>
#include "../include/pstn_defs.h"

extern int fsk_mode_rx;

#define	MAX_TEXT_LINE	80

static fsk_rx_state_t *fsk_rx_state;
static u_char rx_line_buf[MAX_TEXT_LINE];
static unsigned rx_buf_fill;

static void
safe_print_char(c)
{
	if (c >= ' ' && c <= '~') {
		putchar(c);
		return;
	}
	switch (c) {
	case '\t':
		putchar(c);
		return;
	case '\n':
		return;
	case '\r':
		putchar('\\');
		putchar('r');
		return;
	case '\b':
		putchar('\\');
		putchar('b');
		return;
	case '\f':
		putchar('\\');
		putchar('f');
		return;
	}
	printf("\\x%02X", c);
}

static void
print_rx_line()
{
	u_char *dp, *endp;
	int c;

	fputs("MRx:\t", stdout);
	dp = rx_line_buf;
	endp = rx_line_buf + rx_buf_fill;
	while (dp < endp) {
		c = *dp++;
		safe_print_char(c);
	}
	if (c != '\n')
		putchar('\\');
	putchar('\n');
}

static void
byte_rx_func(user_data, byte)
	void *user_data;
	int byte;
{
	if (byte < 0) {
		printf("Modem state change: %s\n", signal_status_to_str(byte));
		return;
	}
	rx_line_buf[rx_buf_fill++] = byte;
	if (byte == '\n' || rx_buf_fill >= MAX_TEXT_LINE) {
		print_rx_line();
		rx_buf_fill = 0;
	}
}

void
init_modem_rx()
{
	fsk_rx_state = fsk_rx_init(NULL, &preset_fsk_specs[fsk_mode_rx],
				   FSK_FRAME_MODE_FRAMED, byte_rx_func, NULL);
	if (!fsk_rx_state) {
		fprintf(stderr, "error: fsk_rx_init() failed!\n");
		exit(1);
	}
}

void
process_rx_frame(samples)
	int16_t *samples;
{
	fsk_rx(fsk_rx_state, samples, FRAME_20MS);
}