diff ffstools/newcomp/compile-fc-batt2.c @ 753:cae22bec3cba

compile-fc-batt2 utility written, compiles
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 05 Nov 2020 22:07:13 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ffstools/newcomp/compile-fc-batt2.c	Thu Nov 05 22:07:13 2020 +0000
@@ -0,0 +1,173 @@
+/*
+ * This utility compiles a table of battery thresholds for the 2020-10 version
+ * of FreeCalypso battery management code from ASCII source into the binary
+ * form suitable for uploading into /etc/batterytab2 on a FreeCalypso device.
+ */
+
+#include <sys/types.h>
+#include <ctype.h>
+#include <string.h>
+#include <strings.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "../../rvinterf/include/exitcodes.h"
+
+#define	MIN_PERCENT_THRESH	5
+#define	MAX_PERCENT_THRESH	21	/* allowing 5% steps */
+#define	NB_BARS_THRESH		4
+
+char *infname;
+FILE *inf;
+char linebuf[256];
+int lineno;
+
+unsigned main_array_mv[MAX_PERCENT_THRESH];
+unsigned main_array_percent[MAX_PERCENT_THRESH];
+unsigned main_array_count;
+
+u_char bars_thresh_array[NB_BARS_THRESH];
+unsigned expect_bars = NB_BARS_THRESH, bars_index;
+
+process_line()
+{
+	char *cp;
+	unsigned mv, percent, bars;
+	int bars_set;
+
+	for (cp = linebuf; isspace(*cp); cp++)
+		;
+	if (*cp == '\0' || *cp == '#')
+		return(0);
+	if (!isdigit(*cp)) {
+inv:		fprintf(stderr, "%s line %d: invalid syntax\n", infname,
+			lineno);
+		exit(ERROR_USAGE);
+	}
+	mv = strtoul(cp, 0, 10);
+	while (isdigit(*cp))
+		cp++;
+	if (!isspace(*cp))
+		goto inv;
+	while (isspace(*cp))
+		cp++;
+	if (!isdigit(*cp))
+		goto inv;
+	percent = strtoul(cp, 0, 10);
+	while (isdigit(*cp))
+		cp++;
+	while (isspace(*cp))
+		cp++;
+	if (*cp && *cp != '#') {
+		if (!isdigit(*cp))
+			goto inv;
+		bars = strtoul(cp, 0, 10);
+		while (isdigit(*cp))
+			cp++;
+		while (isspace(*cp))
+			cp++;
+		if (*cp && *cp != '#')
+			goto inv;
+		bars_set = 1;
+	} else
+		bars_set = 0;
+	if (mv > 0xFFFF) {
+		fprintf(stderr, "%s line %d: the millivolt value is invalid\n",
+			infname, lineno);
+		exit(ERROR_USAGE);
+	}
+	if (percent > 100) {
+		fprintf(stderr, "%s line %d: the percent value is invalid\n",
+			infname, lineno);
+		exit(ERROR_USAGE);
+	}
+	if (bars_set && (bars < 1 || bars > NB_BARS_THRESH)) {
+		fprintf(stderr, "%s line %d: the bars number is invalid\n",
+			infname, lineno);
+		exit(ERROR_USAGE);
+	}
+	if (main_array_count >= MAX_PERCENT_THRESH) {
+		fprintf(stderr, "%s line %d: too many table entries\n",
+			infname, lineno);
+		exit(ERROR_USAGE);
+	}
+	if (main_array_count) {
+		if (mv >= main_array_mv[main_array_count-1]) {
+			fprintf(stderr,
+			"%s line %d: millivolt numbers must be decreasing\n",
+				infname, lineno);
+			exit(ERROR_USAGE);
+		}
+		if (percent >= main_array_percent[main_array_count-1]) {
+			fprintf(stderr,
+			"%s line %d: percent numbers must be decreasing\n",
+				infname, lineno);
+			exit(ERROR_USAGE);
+		}
+	}
+	main_array_mv[main_array_count] = mv;
+	main_array_percent[main_array_count] = percent;
+	if (bars_set) {
+		if (bars != expect_bars) {
+			fprintf(stderr,
+				"%s line %d: bars threshold out of order\n",
+				infname, lineno);
+			exit(1);
+		}
+		bars_thresh_array[bars_index++] = main_array_count;
+		expect_bars--;
+	}
+	main_array_count++;
+	return(1);
+}
+
+write_output(filename)
+	char *filename;
+{
+	FILE *of;
+	unsigned n, mv, percent;
+
+	of = fopen(filename, "w");
+	if (!of) {
+		perror(filename);
+		exit(ERROR_UNIX);
+	}
+	fwrite(bars_thresh_array, 1, NB_BARS_THRESH, of);
+	for (n = 0; n < main_array_count; n++) {
+		mv = main_array_mv[n];
+		percent = main_array_percent[n];
+		putc(mv, of);
+		putc(mv >> 8, of);
+		putc(percent, of);
+		putc(0, of);
+	}
+	fclose(of);
+}
+
+main(argc, argv)
+	char **argv;
+{
+	if (argc != 3) {
+		fprintf(stderr, "usage: %s srcfile output-binfile\n", argv[0]);
+		exit(ERROR_USAGE);
+	}
+	infname = argv[1];
+	inf = fopen(infname, "r");
+	if (!inf) {
+		perror(infname);
+		exit(ERROR_UNIX);
+	}
+	for (lineno = 1; fgets(linebuf, sizeof linebuf, inf); lineno++)
+		process_line();
+	fclose(inf);
+	if (main_array_count < MIN_PERCENT_THRESH) {
+		fprintf(stderr, "error: %s is too short\n", infname);
+		exit(ERROR_USAGE);
+	}
+	if (expect_bars) {
+		fprintf(stderr, "error: %s did not specify bars thresholds\n",
+			infname);
+		exit(ERROR_USAGE);
+	}
+	write_output(argv[2]);
+	exit(0);
+}