changeset 86:684eddecbc62

fc-buzplay play command implemented
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 27 Oct 2016 06:51:42 +0000
parents c5766d12360d
children 7fb62fc724dc
files loadtools/Makefile loadtools/bpdispatch.c loadtools/buzplay.c
diffstat 3 files changed, 129 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/loadtools/Makefile	Thu Oct 27 05:28:30 2016 +0000
+++ b/loadtools/Makefile	Thu Oct 27 06:51:42 2016 +0000
@@ -23,9 +23,9 @@
 		hexdecode.o hwparam.o initscript.o labaud.o romload.o sercomm.o\
 		srecreader.o tpinterf.o ttypassthru.o ${EXTRA_OBJ}
 
-BUZPLAY_OBJS=	bpdispatch.o bpmain.o defpath.o flashstubs.o hexdecode.o \
-		hwparam.o labaud.o ltexit.o ltpassthru.o romload.o sercomm.o \
-		srecreader.o tpinterf.o ${EXTRA_OBJ}
+BUZPLAY_OBJS=	bpdispatch.o bpmain.o buzplay.o defpath.o flashstubs.o \
+		hexdecode.o hwparam.o labaud.o ltexit.o ltpassthru.o romload.o \
+		sercomm.o srecreader.o tpinterf.o ${EXTRA_OBJ}
 
 all:	${PROGS}
 
--- a/loadtools/bpdispatch.c	Thu Oct 27 05:28:30 2016 +0000
+++ b/loadtools/bpdispatch.c	Thu Oct 27 06:51:42 2016 +0000
@@ -10,6 +10,7 @@
 
 extern int cmd_baud();
 extern int cmd_exit();
+extern int cmd_play();
 extern int loadtool_cmd_passthru();
 
 static struct cmdtab {
@@ -23,6 +24,7 @@
 	{"baud", 0, 1, cmd_baud},
 	{"buzlev", 0, 1, loadtool_cmd_passthru},
 	{"exit", 0, 1, cmd_exit},
+	{"play", 1, 1, cmd_play},
 	{"quit", 0, 1, cmd_exit},
 	{"r8", 1, 1, loadtool_cmd_passthru},
 	{"r16", 1, 1, loadtool_cmd_passthru},
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loadtools/buzplay.c	Thu Oct 27 06:51:42 2016 +0000
@@ -0,0 +1,124 @@
+/*
+ * The actual functionality of fc-buzplay is implemented here.
+ */
+
+#include <sys/types.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+#include <strings.h>
+#include <stdlib.h>
+
+cmd_play(argc, argv)
+	char **argv;
+{
+	FILE *f;
+	char linebuf[256], *cp, *num1, *num2;
+	int lineno;
+	char *targv[4];
+	u_long n1, n2, total_ms;
+	int rc, timeout;
+
+	f = fopen(argv[1], "r");
+	if (!f) {
+		perror(argv[1]);
+		return(-1);
+	}
+	printf("Uploading the melody to the target\n");
+	targv[0] = "I";
+	targv[1] = 0;
+	tpinterf_make_cmd(targv);
+	if (tpinterf_send_cmd() < 0) {
+		fclose(f);
+		return(-1);
+	}
+	rc = tpinterf_pass_output(1);
+	if (rc) {
+		fclose(f);
+		return(rc);
+	}
+	targv[0] = "E";
+	targv[3] = 0;
+	total_ms = 0;
+	for (lineno = 1; fgets(linebuf, sizeof linebuf, f); lineno++) {
+		cp = index(linebuf, '\n');
+		if (!cp) {
+			fprintf(stderr, "%s line %d: missing newline\n",
+				argv[1], lineno);
+			fclose(f);
+			return(-1);
+		}
+		for (cp = linebuf; isspace(*cp); cp++)
+			;
+		if (*cp == '\0' || *cp == '#')
+			continue;
+		if (!isdigit(*cp)) {
+inv:			fprintf(stderr, "%s line %d: unexpected content\n",
+				argv[1], lineno);
+			fclose(f);
+			return(-1);
+		}
+		for (num1 = cp; *cp && !isspace(*cp); cp++)
+			if (!isdigit(*cp))
+				goto inv;
+		if (isspace(*cp))
+			*cp++ = '\0';
+		while (isspace(*cp))
+			cp++;
+		if (!isdigit(*cp))
+			goto inv;
+		for (num2 = cp; *cp && !isspace(*cp); cp++)
+			if (!isdigit(*cp))
+				goto inv;
+		if (isspace(*cp))
+			*cp++ = '\0';
+		while (isspace(*cp))
+			cp++;
+		if (*cp != '\0' && *cp != '#')
+			goto inv;
+		n1 = strtoul(num1, 0, 10);
+		n2 = strtoul(num2, 0, 10);
+		if (n1 > 255) {
+			fprintf(stderr,
+				"%s line %d: the tone number is out of range\n",
+				argv[1], lineno);
+			fclose(f);
+			return(-1);
+		}
+		if (n2 < 1 || n2 > 0xFFFF) {
+			fprintf(stderr,
+			"%s line %d: the duration number is out of range\n",
+				argv[1], lineno);
+			fclose(f);
+			return(-1);
+		}
+		/* send it to the target */
+		targv[1] = num1;
+		targv[2] = num2;
+		tpinterf_make_cmd(targv);
+		if (tpinterf_send_cmd() < 0) {
+			fclose(f);
+			return(-1);
+		}
+		rc = tpinterf_pass_output(1);
+		if (rc) {
+			fclose(f);
+			return(rc);
+		}
+		/* account for the duration */
+		total_ms += n2 * 5;
+	}
+	fclose(f);
+	if (!total_ms) {
+		fprintf(stderr, "%s is empty!\n", argv[1]);
+		return(-1);
+	}
+	printf("Requesting play of the uploaded melody on the target\n");
+	targv[0] = "P";
+	targv[1] = 0;
+	tpinterf_make_cmd(targv);
+	if (tpinterf_send_cmd() < 0)
+		return(-1);
+	timeout = total_ms / 1000 + 2;
+	return tpinterf_pass_output(timeout);
+}