FreeCalypso > hg > freecalypso-tools
view loadtools/buzplay.c @ 206:70bb11ba7485
fc-tsid-shell (fc-cmu200d development aid) written
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 14 May 2017 00:34:23 +0000 |
parents | 684eddecbc62 |
children |
line wrap: on
line source
/* * 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); }