annotate test.c @ 4:b6416c4aadc8

Test implementation
author Daniel O'Connor <darius@dons.net.au>
date Tue, 04 Feb 2025 14:20:07 +1030
parents
children 2db42eaba3c8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
1 #include <sys/errno.h>
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
2 #include <stdio.h>
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
3 #include <stdint.h>
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
4 #include <stdlib.h>
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
5 #include <string.h>
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
6
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
7 #include <q.h>
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
8
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
9 #include "shaped-trap.h"
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
10
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
11 int
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
12 main(int argc, char **argv) {
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
13 uint8_t data[50000], shapelen, codegap, slew1, slew2, dcofs;
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
14 uint16_t plen, ncode;
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
15 uint32_t shapesamples, nsamples, idx;
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
16 q_t dcscale, stepsize;
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
17 char *code, tmps[20];
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
18
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
19 if (argc != 7) {
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
20 printf("Bad usage\n");
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
21 exit(1);
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
22 }
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
23 plen = atoi(argv[1]);
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
24 code = argv[2];
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
25 ncode = strlen(code);
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
26 shapelen = sizeof(shaped_trap);
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
27 codegap = atoi(argv[3]);
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
28 slew1 = atoi(argv[4]);
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
29 slew2 = atoi(argv[5]);
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
30 dcofs = atoi(argv[6]);
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
31
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
32 dcscale = qdiv(qsub(qint(255), qint(dcofs)), qint(255));
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
33 qsprint(dcscale, tmps, sizeof(tmps));
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
34 printf("dcscale = %s\n", tmps);
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
35
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
36 if (ncode == 1) {
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
37 // Number of samples for half of the pulse
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
38 // Can't use q library here because it is Q16.16 so not large enough
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
39 shapesamples = (plen * shapelen) / 100;
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
40 // Number of samples for everything
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
41 nsamples = shapesamples * 2 + slew1 + slew2;
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
42 } else {
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
43 shapesamples = plen;
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
44 nsamples = shapesamples * 2 * ncode + codegap * (ncode - 1) + slew1 + slew2;
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
45 }
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
46
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
47 if (nsamples > sizeof(data)) {
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
48 printf("Pulse too long (%d > %lu)\n", nsamples, sizeof(data));
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
49 exit(1);
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
50 }
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
51
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
52 // Number of samples per step in the pulse shape
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
53 stepsize = qdiv(qint(shapesamples), qint(shapelen));
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
54 qsprint(stepsize, tmps, sizeof(tmps));
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
55 printf("shapelen = %d shapesamples = %u nsamples = %u stepsize = %s\n", shapelen, shapesamples, nsamples, tmps);
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
56
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
57 if (shapesamples < 2) {
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
58 printf("Pulse too short (%u < %d)\n", shapesamples, 2);
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
59 exit(1);
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
60 }
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
61
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
62 idx = 0;
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
63
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
64 // Up slew
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
65 for (uint16_t i = 0; i < slew1; i++)
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
66 data[idx++] = qtoi(qdiv(qmul(qint(dcofs), qint(i)), qint(slew1)));
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
67
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
68 for (uint16_t c = 0; c < ncode; c++) {
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
69 // Pulse up
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
70 for (uint16_t i = 0; i < shapesamples; i++)
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
71 data[idx++] = dcofs + qtoi(qmul(qint(shaped_trap[qtoi(qdiv(qint(i), stepsize))]), dcscale));
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
72
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
73 // Pulse down
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
74 for (uint16_t i = 0; i < shapesamples; i++)
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
75 data[idx++] = dcofs + qtoi(qmul(qint(shaped_trap[qtoi(qdiv(qint(shapesamples - i - 1), stepsize))]), dcscale));
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
76
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
77 // Code gap
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
78 if (c < ncode - 1)
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
79 for (uint16_t i = 0; i < codegap; i++)
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
80 data[idx++] = dcofs;
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
81 }
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
82
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
83 // Down slew
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
84 for (uint16_t i = 0; i < slew2; i++)
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
85 data[idx++] = qtoi(qdiv(qmul(qint(dcofs), qint(slew2 - i)), qint(slew2)));
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
86
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
87 FILE *fh;
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
88
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
89 if ((fh = fopen("/tmp/out.bin", "w")) == NULL) {
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
90 printf("Unable to open file: %s\n", strerror(errno));
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
91 exit(1);
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
92 }
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
93 fwrite(data, idx, 1, fh);
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
94 fclose(fh);
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
95
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
96 exit(0);
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
97 }