add lcd-writer
This commit is contained in:
parent
fe616b76e0
commit
3bb22e568a
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
Cargo.lock
|
||||
target/
|
6
Cargo.toml
Normal file
6
Cargo.toml
Normal file
@ -0,0 +1,6 @@
|
||||
[workspace]
|
||||
resolver = "2"
|
||||
members = [
|
||||
"server",
|
||||
"lcd-writer",
|
||||
]
|
4
lcd-writer/.gitignore
vendored
Normal file
4
lcd-writer/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
target/
|
||||
Cargo.lock
|
||||
|
9
lcd-writer/Cargo.toml
Normal file
9
lcd-writer/Cargo.toml
Normal file
@ -0,0 +1,9 @@
|
||||
[package]
|
||||
name = "lcd-writer"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
linux-embedded-hal = "0.3.2"
|
85
lcd-writer/src/main.rs
Normal file
85
lcd-writer/src/main.rs
Normal file
@ -0,0 +1,85 @@
|
||||
use linux_embedded_hal::{
|
||||
i2cdev::{core::I2CDevice, linux::LinuxI2CError},
|
||||
I2cdev,
|
||||
};
|
||||
use std::{
|
||||
io::{self, stdin, stdout, BufRead, Write},
|
||||
path::Path,
|
||||
};
|
||||
|
||||
const C0: u8 = 7;
|
||||
const A0: u8 = 6;
|
||||
|
||||
#[allow(unused)]
|
||||
#[repr(u8)]
|
||||
enum LcdCommand {
|
||||
Clear = 1,
|
||||
ReturnHome = 2,
|
||||
DisplayOn = 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0,
|
||||
FunctionSet = 1 << 5 | 1 << 4 | 1 << 3,
|
||||
EntryModeSet = 1 << 2 | 1 << 1,
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
#[repr(u8)]
|
||||
enum ControlByte {
|
||||
Normal = 1 << C0,
|
||||
Last = 0 << C0,
|
||||
Data = 0 << C0 | 1 << A0,
|
||||
}
|
||||
|
||||
struct Lcd {
|
||||
bus: I2cdev,
|
||||
}
|
||||
|
||||
impl Lcd {
|
||||
pub fn new<P: AsRef<Path>>(path: P) -> Result<Self, LinuxI2CError> {
|
||||
let mut bus = I2cdev::new(path)?;
|
||||
let setup = [
|
||||
ControlByte::Last as u8,
|
||||
LcdCommand::FunctionSet as u8,
|
||||
LcdCommand::DisplayOn as u8,
|
||||
LcdCommand::EntryModeSet as u8,
|
||||
LcdCommand::Clear as u8,
|
||||
];
|
||||
bus.write(&setup)?;
|
||||
Ok(Self { bus })
|
||||
}
|
||||
|
||||
pub fn write(&mut self, value: &str) -> Result<(), LinuxI2CError> {
|
||||
let mut data = vec![ControlByte::Data as u8];
|
||||
data.extend(value.bytes());
|
||||
self.bus.write(&data)
|
||||
}
|
||||
|
||||
pub fn set_cursor(&mut self, col: u8, row: u8) -> Result<(), LinuxI2CError> {
|
||||
let pos = col | (row * 0x40) | 1 << 7;
|
||||
let data = vec![ControlByte::Last as u8, pos];
|
||||
self.bus.write(&data)
|
||||
}
|
||||
|
||||
pub fn clear(&mut self) -> Result<(), LinuxI2CError> {
|
||||
let data = vec![ControlByte::Last as u8, LcdCommand::Clear as u8];
|
||||
self.bus.write(&data)
|
||||
}
|
||||
}
|
||||
|
||||
fn main() -> io::Result<()> {
|
||||
let device = "/dev/i2c-21";
|
||||
println!("device = {device}");
|
||||
let mut lcd = Lcd::new(device)?;
|
||||
loop {
|
||||
print!("> ");
|
||||
stdout().lock().flush()?;
|
||||
let mut line = String::new();
|
||||
stdin().lock().read_line(&mut line)?;
|
||||
if line.starts_with("clear") {
|
||||
lcd.clear()?;
|
||||
lcd.set_cursor(0, 0)?;
|
||||
} else if line.starts_with("print") {
|
||||
lcd.write(&line[6..])?;
|
||||
} else {
|
||||
println!("unrecognized command \"{line}\"");
|
||||
}
|
||||
}
|
||||
}
|
1
server/.gitignore
vendored
1
server/.gitignore
vendored
@ -1,3 +1,4 @@
|
||||
|
||||
target/
|
||||
|
||||
Cargo.lock
|
||||
|
Loading…
Reference in New Issue
Block a user