annotate test.c @ 18:f1e44afb41a3

WIP with control and DAC in sync and not hanging. Control data is wrong but baby steps.
author Daniel O'Connor <darius@dons.net.au>
date Tue, 25 Feb 2025 14:36:10 +1030
parents 2db42eaba3c8
children
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
5
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
7 #if 1
4
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
8 #include <q.h>
5
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
9 #else
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
10 // We want Q24.8 - Q16.16 is too small for sample calculations
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
11 #define FPT_WBITS 24
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
12 #include "fptc-lib/src/fptc.h"
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
13 #define q_t fpt
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
14 #define qmul fpt_mul
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
15 #define qdiv fpt_div
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
16 #define qtoi fpt2i
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
17 #define qint i2fpt
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
18 #define qsub(x, y) ((x) - (y))
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
19 #define qsprint(n, s, len) fpt_str(n, s, 3)
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
20 #endif
4
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
21
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
22 #include "shaped-trap.h"
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
23
5
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
24 unsigned
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
25 compute_pulse(uint8_t *data, unsigned datalen, uint16_t plen, char *code, uint8_t ncode, uint8_t shapelen, const uint8_t *shape, uint8_t codegap, uint8_t slew1, uint8_t slew2, uint8_t dcofs) {
4
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
26 uint32_t shapesamples, nsamples, idx;
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
27 q_t dcscale, stepsize;
5
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
28 char tmps[20];
4
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
29
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
30 dcscale = qdiv(qsub(qint(255), qint(dcofs)), qint(255));
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
31 qsprint(dcscale, tmps, sizeof(tmps));
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
32 printf("dcscale = %s\n", tmps);
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
33
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
34 if (ncode == 1) {
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
35 // Number of samples for half of the pulse
5
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
36 // Do division first so we don't overflow Q16.16
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
37 shapesamples = qtoi(qmul(qdiv(qint(plen), qint(100)), qint(shapelen)));
4
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
38 // Number of samples for everything
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
39 nsamples = shapesamples * 2 + slew1 + slew2;
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
40 } else {
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
41 shapesamples = plen;
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
42 nsamples = shapesamples * 2 * ncode + codegap * (ncode - 1) + slew1 + slew2;
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
43 }
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
44
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
45 // Number of samples per step in the pulse shape
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
46 stepsize = qdiv(qint(shapesamples), qint(shapelen));
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
47 qsprint(stepsize, tmps, sizeof(tmps));
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
48 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
49
5
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
50 if (nsamples > datalen) {
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
51 printf("Pulse too long (%d > %u)\n", nsamples, datalen);
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
52 return 0;
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
53 }
4
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
54 if (shapesamples < 2) {
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
55 printf("Pulse too short (%u < %d)\n", shapesamples, 2);
5
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
56 return 0;
4
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
57 }
5
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
58 if (qtoi(shapesamples) > 65535) {
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
59 printf("Shape too long (%u > %d)\n", qtoi(shapesamples), 65535);
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
60 return 0;
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
61 }
4
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++)
5
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
71 data[idx++] = dcofs + qtoi(qmul(qint(shape[qtoi(qdiv(qint(i), stepsize))]), dcscale));
4
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++)
5
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
75 data[idx++] = dcofs + qtoi(qmul(qint(shape[qtoi(qdiv(qint(shapesamples - i - 1), stepsize))]), dcscale));
4
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
5
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
87 return idx - 1;
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
88 }
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
89
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
90 int
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
91 main(int argc, char **argv) {
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
92 uint8_t data[65536], codegap, slew1, slew2, dcofs;
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
93 uint16_t plen;
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
94 uint32_t idx;
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
95 char *code;
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
96
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
97 if (argc != 7) {
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
98 printf("Bad usage\n");
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
99 exit(1);
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
100 }
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
101 plen = atoi(argv[1]);
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
102 code = argv[2];
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
103 codegap = atoi(argv[3]);
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
104 slew1 = atoi(argv[4]);
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
105 slew2 = atoi(argv[5]);
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
106 dcofs = atoi(argv[6]);
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
107
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
108 if ((idx = compute_pulse(data, sizeof(data), plen, code, strlen(code), sizeof(shaped_trap), shaped_trap, codegap, slew1, slew2, dcofs)) == 0) {
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
109 printf("Failed to build pulse\n");
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
110 exit(1);
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
111 }
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
112
4
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
113 FILE *fh;
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
114 if ((fh = fopen("/tmp/out.bin", "w")) == NULL) {
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
115 printf("Unable to open file: %s\n", strerror(errno));
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
116 exit(1);
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
117 }
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
118 fwrite(data, idx, 1, fh);
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
119 fclose(fh);
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
120
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
121 exit(0);
b6416c4aadc8 Test implementation
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
122 }