Pejović Luka Elma Gazetić

Dependencies:   mbed

main.cpp

Committer:
tim003
Date:
2014-05-12
Revision:
0:7ecda32385e2

File content as of revision 0:7ecda32385e2:

#include "mbed.h"
#include <cstdlib>

Serial pc(USBTX, USBRX);
char c[5] = {'0','0','0','0',0};
char * itoa(int i){
    for(int i = 0; i < 5; i++)
        c[i] = '0';
    c[4] = 0;
    c[3] = i%10 + '0';
    c[2] = (i/10) % 10 + '0';
    c[1] = (i/100) % 10 + '0';
    c[0] = (i/1000) % 10 + '0';
    
    return c;
}
class Motor{

    DigitalOut _p1, _p2, _p3, _p4;
    bool _smjer_cw;
    int _polozaj;
    float _brzina;// u sekundama
    bool _jel_ide;

    Ticker ticker;

    void postavi(int i){
        switch(i){
            case 1:
                _p1 = 1;
                _p2 = _p3 = _p4 = 0;
                break;
            case 2:
                _p1 = _p2 = 1;
                _p3 = _p4 = 0;
                break;
            case 3:
                _p1 = _p3 =_p4 = 0;
                _p2 = 1;
                break;
            case 4:
                _p1 = _p4 = 0;
                _p3 = _p2 = 1;
                break;
            case 5:
                _p1 = _p2 =_p4 = 0;
                _p3 = 1;
                break;
            case 6:
                _p1 = _p2 = 0;
                _p3 = _p4 = 1;
                break;
            case 7:
                _p1 = _p2 = _p3 = 0;
                _p4 = 1;
                break;
            case 8:
                _p1 = _p4 = 1;
                _p2 = _p3 = 0;
                break;
        }
    }
    
    void ugajguli(){
        _polozaj = 0;
        //jos skontati postaviti na neki 0 poloza;
    }

public:
    Motor(PinName p1, PinName p2, PinName p3, PinName p4):
        _p1(p1), _p2(p2), _p3(p3), _p4(p4), _smjer_cw(true), _brzina(0.6),
        _jel_ide(false)
    {
            ugajguli();
    }

    void cw(float time = 1000){
        for(int i = 1; i <= 8; i++){
            postavi(i);
            wait_us(time);
        }
         _polozaj = (_polozaj + 1) % 500;
    }

    void ccw(float time = 1000){
        for(int i = 7; i >= 1; i--){
          
            postavi(i);
            wait_us(time);
        }
        postavi(8);
        wait_us(time);
        _polozaj = (_polozaj - 1) % 500;
    }

    void napravi_korak(){
        if(_smjer_cw) cw();
        else ccw();
    }

    void postavi_cw(){_smjer_cw = true;}
    void postavi_ccw(){_smjer_cw = false;}
    void promijeni_smjer(){
        if(_smjer_cw) _smjer_cw = false;
        else _smjer_cw = true;
    }
    bool Smjer() const { return _smjer_cw;}
    void postavi_brzinu(float sekunde){
        _brzina = sekunde;
        if(_jel_ide){
            stani();
            kreni();
        }
    }

    void idi_na(int i, bool smjer = true){
        i %= 500;
        if(smjer) {
            while(_polozaj != i){
                
                cw();
                wait_us(1000);
            }
        } else {
            while(_polozaj != i){
                ccw();
                wait_us(1000);
            }
        }
    }

    void idi_na_polozaj(int kut){
        kut%=360;
        char  buf[20];
      
        pc.puts(itoa(kut));
        int p = int(kut*1.62 + 0.5);

                idi_na(p, true);

        
    }

    void kreni(){
        if(_jel_ide)
            ticker.detach();

        ticker.attach(this, &Motor::napravi_korak, _brzina);
        _jel_ide = true;
    }

    void stani(){
        if(_jel_ide)
            ticker.detach();

        _jel_ide = false;
    }
    
    void okreni(int kut){
        int p =  kut*1.62 + 0.5;
            while(p > 0){
              napravi_korak();
              p--;   
            }
        /*if(kut >= 0){
            int p =  kut*1.62 + 0.5;
            while(p > 0){
              cw();
              p--;   
            }
        
        } else {
            kut *= -1;
            
            int p = kut*1.62 + 0.5;
            while(p > 0){
              ccw();
              p--;   
            }
        }*/
          
    }
    
};


Motor motor(dp13, dp11, dp10, dp9);

int uzmiBroj(){
    char c = pc.getc();
    int broj = 0;
    while(c >= '0' && c <= '9'){
        broj *= 10;
        broj += c - '0';

        c=pc.getc();
    }
    
   
    pc.putc('o');
    pc.putc('k');
     return broj;
}
void funkcija(){
    if(!pc.readable()) return;
    switch(pc.getc())
    {
       case'K':
            motor.kreni();
            break;
       case'S':
            motor.stani();
             break;
       case'I':
            int i = uzmiBroj();
          
            motor.idi_na_polozaj(i);
            
            break;
        case 'O':
            motor.okreni(uzmiBroj());
            break;
        case'P':
            motor.promijeni_smjer();
            break;
    }
}

int main(){
    motor.postavi_brzinu(0.01);
    pc.attach(funkcija);
    while(1){
        
         
    }
}