189 lines
3.9 KiB
C++
189 lines
3.9 KiB
C++
|
|
#ifndef __train_H__
|
|
#define __train_H__
|
|
|
|
#include <Arduino.h>
|
|
|
|
class train
|
|
{
|
|
private:
|
|
const uint8_t _MAX_FADE_STEP = 255;
|
|
const uint8_t _MIN_FADE_STEP = 0;
|
|
uint8_t _current_max_fade_step;
|
|
uint8_t _current_min_fade_step;
|
|
static const unsigned long _FADE_DELAY_MS = 50;
|
|
size_t _relais_pin;
|
|
const char* _name;
|
|
|
|
bool _switch_zero_relais;
|
|
|
|
uint8_t _prev_pwm_value = 255;
|
|
size_t _pwmpin;
|
|
size_t _pwmchannel;
|
|
uint8_t _fade_step;
|
|
unsigned long _last_faded_ms;
|
|
unsigned long _delay_ms;
|
|
|
|
bool _fade(bool fade_up);
|
|
|
|
public:
|
|
train(const char* name, size_t pwmpin , size_t pwmchannel, size_t relais_pin, unsigned long delay_ms = _FADE_DELAY_MS);
|
|
~train();
|
|
void stop();
|
|
bool fade_on();
|
|
bool fade_off();
|
|
void set_pwm(uint8_t pwm_value);
|
|
void begin();
|
|
bool is_stopped();
|
|
bool is_up();
|
|
bool is_down();
|
|
uint8_t get_pwm();
|
|
void switch_zero_relais(bool do_switch);
|
|
bool fade_down_to(uint8_t pwm_value);
|
|
bool fade_up_to(uint8_t pwm_value);
|
|
|
|
};
|
|
|
|
train::train(const char* name, size_t pwmpin, size_t pwmchannel, size_t relais_pin, unsigned long delay_ms)
|
|
{
|
|
_pwmpin = pwmpin;
|
|
_pwmchannel = pwmchannel;
|
|
_fade_step = 0;
|
|
_last_faded_ms = 0;
|
|
_delay_ms = delay_ms;
|
|
_relais_pin = relais_pin;
|
|
_name = name;
|
|
_switch_zero_relais = true;
|
|
_current_max_fade_step = _MAX_FADE_STEP;
|
|
_current_min_fade_step = _MIN_FADE_STEP;
|
|
}
|
|
|
|
void train::begin()
|
|
{
|
|
//pinMode(_pwmpin, OUTPUT);
|
|
ledcSetup(_pwmchannel, 100, 8);
|
|
ledcAttachPin(_pwmpin, _pwmchannel);
|
|
if(_relais_pin != -1)
|
|
{
|
|
pinMode(_relais_pin, OUTPUT);
|
|
digitalWrite(_relais_pin, HIGH);
|
|
}
|
|
}
|
|
|
|
train::~train()
|
|
{
|
|
}
|
|
|
|
void train::set_pwm(uint8_t pwm_value) {
|
|
if(_prev_pwm_value != pwm_value)
|
|
{
|
|
_prev_pwm_value = pwm_value;
|
|
if(_relais_pin != -1 )
|
|
{
|
|
if(pwm_value == 0 )
|
|
{
|
|
if( _switch_zero_relais == true)
|
|
digitalWrite(_relais_pin, HIGH);
|
|
}
|
|
else
|
|
{
|
|
digitalWrite(_relais_pin, LOW);
|
|
}
|
|
}
|
|
_fade_step = pwm_value;
|
|
ledcWrite(_pwmchannel, pwm_value);
|
|
//Serial.printf("PWM '%s' set to value %d\n", _name, pwm_value);
|
|
}
|
|
}
|
|
|
|
void train::stop() {
|
|
set_pwm(0);
|
|
}
|
|
|
|
bool train::_fade(bool fade_up)
|
|
{
|
|
if(millis() - _last_faded_ms > _delay_ms)
|
|
{
|
|
_last_faded_ms = millis();
|
|
if(true == fade_up)
|
|
{
|
|
if(_current_max_fade_step > _fade_step)
|
|
{
|
|
_fade_step++;
|
|
}
|
|
else
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
if(_current_min_fade_step < _fade_step)
|
|
_fade_step--;
|
|
else
|
|
return false;
|
|
}
|
|
set_pwm(_fade_step);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
bool train::fade_down_to(uint8_t pwm_value)
|
|
{
|
|
_current_min_fade_step = pwm_value;
|
|
return _fade(false);
|
|
}
|
|
|
|
bool train::fade_up_to(uint8_t pwm_value)
|
|
{
|
|
_current_max_fade_step = pwm_value;
|
|
return _fade(true);
|
|
}
|
|
|
|
|
|
bool train::fade_on()
|
|
{
|
|
_current_max_fade_step = _MAX_FADE_STEP;
|
|
return _fade(true);
|
|
}
|
|
|
|
bool train::fade_off()
|
|
{
|
|
_current_min_fade_step = _MIN_FADE_STEP;
|
|
return _fade(false);
|
|
}
|
|
|
|
void train::switch_zero_relais(bool do_switch)
|
|
{
|
|
_switch_zero_relais = do_switch;
|
|
}
|
|
|
|
bool train::is_stopped()
|
|
{
|
|
if(_prev_pwm_value == 0)
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
bool train::is_up()
|
|
{
|
|
if(_prev_pwm_value == _current_max_fade_step)
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
bool train::is_down()
|
|
{
|
|
if(_prev_pwm_value == _current_min_fade_step)
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
uint8_t train::get_pwm()
|
|
{
|
|
return _prev_pwm_value;
|
|
}
|
|
|
|
#endif
|