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