20#ifdef COMPILE_THE_EASTER_EGG
22struct DrawAnabridLogo {
29 DrawAnabridLogo(carrier::Carrier &c) : cluster(c.clusters[0]), mBlock((MIntBlock *)(cluster.m1block)) {}
31 const uint8_t one = mBlock->M2_OUTPUT(4);
34 const uint8_t x_in = mBlock->M1_INPUT(0);
35 const uint8_t x_out = mBlock->M1_OUTPUT(0);
38 const uint8_t y_in = mBlock->M1_INPUT(1);
39 const uint8_t y_out = mBlock->M1_OUTPUT(1);
42 const uint8_t z_in = mBlock->M1_INPUT(2);
43 const uint8_t z_out = mBlock->M1_OUTPUT(2);
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();
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();
66 ManualControl::to_ic();
68 ManualControl::to_op();
70 ManualControl::to_halt();
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();
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();
87 ManualControl::to_ic();
89 ManualControl::to_op();
90 delayMicroseconds(100);
91 ManualControl::to_halt();
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();
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();
108 ManualControl::to_ic();
109 delayMicroseconds(5);
110 ManualControl::to_op();
111 delayMicroseconds(100);
112 ManualControl::to_halt();
115 void draw_a(
float pos_x,
float pos_y,
float size) {
117 float c_y = pos_y +
size;
118 draw_circ(pos_x, pos_y, c_x, c_y,
size, 3 * TquaterCirc);
120 draw_line_horiz(pos_x +
size, pos_y, -
size);
123 void draw_n(
float pos_x,
float pos_y,
float size) {
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);
129 draw_circ(pos_x, pos_y + 2 *
size, c_x, c_y,
size, TquaterCirc);
131 draw_line_horiz(pos_x +
size, pos_y, -
size);
134 void draw_b(
float pos_x,
float pos_y,
float size) {
136 float c_y = pos_y +
size;
137 draw_circ(pos_x, pos_y, c_x, c_y,
size, TquaterCirc);
139 draw_line_vert(pos_x -
size, pos_y + 3.5 *
size, -1.5 *
size);
141 draw_circ(pos_x, pos_y + 2 *
size, c_x, c_y,
size, 2 * TquaterCirc);
144 void draw_r(
float pos_x,
float pos_y,
float size) {
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,
153 draw_line_horiz(pos_x -
size, pos_y,
size);
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);
161 void draw_d(
float pos_x,
float pos_y,
float size) {
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);
171 void draw_anabrid() {
174 cluster.ublock->connect(x_out, 5);
175 cluster.ublock->connect(y_out, 6);
177 cluster.route(x_out, 0, 0, y_in);
178 cluster.route(one, 1, 0, y_in);
180 cluster.route(y_out, 2, 0, x_in);
181 cluster.route(one, 3, 0, x_in);
183 cluster.write_to_hardware();
184 delayMicroseconds(500);
188 float gap = 2.5 *
size;
189 float start = -0.829;
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);
209 cluster.write_to_hardware();
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();
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();
227 ManualControl::to_ic();
228 delayMicroseconds(50);
229 ManualControl::to_op();
230 delayMicroseconds(1980);
231 ManualControl::to_halt();
237 cluster.ublock->connect(x_out, 5);
238 cluster.ublock->connect(y_out, 6);
240 cluster.route(x_out, 0, 0, y_in);
241 cluster.route(one, 1, 0, y_in);
243 cluster.route(y_out, 2, 0, x_in);
244 cluster.route(one, 3, 0, x_in);
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);
250 cluster.write_to_hardware();
251 delayMicroseconds(500);
255 draw_circ(-1, 0, 0, 0, 1, 4 * TquaterCirc);
257 draw_line_horiz(1, 0, -2);
261 cluster.write_to_hardware();
266void draw_anabrid_logo(carrier::Carrier &c) { DrawAnabridLogo(c).draw_logo(); }