FastLED 3.9.15
Loading...
Searching...
No Matches
time.cpp
Go to the documentation of this file.
1#include "fl/time.h"
2#include "fl/warn.h"
3
4// Platform-specific headers
5#if defined(__EMSCRIPTEN__)
6 // WASM platform - use existing timer implementation
7 #include <stdint.h> // ok include
8 extern "C" uint32_t millis(); // Defined in platforms/wasm/timer.cpp
9#elif defined(ESP32) || defined(ESP8266)
10 // ESP platforms - use Arduino millis()
11 #include <Arduino.h> // ok include
12#elif defined(__AVR__)
13 // AVR platforms - use Arduino millis()
14 #include <Arduino.h> // ok include
15#elif defined(FASTLED_ARM)
16 // ARM platforms - use Arduino millis()
17 #include <Arduino.h> // ok include
18#elif defined(FASTLED_STUB_IMPL)
19 // Stub platform - use existing stub implementation
20 #include <stdint.h> // ok include
21 extern "C" uint32_t millis(); // Defined in platforms/stub/generic/led_sysdefs_generic.hpp
22#elif defined(FASTLED_TESTING) || defined(__linux__) || defined(__APPLE__) || defined(_WIN32)
23 // Native platforms - use std::chrono
24 #include <chrono> // ok include
25 #include "fl/compiler_control.h"
26
29 static const auto start_time = std::chrono::steady_clock::now();
31#else
32 // Default fallback - assume Arduino-compatible millis() is available
33 #include <Arduino.h> // ok include
34#endif
35
36#ifdef FASTLED_TESTING
37 #include "fl/mutex.h"
38#endif
39
40namespace fl {
41
43
44#ifdef FASTLED_TESTING
45
46namespace {
47 // Thread-safe storage for injected time provider
48 fl::mutex& get_time_mutex() {
49 static fl::mutex mutex;
50 return mutex;
51 }
52
53 time_provider_t& get_time_provider() {
54 static time_provider_t provider;
55 return provider;
56 }
57}
58
59void inject_time_provider(const time_provider_t& provider) {
60 fl::lock_guard<fl::mutex> lock(get_time_mutex());
61 get_time_provider() = provider;
62}
63
64void clear_time_provider() {
65 fl::lock_guard<fl::mutex> lock(get_time_mutex());
66 get_time_provider() = time_provider_t{}; // Clear the function
67}
68
69// MockTimeProvider implementation
70MockTimeProvider::MockTimeProvider(fl::u32 initial_time)
71 : mCurrentTime(initial_time) {
72}
73
74void MockTimeProvider::advance(fl::u32 milliseconds) {
75 mCurrentTime += milliseconds;
76}
77
78void MockTimeProvider::set_time(fl::u32 milliseconds) {
79 mCurrentTime = milliseconds;
80}
81
82fl::u32 MockTimeProvider::current_time() const {
83 return mCurrentTime;
84}
85
86fl::u32 MockTimeProvider::operator()() const {
87 return mCurrentTime;
88}
89
90#endif // FASTLED_TESTING
91
93
94namespace {
95
99#if defined(__EMSCRIPTEN__)
100 // WASM platform - delegate to existing millis() implementation
101 return static_cast<fl::u32>(millis());
102
103#elif defined(ESP32) || defined(ESP8266)
104 // ESP platforms - use Arduino millis()
105 return static_cast<fl::u32>(millis());
106
107#elif defined(__AVR__)
108 // AVR platforms - use Arduino millis()
109 return static_cast<fl::u32>(millis());
110
111#elif defined(FASTLED_ARM)
112 // ARM platforms - use Arduino millis()
113 return static_cast<fl::u32>(millis());
114
115#elif defined(FASTLED_STUB_IMPL)
116 // Stub platform - delegate to existing stub millis() implementation
117 return static_cast<fl::u32>(millis());
118
119#elif defined(FASTLED_TESTING) || defined(__linux__) || defined(__APPLE__) || defined(_WIN32)
120 // Native platforms - use std::chrono with consistent start time
121 auto current_time = std::chrono::steady_clock::now();
122 auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(current_time - start_time);
123 return static_cast<fl::u32>(elapsed.count());
124
125#else
126 // Default fallback - assume Arduino-compatible millis() is available
127 return static_cast<fl::u32>(millis());
128
129#endif
130}
131
132} // anonymous namespace
133
135
136fl::u32 time() {
137#ifdef FASTLED_TESTING
138 // Check for injected time provider first
139 {
140 fl::lock_guard<fl::mutex> lock(get_time_mutex());
141 const auto& provider = get_time_provider();
142 if (provider) {
143 return provider();
144 }
145 }
146#endif
147
148 // Use platform-specific implementation
149 return get_platform_time();
150}
151
152} // namespace fl
#define FL_DISABLE_WARNING_GLOBAL_CONSTRUCTORS
#define FL_DISABLE_WARNING_PUSH
#define FL_DISABLE_WARNING_POP
Universal timing functions for FastLED.
fl::u32 get_platform_time()
Get platform-specific time in milliseconds This function contains all platform-specific timing code.
Definition time.cpp:98
MutexFake< void > mutex
Definition mutex.h:18
fl::u32 time()
Universal millisecond timer - returns milliseconds since system startup.
Definition time.cpp:136
IMPORTANT!
Definition crgb.h:20