FastLED 3.10.8
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 FL_NO_EXCEPT : mLastRealTime(realTimeNow), mStartTime(realTimeNow),
13 mTimeScale(initialTimeScale) {}
14
16
18
19float TimeWarp::scale() const FL_NO_EXCEPT { return mTimeScale; }
20
21void TimeWarp::pause(fl::u32 now) FL_NO_EXCEPT {
22 if (mPauseTime) {
23 FL_WARN("TimeWarp::pause: already paused");
24 return;
25 }
26 mPauseTime = now;
27}
28void TimeWarp::resume(fl::u32 now) FL_NO_EXCEPT {
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) FL_NO_EXCEPT {
40 applyExact(timeNow);
41 return time();
42}
43
44fl::u32 TimeWarp::time() const FL_NO_EXCEPT { return mRelativeTime; }
45
46void TimeWarp::reset(fl::u32 realTimeNow) FL_NO_EXCEPT {
47 mLastRealTime = realTimeNow;
48 mStartTime = realTimeNow;
49 mRelativeTime = 0;
50}
51
52void TimeWarp::applyExact(fl::u32 timeNow) FL_NO_EXCEPT {
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:72
void setScale(float speed) FL_NO_EXCEPT FASTLED_DEPRECATED("Use setSpeed(...) instead.")
Definition time.cpp.hpp:95
void applyExact(fl::u32 timeNow) FL_NO_EXCEPT
Definition time.cpp.hpp:52
TimeWarp(fl::u32 realTimeNow=0, float initialTimeScale=1.0f) FL_NO_EXCEPT
Definition time.cpp.hpp:11
float scale() const FL_NO_EXCEPT
Definition time.cpp.hpp:19
fl::u32 mPauseTime
Definition time.h:51
float mTimeScale
Definition time.h:50
~TimeWarp() FL_NO_EXCEPT
Definition time.cpp.hpp:15
void setSpeed(float speedScale) FL_NO_EXCEPT
Definition time.cpp.hpp:17
fl::u32 mLastRealTime
Definition time.h:47
void pause(fl::u32 now) FL_NO_EXCEPT
Definition time.cpp.hpp:21
fl::u32 update(fl::u32 timeNow) FL_NO_EXCEPT override
Definition time.cpp.hpp:39
fl::u32 time() const FL_NO_EXCEPT override
Definition time.cpp.hpp:44
void reset(fl::u32 realTimeNow) FL_NO_EXCEPT override
Definition time.cpp.hpp:46
fl::u32 mStartTime
Definition time.h:48
fl::u32 mRelativeTime
Definition time.h:49
void resume(fl::u32 now) FL_NO_EXCEPT
Definition time.cpp.hpp:28
#define FL_WARN(...)
Definition log.h:437
Centralized logging categories for FastLED hardware interfaces and subsystems.
u8 u8 fract8 blur_amount FL_NO_EXCEPT
Definition blur.h:186
fl::u64 time() FL_NO_EXCEPT
Alias for millis64() - returns 64-bit millisecond time.
Definition chrono.h:346
Base definition for an LED controller.
Definition crgb.hpp:179