diff --git a/lib/fahrt/fahrt.cpp b/lib/fahrt/fahrt.cpp index 7ae7264..85e836c 100644 --- a/lib/fahrt/fahrt.cpp +++ b/lib/fahrt/fahrt.cpp @@ -2,24 +2,12 @@ #include #include -Fahrt::Fahrt(Locomotive locomotive, MotorDirection Direction, Gleis gleis, Gleisabschnitt gleisabschnitt): _locomotive(locomotive), _gleis(gleis), _gleisabschnitt(gleisabschnitt) -{ - _direction = Direction; - _speed = locomotive.getDefaultSpeed(); - _bremsweg=0; -} -Fahrt::Fahrt(Locomotive locomotive, byte speed, MotorDirection Direction, Gleis gleis, Gleisabschnitt gleisabschnitt): _locomotive(locomotive), _gleis(gleis), _gleisabschnitt(gleisabschnitt) -{ - _direction = Direction; - _speed = speed; - _bremsweg=0; -} - -Fahrt::Fahrt(Locomotive locomotive, byte speed, MotorDirection Direction, Gleis gleis, Gleisabschnitt gleisabschnitt, float bremsweg): _locomotive(locomotive), _gleis(gleis), _gleisabschnitt(gleisabschnitt) +Fahrt::Fahrt(Locomotive locomotive, byte speed, MotorDirection Direction, Gleis gleis, float startbeschleunigung, Gleisabschnitt gleisabschnitt, float bremsweg): _locomotive(locomotive), _gleis(gleis), _gleisabschnitt(gleisabschnitt) { _direction = Direction; _speed = speed; + _startbeschleunigung = startbeschleunigung; _bremsweg=bremsweg; } @@ -50,10 +38,7 @@ void Fahrt::Loop() delay(20); if (_gleisabschnitt.IstBesetzt() && !_abschnittErkannt) { - if (_bremsweg==0) - _locomotive.Break(); - else - _locomotive.Accelerate(0, _bremsweg); + _locomotive.Accelerate(0, _bremsweg); _abschnittErkannt=true; } } diff --git a/lib/fahrt/fahrt.h b/lib/fahrt/fahrt.h index 00bfdde..f2ee6c2 100644 --- a/lib/fahrt/fahrt.h +++ b/lib/fahrt/fahrt.h @@ -8,9 +8,7 @@ class Fahrt { public: - Fahrt(Locomotive locomotive, MotorDirection Direction, Gleis gleis, Gleisabschnitt gleisabschnitt); - Fahrt(Locomotive locomotive, byte speed, MotorDirection Direction, Gleis gleis, Gleisabschnitt gleisabschnitt); - Fahrt(Locomotive locomotive, byte speed, MotorDirection Direction, Gleis gleis, Gleisabschnitt gleisabschnitt, float bremsweg); + Fahrt(Locomotive locomotive, byte speed, MotorDirection Direction, Gleis gleis, float startbeschleunigung, Gleisabschnitt gleisabschnitt, float bremsweg); void Vorbereiten(); void Start(); void Loop(); @@ -27,6 +25,7 @@ class Fahrt Gleisabschnitt _gleisabschnitt; bool _abschnittErkannt; byte _speed; + float _startbeschleunigung; float _bremsweg; }; diff --git a/lib/locomotive/locomotive.cpp b/lib/locomotive/locomotive.cpp index 8bf9291..8f13603 100644 --- a/lib/locomotive/locomotive.cpp +++ b/lib/locomotive/locomotive.cpp @@ -2,22 +2,17 @@ #include #include -Locomotive::Locomotive(int accelerate, int decelerate, byte minSpeed, byte maxSpeed, IMotor& motor): _motor(motor) +Locomotive::Locomotive(float accelerate, float decelerate, byte minSpeedStart, byte minSpeedStop, IMotor& motor): _motor(motor) { _currentSpeed=0; _currentAcc=0; _accelerate=accelerate; _decelerate=decelerate; - _minSpeed=minSpeed; - _maxSpeed=maxSpeed; + _minSpeedStart=minSpeedStart; + _minSpeedStop=minSpeedStop; }; -void Locomotive::Accelerate() -{ - Accelerate(_maxSpeed); -}; - void Locomotive::Accelerate(byte Speed) { /* Serial.print("Locomotive.Accelerate: "); @@ -26,6 +21,11 @@ void Locomotive::Accelerate(byte Speed) Serial.print(Speed); Serial.print(" "); */ + Serial.print("Accelerate: currentspeed="); + Serial.print((_currentSpeed)); + Serial.print(" targetspeed="); + Serial.print(Speed); + _targetSpeed = Speed; _millisStart = millis()-_delay; if (_targetSpeed>_currentSpeed) @@ -33,31 +33,41 @@ void Locomotive::Accelerate(byte Speed) else _currentAcc = - _decelerate; + Serial.print(" _currentAcc="); + Serial.print(_currentAcc); + Serial.println(); + }; void Locomotive::Accelerate(byte Speed, float bremsweg) { + Serial.print("Accelerate: currentspeed="); + Serial.print((_currentSpeed)); + Serial.print(" targetspeed="); + Serial.print(Speed); + Serial.print(" bremsweg="); + Serial.print((bremsweg)); + _targetSpeed = Speed; - _currentSpeed = (_currentSpeed<_minSpeed)? _minSpeed : _currentSpeed; + _currentSpeed = (_currentSpeed<_minSpeedStart)? _minSpeedStart : _currentSpeed; _millisStart = millis()-_delay; - byte _targetSpeed2 = ((_targetSpeed < _currentSpeed)&&(_targetSpeed == 0)) ? _minSpeed : _targetSpeed; + byte _targetSpeed2 = ((_targetSpeed < _currentSpeed)&&(_targetSpeed == 0)) ? _minSpeedStop : _targetSpeed; int deltaspeed = (_targetSpeed2 - _currentSpeed); - _currentAcc = copysign(deltaspeed * deltaspeed / (100.0 * bremsweg), deltaspeed); + _currentAcc = copysign(deltaspeed * deltaspeed / (100.0 * bremsweg ) * (_delay / 300.0) , deltaspeed); if (_currentAcc == 0) _currentAcc = copysign(1, deltaspeed); + Serial.print(" targetspeed2="); + Serial.print(_targetSpeed2); + Serial.print(" _currentAcc="); + Serial.print(_currentAcc); + Serial.println(); }; - -void Locomotive::Break() -{ - Accelerate(0); -}; - -void Locomotive::setSpeed(byte Speed) +void Locomotive::setSpeed(float Speed) { _currentSpeed = Speed; _motor.setSpeed( (int) (_currentSpeed+0.5)); @@ -86,14 +96,14 @@ void Locomotive::loop() Serial.println(newspeed); */ - int breakspeed = _minSpeed * 80 / 100; + int breakspeed = _minSpeedStop; if ((newspeed>_targetSpeed) && (_currentAcc>0)) { newspeed = _targetSpeed; _currentAcc =0; } - else if ((newspeed<_minSpeed) && (_currentAcc>0)) newspeed = _minSpeed; + else if ((newspeed<_minSpeedStart) && (_currentAcc>0)) newspeed = _minSpeedStart; else if ((newspeed