Files
klubhaus-doorbell/libraries/FastLED/src/fx/time.cpp
2026-02-12 00:45:31 -08:00

90 lines
2.1 KiB
C++

#include "time.h"
#include "fl/namespace.h"
#include "fl/dbg.h"
#include "fl/warn.h"
#define DBG FASTLED_DBG
namespace fl {
TimeWarp::TimeWarp(fl::u32 realTimeNow, float initialTimeScale)
: mLastRealTime(realTimeNow), mStartTime(realTimeNow),
mTimeScale(initialTimeScale) {}
TimeWarp::~TimeWarp() {}
void TimeWarp::setSpeed(float timeScale) { mTimeScale = timeScale; }
float TimeWarp::scale() const { return mTimeScale; }
void TimeWarp::pause(fl::u32 now) {
if (mPauseTime) {
FASTLED_WARN("TimeWarp::pause: already paused");
return;
}
mPauseTime = now;
}
void TimeWarp::resume(fl::u32 now) {
if (mLastRealTime == 0) {
reset(now);
return;
}
fl::u32 diff = now - mPauseTime;
mStartTime += diff;
mLastRealTime += diff;
mPauseTime = 0;
}
fl::u32 TimeWarp::update(fl::u32 timeNow) {
// DBG("TimeWarp::update: timeNow: " << timeNow << " mLastRealTime: " <<
// mLastRealTime
//<< " mRelativeTime: " << mRelativeTime << " mTimeScale: " << mTimeScale);
if (mLastRealTime > timeNow) {
DBG("TimeWarp::applyExact: mLastRealTime > timeNow: "
<< mLastRealTime << " > " << timeNow);
}
applyExact(timeNow);
return time();
}
fl::u32 TimeWarp::time() const { return mRelativeTime; }
void TimeWarp::reset(fl::u32 realTimeNow) {
mLastRealTime = realTimeNow;
mStartTime = realTimeNow;
mRelativeTime = 0;
}
void TimeWarp::applyExact(fl::u32 timeNow) {
fl::u32 elapsedRealTime = timeNow - mLastRealTime;
mLastRealTime = timeNow;
int32_t diff = static_cast<int32_t>(elapsedRealTime * mTimeScale);
if (diff == 0) {
return;
}
if (diff >= 0) {
mRelativeTime += diff;
return;
}
// diff < 0
fl::u32 abs_diff = -diff;
if (abs_diff > mRelativeTime) {
// Protection against rollover.
mRelativeTime = 0;
mLastRealTime = timeNow;
return;
}
mLastRealTime = timeNow;
mRelativeTime -= abs_diff;
}
void TimeWarp::setScale(float speed) { mTimeScale = speed; }
} // namespace fl