File source

#include <fitkitlib>
#include "stepper.h"
#include "adc.h"
#include "color.h"

extern "C" {
  #include <stdlib.h>
}
#define TIMER_INTERVAL 10

int next_flag = 0;
int back_flag = 0;
/*******************************************************************************
 * Vypis uzivatelske napovedy (funkce se vola pri vykonavani prikazu "help")
 * systemoveho helpu
*******************************************************************************/
void print_user_help(void)
{
}

int state = -1;

/*******************************************************************************
 * Dekodovani a vykonani uzivatelskych prikazu
*******************************************************************************/
extern "C" unsigned char decode_user_cmd(char *cmd_ucase, char *cmd){
  if(strcmp5(cmd_ucase, "STEP ")){
    int steps = atoi(cmd+5);
    stepper_steps = steps;
    term_send_str("urobim kroky:");
    term_send_num(steps);
    term_send_crlf();
    return USER_COMMAND;
  }else if(strcmp6(cmd_ucase, "SPEED ")){
    int speed = atoi(cmd+6);
    stepper_speed = speed;
    term_send_str("nastavim rychlost = ");
    term_send_num(speed);
    term_send_crlf();
    return USER_COMMAND;
  }else if(strcmp4(cmd_ucase, "NEXT")){
    next_flag++;
    return USER_COMMAND;    
  }else if(strcmp4(cmd_ucase, "BACK")){
    back_flag++;
    return USER_COMMAND;   
  }else if(strcmp1(cmd_ucase, "R")){
    Color::red();
    return USER_COMMAND;
  }else if(strcmp1(cmd_ucase, "G")){
    Color::green();
    return USER_COMMAND;
  }else if(strcmp1(cmd_ucase, "B")){
    Color::blue();
    return USER_COMMAND;
  }else if(strcmp1(cmd_ucase, "W")){
    Color::white();
    return USER_COMMAND;
  }else if(strcmp3(cmd_ucase, "OFF")){
    Color::off();
    return USER_COMMAND;
  }else if(strcmp1(cmd_ucase, "M")){
    state = 3;
    return USER_COMMAND;
  }else if(strcmp1(cmd_ucase, "?")){
    term_send_num(readADC(0));
    term_send_crlf();
    return USER_COMMAND;
  }

  return (CMD_UNKNOWN);
}


/*******************************************************************************
 * Inicializace periferii/komponent po naprogramovani FPGA
*******************************************************************************/
void fpga_initialized()
{
  term_send_crlf();
  term_send_str_crlf("Aplikace bezi. :)");
}


/*******************************************************************************
 * Hlavni funkce
*******************************************************************************/
int main(void){
  initialize_hardware();
  WDG_stop(); // watchdog

  /* timer */
  CCTL0 = CCIE;            // interrupt enable
  CCR0 = TIMER_INTERVAL;   // set up timer interval
  TACTL = TASSEL_1 + MC_2; // clock ACLK, cont. mode


  term_send_crlf();
  term_send_str_crlf("Aplikace bezi!!!");
  int cnt = 0;
  while (1) {
    unsigned int a = readADC(0);
    unsigned int last = 0;
    cnt++;
    if(cnt > 100){
      cnt = 0;
    }

    if(next_flag){
      /* go forward one rotation */
      next_flag=0;
      stepper_direction=0;
      stepper_steps=400;
      stepper_speed=230;
      state = 0;
      Color::white();
      term_send_str("START");
      term_send_crlf();
     }else if(back_flag){
      /* go back half rotation and return */
        int length = 200;
        back_flag=0;
        stepper_speed=230;
        stepper_direction = 1;
        stepper_steps=length;
        while(stepper_steps){}
        stepper_direction=0;
        stepper_steps=length+50;
        stepper_speed=230;
        state = 0;
        Color::white();
        term_send_str_crlf("START");          
     }

     if(state == 0){
      // motor acceleration
      if(stepper_steps < 200){
        state = 1;
      }
     }if(state == 1){
      // wait for stop mark, then slow down
      if(a < 100){
        stepper_speed = 200;
        state = 2;
        last = a;
        term_send_str("SLOW");
        term_send_crlf();
      }
     }else if(state == 2){
      // when stop mark passes by, stop
      if(a > 300){
       state=3;
        term_send_str("STOP");
        //term_send_num(a);
        term_send_crlf();
      }else{
        last = a;
      }
     }else if(state==3){
      // done
      // here was color measurement, now replaced by camera & computer vision
      stepper_steps = 0;
      state = 4;      
     }


     terminal_idle(); // handle terminal 
     delay_ms(1);
  }
  return 0;
}

/* timer interrupt */
ISR(TIMERA0, tmra_isr){
  CCR0 += TIMER_INTERVAL;
  // handle stepper motor
  stepper();
}