REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
easter_logo.cpp
Go to the documentation of this file.
1// Copyright (c) 2024 anabrid GmbH
2// Contact: https://www.anabrid.com/licensing/
3//
4// SPDX-License-Identifier: MIT OR GPL-2.0-or-later
5
6#include <proto/main.pb.h>
7#include <Arduino.h>
8
9#include "carrier/carrier.h"
10#include "daq/daq.h"
11#include "mode/mode.h"
12
13using namespace blocks;
14using namespace daq;
15using namespace platform;
16using namespace mode;
17
18namespace easter_egg {
19
20// Comment in again when the code is working without warnings...
21#ifdef COMPILE_THE_EASTER_EGG
22
23struct DrawAnabridLogo {
24 Cluster &cluster;
25 MIntBlock *mBlock;
26 OneshotDAQ daq_{};
27
28 const uint32_t TquaterCirc = 162;
29
30 DrawAnabridLogo(carrier::Carrier &c) : cluster(c.clusters[0]), mBlock((MIntBlock *)(cluster.m1block)) {}
31
32 const uint8_t one = mBlock->M2_OUTPUT(4);
33
34 uint8_t x = 0;
35 const uint8_t x_in = mBlock->M1_INPUT(0);
36 const uint8_t x_out = mBlock->M1_OUTPUT(0);
37
38 uint8_t y = 1;
39 const uint8_t y_in = mBlock->M1_INPUT(1);
40 const uint8_t y_out = mBlock->M1_OUTPUT(1);
41
42 uint8_t z = 2;
43 const uint8_t z_in = mBlock->M1_INPUT(2);
44 const uint8_t z_out = mBlock->M1_OUTPUT(2);
45
46 void draw_circ(float pos_x, float pos_y, float c_x, float c_y, float size, uint64_t t,
47 bool reverse = false) {
48 mBlock->set_ic(x, pos_x);
49 mBlock->set_ic(y, pos_y);
50 mBlock->write_to_hardware();
51
52 int rev = 1;
53
54 if (reverse) {
55 rev = -1;
56 }
57
58 cluster.cblock->set_factor(0, -rev);
59 cluster.cblock->set_factor(1, rev * c_x);
60 cluster.cblock->set_factor(2, rev);
61 cluster.cblock->set_factor(3, -rev * c_y);
62 cluster.cblock->set_factor(4, 0);
63 cluster.cblock->set_factor(5, 0);
64 cluster.cblock->set_factor(6, 0);
65 cluster.cblock->write_to_hardware();
66
67 ManualControl::to_ic();
68 delayMicroseconds(5);
69 ManualControl::to_op();
70 delayMicroseconds(t);
71 ManualControl::to_halt();
72 }
73
74 void draw_line_horiz(float pos_x, float pos_y, float length) {
75 mBlock->set_ic(x, pos_x);
76 mBlock->set_ic(y, pos_y);
77 mBlock->write_to_hardware();
78
79 cluster.cblock->set_factor(0, 0);
80 cluster.cblock->set_factor(1, 0);
81 cluster.cblock->set_factor(2, 0);
82 cluster.cblock->set_factor(3, length);
83 cluster.cblock->set_factor(4, 0);
84 cluster.cblock->set_factor(5, 0);
85 cluster.cblock->set_factor(6, 0);
86 cluster.cblock->write_to_hardware();
87
88 ManualControl::to_ic();
89 delayMicroseconds(5);
90 ManualControl::to_op();
91 delayMicroseconds(100);
92 ManualControl::to_halt();
93 }
94
95 void draw_line_vert(float pos_x, float pos_y, float length) {
96 mBlock->set_ic(x, pos_x);
97 mBlock->set_ic(y, pos_y);
98 mBlock->write_to_hardware();
99
100 cluster.cblock->set_factor(0, 0);
101 cluster.cblock->set_factor(1, length);
102 cluster.cblock->set_factor(2, 0);
103 cluster.cblock->set_factor(3, 0);
104 cluster.cblock->set_factor(4, 0);
105 cluster.cblock->set_factor(5, 0);
106 cluster.cblock->set_factor(6, 0);
107 cluster.cblock->write_to_hardware();
108
109 ManualControl::to_ic();
110 delayMicroseconds(5);
111 ManualControl::to_op();
112 delayMicroseconds(100);
113 ManualControl::to_halt();
114 }
115
116 void draw_a(float pos_x, float pos_y, float size) {
117 float c_x = pos_x;
118 float c_y = pos_y + size;
119 draw_circ(pos_x, pos_y, c_x, c_y, size, 3 * TquaterCirc);
120 draw_line_vert(pos_x + size, pos_y + size, -size);
121 draw_line_horiz(pos_x + size, pos_y, -size);
122 }
123
124 void draw_n(float pos_x, float pos_y, float size) {
125 float c_x = pos_x;
126 float c_y = pos_y + size;
127 draw_line_horiz(pos_x, pos_y, -size);
128 draw_line_vert(pos_x - size, pos_y, 2 * size);
129 draw_line_horiz(pos_x - size, pos_y + 2 * size, size);
130 draw_circ(pos_x, pos_y + 2 * size, c_x, c_y, size, TquaterCirc);
131 draw_line_vert(pos_x + size, pos_y + size, -size);
132 draw_line_horiz(pos_x + size, pos_y, -size);
133 }
134
135 void draw_b(float pos_x, float pos_y, float size) {
136 float c_x = pos_x;
137 float c_y = pos_y + size;
138 draw_circ(pos_x, pos_y, c_x, c_y, size, TquaterCirc);
139 draw_line_vert(pos_x - size, pos_y + size, 2.5 * size);
140 draw_line_vert(pos_x - size, pos_y + 3.5 * size, -1.5 * size);
141 draw_line_horiz(pos_x - size, pos_y + 2 * size, size);
142 draw_circ(pos_x, pos_y + 2 * size, c_x, c_y, size, 2 * TquaterCirc);
143 }
144
145 void draw_r(float pos_x, float pos_y, float size) {
146 float c_x = pos_x;
147 float c_y = pos_y + size;
148 draw_line_horiz(pos_x, pos_y, -size);
149 draw_line_vert(pos_x - size, pos_y, size);
150 draw_circ(pos_x - size, pos_y + size, c_x, c_y, size, 1.5 * TquaterCirc);
151 draw_circ(pos_x + 1 / sqrt(2) * size, pos_y + (1 + 1 / sqrt(2)) * size, c_x, c_y, size, 1.5 * TquaterCirc,
152 true);
153 draw_line_vert(pos_x - size, pos_y + size, -size);
154 draw_line_horiz(pos_x - size, pos_y, size);
155 }
156
157 void draw_i(float pos_x, float pos_y, float size) {
158 draw_line_vert(pos_x, pos_y, 2 * size);
159 draw_line_vert(pos_x, pos_y + 2 * size, -2 * size);
160 }
161
162 void draw_d(float pos_x, float pos_y, float size) {
163 float c_x = pos_x;
164 float c_y = pos_y + size;
165 draw_circ(pos_x, pos_y, c_x, c_y, size, 2 * TquaterCirc);
166 draw_line_horiz(pos_x, pos_y + 2 * size, size);
167 draw_line_vert(pos_x + size, pos_y + 2 * size, 1.5 * size);
168 draw_line_vert(pos_x + size, pos_y + 3.5 * size, -2.5 * size);
169 draw_circ(pos_x + size, pos_y + size, c_x, c_y, size, TquaterCirc);
170 }
171
172 void draw_anabrid() {
173 cluster.reset(true);
174
175 cluster.ublock->connect(x_out, 5); // FIXME UBlock::IDX_RANGE_TO_ACL_OUT(5));
176 cluster.ublock->connect(y_out, 6); // FIXME UBlock::IDX_RANGE_TO_ACL_OUT(6));
177
178 cluster.route(x_out, 0, 0, y_in);
179 cluster.route(one, 1, 0, y_in);
180
181 cluster.route(y_out, 2, 0, x_in);
182 cluster.route(one, 3, 0, x_in);
183
184 cluster.write_to_hardware();
185 delayMicroseconds(500);
186
187 float size = 0.13;
188
189 float gap = 2.5 * size;
190 float start = -0.829;
191
192 for (;;) {
193 draw_a(start, 0, size);
194 draw_line_horiz(start, 0, gap);
195 draw_n(start + gap, 0, size);
196 draw_line_horiz(start + gap, 0, gap);
197 draw_a(start + 2 * gap, 0, size);
198 draw_line_horiz(start + 2 * gap, 0, gap);
199 draw_b(start + 3 * gap, 0, size);
200 draw_line_horiz(start + 3 * gap, 0, gap);
201 draw_r(start + 4 * gap, 0, size);
202 draw_line_horiz(start + 4 * gap, 0, 0.5 * gap);
203 draw_i(start + 4.5 * gap, 0, size);
204 draw_line_horiz(start + 4.5 * gap, 0, 0.6 * gap);
205 draw_d(start + 5.1 * gap, 0, size);
206 draw_line_horiz(start + 5.1 * gap, 0, -5.1 * gap);
207 }
208
209 cluster.reset(true);
210 cluster.write_to_hardware();
211 }
212
213 void draw_damped_sin() {
214 mBlock->set_ic(x, -1);
215 mBlock->set_ic(y, -0);
216 mBlock->set_ic(z, 1);
217 mBlock->write_to_hardware();
218
219 cluster.cblock->set_factor(0, 0);
220 cluster.cblock->set_factor(1, 0);
221 cluster.cblock->set_factor(2, 0);
222 cluster.cblock->set_factor(3, 0.116);
223 cluster.cblock->set_factor(4, -0.2);
224 cluster.cblock->set_factor(5, 1);
225 cluster.cblock->set_factor(6, -1);
226 cluster.cblock->write_to_hardware();
227
228 ManualControl::to_ic();
229 delayMicroseconds(50);
230 ManualControl::to_op();
231 delayMicroseconds(1980);
232 ManualControl::to_halt();
233 }
234
235 void draw_logo() {
236 cluster.reset(true);
237
238 cluster.ublock->connect(x_out, 5); // FIXME UBlock::IDX_RANGE_TO_ACL_OUT(5));
239 cluster.ublock->connect(y_out, 6); // FIXME UBlock::IDX_RANGE_TO_ACL_OUT(6));
240
241 cluster.route(x_out, 0, 0, y_in);
242 cluster.route(one, 1, 0, y_in);
243
244 cluster.route(y_out, 2, 0, x_in);
245 cluster.route(one, 3, 0, x_in);
246
247 cluster.route(y_out, 4, 0, y_in);
248 cluster.route(y_out, 5, 0, z_in);
249 cluster.route(z_out, 6, 0, y_in);
250
251 cluster.write_to_hardware();
252 delayMicroseconds(500);
253
254 // TODO: Have some finite runtime like 10sec instead of an infinite loop
255 for (;;) {
256 draw_circ(-1, 0, 0, 0, 1, 4 * TquaterCirc);
257 draw_damped_sin();
258 draw_line_horiz(1, 0, -2);
259 }
260
261 cluster.reset(true);
262 cluster.write_to_hardware();
263 }
264
265}; // end of class
266
267void draw_anabrid_logo(carrier::Carrier &c) { DrawAnabridLogo(c).draw_logo(); }
268
269#endif
270
271} // namespace easter_egg
uint32_t
Definition flasher.cpp:195
uint32_t uint32_t size
Definition flasher.cpp:63
Routines for data acquisition (DAQ) using the internal analog-to-digital converters (ADC).
Definition daq.cpp:15
Definition mode.h:14