use tiny_led_matrix::Render;
use crate::image::BitImage;
use crate::font;
use crate::scrolling::{Animate, ScrollingState, Scrollable};
#[derive(Default)]
#[derive(Copy, Clone)]
pub struct ScrollingStaticText {
message: &'static [u8],
state: ScrollingState,
}
impl ScrollingStaticText {
pub fn set_message(&mut self, message: &'static [u8]) {
self.message = message;
self.reset();
}
}
impl Scrollable for ScrollingStaticText {
type Subimage = BitImage;
fn length(&self) -> usize {
self.message.len()
}
fn state(&self) -> &ScrollingState {
&self.state
}
fn state_mut(&mut self) -> &mut ScrollingState {
&mut self.state
}
fn subimage(&self, index: usize) -> &BitImage {
font::character(self.message[index])
}
}
impl Render for ScrollingStaticText {
fn brightness_at(&self, x: usize, y: usize) -> u8 {
self.current_brightness_at(x, y)
}
}
#[derive(Copy, Clone)]
pub struct ScrollingBufferedText<const N: usize> {
length: usize,
message: [u8; N],
state: ScrollingState,
}
impl<const N: usize> ScrollingBufferedText<N> {
pub fn set_message(&mut self, message: &[u8]) {
assert!(message.len() <= N, "message too long");
self.length = message.len();
self.message[..self.length].copy_from_slice(message);
self.reset();
}
}
impl<const N: usize> Default for ScrollingBufferedText<N> {
fn default() -> ScrollingBufferedText<N> {
ScrollingBufferedText {
length: 0,
message: [0; N],
state: Default::default(),
}
}
}
impl<const N: usize> Scrollable for ScrollingBufferedText<N> {
type Subimage = BitImage;
fn length(&self) -> usize {
self.length
}
fn state(&self) -> &ScrollingState {
&self.state
}
fn state_mut(&mut self) -> &mut ScrollingState {
&mut self.state
}
fn subimage(&self, index: usize) -> &BitImage {
font::character(self.message[index])
}
}
impl<const N: usize> Render for ScrollingBufferedText<N> {
fn brightness_at(&self, x: usize, y: usize) -> u8 {
self.current_brightness_at(x, y)
}
}