77
88namespace piomatter {
99
10- constexpr unsigned DATA_OVERHEAD = 3 ;
11- // this is ... flatly wrong!? but it's the number that makes the ramp intensity
12- // correct to my eye
13- constexpr unsigned CLOCKS_PER_DATA = 128 ;
14- constexpr unsigned DELAY_OVERHEAD = 5 ;
15- constexpr unsigned CLOCKS_PER_DELAY = 1 ;
10+ constexpr int DATA_OVERHEAD = 3 ;
11+ constexpr int CLOCKS_PER_DATA = 2 ;
12+ constexpr int DELAY_OVERHEAD = 5 ;
13+ constexpr int CLOCKS_PER_DELAY = 1 ;
1614
1715constexpr uint32_t command_data = 1u << 31 ;
1816constexpr uint32_t command_delay = 0 ;
@@ -139,12 +137,12 @@ void protomatter_render_rgb10(std::vector<uint32_t> &result,
139137
140138 int data_count = 0 ;
141139
142- auto do_delay = [&](uint32_t delay) {
143- if (delay == 0 )
144- return ;
140+ auto do_data_delay = [&](uint32_t data, int32_t delay) {
141+ delay = std::max ((delay / CLOCKS_PER_DELAY) - DELAY_OVERHEAD, 1 );
145142 assert (delay < 1000000 );
146143 assert (!data_count);
147144 result.push_back (command_delay | (delay ? delay - 1 : 0 ));
145+ result.push_back (data);
148146 };
149147
150148 auto prep_data = [&data_count, &result](uint32_t n) {
@@ -155,27 +153,15 @@ void protomatter_render_rgb10(std::vector<uint32_t> &result,
155153 data_count = n;
156154 };
157155
158- auto do_data = [&](uint32_t d) {
159- assert (data_count);
160- data_count--;
161- result.push_back (d);
162- };
163-
164156 int32_t active_time;
165157
166- auto do_data_active = [&active_time, &do_data ](uint32_t d) {
158+ auto do_data_clk_active = [&active_time, &data_count, &result ](uint32_t d) {
167159 bool active = active_time > 0 ;
168160 active_time--;
169161 d |= active ? pinout::oe_active : pinout::oe_inactive;
170- do_data (d);
171- };
172-
173- auto do_data_delay = [&prep_data, &do_data, &do_delay](uint32_t d,
174- int32_t delay) {
175- prep_data (1 );
176- do_data (d);
177- if (delay > 0 )
178- do_delay (delay);
162+ assert (data_count);
163+ data_count--;
164+ result.push_back (d);
179165 };
180166
181167 auto calc_addr_bits = [](int addr) {
@@ -197,9 +183,9 @@ void protomatter_render_rgb10(std::vector<uint32_t> &result,
197183 return data;
198184 };
199185
200- auto add_pixels = [&do_data_active, &result]( uint32_t addr_bits, bool r0 ,
201- bool g0 , bool b0 , bool r1 ,
202- bool g1, bool b1) {
186+ auto add_pixels = [&do_data_clk_active ,
187+ &result]( uint32_t addr_bits, bool r0 , bool g0 , bool b0 ,
188+ bool r1, bool g1, bool b1) {
203189 uint32_t data = addr_bits;
204190 if (r0)
205191 data |= (1 << pinout::PIN_RGB[0 ]);
@@ -214,8 +200,7 @@ void protomatter_render_rgb10(std::vector<uint32_t> &result,
214200 if (b1)
215201 data |= (1 << pinout::PIN_RGB[5 ]);
216202
217- do_data_active (data);
218- do_data_active (data | pinout::clk_bit);
203+ do_data_clk_active (data);
219204 };
220205
221206 int last_bit = 0 ;
@@ -245,7 +230,7 @@ void protomatter_render_rgb10(std::vector<uint32_t> &result,
245230 active_time = 1 << last_bit;
246231 last_bit = bit;
247232
248- prep_data (2 * pixels_across);
233+ prep_data (pixels_across);
249234 auto mapiter = matrixmap.map .begin () + 2 * addr * pixels_across;
250235 for (size_t x = 0 ; x < pixels_across; x++) {
251236 assert (mapiter != matrixmap.map .end ());
0 commit comments