File source

#include <fitkitlib>
#include "stepper.h"
#include <stdint.h>
#include <stdbool.h>
#define LAST_PHASE 7


/* module registers */
unsigned volatile int stepper_steps = 0;
uint8_t stepper_speed = 128;
uint8_t stepper_delay = 0;
uint8_t stepper_phase = 0;
bool stepper_direction = 0;

/* set outputs */
void stepper_setphase(uint8_t phase){
  P6DIR |= STEPPER_MASK;
  P6OUT &= ~STEPPER_MASK;
  switch(phase){
    case 0:
      P6OUT |= STEPPER_A;
    break;
    case 1:
      P6OUT |= STEPPER_A;
      P6OUT |= STEPPER_B;
    break;
    case 2:
      P6OUT |= STEPPER_B;
    break;
    case 3:
      P6OUT |= STEPPER_B;
      P6OUT |= STEPPER_C;
    break;
    case 4:
      P6OUT |= STEPPER_C;
    break;
    case 5:
      P6OUT |= STEPPER_C;
      P6OUT |= STEPPER_D;
    break;
    case 6:
      P6OUT |= STEPPER_D;
    break;
    case 7:
      P6OUT |= STEPPER_D;
      P6OUT |= STEPPER_A;
    break;
    default:
    break;
  }
}

void stepper_disable(){
  P6DIR |= STEPPER_MASK;
  P6OUT &= ~STEPPER_MASK;
}

/* handle stepper motor */
void stepper(){
  if(stepper_steps > 0){
    stepper_delay--;
    if(stepper_delay > stepper_speed) return;
    stepper_delay = 0;
    if(stepper_direction){
      stepper_phase++;
      if(stepper_phase > LAST_PHASE) stepper_phase = 0;
    }else{
      stepper_phase--;
      if(stepper_phase > LAST_PHASE) stepper_phase = LAST_PHASE;
    }
    stepper_setphase(stepper_phase);
    stepper_steps--;
  }else{
    if(stepper_direction){
      stepper_phase--;
    }else{
      stepper_phase++;
    }
    stepper_disable();
  }
}