annotate loadtools/buzplay.c @ 461:10e168596dfd

doc/SIM-hardware-debugging: article written
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 10 Feb 2019 20:40:56 +0000
parents 684eddecbc62
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
86
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * The actual functionality of fc-buzplay is implemented here.
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 */
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 #include <sys/types.h>
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 #include <ctype.h>
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 #include <stdio.h>
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 #include <string.h>
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 #include <strings.h>
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 #include <stdlib.h>
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 cmd_play(argc, argv)
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 char **argv;
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 {
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 FILE *f;
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 char linebuf[256], *cp, *num1, *num2;
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 int lineno;
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 char *targv[4];
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 u_long n1, n2, total_ms;
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 int rc, timeout;
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 f = fopen(argv[1], "r");
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 if (!f) {
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 perror(argv[1]);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 return(-1);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 }
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 printf("Uploading the melody to the target\n");
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 targv[0] = "I";
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 targv[1] = 0;
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 tpinterf_make_cmd(targv);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 if (tpinterf_send_cmd() < 0) {
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 fclose(f);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 return(-1);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 }
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 rc = tpinterf_pass_output(1);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 if (rc) {
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 fclose(f);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 return(rc);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 }
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 targv[0] = "E";
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 targv[3] = 0;
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 total_ms = 0;
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 for (lineno = 1; fgets(linebuf, sizeof linebuf, f); lineno++) {
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 cp = index(linebuf, '\n');
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 if (!cp) {
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 fprintf(stderr, "%s line %d: missing newline\n",
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 argv[1], lineno);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 fclose(f);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 return(-1);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 }
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 for (cp = linebuf; isspace(*cp); cp++)
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 ;
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 if (*cp == '\0' || *cp == '#')
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 continue;
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 if (!isdigit(*cp)) {
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 inv: fprintf(stderr, "%s line %d: unexpected content\n",
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 argv[1], lineno);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 fclose(f);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 return(-1);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 }
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 for (num1 = cp; *cp && !isspace(*cp); cp++)
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 if (!isdigit(*cp))
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 goto inv;
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 if (isspace(*cp))
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 *cp++ = '\0';
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 while (isspace(*cp))
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 cp++;
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 if (!isdigit(*cp))
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 goto inv;
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 for (num2 = cp; *cp && !isspace(*cp); cp++)
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 if (!isdigit(*cp))
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 goto inv;
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 if (isspace(*cp))
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 *cp++ = '\0';
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 while (isspace(*cp))
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 cp++;
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 if (*cp != '\0' && *cp != '#')
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 goto inv;
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 n1 = strtoul(num1, 0, 10);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 n2 = strtoul(num2, 0, 10);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 if (n1 > 255) {
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 fprintf(stderr,
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 "%s line %d: the tone number is out of range\n",
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 argv[1], lineno);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 fclose(f);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 return(-1);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 }
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 if (n2 < 1 || n2 > 0xFFFF) {
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 fprintf(stderr,
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 "%s line %d: the duration number is out of range\n",
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 argv[1], lineno);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 fclose(f);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 return(-1);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 }
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 /* send it to the target */
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 targv[1] = num1;
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97 targv[2] = num2;
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 tpinterf_make_cmd(targv);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 if (tpinterf_send_cmd() < 0) {
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 fclose(f);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101 return(-1);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 }
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 rc = tpinterf_pass_output(1);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 if (rc) {
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 fclose(f);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 return(rc);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 }
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 /* account for the duration */
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109 total_ms += n2 * 5;
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 }
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 fclose(f);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 if (!total_ms) {
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 fprintf(stderr, "%s is empty!\n", argv[1]);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 return(-1);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115 }
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 printf("Requesting play of the uploaded melody on the target\n");
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 targv[0] = "P";
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 targv[1] = 0;
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119 tpinterf_make_cmd(targv);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 if (tpinterf_send_cmd() < 0)
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121 return(-1);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 timeout = total_ms / 1000 + 2;
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123 return tpinterf_pass_output(timeout);
684eddecbc62 fc-buzplay play command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124 }