+ uint8_t i, blocked;
+ microseconds us;
+
+ for (i = 0; i < 3; i ++) {
+
+ roller_reverse();
+
+ us = time_get_us2();
+ blocked = 0;
+
+ while (1) {
+
+ /* no more balls (sensor is heavily filtered) */
+ if (!sensor_get(S_LOW_BARRIER)) {
+ STMCH_DEBUG("%s(): no more balls", __FUNCTION__);
+ break;
+ }
+
+ /* timeout */
+ if ((time_get_us2() - us) > 2000UL * 1000UL) {
+ STMCH_DEBUG("%s(): eject timeout", __FUNCTION__);
+ blocked = 1;
+ break;
+ }
+
+ /* blocking ! */
+ if (bd_get(&ballboard.roller.bd)) {
+ blocked = 1;
+ break;
+ }
+ }
+
+ if (!blocked)
+ break;
+
+ STMCH_DEBUG("%s(): roller blocked", __FUNCTION__);
+ roller_on();
+ time_wait_ms(500);
+ bd_reset(&ballboard.roller.bd);
+ STMCH_DEBUG("%s(): roller restart", __FUNCTION__);
+ }