worked on ui
This commit is contained in:
parent
04ba63fef3
commit
4361508419
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -1,3 +1,5 @@
|
|||
/target
|
||||
/src-tauri
|
||||
/dist
|
||||
/cache
|
||||
/.zed
|
||||
|
|
|
|||
4376
Cargo.lock
generated
4376
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
|
@ -9,4 +9,10 @@ serial = "0.4.0"
|
|||
reqwest = { version = "0.12.23", features = ["json"] }
|
||||
serde_json = "1.0.145"
|
||||
tokio = { version = "1.47.1", features = ["full"] }
|
||||
serde = { version = "1.0.227", features = ["derive"] }
|
||||
serde = { version = "1.0.228", features = ["derive"] }
|
||||
eframe = "0.32.3"
|
||||
egui_extras = { version = "0.32.3", features = ["all_loaders"] }
|
||||
log = "0.4.28"
|
||||
env_logger = "0.11.8"
|
||||
image = "0.25.8"
|
||||
egui_commonmark = "0.21.1"
|
||||
|
|
|
|||
147
src/main.rs
147
src/main.rs
|
|
@ -1,12 +1,18 @@
|
|||
use eframe::egui;
|
||||
use eframe::egui::ImageSource;
|
||||
use log::*;
|
||||
use reqwest::Client;
|
||||
use serde::Deserialize;
|
||||
use serial::prelude::*;
|
||||
use std::env;
|
||||
use std::io;
|
||||
use std::fs::File;
|
||||
use std::io::{Cursor, copy};
|
||||
use std::str::from_utf8;
|
||||
use std::time::Duration;
|
||||
use std::{env, fs};
|
||||
use tokio;
|
||||
use tokio::runtime::Runtime;
|
||||
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, Clone)]
|
||||
struct BookData {
|
||||
title: String,
|
||||
authors: Vec<String>,
|
||||
|
|
@ -42,52 +48,62 @@ struct ImageLinks {
|
|||
smallThumbnail: Option<String>,
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
fn main() -> eframe::Result {
|
||||
env_logger::init();
|
||||
let options = eframe::NativeOptions {
|
||||
viewport: egui::ViewportBuilder::default().with_inner_size([320.0, 880.0]),
|
||||
..Default::default()
|
||||
};
|
||||
eframe::run_native(
|
||||
"Barcode Scanner",
|
||||
options,
|
||||
Box::new(|cc| {
|
||||
egui_extras::install_image_loaders(&cc.egui_ctx);
|
||||
Ok(Box::<BarcodeScanner>::default())
|
||||
}),
|
||||
)
|
||||
}
|
||||
|
||||
fn get_ean13_data() -> String {
|
||||
let args: Vec<String> = env::args().collect();
|
||||
let path_to_scanner = &args[1];
|
||||
let mut port = serial::open(path_to_scanner).unwrap();
|
||||
interact(&mut port).await.unwrap();
|
||||
interact(&mut port).to_string()
|
||||
}
|
||||
fn interact<T: SerialPort>(port: &mut T) -> String {
|
||||
port
|
||||
.reconfigure(&|settings| {
|
||||
settings.set_baud_rate(serial::Baud9600).unwrap();
|
||||
settings.set_char_size(serial::Bits8);
|
||||
settings.set_parity(serial::ParityNone);
|
||||
settings.set_stop_bits(serial::Stop1);
|
||||
settings.set_flow_control(serial::FlowNone);
|
||||
Ok(())
|
||||
})
|
||||
.unwrap();
|
||||
port.set_timeout(Duration::from_millis(1000000000)).unwrap();
|
||||
let buf: &mut [u8; 14] = &mut [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||
port.read_exact(buf).unwrap();
|
||||
let barcode_id = from_utf8(buf).unwrap();
|
||||
debug!("{}", &barcode_id);
|
||||
barcode_id.to_string()
|
||||
}
|
||||
|
||||
async fn interact<T: SerialPort>(port: &mut T) -> io::Result<()> {
|
||||
port.reconfigure(&|settings| {
|
||||
settings.set_baud_rate(serial::Baud9600)?;
|
||||
settings.set_char_size(serial::Bits8);
|
||||
settings.set_parity(serial::ParityNone);
|
||||
settings.set_stop_bits(serial::Stop1);
|
||||
settings.set_flow_control(serial::FlowNone);
|
||||
Ok(())
|
||||
})?;
|
||||
|
||||
port.set_timeout(Duration::from_millis(1000000000))?;
|
||||
loop {
|
||||
let buf: &mut [u8; 14] = &mut [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||
port.read_exact(buf).unwrap();
|
||||
let barcode_id = from_utf8(buf).unwrap();
|
||||
println!("{}", &barcode_id);
|
||||
if barcode_id.starts_with("978") {
|
||||
get_book_data(barcode_id.to_string()).await;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async fn get_book_data(isbn: String) {
|
||||
fn get_book_data(isbn: String) -> BookData {
|
||||
let runtime = tokio::runtime::Runtime::new().unwrap();
|
||||
let lookup_url = format!(
|
||||
"https://www.googleapis.com/books/v1/volumes?q=isbn:{}",
|
||||
isbn
|
||||
);
|
||||
let cleint = Client::new();
|
||||
let book_data = cleint
|
||||
.get(lookup_url)
|
||||
.send()
|
||||
.await
|
||||
let book_data = runtime
|
||||
.block_on(cleint.get(lookup_url).send())
|
||||
.unwrap()
|
||||
.json::<BookRoot>()
|
||||
.await
|
||||
.unwrap();
|
||||
.json::<BookRoot>();
|
||||
let book_data = runtime.block_on(book_data).unwrap();
|
||||
let book_metadata: Vec<BookData> = book_data.items.into_iter().map(BookData::from).collect();
|
||||
println!("{}", &book_metadata[0]);
|
||||
return book_metadata[0].clone();
|
||||
}
|
||||
|
||||
impl From<Item> for BookData {
|
||||
|
|
@ -106,6 +122,16 @@ impl From<Item> for BookData {
|
|||
}
|
||||
}
|
||||
}
|
||||
impl BookData {
|
||||
fn new() -> BookData {
|
||||
BookData {
|
||||
title: "Unknown".to_string(),
|
||||
authors: vec!["Unknown".to_string()],
|
||||
thumbnail: "https://www.rust-lang.org/logos/rust-logo-512x512.png".to_string(),
|
||||
description: "No description available".to_string(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl std::fmt::Display for BookData {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
|
|
@ -127,3 +153,52 @@ impl std::fmt::Display for BookData {
|
|||
)
|
||||
}
|
||||
}
|
||||
fn get_thumbnail(url: String) {
|
||||
let runtime = Runtime::new().unwrap();
|
||||
let url = if url.is_empty() {
|
||||
"https://www.rust-lang.org/logos/rust-logo-512x512.png".to_string()
|
||||
} else {
|
||||
url
|
||||
};
|
||||
|
||||
fs::create_dir_all("cache").unwrap();
|
||||
let mut dest = File::create("cache/image.jpeg").unwrap();
|
||||
let image = runtime.block_on(reqwest::get(url)).unwrap();
|
||||
let bytes = runtime.block_on(image.bytes()).unwrap();
|
||||
let mut output = Cursor::new(bytes);
|
||||
copy(&mut output, &mut dest).unwrap();
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
struct BarcodeScanner {}
|
||||
|
||||
impl eframe::App for BarcodeScanner {
|
||||
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) -> () {
|
||||
egui_extras::install_image_loaders(ctx);
|
||||
egui::CentralPanel::default().show(ctx, |ui| {
|
||||
ui.heading("Barcode Scanner");
|
||||
ui.group(|ui| {
|
||||
//loop {
|
||||
let barcode = get_ean13_data();
|
||||
ui.label(format!("EAN13: {}", barcode));
|
||||
let book_metadata = if barcode.starts_with("978") {
|
||||
get_book_data(barcode)
|
||||
} else {
|
||||
BookData::new()
|
||||
};
|
||||
get_thumbnail(book_metadata.thumbnail.clone());
|
||||
ui.label(format!("Title: {}", book_metadata.title));
|
||||
ui.label(format!("Description: {}", book_metadata.description));
|
||||
ui.label(format!("Authors: {:?}", book_metadata.authors));
|
||||
if !book_metadata.thumbnail.is_empty() {
|
||||
ui.image(egui::ImageSource::Uri(book_metadata.thumbnail.into()))
|
||||
} else {
|
||||
ui.image(egui::ImageSource::Uri(std::borrow::Cow::Borrowed(
|
||||
"https://www.rust-lang.org/logos/rust-logo-512x512.png",
|
||||
)))
|
||||
}
|
||||
// }
|
||||
})
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue