[−][src]Struct charlcd::Screen
A screen that allows you to send commands to a charlcd driver (or whatever
that implements the Write
trait).
Simple example
use charlcd::Screen; use std::io::Write; fn main() -> std::io::Result<()> { let mut screen = Screen::default()?; // will use "/dev/lcd" charlcd driver screen.clear()?; screen.write(b"hello, world!")?; screen.flash_backlight()?; screen.flush()?; // send all the previous commands to the driver at once Ok(()) }
Methods
impl<T> Screen<T> where
T: Write,
[src]
T: Write,
pub fn new(writer: T) -> Screen<T>
[src]
pub fn kill_eol(&mut self) -> Result<()>
[src]
Clean the rest of the current line, from current cursor position.
Example
use std::io::Write; use charlcd::Screen; fn main() -> std::io::Result<()> { let mut screen = Screen::default()?; for _ in 1..5 { screen.write(b"test")?; } for _ in 1..8 { screen.back()?; } screen.flush()?; // before screen.kill_eol()?; screen.flush()?; // after Ok(()) }
Live footage (before and after)
pub fn reinit(&mut self) -> Result<()>
[src]
Reinitialize the display to its default hardware values.
Example
use std::io::Write; use charlcd::Screen; fn main() -> std::io::Result<()> { let mut screen = Screen::default()?; for _ in 1..20 { screen.write(b"test")?; } screen.flush()?; // before screen.reinit()?; screen.flush()?; // after Ok(()) }
Live footage (before and after)
Note: we observe that the cursor and blink are activated after a call
to Screen::reinit()
, although the Screen::blink_on()
and
Screen::cursor_on()
methods are not called in this function. We
can deduce it is a hardware default to put back the blink and cursor on
at initialization.
You may want to disable them after a call to this function by using the
Screen::blink_off()
and Screen::cursor_off()
functions.
pub fn display_off(&mut self) -> Result<()>
[src]
Disable the display.
The displayed content is not lost and kept into the screen buffer. Call
Screen::display_on()
to display back what was printed to the screen.
Example
use std::io::Write; use charlcd::Screen; fn main() -> std::io::Result<()> { let mut screen = Screen::default()?; for _ in 1..20 { screen.write(b"test")?; } screen.flush()?; // before screen.display_off()?; screen.flush()?; // after Ok(()) }
Live footage (before and after)
pub fn display_on(&mut self) -> Result<()>
[src]
Enable the display.
The content of the screen buffer will be displayed back with no change.
Example
use std::io::Write; use charlcd::Screen; fn main() -> std::io::Result<()> { let mut screen = Screen::default()?; for _ in 1..20 { screen.write(b"test")?; } screen.flush()?; screen.display_off()?; screen.flush()?; // before screen.display_on()?; screen.flush()?; // after Ok(()) }
Live footage (before and after)
pub fn cursor_on(&mut self) -> Result<()>
[src]
Enable the underscore cursor (independent of blinking cursor).
Example
use std::io::Write; use charlcd::Screen; fn main() -> std::io::Result<()> { let mut screen = Screen::default()?; screen.write(b"test")?; screen.flush()?; // before screen.cursor_on()?; screen.flush()?; // after Ok(()) }
Live footage (before and after)
pub fn cursor_off(&mut self) -> Result<()>
[src]
Disable the underscore cursor (independent of blinking cursor).
Example
use std::io::Write; use charlcd::Screen; fn main() -> std::io::Result<()> { let mut screen = Screen::default()?; screen.write(b"test")?; screen.cursor_on()?; screen.flush()?; // before screen.cursor_off()?; screen.flush()?; // after Ok(()) }
Live footage (before and after)
pub fn blink_on(&mut self) -> Result<()>
[src]
Enable the blinking cursor (independent of underscore cursor).
Example
use std::io::Write; use charlcd::Screen; fn main() -> std::io::Result<()> { let mut screen = Screen::default()?; screen.write(b"test")?; screen.flush()?; // before screen.blink_on()?; screen.flush()?; // after Ok(()) }
Live footage (before and after)
Note: due to long exposure duration of the camera (1 second), the blinking cursor appears dim in the footage.
pub fn blink_off(&mut self) -> Result<()>
[src]
Disable the blinking cursor (independent of underscore cursor).
Example
use std::io::Write; use charlcd::Screen; fn main() -> std::io::Result<()> { let mut screen = Screen::default()?; screen.write(b"test")?; screen.blink_on()?; screen.flush()?; // before screen.blink_off()?; screen.flush()?; // after Ok(()) }
Live footage (before and after)
pub fn backlight_on(&mut self) -> Result<()>
[src]
Enable the backlight.
Example
use std::io::Write; use charlcd::Screen; fn main() -> std::io::Result<()> { let mut screen = Screen::default()?; screen.write(b"test")?; screen.backlight_off()?; screen.flush()?; // before screen.backlight_on()?; screen.flush()?; // after Ok(()) }
Note: due to poor light conditions, it is not easy to illustrate the before and after steps with a photography. The backlight term should be straightforward to understand so that a picture is not needed afterall.
pub fn backlight_off(&mut self) -> Result<()>
[src]
Disable the backlight.
Example
use std::io::Write; use charlcd::Screen; fn main() -> std::io::Result<()> { let mut screen = Screen::default()?; screen.write(b"test")?; screen.backlight_on()?; screen.flush()?; // before screen.backlight_off()?; screen.flush()?; // after Ok(()) }
Note: due to poor light conditions, it is not easy to illustrate the before and after steps with a photography. The backlight term should be straightforward to understand so that a picture is not needed afterall.
pub fn flash_backlight(&mut self) -> Result<()>
[src]
Flash the backlight during a small duration.
The exact duration is specified in the driver. As of today, the default
value is set to 4 seconds (see the LCD_BL_TEMPO_PERIOD
define of
the charlcd.c
driver in your Linux tree).
Example
use std::io::Write; use charlcd::Screen; fn main() -> std::io::Result<()> { let mut screen = Screen::default()?; screen.write(b"test")?; screen.backlight_off()?; screen.flush()?; // before screen.flash_backlight()?; screen.flush()?; // after // after some time, the screen backlight goes off by itself Ok(()) }
Note: due to poor light conditions, it is not easy to illustrate the before and after steps with a photography. The backlight term should be straightforward to understand so that a picture is not needed afterall.
pub fn clear(&mut self) -> Result<()>
[src]
Clear the screen and return the cursor at original (0, 0) XY position.
Example
use std::io::Write; use charlcd::Screen; fn main() -> std::io::Result<()> { let mut screen = Screen::default()?; screen.reinit()?; screen.write(b"test")?; screen.flush()?; // before screen.clear()?; screen.flush()?; // after Ok(()) }
Live footage (before and after)
pub fn back(&mut self) -> Result<()>
[src]
Move the cursor back one character, and delete the character at this position.
This is an utility function that will send the raw byte value for the
'\b'
escape sequence. This sequence is valid in C, but is not
available in Rust.
Example
use std::io::Write; use charlcd::Screen; fn main() -> std::io::Result<()> { let mut screen = Screen::default()?; screen.reinit()?; screen.write(b"test")?; screen.flush()?; // before screen.back()?; screen.flush()?; // after Ok(()) }
Live footage (before and after)
pub fn shift_cursor_left(&mut self) -> Result<()>
[src]
Shift cursor left.
Example
use std::io::Write; use charlcd::Screen; fn main() -> std::io::Result<()> { let mut screen = Screen::default()?; screen.reinit()?; screen.write(b"test")?; screen.flush()?; // before screen.shift_cursor_left()?; screen.flush()?; // after Ok(()) }
Live footage (before and after)
pub fn shift_cursor_right(&mut self) -> Result<()>
[src]
Shift cursor right.
Example
use std::io::Write; use charlcd::Screen; fn main() -> std::io::Result<()> { let mut screen = Screen::default()?; screen.reinit()?; screen.write(b"test")?; screen.flush()?; // before screen.shift_cursor_right()?; screen.flush()?; // after Ok(()) }
Live footage (before and after)
pub fn shift_display_left(&mut self) -> Result<()>
[src]
Shift display left.
Example
use std::io::Write; use charlcd::Screen; fn main() -> std::io::Result<()> { let mut screen = Screen::default()?; screen.reinit()?; for _ in 1..5 { screen.write(b"test")?; } screen.flush()?; // before screen.shift_display_left()?; screen.flush()?; // after Ok(()) }
Live footage (before and after)
Note: we can observe that the shift will create an artefact on the n+2 line, as the extra characters will be shifted there.
pub fn shift_display_right(&mut self) -> Result<()>
[src]
Shift display right.
Example
use std::io::Write; use charlcd::Screen; fn main() -> std::io::Result<()> { let mut screen = Screen::default()?; screen.reinit()?; for _ in 1..5 { screen.write(b"test")?; } screen.flush()?; // before screen.shift_display_right()?; screen.flush()?; // after Ok(()) }
Live footage (before and after)
Note: we can observe that the shift will create an artefact on the n+2 line, as the extra characters will be shifted there.
pub fn one_line(&mut self) -> Result<()>
[src]
Enable one line mode.
Example
use std::io::Write; use charlcd::Screen; fn main() -> std::io::Result<()> { let mut screen = Screen::default()?; screen.reinit()?; for _ in 1..20 { screen.write(b"test")?; } screen.flush()?; // before screen.one_line()?; screen.flush()?; // after Ok(()) }
Live footage (before and after)
We can see that the screen seems to disable power for the second and fourth line of the display (in case of a 4 lines one). Cutting the power for half the screen means that the contrast adjustment will not be correct anymore, as the screen uses less power by managing only half of the characters.
A manual recalibration of the contrast will be necessary if you change
between Screen::one_line()
and Screen::two_lines()
modes.
pub fn two_lines(&mut self) -> Result<()>
[src]
Enable two lines mode.
Example
use std::io::Write; use charlcd::Screen; fn main() -> std::io::Result<()> { let mut screen = Screen::default()?; screen.reinit()?; for _ in 1..20 { screen.write(b"test")?; } screen.one_line()?; screen.flush()?; // before screen.two_lines()?; screen.flush()?; // after Ok(()) }
Live footage (before and after)
This will mess up the screen if coming from Screen::one_line()
mode.
A manual recalibration of the contrast will be necessary if you change
between Screen::one_line()
and Screen::two_lines()
modes.
pub fn small_font(&mut self) -> Result<()>
[src]
Enable small font mode.
Note: this function seems to have no effect on the screen after tests with multiple screen variants. No relevant footage available.
pub fn large_font(&mut self) -> Result<()>
[src]
Enable big font mode.
Note: this function seems to have no effect on the screen after tests with multiple screen variants. No relevant footage available.
pub fn custom_char(&mut self, code: u8, value: [u8; 8]) -> Result<()>
[src]
Store a custom character into the screen memory for future usage.
See also custom_char
module for a global explanation on how to
declare custom characters, as well as a list of already defined custom
characters.
Example
use std::io::Write; use charlcd::{Screen, custom_char}; fn main() -> std::io::Result<()> { let mut screen = Screen::default()?; screen.reinit()?; // Store the custom ▸ character in the screen memory, code 0 screen.custom_char(0, custom_char::RIGHT_TRIANGLE)?; // Print custom character from screen memory, code 0 screen.write(b"\x00")?; screen.flush()?; Ok(()) }
pub fn gotoxy(&mut self, x: u32, y: u32) -> Result<()>
[src]
pub fn gotox(&mut self, x: u32) -> Result<()>
[src]
pub fn gotoy(&mut self, y: u32) -> Result<()>
[src]
impl Screen<BufWriter<File>>
[src]
pub fn from_dev_path(path: &Path) -> Result<Screen<BufWriter<File>>>
[src]
Create a Screen instance based on the passed path to the device.
pub fn default() -> Result<Screen<BufWriter<File>>>
[src]
Create a default Screen instance based on /dev/lcd
device driver
path.
pub fn width(&self) -> Result<u32>
[src]
Get the width of the screen, in number of characters it can display.
Example
use std::io::Write; use charlcd::Screen; fn main() -> std::io::Result<()> { let screen = Screen::default()?; // the screen is 20x4 in this test let width = screen.width()?; assert_eq!(width, 20); Ok(()) }
Important note
The implementation behind this function is currently a hack that will
go find the value in the auxdisplay
platform device tree node in
/sys/devices/platform/auxdisplay/of_node/*
. This is because the
charlcd
driver does not export the width
nor height
fields to
userspace.
In the future, this function may be able to read the value directly
from the /dev/lcd
device if a proper ioctl
or read
call is
implemented for this purpose.
pub fn height(&self) -> Result<u32>
[src]
Get the height of the screen, in number of characters it can display.
Example
use std::io::Write; use charlcd::Screen; fn main() -> std::io::Result<()> { let screen = Screen::default()?; // the screen is 20x4 in this test let height = screen.height()?; assert_eq!(height, 4); Ok(()) }
Important note
The implementation behind this function is currently a hack that will
go find the value in the auxdisplay
platform device tree node in
/sys/devices/platform/auxdisplay/of_node/*
. This is because the
charlcd
driver does not export the width
nor height
fields to
userspace.
In the future, this function may be able to read the value directly
from the /dev/lcd
device if a proper ioctl
or read
call is
implemented for this purpose.
Trait Implementations
impl<T> Write for Screen<T> where
T: Write,
[src]
T: Write,
fn write(&mut self, buf: &[u8]) -> Result<usize>
[src]
fn flush(&mut self) -> Result<()>
[src]
fn write_vectored(&mut self, bufs: &[IoSlice]) -> Result<usize, Error>
1.36.0[src]
fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>
1.0.0[src]
fn write_fmt(&mut self, fmt: Arguments) -> Result<(), Error>
1.0.0[src]
fn by_ref(&mut self) -> &mut Self
1.0.0[src]
Auto Trait Implementations
impl<T> RefUnwindSafe for Screen<T> where
T: RefUnwindSafe,
T: RefUnwindSafe,
impl<T> Send for Screen<T> where
T: Send,
T: Send,
impl<T> Sync for Screen<T> where
T: Sync,
T: Sync,
impl<T> Unpin for Screen<T> where
T: Unpin,
T: Unpin,
impl<T> UnwindSafe for Screen<T> where
T: UnwindSafe,
T: UnwindSafe,
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
impl<W> WriteBytesExt for W where
W: Write + ?Sized,
[src]
W: Write + ?Sized,
fn write_u8(&mut self, n: u8) -> Result<(), Error>
[src]
fn write_i8(&mut self, n: i8) -> Result<(), Error>
[src]
fn write_u16<T>(&mut self, n: u16) -> Result<(), Error> where
T: ByteOrder,
[src]
T: ByteOrder,
fn write_i16<T>(&mut self, n: i16) -> Result<(), Error> where
T: ByteOrder,
[src]
T: ByteOrder,
fn write_u24<T>(&mut self, n: u32) -> Result<(), Error> where
T: ByteOrder,
[src]
T: ByteOrder,
fn write_i24<T>(&mut self, n: i32) -> Result<(), Error> where
T: ByteOrder,
[src]
T: ByteOrder,
fn write_u32<T>(&mut self, n: u32) -> Result<(), Error> where
T: ByteOrder,
[src]
T: ByteOrder,
fn write_i32<T>(&mut self, n: i32) -> Result<(), Error> where
T: ByteOrder,
[src]
T: ByteOrder,
fn write_u48<T>(&mut self, n: u64) -> Result<(), Error> where
T: ByteOrder,
[src]
T: ByteOrder,
fn write_i48<T>(&mut self, n: i64) -> Result<(), Error> where
T: ByteOrder,
[src]
T: ByteOrder,
fn write_u64<T>(&mut self, n: u64) -> Result<(), Error> where
T: ByteOrder,
[src]
T: ByteOrder,
fn write_i64<T>(&mut self, n: i64) -> Result<(), Error> where
T: ByteOrder,
[src]
T: ByteOrder,
fn write_u128<T>(&mut self, n: u128) -> Result<(), Error> where
T: ByteOrder,
[src]
T: ByteOrder,
fn write_i128<T>(&mut self, n: i128) -> Result<(), Error> where
T: ByteOrder,
[src]
T: ByteOrder,
fn write_uint<T>(&mut self, n: u64, nbytes: usize) -> Result<(), Error> where
T: ByteOrder,
[src]
T: ByteOrder,
fn write_int<T>(&mut self, n: i64, nbytes: usize) -> Result<(), Error> where
T: ByteOrder,
[src]
T: ByteOrder,
fn write_uint128<T>(&mut self, n: u128, nbytes: usize) -> Result<(), Error> where
T: ByteOrder,
[src]
T: ByteOrder,
fn write_int128<T>(&mut self, n: i128, nbytes: usize) -> Result<(), Error> where
T: ByteOrder,
[src]
T: ByteOrder,
fn write_f32<T>(&mut self, n: f32) -> Result<(), Error> where
T: ByteOrder,
[src]
T: ByteOrder,
fn write_f64<T>(&mut self, n: f64) -> Result<(), Error> where
T: ByteOrder,
[src]
T: ByteOrder,