void awp_draw_reel(int rno) { int x = rno + 1; char rg[16]; sprintf(rg,"reel%d", x); reelpos[rno] = stepper_get_position(rno); if (reelpos[rno] == output_get_value(rg)) { // Not moved, no need to update. } else { output_set_value(rg,(reelpos[rno])); // if the reel isn't configured don't do this, otherwise you'll get DIV0 if (stepper_get_max(rno)) { sprintf(rg,"sreel%d", x); // our new scrolling reels are called 'sreel' // normalize the value int sreelpos = (reelpos[rno] * 0x10000) / stepper_get_max(rno); output_set_value(rg,sreelpos); } } }
// Report the current position of the stepper void command_stepper_get_position(uint32_t *args) { uint8_t oid = args[0]; struct stepper *s = stepper_oid_lookup(oid); irq_disable(); uint32_t position = stepper_get_position(s); irq_enable(); sendf("stepper_position oid=%c pos=%i", oid, position - POSITION_BIAS); }
void awp_draw_reel(int rno) { int rsteps = steps[rno]; int rsymbols = symbols[rno]; int m; int x = rno + 1; char rg[16], rga[16], rgb[16]; sprintf(rg,"reel%d", x); reelpos[rno] = stepper_get_position(rno); if (reelpos[rno] == output_get_value(rg)) { // Not moved, no need to update. } else { reelpos[rno] = stepper_get_position(rno)%(stepper_get_max(rno)-1); for ( m = 0; m < (rsymbols-1); m++ ) { { sprintf(rga,"reel%da%d", x, m); output_set_value(rga,(reelpos[rno] + rsteps * m)%stepper_get_max(rno)); } { if ((reelpos[rno] - rsteps * m) < 0) { sprintf(rgb,"reel%db%d", x, m); output_set_value(rgb,(reelpos[rno] - (rsteps * m - stepper_get_max(rno)))); } else { sprintf(rgb,"reel%db%d", x, m); output_set_value(rgb,(reelpos[rno] - rsteps * m)); } } } output_set_value(rg,(reelpos[rno])); } }
// Stop all moves for a given stepper (used in end stop homing). IRQs // must be off. void stepper_stop(struct stepper *s) { sched_del_timer(&s->time); s->next_step_time = 0; s->position = -stepper_get_position(s); s->count = 0; s->flags = (s->flags & SF_INVERT_STEP) | SF_NEED_RESET; gpio_out_write(s->dir_pin, 0); gpio_out_write(s->step_pin, s->flags & SF_INVERT_STEP); while (s->first) { struct stepper_move *next = s->first->next; move_free(s->first); s->first = next; } }