view librftab/rftablewr.c @ 877:2fe0f7fe1f86

ringtools/fc-meltest-e1: parallel to fc-meltest-pwt
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 30 Mar 2022 20:30:32 +0000
parents 059649902c7f
children
line wrap: on
line source

/*
 * Here we implement the writing of RF tables into ASCII text files
 * in our defined format.  This module will also be linked by the
 * standalone fc-cal2text utility, hence our code here needs to be
 * independent of rvinterf and fc-tmsh specifics.
 */

#include <sys/types.h>
#include <stdio.h>
#include <stdint.h>
#include <endian.h>

static unsigned
get_u32(bin)
	u_char *bin;
{
	return le32toh(*(uint32_t *)bin);
}

static unsigned
get_u16(bin)
	u_char *bin;
{
	return le16toh(*(uint16_t *)bin);
}

static int
get_s16(bin)
	u_char *bin;
{
	int i;

	i = le16toh(*(uint16_t *)bin);
	if (i >= 32768)
		i -= 65536;
	return(i);
}

void
write_adccal_table(bin, outf)
	u_char *bin;
	FILE *outf;
{
	fputs("rf_table adc-cal\n\n", outf);
	fprintf(outf, "%5u %6d\t# Vbat\n", get_u16(bin), get_s16(bin + 18));
	fprintf(outf, "%5u %6d\t# Vchg\n", get_u16(bin + 2), get_s16(bin + 20));
	fprintf(outf, "%5u %6d\t# Ichg\n", get_u16(bin + 4), get_s16(bin + 22));
	fprintf(outf, "%5u %6d\t# Vbackup\n", get_u16(bin + 6),
		get_s16(bin + 24));
	fprintf(outf, "%5u %6d\t# ADIN1\n", get_u16(bin + 8),
		get_s16(bin + 26));
	fprintf(outf, "%5u %6d\t# ADIN2\n", get_u16(bin + 10),
		get_s16(bin + 28));
	fprintf(outf, "%5u %6d\t# ADIN3\n", get_u16(bin + 12),
		get_s16(bin + 30));
	fprintf(outf, "%5u %6d\t# RF Temp\n", get_u16(bin + 14),
		get_s16(bin + 32));
	fprintf(outf, "%5u %6d\t# ADIN5\n", get_u16(bin + 16),
		get_s16(bin + 34));
}

void
write_afcparams_table(bin, outf)
	u_char *bin;
	FILE *outf;
{
	fputs("rf_table afcparams\n\n", outf);
	/* 32-bit parameters */
	fprintf(outf, "%10u\t# psi_sta_inv\n", get_u32(bin));
	fprintf(outf, "%10u\t# psi_st\n", get_u32(bin + 4));
	fprintf(outf, "%10u\t# psi_st_32\n", get_u32(bin + 8));
	fprintf(outf, "%10u\t# psi_st_inv\n\n", get_u32(bin + 12));
	/* 16-bit parameters */
	fprintf(outf, "%10d\t# dac_center\n", get_s16(bin + 16));
	fprintf(outf, "%10d\t# dac_min\n", get_s16(bin + 18));
	fprintf(outf, "%10d\t# dac_max\n", get_s16(bin + 20));
	fprintf(outf, "%10d\t# snr_thr\n", get_s16(bin + 22));
}

void
write_agcwords_table(bin, outf)
	u_char *bin;
	FILE *outf;
{
	int i, j;
	u_char *p = bin;

	fputs("rf_table agc-table\n\n", outf);
	for (i = 0; i < 4; i++) {
		for (j = 0; j < 5; j++) {
			if (j)
				putc(' ', outf);
			fprintf(outf, "0x%04X", get_u16(p));
			p += 2;
		}
		putc('\n', outf);
	}
}

void
write_agcglobals_table(bin, outf)
	u_char *bin;
	FILE *outf;
{
	fputs("rf_table agc-global-params\n\n", outf);
	fprintf(outf, "%5u\t# low_agc_noise_thr\n", get_u16(bin));
	fprintf(outf, "%5u\t# high_agc_sat_thr\n", get_u16(bin + 2));
	fprintf(outf, "%5u\t# low_agc\n", get_u16(bin + 4));
	fprintf(outf, "%5u\t# high_agc\n", get_u16(bin + 6));
}

void
write_il2agc_table(bin, outf)
	u_char *bin;
	FILE *outf;
{
	int idx;

	fputs("rf_table il2agc\n\n", outf);
	for (idx = 0; idx < 121; idx++)
		fprintf(outf, "%3u\t# IL=%d\n", bin[idx], -idx);
}

void
write_tx_levels_table(bin, outf)
	u_char *bin;
	FILE *outf;
{
	int i;
	u_char *p = bin;

	fputs("rf_table tx-levels\n\n", outf);
	fputs("# Fields in each entry: apc, ramp_index, chan_cal_index\n\n",
		outf);
	for (i = 0; i < 32; i++) {
		fprintf(outf, "%5u %3u %3u\t# entry %d\n",
			get_u16(p), p[2], p[3], i);
		p += 4;
	}
}

void
write_tx_calchan_table(bin, outf)
	u_char *bin;
	FILE *outf;
{
	int i, j;
	u_char *p = bin;

	fputs("rf_table tx-calchan\n", outf);
	for (i = 0; i < 4; i++) {
		fprintf(outf, "\n# Channel calibration table %d:\n\n", i);
		for (j = 0; j < 8; j++) {
			fprintf(outf, "%5u %6d\n", get_u16(p), get_s16(p + 2));
			p += 4;
		}
	}
}

void
write_tx_caltemp_table(bin, outf)
	u_char *bin;
	FILE *outf;
{
	int i;
	u_char *p = bin;

	fputs("rf_table tx-caltemp\n\n", outf);
	for (i = 0; i < 5; i++) {
		fprintf(outf, "%6d %6d %6d %6d\n", get_s16(p), get_s16(p + 2),
			get_s16(p + 4), get_s16(p + 6));
		p += 8;
	}
}

void
write_rx_calchan_table(bin, outf)
	u_char *bin;
	FILE *outf;
{
	int i;
	u_char *p = bin;

	fputs("rf_table rx-calchan\n\n", outf);
	for (i = 0; i < 10; i++) {
		fprintf(outf, "%5u %6d\n", get_u16(p), get_s16(p + 2));
		p += 4;
	}
}

void
write_rx_caltemp_table(bin, outf)
	u_char *bin;
	FILE *outf;
{
	int i;
	u_char *p = bin;

	fputs("rf_table rx-caltemp\n\n", outf);
	for (i = 0; i < 11; i++) {
		fprintf(outf, "%6d %6d\n", get_s16(p), get_s16(p + 2));
		p += 4;
	}
}

void
write_rx_agcparams_table(bin, outf)
	u_char *bin;
	FILE *outf;
{
	fputs("rf_table rx-agc-params\n\n", outf);
	fprintf(outf, "%5u\t# g_magic\n", get_u16(bin));
	fprintf(outf, "%5u\t# lna_att\n", get_u16(bin + 2));
	fprintf(outf, "%5u\t# lna_switch_thr_low\n", get_u16(bin + 4));
	fprintf(outf, "%5u\t# lna_switch_thr_high\n", get_u16(bin + 6));
}

void
write_tx_ramp(bin, outf)
	u_char *bin;
	FILE *outf;
{
	int i;

	fputs("ramp-up  ", outf);
	for (i = 0; i < 16; i++)
		fprintf(outf, " %3u", bin[i]);
	putc('\n', outf);
	fputs("ramp-down", outf);
	for (i = 0; i < 16; i++)
		fprintf(outf, " %3u", bin[i+16]);
	putc('\n', outf);
}

void
write_tx_ramps_table(bin, outf)
	u_char *bin;
	FILE *outf;
{
	int i;
	u_char *p = bin;

	fputs("rf_table tx-ramps\n", outf);
	for (i = 0; i < 16; i++) {
		fprintf(outf, "\n# Tx ramp template %d:\n\n", i);
		write_tx_ramp(p, outf);
		p += 32;
	}
}