From 05b4f35d52c53eff30ce96a8a534b4a7c80259ff Mon Sep 17 00:00:00 2001 From: Marto Date: Thu, 16 Jan 2025 22:10:18 +0100 Subject: [PATCH] fin --- Cargo.lock | 196 ++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 3 +- src/curl.rs | 72 +++++++++---------- src/main.rs | 16 ++--- src/serial.rs | 37 +++++++++- 5 files changed, 274 insertions(+), 50 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6b2b188..a9c6ec1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,8 +8,21 @@ version = "0.1.0" dependencies = [ "curl", "json", + "serialport", ] +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" + [[package]] name = "cc" version = "1.2.9" @@ -19,6 +32,28 @@ dependencies = [ "shlex", ] +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + [[package]] name = "curl" version = "0.4.47" @@ -49,6 +84,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "io-kit-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617ee6cf8e3f66f3b4ea67a4058564628cde41901316e19f559e14c7c72c5e7b" +dependencies = [ + "core-foundation-sys", + "mach2", +] + [[package]] name = "json" version = "0.12.4" @@ -61,6 +106,26 @@ version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +[[package]] +name = "libudev" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b324152da65df7bb95acfcaab55e3097ceaab02fb19b228a9eb74d55f135e0" +dependencies = [ + "libc", + "libudev-sys", +] + +[[package]] +name = "libudev-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" +dependencies = [ + "libc", + "pkg-config", +] + [[package]] name = "libz-sys" version = "1.1.21" @@ -73,6 +138,26 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "mach2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +dependencies = [ + "libc", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", +] + [[package]] name = "openssl-probe" version = "0.1.5" @@ -97,6 +182,24 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +[[package]] +name = "proc-macro2" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +dependencies = [ + "proc-macro2", +] + [[package]] name = "schannel" version = "0.1.27" @@ -106,6 +209,31 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serialport" +version = "4.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ecfc4858c2266c7695d8b8460bbd612fa81bd2e250f5f0dd16195e4b4f8b3d8" +dependencies = [ + "bitflags 2.8.0", + "cfg-if", + "core-foundation", + "core-foundation-sys", + "io-kit-sys", + "libudev", + "mach2", + "nix", + "scopeguard", + "unescaper", + "winapi", +] + [[package]] name = "shlex" version = "1.3.0" @@ -122,12 +250,80 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "syn" +version = "2.0.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unescaper" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c878a167baa8afd137494101a688ef8c67125089ff2249284bd2b5f9bfedb815" +dependencies = [ + "thiserror", +] + +[[package]] +name = "unicode-ident" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" + [[package]] name = "vcpkg" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "windows-sys" version = "0.52.0" diff --git a/Cargo.toml b/Cargo.toml index 129c4a1..c354ff5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,4 +5,5 @@ edition = "2021" [dependencies] json = "0.12.4" -curl = "0.4.47" \ No newline at end of file +curl = "0.4.47" +serialport = "4.7.0" \ No newline at end of file diff --git a/src/curl.rs b/src/curl.rs index 26e1aa1..21a90fc 100644 --- a/src/curl.rs +++ b/src/curl.rs @@ -1,58 +1,52 @@ +use std::collections; use std::io::Read; -use std::string::String; -use std::collections::HashMap; -use curl::easy::{Easy, List}; -pub fn request(auth: HashMap) -> u32 { +pub fn startup(auth: &collections::HashMap) -> (curl::easy::Easy, String) { let url = auth.get("ha_url").expect("[ERROR] Failed to read the URL").as_str(); - + // escape character for { is {{ and for } is }} let entity_id = auth.get("light_entity_id").expect("[ERROR] Failed to read the entity id").as_str(); - let body = format!("{{\"entity_id\": {entity_id}}}"); - let mut data = body.as_bytes(); + let data = format!("{{\"entity_id\": {entity_id}}}"); let token = auth.get("access_token").expect("[ERROR] Failed to read the token").as_str(); let auth = format!("Authorization: Bearer {}", &token[1..token.len()-1]); - - let mut list = List::new(); + + let mut list = curl::easy::List::new(); list.append(&auth).unwrap(); list.append("Content-Type: application/json").unwrap(); - - let mut request = Easy::new(); - // proper error handling - - request.url(&url[1..url.len()-1]).unwrap_or_else(|e| { - panic!("[ERROR] Failed to set the URL for the CURL request:\n{e}"); - }); - - request.post(true).unwrap_or_else(|e| { - panic!("[ERROR] Failed to set the CURL request as POST:\n{e}"); - }); - - request.http_headers(list).unwrap_or_else(|e| { - panic!("[ERROR] Failed to apply HTTP headers:\n{e}"); - }); - request.post_field_size(data.len() as u64).unwrap_or_else(|e| { - panic!("[ERROR] Failed to set the POST field size for CURL request:\n{e}"); - }); + let mut request = curl::easy::Easy::new(); + + request.url(&url[1..url.len()-1]).expect("[ERROR] Failed to set the URL for the CURL request"); + request.post(true).expect("[ERROR] Failed to set the CURL request as POST"); + request.http_headers(list).expect("ERROR] Failed to apply HTTP headers"); + request.post_field_size(data.len() as u64).expect("[ERROR] Failed to set the POST field size for CURL request"); + + (request, data) +} +pub fn request(request: &mut curl::easy::Easy, data: &str) -> Option { let mut transfer = request.transfer(); - transfer.read_function(|buf| { - Ok(data.read(buf).unwrap_or(0)) - }).unwrap_or_else(|e| { - panic!("[ERROR] Failed to read the data:\n{e}"); - }); - - transfer.perform().unwrap_or_else(|e| { - panic!("[ERROR] Failed to perform the CURL request:\n{e}"); - }); + if let Err(e) = transfer.read_function(|buf| { + Ok(data.as_bytes().read(buf).unwrap_or(0)) + }) { + eprintln!("[ERROR] Failed to read the data:\n{e}"); + return None; + } + + if let Err(e) = transfer.perform() { + eprintln!("[ERROR] Failed to perform the CURL request:\n{e}"); + return None; + } // drop transfer so we can access request.response_code below drop(transfer); - + match request.response_code() { - Ok(t) => t, - Err(e) => panic!("[ERROR] Failed to retrieve the response code:\n{e}"), + Ok(t) => Some(t), + Err(e) => { + eprintln!("[ERROR] Failed to retrieve the response code:\n{e}"); + None + }, } } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 41b9182..5ff3553 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,15 +1,15 @@ -use std::path::Path; +use crate::curl::startup; + mod json; mod curl; mod serial; -fn main() { - let data_file = Path::new("data.json"); +fn main() { + let data_file = std::path::Path::new("data.json"); let data = json::get_json(data_file); - // some loop for getting data from arduino - - // send curl request - let res = curl::request(data); - println!("Response code: {res}\n"); + let req; + let dt; + (req, dt) = startup(&data); + serial::read_messages(req, &dt); } diff --git a/src/serial.rs b/src/serial.rs index 734044b..8c50938 100644 --- a/src/serial.rs +++ b/src/serial.rs @@ -1,3 +1,36 @@ -fn get_port() {} +use std::time::Duration; +use serialport::SerialPortInfo; -fn read_messages() {} \ No newline at end of file +fn get_port(ports: Vec) -> Option { + for p in ports { + if p.port_name.contains("ttyACM") { + return Some(p); + } + } + + None +} + +pub fn read_messages(mut request: curl::easy::Easy, data: &str) { + let ports = serialport::available_ports().expect("No ports found!"); + let r = get_port(ports).unwrap().port_name; + let mut connection = serialport::new(r, 9600) + .timeout(Duration::from_millis(1000)) + .open().expect("Failed to open the port"); + + let mut serial_buf: Vec = vec![0; 1024]; + + loop { + match connection.read(serial_buf.as_mut_slice()) { + Ok(t) => { + let output = String::from_utf8_lossy(&serial_buf[..t]); + if output.contains("1") { + // send curl request + let res = crate::curl::request(&mut request, &data); + println!("Response code: {}", res.unwrap()); + } + }, + Err(_) => {} + } + } +} \ No newline at end of file