changeset 181:dcab0be3f67a

started manual VCXO calibration code: fc-vcxo-linear utility written
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 12 Apr 2017 06:45:45 +0000
parents e50c3aa1152a
children 9099a35a705f
files .hgignore rfcal/vcxo-manual/Makefile rfcal/vcxo-manual/linear.c rfcal/vcxo-manual/meas.h rfcal/vcxo-manual/readmeas.c
diffstat 5 files changed, 112 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Mon Mar 27 21:38:45 2017 +0000
+++ b/.hgignore	Wed Apr 12 06:45:45 2017 +0000
@@ -27,6 +27,8 @@
 ^miscutil/fc-vm2hex$
 ^miscutil/imei-luhn$
 
+^rfcal/vcxo-manual/fc-vcxo-linear$
+
 ^ringtools/fc-e1decode$
 ^ringtools/fc-e1gen$
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfcal/vcxo-manual/Makefile	Wed Apr 12 06:45:45 2017 +0000
@@ -0,0 +1,18 @@
+CC=	gcc
+CFLAGS=	-O2
+PROGS=	fc-vcxo-linear
+INSTBIN=/opt/freecalypso/bin
+
+LINEAR_OBJS=	linear.o readmeas.o
+
+all:	${PROGS}
+
+fc-vcxo-linear:	${LINEAR_OBJS}
+	${CC} ${CFLAGS} -o $@ ${LINEAR_OBJS}
+
+install:
+	mkdir -p ${INSTBIN}
+	install -c ${PROGS} ${INSTBIN}
+
+clean:
+	rm -f *.o *.out *errs ${PROGS}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfcal/vcxo-manual/linear.c	Wed Apr 12 06:45:45 2017 +0000
@@ -0,0 +1,27 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "meas.h"
+
+struct meas meas[2];
+float lin_a, lin_b, target_off;
+int target_dac;
+
+main(argc, argv)
+	char **argv;
+{
+	if (argc < 2 || argc > 3) {
+		fprintf(stderr, "usage: %s meas-file [target]\n", argv[0]);
+		exit(1);
+	}
+	read_meas_file(argv[1], meas, 2);
+	if (argc > 2)
+		target_off = atof(argv[2]);
+	else
+		target_off = 0;
+	lin_a = (float)(meas[1].freq_offset - meas[0].freq_offset) /
+		(float)(meas[1].dac_value - meas[0].dac_value);
+	lin_b = (float)meas[1].freq_offset - lin_a * meas[1].dac_value;
+	target_dac = (target_off - lin_b) / lin_a;
+	printf("%d\n", target_dac);
+	exit(0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfcal/vcxo-manual/meas.h	Wed Apr 12 06:45:45 2017 +0000
@@ -0,0 +1,4 @@
+struct meas {
+	int	dac_value;
+	int	freq_offset;
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfcal/vcxo-manual/readmeas.c	Wed Apr 12 06:45:45 2017 +0000
@@ -0,0 +1,61 @@
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "meas.h"
+
+read_meas_file(filename, meas_table, nmeas)
+	char *filename;
+	struct meas *meas_table;
+{
+	FILE *f;
+	char linebuf[256], *cp, *np;
+	int lineno;
+	struct meas *mtp;
+	int got_meas;
+
+	f = fopen(filename, "r");
+	if (!f) {
+		perror(filename);
+		exit(1);
+	}
+	mtp = meas_table;
+	got_meas = 0;
+	for (lineno = 1; fgets(linebuf, sizeof linebuf, f); lineno++) {
+		for (cp = linebuf; isspace(*cp); cp++)
+			;
+		if (*cp == '\0' || *cp == '#')
+			continue;
+		if (!isdigit(*cp) && *cp != '-' && *cp != '+') {
+inv:			fprintf(stderr, "%s line %d: invalid syntax\n",
+				filename, lineno);
+			exit(1);
+		}
+		np = cp++;
+		while (isdigit(*cp))
+			cp++;
+		if (!isspace(*cp))
+			goto inv;
+		mtp->dac_value = atoi(np);
+		while (isspace(*cp))
+			cp++;
+		if (!isdigit(*cp) && *cp != '-' && *cp != '+')
+			goto inv;
+		np = cp++;
+		while (isdigit(*cp))
+			cp++;
+		if (*cp && !isspace(*cp))
+			goto inv;
+		mtp->freq_offset = atoi(np);
+		mtp++;
+		got_meas++;
+		if (got_meas >= nmeas)
+			break;
+	}
+	fclose(f);
+	if (got_meas < nmeas) {
+		fprintf(stderr, "error: need %d measurements, got %d in %s\n",
+			nmeas, got_meas, filename);
+		exit(1);
+	}
+	return 0;
+}