initial pipe

This commit is contained in:
John Goerzen 2020-09-20 23:07:07 -05:00
parent 9366c39e30
commit 8ad0a2ea86
2 changed files with 49 additions and 2 deletions

View File

@ -25,7 +25,7 @@ mod ser;
mod xb;
mod xbpacket;
mod xbrx;
// mod pipe;
mod pipe;
mod ping;
use std::path::PathBuf;
@ -62,6 +62,13 @@ enum Command {
},
/// Receive ping requests and transmit pongs
Pong,
/// Pipe data across radios using the xbnet protocol
Pipe{
/// The 64-bit destination for the pipe, in hex
#[structopt(long)]
dest: String,
// FIXME: add a paremter to accept data from only that place
},
}
fn main() {
@ -85,6 +92,11 @@ fn main() {
},
Command::Pong => {
ping::pong(&mut xbreframer, &xb.ser, xbeesender).expect("Failure in pong");
}
},
Command::Pipe{dest} => {
let dest_u64:u64 = u64::from_str_radix(&dest, 16).expect("Invalid destination");
thread::spawn(move || pipe::stdin_processor(dest_u64, 1600, xbeesender).expect("Failure in stdin_processor"));
pipe::stdout_processor(&mut xbreframer, &xb.ser).expect("Failure in stdout_processor");
},
}
}

View File

@ -17,4 +17,39 @@
use std::io;
use std::io::{Read, Write};
use crate::xb::*;
use crate::xbpacket::*;
use crate::ser::*;
use crate::xbrx::*;
use crossbeam_channel;
use std::thread;
use std::time::Duration;
use bytes::*;
const INTERVAL: u64 = 5;
pub fn stdin_processor(dest: u64, maxframesize: usize,
sender: crossbeam_channel::Sender<(XBDestAddr, Bytes)>) -> io::Result<()> {
let stdin = io::stdin();
let mut br = io::BufReader::new(stdin);
let mut buf = vec![0u8; maxframesize - 1];
loop {
let res = br.read(&mut buf)?;
if res == 0 {
// EOF
return Ok(());
}
sender.send((XBDestAddr::U64(dest), Bytes::copy_from_slice(&buf[0..res]))).unwrap();
}
}
pub fn stdout_processor(xbreframer: &mut XBReframer, ser: &XBSer) -> io::Result<()> {
let mut stdout = io::stdout();
loop {
let (_fromu64, _fromu16, payload) = xbreframer.rxframe(ser);
stdout.write_all(&payload)?;
stdout.flush()?;
}
}