diff options
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 70 |
1 files changed, 54 insertions, 16 deletions
diff --git a/src/main.rs b/src/main.rs index 134ee11..0a562ee 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,12 +3,13 @@ extern crate libc; extern crate raspi_rfm95_kiss; -use raspi_rfm95_kiss::rfm95::{RF95, Bandwidth, CodingRate, SpreadingFactor}; +use raspi_rfm95_kiss::rfm95::{RF95EventType, RF95, Bandwidth, CodingRate, SpreadingFactor, MAX_MTU}; +use raspi_rfm95_kiss::kiss::{KissDecoder, KissEncoder}; use std::fs::{OpenOptions, File}; use std::ffi::{CStr, CString}; use std::os::unix::io::AsRawFd; - -const MAX_MTU: usize = 251; +use std::thread; +use std::sync::{Arc, Mutex}; extern { fn kissattach( @@ -41,7 +42,7 @@ fn create_pts_pair() -> std::io::Result<File> { fn main() { eprintln!("Creating PTY pair"); - let master_file = match create_pts_pair() { + let mut master_file = match create_pts_pair() { Ok(fd) => fd, Err(e) => panic!("create_pts_pair failed: {}", e) }; @@ -61,7 +62,7 @@ fn main() { eprintln!("PTS slave: {:?}", slice); } - match RF95::new(Bandwidth::Bw250, CodingRate::Cr8, SpreadingFactor::Sf10) { + let radio = match RF95::new(Bandwidth::Bw250, CodingRate::Cr8, SpreadingFactor::Sf10) { Ok(mut radio) => { radio.reset().expect("radio reset"); @@ -71,13 +72,14 @@ fn main() { else { eprintln!("Cannot read device version"); } + radio }, Err(e) => panic!("Cannot create lora radio object, {}", e) }; let callsign = CString::new("HB9EGM-1").expect("Failed to convert callsign to CString"); let speed : i32 = 9600; - let mtu : i32 = 251; + let mtu = MAX_MTU as i32; let allow_broadcast : i32 = 1; let success = unsafe { @@ -93,21 +95,57 @@ fn main() { panic!("kissattach failed"); } - let todo = "Read/Write from/to TTY and RFM95"; - /* - let master_tty = Box::new(master_file); + let radio = Arc::new(Mutex::new(radio)); + + let mut pty_tx_side = master_file.try_clone() + .expect("Cannot clone PTY file"); + + let radio_tx = radio.clone(); + + let writer = thread::spawn(move || { + let mut kiss_decoder = KissDecoder::new(&mut pty_tx_side) + .expect("KissDecoder creation failed"); - let writer = thread::spawn(|| { loop { - let mut buffer = [0; MAX_MTU]; - match *master_tty.read(&mut buffer[..]) { - Ok(n) => radio.write_buffer(buffer), - Err(e) => panic!("TTY Read error {}", e); - } + let frame_to_tx = match kiss_decoder.receive_frame() { + Ok(f) => f, + Err(e) => { + println!("Error decoding KISS: {}", e); + continue + } + }; + + radio_tx.lock().unwrap().send(frame_to_tx) + .expect("Failed to send frame"); } }); + let mut kiss_encoder = KissEncoder::new(&mut master_file) + .expect("KissEncoder creation failed"); + + loop { + let timeout = std::time::Duration::from_millis(100); + match radio.lock().unwrap().wait_for_event(timeout) { + Ok(msg) => match msg { + RF95EventType::None => println!("radio: None"), + RF95EventType::DataReceived(buf) => { + println!("radio: Data received {:?}", buf); + + kiss_encoder.send_frame(buf.as_slice()).expect("Failed to encode frame"); + }, + RF95EventType::DataSent => println!("radio: Data sent"), + RF95EventType::ErrorPinConfig => println!("radio: Error pin config"), + RF95EventType::ErrorTimedOut => println!("radio: Timeout"), + RF95EventType::ErrorWrongCrc => println!("radio: Wrong CRC"), + RF95EventType::ErrorCommBus => println!("radio: Comm Bus"), + }, + Err(e) => { + println!("Receiver channel closing: {}", e); + break; + }, + } + } + writer.join().unwrap(); - */ } |