Объектно-ориентированное программирование

nmaqsudov
nmaqsudov аватар
Offline
Зарегистрирован: 24.05.2011

Написал вчера свою первую программу :)

Однако встретив в среде программирования упоминание об ANSI/ISO CPP мне подумалось, что Справочник языка http://arduino.ru/Reference наверное неполон. Взял руководство по этой версии С++. Так и вышло.

Вот что у меня получилось для управления моторами через мотор-шилд:

#define  DEBUG
class C2Motors {
  private:
    int _Speed;  int _Vector;
    int PortM1;  int PortM1Dir;
    int PortM2;  int PortM2Dir;
    float _k1;   float _k2;
    void applychanges() {
      int k1, k2;
      analogWrite(PortM1,abs(k1=_Speed*_k1)*0);
      analogWrite(PortM2,abs(k2=_Speed*_k2)*0);
      Serial.print(k1); Serial.print("    "); Serial.println(k2);
      if (k1>=0) analogWrite(PortM1Dir,255); else analogWrite(PortM1Dir,0);
      if (k2>=0) analogWrite(PortM1Dir,255); else analogWrite(PortM1Dir,0);
    };
  public:
    //constructor
    C2Motors(int M1, int M1D, int M2, int M2D){
      PortM1=M1; PortM1Dir=M1D; PortM2=M2; PortM2Dir=M2D;
      _Speed=0; _Vector=0;
      pinMode(PortM1,OUTPUT);
      pinMode(PortM1Dir,OUTPUT);
      pinMode(PortM2,OUTPUT);
      pinMode(PortM2Dir,OUTPUT);
      digitalWrite(PortM1,0);
      digitalWrite(PortM2,0);
      #ifdef DEBUG 
        Serial.begin(9600);
        Serial.println(" C2Motors constructor executed"); 
      #endif
    };
    //constructor w/defaults
    C2Motors() {C2Motors(6,7,5,4);};
    //destructor
    //~C2Motors() {
    //  digitalWrite(PortM1,0);
    //  digitalWrite(PortM2,0);
    //  #ifdef DEBUG 
    //    Serial.println("destructor executed");
    //  #endif
    //};
    int getspeed() {
      return _Speed;
    };
    void setspeed(int Spd) {
      if (Spd!=_Speed) {
        constrain(Spd, -255, 255);
        _Speed=Spd;
        applychanges();
      }
    };
    void setspeed(int Spd, int Vec) {
      if (Spd!=_Speed || Vec!=_Vector) {
        constrain(Spd, -255, 255);
        constrain(Vec, -180, 180);
        if (Vec>=0) _k2=1; else _k2=Vec/90.0+1.0;
        if (Vec<=0) _k1=1; else _k1=1.0-Vec/90.0;
        _Speed=Spd;
        _Vector=Vec;
        applychanges();
      }
    };
    int getvector() {
      return _Vector;
    };
    void setvector(int Vec) {
      if (Vec!=_Vector) {
        constrain(Vec, -180, 180);
        if (Vec>=0) _k2=1; else _k2=Vec/90.0+1.0;
        if (Vec<=0) _k1=1; else _k1=1.0-Vec/90.0;
        _Vector=Vec;
        applychanges();
      }
    };
};

Пользоваться очень просто:

 

C2Motors Mtr;

void setup() {
  Serial.begin(9600);
  Serial.println(" Setup done");
}

void loop() {
  Mtr.setspeed(200,0); delay(5000); //прямо 5 сек
  Mtr.setspeed(150); delay(2000); //сбросить газ  2 сек
  Mtr.setspeed(150,90); delay(3000); //поворачивать направо
  Mtr.setvector(0); delay(2000); //продолжить прямо 3 сек
}

 

Деструктор пришлось закоментировать, так как он по факту почему-то выполнялся сразу после конструктора. Не понял с какого бодуна...

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

А что за справочник по СРР? 

nmaqsudov
nmaqsudov аватар
Offline
Зарегистрирован: 24.05.2011

Да, их навалом. Вот, напрмиер, http://www.comms.engg.susx.ac.uk/fft/programming/ANSI-ISOCppProfessionalProgrammersHandbook.pdf

PS

Ой, я извиняюсь. Там в строчках 10 и 11 исходного кода "*0" надо убрать. Это я добавил в отладочных целях.
 

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

А для начинающих, из книг что-то посоветуете и на русском? 

nmaqsudov
nmaqsudov аватар
Offline
Зарегистрирован: 24.05.2011

Даже и не знаю :) что посоветовать по этой теме. Мне упомянутого выше справочника более чем хватает.

Наверное можно начать отсюда http://ru.wikibooks.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%...

Вопрос также и в том, насколько это всё применимо к Arduino, и насколько вообще целесообразно?