Знакомство с классами

Не удержался и переделал нашу программу с таймерами на использование классов.

Что такое класс? Класс – описание законченного объекта, имеющего не только внутренние переменные, но и методы обеспечивающие доступ к этим переменным. Давайте опишем наш таймер.

Свойства таймера – время задержки. Время, на которое мы включаем программный таймер, привязанный к внутренним часам контроллера.

Методы таймера:

  • Установка времени таймера bool setTimer(unsigned long dT); Функция получает число задающее время включения таймера. Функция возвращает логическое значение. True, если таймер установлен и FALSE, если таймер ещё выполняет другую задачу.
  • Запрос состояния таймера bool getTimer(); Функция, обращаясь к внутреннему счетчику контроллера, возвращает TRUE/FALSE в зависимости от состояния таймера.
timer.cpp
#include  "Arduino.h"
#include "timer.h"

timer::timer(unsigned long dT){this->ulTimer = dT;}
timer::timer(){this->ulTimer = 0;}
//***********************************************************************
bool timer::setTimer(unsigned long dT){
  bool bActive = false;
  if(this->ulTimer == 0){           //если таймер не включен
      bActive = true;
      this->ulTimer = millis() + dT;  //задаем значение - сумма текущего времени
  }                               //и заданного времни ожидания
  return bActive;
}
//***************************** запрос состояния таймера. Возвращает true, если включен.
bool timer::getTimer(){
  if(this->ulTimer <= millis()){   //проверяем состояние таймера
      this->ulTimer = 0;            //если время истекло, сбрасываем заданное значение, выключаем таймер.
  }
  return this->ulTimer != 0;       //возвращаем логическое состояние таймера, если включен - true
}

Файл описания класса.

timer.h
#ifndef MYLIBRARY_H
#define MYLIBRARY_H

//class timer;
class timer {
  private:
     unsigned long ulTimer;
  public:
     timer(unsigned long dT);
     timer();
     //*****************************       установка времени задержки таймера
     bool setTimer(unsigned long dT);
     //***************************** запрос состояния таймера. Возвращает true, если включен.
     bool getTimer();

};
#endif

Класс виртуального индикатора. При инициализации задается номер пина, число включений, длительность мигания.

vLed.cpp
#include "Arduino.h"
#include "vLed.h"
#include "timer.h"
//++++++++++++++++++++++++++++++++++++++++++++++++++++
vLed::vLed(int pin, int nFlash, unsigned long time_x){
    this->pin = pin;
    this->nFlash = nFlash;
    this->time_x = time_x;
}
//****************************************************
bool vLed::setVLed(){   //включение индикатора
  if(this->statTimer == 0){ //если индикатор свободен
    this->statTimer = this -> nFlash * 2; //переводим в полупериоды
    this->vTimer.setTimer(this->time_x);
    return true;            //индикатор включен
  } else return false;      //индикатор занят
}
//************************************
bool vLed::cycleVLed(){           //обеспечение работы индикатора
  if(this->statTimer > 0 && !vTimer.getTimer()){ //определяем состояние таймера и если выключился,
      this->vTimer.setTimer(this->time_x);           //запускаем заново
      int st = (this->statTimer & 1) == 0;            //состояние светодиода определяется младшим разрядом счетчика индикатора
      digitalWrite(this->pin, st);
      Serial.println(this->pin);
      this->statTimer--;      //уменьшаем счетчик индикатора
  }
  return this->statTimer > 0;
}

Файл описания класса.

vLed.h
#ifndef VLED_H
#define VLED_H
#include "timer.h"

class vLed {           //аппаратно - виртуальный индикатор
  private:
    int statTimer;        //состояние индикатора, текущий полупериод
    timer vTimer;         //внутренний таймер виртуального индикатора
  public:
    int pin;              //номер пина, к которому подключен светодиод
    int nFlash;           //число миганий светодиода этого индикатора
    unsigned long time_x; //длительность включения светодиода
    bool setVLed();       //включение индикатора
    bool cycleVLed();     //обеспечение работы индикатора
    //*****************************************************************
    vLed(int pin, int nFlash, unsigned long time_x);
};

#endif
#include "timer.h"
#include "vLed.h"

#define BLUE 9     
#define GREEN 10
#define RED 11
#define LONG_TIME 2550

timer randEvent;    //таймер генерации случайного события для включения индикатора
int randLed = 0;          //индекс активного индикатора
//***********************************
vLed arTimers[] = { //массив структур задающий параметры работы индикаторов
    vLed(RED, 12, 2000),
    vLed(GREEN, 8, 1800),
    vLed(BLUE, 4, 220)
  };
//************************************
void setup() {
  for(int i=0; i < sizeof(arTimers)/sizeof(vLed); i++)
    pinMode(arTimers[i].pin, OUTPUT); //инициализация портов индикаторов
   Serial.begin(9600);
}
//*******************************
void loop() {
    if(!randEvent.getTimer()){   //проверка состояния таймера randEvent, отвечающего за генерацию события включающего индикатор
      randLed = random(0, 3);    //получение случайного номера индикатора
      randEvent.setTimer(LONG_TIME);  //запуск таймера randEvent
      arTimers[randLed].setVLed();  //включение индикатора
    }
    arTimers[randLed].cycleVLed();  //вызов функции обрабатывающей состояние активного индикатора
}