eg_seven_segment/lib.rs
1//! `eg-seven-segment` is a seven-segment display text renderer for use with
2//! [`embedded-graphics`]. It can be used to display virtual seven-segment displays
3//! on any [`embedded-graphics`] [`DrawTarget`]. The appearance of the drawn digits
4//! can be configured to achieve a wide variety of styles.
5//!
6//! ![eg-seven-segment example][img1]
7//!
8//! # Examples
9//!
10//! The most convenient way to use this crate is by using the [`SevenSegmentStyle`] as a
11//! character style for an [`embedded-graphics`] [`Text`]:
12//!
13//! ```
14//! # fn main() -> Result<(), core::convert::Infallible> {
15//! use embedded_graphics::{prelude::*, text::Text, pixelcolor::Rgb888};
16//! use eg_seven_segment::SevenSegmentStyleBuilder;
17//! # use embedded_graphics::mock_display::MockDisplay;
18//! # let mut display = MockDisplay::new();
19//! # display.set_allow_out_of_bounds_drawing(true);
20//!
21//! // Define a new style.
22//! let style = SevenSegmentStyleBuilder::new()
23//! .digit_size(Size::new(10, 20)) // digits are 10x20 pixels
24//! .digit_spacing(5) // 5px spacing between digits
25//! .segment_width(5) // 5px wide segments
26//! .segment_color(Rgb888::GREEN) // active segments are green
27//! .build();
28//!
29//! // Use the style to draw text to a embedded-graphics `DrawTarget`.
30//! Text::new("12:42", Point::new(5, 25), style).draw(&mut display)?;
31//! # Ok(())
32//! # }
33//! ```
34//!
35//! Individual digits can also be drawn by using the [`Digit`] drawable:
36//!
37//! ```
38//! # fn main() -> Result<(), core::convert::Infallible> {
39//! use embedded_graphics::{prelude::*, text::Text, pixelcolor::Rgb888};
40//! use eg_seven_segment::{SevenSegmentStyleBuilder, Digit, Segments};
41//! # use embedded_graphics::mock_display::MockDisplay;
42//! # let mut display = MockDisplay::new();
43//! # display.set_allow_out_of_bounds_drawing(true);
44//!
45//! // Define a new style.
46//! let style = SevenSegmentStyleBuilder::new()
47//! .digit_size(Size::new(10, 20)) // digits are 10x20 pixels
48//! .digit_spacing(5) // 5px spacing between digits
49//! .segment_width(5) // 5px wide segments
50//! .segment_color(Rgb888::GREEN) // active segments are green
51//! .build();
52//!
53//! // Draw digit with active segment A at the origin.
54//! let next = Digit::new(Segments::A, Point::zero())
55//! .into_styled(style)
56//! .draw(&mut display)?;
57//!
58//! // Draw `0` digit the the right of the previous digit.
59//! Digit::new('0'.try_into().unwrap(), next)
60//! .into_styled(style)
61//! .draw(&mut display)?;
62//! # Ok(())
63//! # }
64//! ```
65//!
66//! <!-- README-LINKS
67//! [`embedded-graphics`]: https://docs.rs/embedded-graphics
68//! [`Text`]: https://docs.rs/embedded-graphics/latest/embeddded_graphics/text/struct.Text.html
69//! [`DrawTarget`]: https://docs.rs/embedded-graphics/latest/embeddded_graphics/draw_target/struct.DrawTarget.html
70//! [`SevenSegmentStyle`]: https://docs.rs/eg-seven-segment/latest/eg_seven_segment/struct.SevenSegmentStyle.html
71//! [`Digit`]: https://docs.rs/eg-seven-segment/latest/eg_seven_segment/struct.Digit.html
72//! [img1]: assets/styles.png
73//! README-LINKS -->
74//!
75//! [`embedded-graphics`]: embedded_graphics
76//! [`Text`]: embedded_graphics::text::Text
77//! [`DrawTarget`]: embedded_graphics::draw_target::DrawTarget
78#![doc = include_str!("../assets/styles.png_base64")]
79//
80#![no_std]
81#![deny(missing_docs)]
82#![deny(missing_debug_implementations)]
83#![deny(missing_copy_implementations)]
84#![deny(trivial_casts)]
85#![deny(trivial_numeric_casts)]
86#![deny(unsafe_code)]
87#![deny(unstable_features)]
88#![deny(unused_import_braces)]
89#![deny(unused_qualifications)]
90#![deny(rustdoc::broken_intra_doc_links)]
91#![deny(rustdoc::private_intra_doc_links)]
92
93mod digit;
94mod segment;
95mod segments;
96mod seven_segment_style;
97mod seven_segment_style_builder;
98
99pub use digit::Digit;
100pub use segments::Segments;
101pub use seven_segment_style::SevenSegmentStyle;
102pub use seven_segment_style_builder::SevenSegmentStyleBuilder;