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();
}