#include "param_map.h" #include #include #include #include static inline uint8_t FloatToU8(float v) { v = std::clamp(v, 0.0f, 1.0f); return static_cast(std::lround(v * 255.0f)); } static inline int64_t NowNs() { return std::chrono::duration_cast( std::chrono::steady_clock::now().time_since_epoch()).count(); } void ParamMap::SetChannel(int led, int channel, float value01) { if (led < 0 || led >= 10) return; if (channel < 0 || channel >= 3) return; m_rgb[led * 3 + channel].store(FloatToU8(value01), std::memory_order_relaxed); } void ParamMap::SetBrightness(float value01) { m_bri.store(FloatToU8(value01), std::memory_order_relaxed); } void ParamMap::SnapshotFrame(std::array& dst) const { for (int i = 0; i < 30; ++i) { dst[i] = m_rgb[i].load(std::memory_order_relaxed); } } uint8_t ParamMap::SnapshotBri() const { return m_bri.load(std::memory_order_relaxed); } void ParamMap::MarkOscArrived() { m_lastOscNs.store(NowNs(), std::memory_order_relaxed); } int64_t ParamMap::NsSinceLastOsc() const { const int64_t last = m_lastOscNs.load(std::memory_order_relaxed); if (last == 0) return 0; // zero means "never received" — treat as fresh return NowNs() - last; }