|
17 | 17 | struct _pbio_lightgrid_t { |
18 | 18 | pbdrv_pwm_dev_t *pwm; |
19 | 19 | const pbdrv_lightgrid_platform_data_t *data; |
20 | | - uint32_t last_poll; |
21 | 20 | uint8_t number_of_frames; |
22 | 21 | uint8_t frame_index; |
23 | 22 | uint8_t interval; |
24 | 23 | const uint8_t *frame_data; |
25 | 24 | }; |
26 | 25 |
|
| 26 | +PROCESS(pbio_lightgrid_process, "light grid"); |
27 | 27 | static pbio_lightgrid_t _lightgrid; |
28 | 28 |
|
29 | 29 | pbio_error_t pbio_lightgrid_get_dev(pbio_lightgrid_t **lightgrid) { |
@@ -106,18 +106,16 @@ pbio_error_t pbio_lightgrid_set_image(pbio_lightgrid_t *lightgrid, const uint8_t |
106 | 106 | } |
107 | 107 |
|
108 | 108 | void pbio_lightgrid_stop_pattern(pbio_lightgrid_t *lightgrid) { |
109 | | - lightgrid->number_of_frames = 0; |
| 109 | + process_exit(&pbio_lightgrid_process); |
110 | 110 | } |
111 | 111 |
|
112 | | -pbio_error_t pbio_lightgrid_start_pattern(pbio_lightgrid_t *lightgrid, const uint8_t *images, uint8_t frames, uint32_t interval) { |
| 112 | +void pbio_lightgrid_start_pattern(pbio_lightgrid_t *lightgrid, const uint8_t *images, uint8_t frames, uint32_t interval) { |
113 | 113 | lightgrid->number_of_frames = frames; |
114 | 114 | lightgrid->frame_index = 0; |
115 | 115 | lightgrid->interval = interval; |
116 | 116 | lightgrid->frame_data = images; |
117 | | - lightgrid->last_poll = clock_time(); |
118 | 117 |
|
119 | | - // Start with the first frame |
120 | | - return pbio_lightgrid_set_image(lightgrid, images); |
| 118 | + process_start(&pbio_lightgrid_process, NULL); |
121 | 119 | } |
122 | 120 |
|
123 | 121 | // FIXME: compress / implement differently |
@@ -164,29 +162,30 @@ const uint8_t pbio_lightgrid_sys_pattern[1000] = { |
164 | 162 | 0, 0, 0, 0, 0, 15, 68, 100, 72, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
165 | 163 | }; |
166 | 164 |
|
167 | | -// TODO: Convert to contiki process |
168 | | -void _pbio_lightgrid_poll(uint32_t now) { |
| 165 | +PROCESS_THREAD(pbio_lightgrid_process, ev, data) { |
| 166 | + static pbio_lightgrid_t *lightgrid = &_lightgrid; |
| 167 | + static struct etimer timer; |
169 | 168 |
|
170 | | - pbio_lightgrid_t *lightgrid = &_lightgrid; |
| 169 | + PROCESS_BEGIN(); |
171 | 170 |
|
172 | | - // Poll only if there are frames to do |
173 | | - if (lightgrid->number_of_frames > 1) { |
| 171 | + etimer_set(&timer, clock_from_msec(lightgrid->interval)); |
174 | 172 |
|
175 | | - // Check if we are past the next sample yet |
176 | | - if (now - lightgrid->last_poll >= lightgrid->interval) { |
| 173 | + for (;;) { |
| 174 | + // Current frame data |
| 175 | + uint8_t size = lightgrid->data->size; |
| 176 | + const uint8_t *frame = lightgrid->frame_data + size * size * lightgrid->frame_index; |
177 | 177 |
|
178 | | - // Bump the poll time and frame index |
179 | | - lightgrid->last_poll += lightgrid->interval; |
180 | | - lightgrid->frame_index = (lightgrid->frame_index + 1) % lightgrid->number_of_frames; |
| 178 | + // Display the frame |
| 179 | + pbio_lightgrid_set_image(lightgrid, frame); |
181 | 180 |
|
182 | | - // Current frame |
183 | | - const uint8_t *frame = lightgrid->frame_data + lightgrid->data->size * lightgrid->data->size * lightgrid->frame_index; |
| 181 | + PROCESS_WAIT_EVENT_UNTIL(ev == PROCESS_EVENT_TIMER && etimer_expired(&timer)); |
| 182 | + etimer_reset(&timer); |
184 | 183 |
|
185 | | - // Display the frame |
186 | | - pbio_lightgrid_set_image(lightgrid, frame); |
187 | | - } |
| 184 | + // Move to next frame |
| 185 | + lightgrid->frame_index = (lightgrid->frame_index + 1) % lightgrid->number_of_frames; |
188 | 186 | } |
189 | 187 |
|
| 188 | + PROCESS_END(); |
190 | 189 | } |
191 | 190 |
|
192 | 191 | #endif // PBIO_CONFIG_LIGHTGRID |
0 commit comments