рефакторинг библиотеки.
This commit is contained in:
+44
-44
@@ -1,8 +1,11 @@
|
||||
// examples/clock_ru.rs
|
||||
//! Показывает локальные дату, время, день недели и часть суток с обновлением раз в секунду.
|
||||
|
||||
mod common;
|
||||
|
||||
use anyhow::Result;
|
||||
use std::time::{Duration, SystemTime, UNIX_EPOCH};
|
||||
|
||||
use m::vfd::VfdConfig;
|
||||
use m::vfd::fit_to_width;
|
||||
use m::worker::VfdWorker;
|
||||
|
||||
fn run_date(args: &[&str]) -> Option<String> {
|
||||
@@ -16,16 +19,19 @@ fn run_date(args: &[&str]) -> Option<String> {
|
||||
Some(String::from_utf8_lossy(&out.stdout).trim().to_string())
|
||||
}
|
||||
|
||||
fn local_datetime_ddmmyyyy_hhmmss() -> String {
|
||||
// 28.01.2006 12:03:34
|
||||
run_date(&["+%d.%m.%Y %H:%M:%S"]).unwrap_or_else(|| "??.??.???? ??:??:??".to_string())
|
||||
fn parse_datetime_and_weekday(value: &str) -> Option<(String, u8)> {
|
||||
let (datetime, weekday) = value.split_once('|')?;
|
||||
let weekday = weekday.parse::<u8>().ok()?;
|
||||
(1..=7)
|
||||
.contains(&weekday)
|
||||
.then(|| (datetime.to_string(), weekday))
|
||||
}
|
||||
|
||||
fn local_weekday_num_1_7() -> u8 {
|
||||
// 1..7 (Mon..Sun)
|
||||
run_date(&["+%u"])
|
||||
.and_then(|s| s.parse::<u8>().ok())
|
||||
.unwrap_or(1)
|
||||
fn local_datetime_and_weekday() -> (String, u8) {
|
||||
run_date(&["+%d.%m.%Y %H:%M:%S|%u"])
|
||||
.as_deref()
|
||||
.and_then(parse_datetime_and_weekday)
|
||||
.unwrap_or_else(|| ("??.??.???? ??:??:??".to_string(), 1))
|
||||
}
|
||||
|
||||
fn weekday_ru_full(n: u8) -> &'static str {
|
||||
@@ -74,51 +80,22 @@ fn extract_hour(datetime: &str) -> u8 {
|
||||
.unwrap_or(12)
|
||||
}
|
||||
|
||||
fn fit_to_width(s: &str, width: usize) -> String {
|
||||
// простое “обрезать по символам”, чтобы кириллицу не порвать
|
||||
let mut out = String::new();
|
||||
for (i, ch) in s.chars().enumerate() {
|
||||
if i >= width {
|
||||
break;
|
||||
}
|
||||
out.push(ch);
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
fn main() -> Result<()> {
|
||||
// args:
|
||||
// 1) port (default: /dev/cu.usbmodem101)
|
||||
// 2) width (default: 20)
|
||||
// 3) brightness 1..4 (default: 2)
|
||||
let port_name = std::env::args()
|
||||
.nth(1)
|
||||
.unwrap_or("/dev/cu.usbmodem101".into());
|
||||
|
||||
let width: usize = std::env::args()
|
||||
.nth(2)
|
||||
.as_deref()
|
||||
.unwrap_or("20")
|
||||
.parse()
|
||||
.unwrap_or(20);
|
||||
|
||||
let brightness: u8 = std::env::args()
|
||||
.nth(3)
|
||||
.as_deref()
|
||||
.unwrap_or("2")
|
||||
.parse()
|
||||
.unwrap_or(2);
|
||||
|
||||
let cfg = VfdConfig::new(port_name).with_width(width);
|
||||
let worker = VfdWorker::start(cfg)?;
|
||||
let mut args = common::ExampleArgs::from_env();
|
||||
let brightness: u8 = args.parse_or(2);
|
||||
let width = args.width;
|
||||
let worker = VfdWorker::start(args.config)?;
|
||||
let vfd = worker.handle();
|
||||
|
||||
vfd.clear();
|
||||
vfd.set_brightness(brightness);
|
||||
|
||||
loop {
|
||||
let dt = local_datetime_ddmmyyyy_hhmmss();
|
||||
let wd = local_weekday_num_1_7();
|
||||
let (dt, wd) = local_datetime_and_weekday();
|
||||
let hour = extract_hour(&dt);
|
||||
let tod = time_of_day_ru(hour);
|
||||
|
||||
@@ -148,3 +125,26 @@ fn main() -> Result<()> {
|
||||
std::thread::sleep(Duration::from_millis(ms_to_next));
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn parses_date_and_weekday_from_one_process_result() {
|
||||
assert_eq!(
|
||||
parse_datetime_and_weekday("15.08.2026 23:59:58|6"),
|
||||
Some(("15.08.2026 23:59:58".to_string(), 6))
|
||||
);
|
||||
assert_eq!(parse_datetime_and_weekday("invalid"), None);
|
||||
assert_eq!(parse_datetime_and_weekday("15.08.2026 23:59:58|8"), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn classifies_hours_and_extracts_them_safely() {
|
||||
assert_eq!(extract_hour("15.08.2026 05:00:00"), 5);
|
||||
assert_eq!(extract_hour("invalid"), 12);
|
||||
assert_eq!(time_of_day_ru(5), "утро");
|
||||
assert_eq!(time_of_day_ru(23), "ночь");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user