21#ifdef COMPILE_THE_EASTER_EGG
23struct DrawAnabridLogo {
30 DrawAnabridLogo(carrier::Carrier &c) : cluster(c.clusters[0]), mBlock((MIntBlock *)(cluster.m1block)) {}
32 const uint8_t one = mBlock->M2_OUTPUT(4);
35 const uint8_t x_in = mBlock->M1_INPUT(0);
36 const uint8_t x_out = mBlock->M1_OUTPUT(0);
39 const uint8_t y_in = mBlock->M1_INPUT(1);
40 const uint8_t y_out = mBlock->M1_OUTPUT(1);
43 const uint8_t z_in = mBlock->M1_INPUT(2);
44 const uint8_t z_out = mBlock->M1_OUTPUT(2);
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();
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();
67 ManualControl::to_ic();
69 ManualControl::to_op();
71 ManualControl::to_halt();
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();
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();
88 ManualControl::to_ic();
90 ManualControl::to_op();
91 delayMicroseconds(100);
92 ManualControl::to_halt();
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();
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();
109 ManualControl::to_ic();
110 delayMicroseconds(5);
111 ManualControl::to_op();
112 delayMicroseconds(100);
113 ManualControl::to_halt();
116 void draw_a(
float pos_x,
float pos_y,
float size) {
118 float c_y = pos_y +
size;
119 draw_circ(pos_x, pos_y, c_x, c_y,
size, 3 * TquaterCirc);
121 draw_line_horiz(pos_x +
size, pos_y, -
size);
124 void draw_n(
float pos_x,
float pos_y,
float size) {
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);
130 draw_circ(pos_x, pos_y + 2 *
size, c_x, c_y,
size, TquaterCirc);
132 draw_line_horiz(pos_x +
size, pos_y, -
size);
135 void draw_b(
float pos_x,
float pos_y,
float size) {
137 float c_y = pos_y +
size;
138 draw_circ(pos_x, pos_y, c_x, c_y,
size, TquaterCirc);
140 draw_line_vert(pos_x -
size, pos_y + 3.5 *
size, -1.5 *
size);
142 draw_circ(pos_x, pos_y + 2 *
size, c_x, c_y,
size, 2 * TquaterCirc);
145 void draw_r(
float pos_x,
float pos_y,
float size) {
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,
154 draw_line_horiz(pos_x -
size, pos_y,
size);
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);
162 void draw_d(
float pos_x,
float pos_y,
float size) {
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);
172 void draw_anabrid() {
175 cluster.ublock->connect(x_out, 5);
176 cluster.ublock->connect(y_out, 6);
178 cluster.route(x_out, 0, 0, y_in);
179 cluster.route(one, 1, 0, y_in);
181 cluster.route(y_out, 2, 0, x_in);
182 cluster.route(one, 3, 0, x_in);
184 cluster.write_to_hardware();
185 delayMicroseconds(500);
189 float gap = 2.5 *
size;
190 float start = -0.829;
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);
210 cluster.write_to_hardware();
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();
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();
228 ManualControl::to_ic();
229 delayMicroseconds(50);
230 ManualControl::to_op();
231 delayMicroseconds(1980);
232 ManualControl::to_halt();
238 cluster.ublock->connect(x_out, 5);
239 cluster.ublock->connect(y_out, 6);
241 cluster.route(x_out, 0, 0, y_in);
242 cluster.route(one, 1, 0, y_in);
244 cluster.route(y_out, 2, 0, x_in);
245 cluster.route(one, 3, 0, x_in);
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);
251 cluster.write_to_hardware();
252 delayMicroseconds(500);
256 draw_circ(-1, 0, 0, 0, 1, 4 * TquaterCirc);
258 draw_line_horiz(1, 0, -2);
262 cluster.write_to_hardware();
267void draw_anabrid_logo(carrier::Carrier &c) { DrawAnabridLogo(c).draw_logo(); }