Вопрос по классу Ultrasonic.

Тема в разделе "Arduino & Shields", создана пользователем Felix102, 28 мар 2019.

  1. Felix102

    Felix102 Нерд

    Здравствуйте.
    Решил разобрать библиотеку ultrasonic.h. Понятно все кроме выражения:
    Ultrasonic(uint8_t sigPin) : Ultrasonic(sigPin, sigPin) {};

    Код (C++):
    #ifndef Ultrasonic_h
    #define Ultrasonic_h

    /*
    * Values of divisors
    */

    #define CM 28
    #define INC 71

    class Ultrasonic {
      public:
        Ultrasonic(uint8_t sigPin) : Ultrasonic(sigPin, sigPin) {};
        Ultrasonic(uint8_t trigPin, uint8_t echoPin, unsigned long timeOut = 20000UL);
        unsigned int distanceRead();
        unsigned int distanceRead(uint8_t und);
        void setTimeout(unsigned long timeOut) {timeout = timeOut;}

      private:
        uint8_t trig;
        uint8_t echo;
        boolean threePins = false;
        unsigned long timeout;
        unsigned int timing();
    };

    #endif // Ultrasonic_h
     
    Я так понимаю это конструктор класса Ultrasonic, который присваивает значение sigPin к uint8_t sigPin, но что делает и куда записывается второй аргумент(sigPin)? И если я ошибаюсь, тогда что это?

    На всякий случай оставляю код основного файла.
    Код (C++):
    #include <Arduino.h>
    #include "Ultrasonic.h"

    Ultrasonic::Ultrasonic(uint8_t trigPin, uint8_t echoPin, unsigned long timeOut) {
      trig = trigPin;
      echo = echoPin;
      threePins = trig == echo ? true : false;
      pinMode(trig, OUTPUT);
      pinMode(echo, INPUT);
      timeout = timeOut;
    }

    unsigned int Ultrasonic::timing() {
      if (threePins)
        pinMode(trig, OUTPUT);

      digitalWrite(trig, LOW);
      delayMicroseconds(2);
      digitalWrite(trig, HIGH);
      delayMicroseconds(10);
      digitalWrite(trig, LOW);

      if (threePins)
        pinMode(trig, INPUT);

      return pulseIn(echo, HIGH, timeout); // duration
    }

    unsigned int Ultrasonic::distanceRead() {
      /*
       * If the unit of measure is not passed as a parameter,
       * by default, it will return the distance in centimeters.
       * To change the default, replace CM by INC.
       */

      return distanceRead(CM);
    }

    unsigned int Ultrasonic::distanceRead(uint8_t und) {
      return timing() / und / 2;  //distance by divisor
    }
     
     
  2. Это конструктор, который вызывает вторую перегрузку конструктора. То бишь следующую строчку, с одинаковыми двумя первыми аргументами.
     
    b707 и ИгорьК нравится это.
  3. Tomasina

    Tomasina Сушитель лампочек Модератор

    А зачем?
     
  4. Чтобы не дублировать код, стоит полагать.
     
  5. Felix102

    Felix102 Нерд

    спасибо