FastLED 3.9.15
Loading...
Searching...
No Matches
time.cpp.hpp
Go to the documentation of this file.
1#include "fl/fx/time.h"
2
3#include "fl/log/log.h"
4#include "fl/log/log.h"
5#include "fl/stl/noexcept.h"
6
7#define DBG FL_DBG
8
9namespace fl {
10
11TimeWarp::TimeWarp(fl::u32 realTimeNow, float initialTimeScale)
12 : mLastRealTime(realTimeNow), mStartTime(realTimeNow),
13 mTimeScale(initialTimeScale) {}
14
16
18
19float TimeWarp::scale() const { return mTimeScale; }
20
21void TimeWarp::pause(fl::u32 now) {
22 if (mPauseTime) {
23 FL_WARN("TimeWarp::pause: already paused");
24 return;
25 }
26 mPauseTime = now;
27}
28void TimeWarp::resume(fl::u32 now) {
29 if (mLastRealTime == 0) {
30 reset(now);
31 return;
32 }
33 fl::u32 diff = now - mPauseTime;
34 mStartTime += diff;
35 mLastRealTime += diff;
36 mPauseTime = 0;
37}
38
39fl::u32 TimeWarp::update(fl::u32 timeNow) {
40 applyExact(timeNow);
41 return time();
42}
43
44fl::u32 TimeWarp::time() const { return mRelativeTime; }
45
46void TimeWarp::reset(fl::u32 realTimeNow) {
47 mLastRealTime = realTimeNow;
48 mStartTime = realTimeNow;
49 mRelativeTime = 0;
50}
51
52void TimeWarp::applyExact(fl::u32 timeNow) {
53 // Handle time going backwards - reset if this happens
54 if (timeNow < mLastRealTime) {
55 FL_WARN("TimeWarp::applyExact: time went backwards, resetting");
56 reset(timeNow);
57 return;
58 }
59
60 fl::u32 elapsedRealTime = timeNow - mLastRealTime;
61 mLastRealTime = timeNow;
62
63 // Calculate scaled time difference with bounds checking
64 float scaledTime = elapsedRealTime * mTimeScale;
65
66 // Check for overflow/underflow before casting to int32_t
67 // int32_t range is [-2147483648, 2147483647]
68 if (scaledTime > 2147483647.0f) {
69 scaledTime = 2147483647.0f;
70 } else if (scaledTime < -2147483648.0f) {
71 scaledTime = -2147483648.0f;
72 }
73
74 i32 diff = static_cast<i32>(scaledTime);
75 if (diff == 0) {
76 return;
77 }
78 if (diff >= 0) {
79 mRelativeTime += diff;
80 return;
81 }
82
83 // diff < 0
84 fl::u32 abs_diff = -diff;
85 if (abs_diff > mRelativeTime) {
86 // Protection against rollover.
87 mRelativeTime = 0;
88 mLastRealTime = timeNow;
89 return;
90 }
91 mLastRealTime = timeNow;
92 mRelativeTime -= abs_diff;
93}
94
96
97} // namespace fl
fl::TimeWarp timeScale(0, 1.0f)
uint16_t speed
Definition Noise.ino:66
void pause(fl::u32 now)
Definition time.cpp.hpp:21
void resume(fl::u32 now)
Definition time.cpp.hpp:28
fl::u32 mPauseTime
Definition time.h:51
void applyExact(fl::u32 timeNow)
Definition time.cpp.hpp:52
float scale() const
Definition time.cpp.hpp:19
void reset(fl::u32 realTimeNow) override
Definition time.cpp.hpp:46
~TimeWarp() FL_NOEXCEPT
Definition time.cpp.hpp:15
float mTimeScale
Definition time.h:50
fl::u32 time() const override
Definition time.cpp.hpp:44
fl::u32 update(fl::u32 timeNow) override
Definition time.cpp.hpp:39
void setSpeed(float speedScale)
Definition time.cpp.hpp:17
fl::u32 mLastRealTime
Definition time.h:47
void setScale(float speed) FASTLED_DEPRECATED("Use setSpeed(...) instead.")
Definition time.cpp.hpp:95
fl::u32 mStartTime
Definition time.h:48
fl::u32 mRelativeTime
Definition time.h:49
TimeWarp(fl::u32 realTimeNow=0, float initialTimeScale=1.0f)
Definition time.cpp.hpp:11
#define FL_WARN(X)
Definition log.h:276
Centralized logging categories for FastLED hardware interfaces and subsystems.
Base definition for an LED controller.
Definition crgb.hpp:179
#define FL_NOEXCEPT