add Brightness::saturating_from

This commit is contained in:
Vinzenz Schroeter 2024-10-15 21:32:37 +02:00
parent 593a975d5c
commit 78a4d4dbcf
4 changed files with 33 additions and 8 deletions

View file

@ -25,10 +25,11 @@ fn main() {
); );
connection.send(command).expect("send failed"); connection.send(command).expect("send failed");
let max_brightness = usize::from(u8::from(Brightness::MAX)); let max_brightness: u8 = Brightness::MAX.into();
let mut brightnesses = BrightnessGrid::new(TILE_WIDTH, TILE_HEIGHT); let mut brightnesses = BrightnessGrid::new(TILE_WIDTH, TILE_HEIGHT);
for (index, byte) in brightnesses.data_ref_mut().iter_mut().enumerate() { for (index, byte) in brightnesses.data_ref_mut().iter_mut().enumerate() {
*byte = Brightness::try_from((index % max_brightness) as u8).unwrap(); let level = index as u8 % max_brightness;
*byte = Brightness::try_from(level).unwrap();
} }
connection connection

View file

@ -60,6 +60,17 @@ impl Brightness {
pub const MAX: Brightness = Brightness(11); pub const MAX: Brightness = Brightness(11);
/// lowest possible brightness value, 0 /// lowest possible brightness value, 0
pub const MIN: Brightness = Brightness(0); pub const MIN: Brightness = Brightness(0);
/// Create a brightness value without returning an error for brightnesses above [Brightness::MAX].
///
/// returns: the specified value as a [Brightness], or [Brightness::MAX].
pub fn saturating_from(value: u8) -> Brightness {
if value > Brightness::MAX.into() {
Brightness::MAX
} else {
Brightness(value)
}
}
} }
impl Default for Brightness { impl Default for Brightness {
@ -138,4 +149,10 @@ mod tests {
let actual = PrimitiveGrid::from(&grid); let actual = PrimitiveGrid::from(&grid);
assert_eq!(actual.data_ref(), &[11, 0, 11, 11]); assert_eq!(actual.data_ref(), &[11, 0, 11, 11]);
} }
#[test]
fn saturating_convert() {
assert_eq!(Brightness::MAX, Brightness::saturating_from(100));
assert_eq!(Brightness(5), Brightness::saturating_from(5));
}
} }

View file

@ -114,6 +114,18 @@ impl<T: PrimitiveGridType> PrimitiveGrid<T> {
/// Convert between PrimitiveGrid types. /// Convert between PrimitiveGrid types.
/// ///
/// See also [Iterator::map]. /// See also [Iterator::map].
///
/// # Examples
///
/// Use logic written for u8s and then convert to [Brightness] values for sending in a [Command].
/// ```
/// # fn foo(grid: &mut PrimitiveGrid<u8>) {}
/// # use servicepoint::{Brightness, BrightnessGrid, Command, Origin, PrimitiveGrid, TILE_HEIGHT, TILE_WIDTH};
/// let mut grid: PrimitiveGrid<u8> = PrimitiveGrid::new(TILE_WIDTH, TILE_HEIGHT);
/// foo(&mut grid);
/// let grid: BrightnessGrid = grid.map(Brightness::saturating_from);
/// let command = Command::CharBrightness(Origin::ZERO, grid);
/// ```
pub fn map<TConverted, F>(&self, f: F) -> PrimitiveGrid<TConverted> pub fn map<TConverted, F>(&self, f: F) -> PrimitiveGrid<TConverted>
where where
TConverted: PrimitiveGridType, TConverted: PrimitiveGridType,

View file

@ -21,14 +21,9 @@ use std::intrinsics::transmute;
/// SPCommand command = sp_command_char_brightness(grid); /// SPCommand command = sp_command_char_brightness(grid);
/// sp_connection_free(connection); /// sp_connection_free(connection);
/// ``` /// ```
#[derive(Clone)]
pub struct SPBrightnessGrid(pub(crate) servicepoint::BrightnessGrid); pub struct SPBrightnessGrid(pub(crate) servicepoint::BrightnessGrid);
impl Clone for SPBrightnessGrid {
fn clone(&self) -> Self {
SPBrightnessGrid(self.0.clone())
}
}
/// Creates a new [SPBrightnessGrid] with the specified dimensions. /// Creates a new [SPBrightnessGrid] with the specified dimensions.
/// ///
/// returns: [SPBrightnessGrid] initialized to 0. Will never return NULL. /// returns: [SPBrightnessGrid] initialized to 0. Will never return NULL.