view libgsmhr1/twts002_in.c @ 494:aaf4dec8bee0

libgsmhr1: implement perfect SID detection
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 17 Jun 2024 23:14:19 +0000
parents 45bf34451dd7
children
line wrap: on
line source

/*
 * The function implemented in this module parses a received TW-TS-002
 * RTP payload and turns it into the internal input form for the HRv1
 * decoder.
 */

#include <stdint.h>
#include <string.h>
#include "tw_gsmhr.h"

int gsmhr_decoder_twts002_in(const uint8_t *payload, int16_t *params)
{
	int ft;

	if (payload[0] & 0x80)
		return -1;
	ft = payload[0] >> 4;
	switch (ft) {
	case 0:
		gsmhr_unpack_ts101318(payload + 1, params);
		params[18] = 0;		/* BFI */
		params[20] = 0;		/* SID */
		break;
	case 1:
		memset(params, 0, sizeof(int16_t) * GSMHR_NUM_PARAMS);
		params[18] = 0;		/* BFI */
		params[20] = 1;		/* SID */
		break;
	case 2:
		gsmhr_unpack_ts101318(payload + 1, params);
		params[18] = 0;		/* BFI */
		params[20] = 2;		/* SID */
		break;
	case 6:
		gsmhr_unpack_ts101318(payload + 1, params);
		params[18] = 1;		/* BFI */
		params[20] = 0;		/* SID */
		break;
	case 7:
		memset(params, 0, sizeof(int16_t) * GSMHR_NUM_PARAMS);
		params[18] = 2;		/* BFI with no data */
		params[20] = 0;		/* SID */
		break;
	default:
		return -2;
	}
	/* UFI and TAF always get their own bits */
	params[19] = (payload[0] & 0x02) >> 1;
	params[21] = payload[0] & 0x01;
	return 0;
}