Initial standalone track core
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
#include "track_core/memory_strip.hpp"
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
namespace track_core {
|
||||
|
||||
MemoryStrip::MemoryStrip(std::size_t led_count)
|
||||
: pixels_(led_count, Color::black()) {}
|
||||
|
||||
TrackError MemoryStrip::begin() {
|
||||
if (pixels_.empty()) {
|
||||
return TrackError::invalid_size;
|
||||
}
|
||||
begun_ = true;
|
||||
return TrackError::ok;
|
||||
}
|
||||
|
||||
TrackError MemoryStrip::clear() {
|
||||
std::ranges::fill(pixels_, Color::black());
|
||||
return TrackError::ok;
|
||||
}
|
||||
|
||||
TrackError MemoryStrip::fill(std::size_t start, std::size_t count, Color color) {
|
||||
if (count == 0) {
|
||||
return TrackError::ok;
|
||||
}
|
||||
if (start >= pixels_.size()) {
|
||||
return TrackError::range;
|
||||
}
|
||||
|
||||
const auto available = pixels_.size() - start;
|
||||
const auto length = std::min(count, available);
|
||||
std::fill_n(pixels_.begin() + static_cast<std::ptrdiff_t>(start), length, color);
|
||||
return TrackError::ok;
|
||||
}
|
||||
|
||||
TrackError MemoryStrip::show() {
|
||||
++frame_sequence_;
|
||||
return TrackError::ok;
|
||||
}
|
||||
|
||||
TrackError MemoryStrip::set_leds_count(std::size_t count) {
|
||||
if (count == 0) {
|
||||
return TrackError::invalid_arg;
|
||||
}
|
||||
pixels_.assign(count, Color::black());
|
||||
return TrackError::ok;
|
||||
}
|
||||
|
||||
std::size_t MemoryStrip::leds_count() const {
|
||||
return pixels_.size();
|
||||
}
|
||||
|
||||
std::uint64_t MemoryStrip::frame_sequence() const {
|
||||
return frame_sequence_;
|
||||
}
|
||||
|
||||
std::span<const Color> MemoryStrip::pixels() const {
|
||||
return pixels_;
|
||||
}
|
||||
|
||||
TrackError apply_render_plan(MemoryStrip &strip, const TrackRenderPlan &plan) {
|
||||
for (std::size_t i = 0; i < plan.span_count; ++i) {
|
||||
const auto &span = plan.spans[i];
|
||||
if (const auto err = strip.fill(span.start_led, span.led_count, span.color); err != TrackError::ok) {
|
||||
return err;
|
||||
}
|
||||
}
|
||||
return TrackError::ok;
|
||||
}
|
||||
|
||||
} // namespace track_core
|
||||
Reference in New Issue
Block a user