mirror of
https://github.com/jgoerzen/xbnet.git
synced 2025-02-19 16:53:49 -04:00
fixing
This commit is contained in:
parent
fb75266b24
commit
e47d093adf
@ -68,12 +68,13 @@ impl XBSer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Transmits a command with terminating EOL characters
|
/// Transmits a command with terminating EOL characters
|
||||||
pub fn writeln(&mut self, mut data: String) -> io::Result<()> {
|
pub fn writeln(&mut self, mut data: &str) -> io::Result<()> {
|
||||||
trace!("{:?} SEROUT: {}", self.portname, data);
|
trace!("{:?} SEROUT: {}", self.portname, data);
|
||||||
data.push_str("\r\n");
|
let mut data = ByteMut::from(data.as_bytes());
|
||||||
|
data.push(b"\r\n");
|
||||||
// Give the receiver a chance to process
|
// Give the receiver a chance to process
|
||||||
// FIXME: lock this only once
|
// FIXME: lock this only once
|
||||||
self.swrite.lock().unwrap().write_all(data.as_bytes())?;
|
self.swrite.lock().unwrap().write_all(data)?;
|
||||||
self.swrite.lock().unwrap().flush()
|
self.swrite.lock().unwrap().flush()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
29
src/xb.rs
29
src/xb.rs
@ -28,6 +28,7 @@ use std::time::{Duration, Instant};
|
|||||||
use format_escape_default::format_escape_default;
|
use format_escape_default::format_escape_default;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
|
use std::convert::TryInto;
|
||||||
|
|
||||||
pub fn mkerror(msg: &str) -> Error {
|
pub fn mkerror(msg: &str) -> Error {
|
||||||
Error::new(ErrorKind::Other, msg)
|
Error::new(ErrorKind::Other, msg)
|
||||||
@ -77,51 +78,51 @@ impl XB {
|
|||||||
let (writertx, writerrx) = crossbeam_channel::bounded(5);
|
let (writertx, writerrx) = crossbeam_channel::bounded(5);
|
||||||
|
|
||||||
debug!("Configuring radio");
|
debug!("Configuring radio");
|
||||||
thread::sleep(Duration::from_msecs(1100));
|
thread::sleep(Duration::from_secs(2));
|
||||||
ser.swrite.lock().unwrap().write_all(b"+++").unwrap();
|
ser.swrite.lock().unwrap().write_all(b"+++").unwrap();
|
||||||
ser.swrite.lock().unwrap().flush();
|
ser.swrite.lock().unwrap().flush();
|
||||||
|
|
||||||
assert_response(ser.readln().unwrap(), "OK");
|
assert_response(ser.readln().unwrap().unwrap(), String::from("OK"));
|
||||||
|
|
||||||
if let Some(file) = initfile {
|
if let Some(file) = initfile {
|
||||||
let f = fs::File::open(file).unwrap();
|
let f = fs::File::open(file).unwrap();
|
||||||
let reader = BufReader::new(f);
|
let reader = BufReader::new(f);
|
||||||
for line in reader.lines() {
|
for line in reader.lines() {
|
||||||
if line.len() > 0 {
|
if line.unwrap().len() > 0 {
|
||||||
self.ser.writeln(line).unwrap();
|
self.ser.writeln(line.unwrap()).unwrap();
|
||||||
assert_response(ser.readln().unwrap(), "OK")
|
assert_response(ser.readln().unwrap().unwrap(), String::from("OK"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enter API mode
|
// Enter API mode
|
||||||
ser.writeln("ATAP 1").unwrap();
|
ser.writeln("ATAP 1").unwrap();
|
||||||
assert_response(ser.readln().unwrap, "OK");
|
assert_response(ser.readln().unwrap().unwrap(), String::from("OK"));
|
||||||
|
|
||||||
// Standard API output mode
|
// Standard API output mode
|
||||||
ser.writeln("ATAO 0").unwrap();
|
ser.writeln("ATAO 0").unwrap();
|
||||||
assert_response(ser.readln().unwrap(), "OK");
|
assert_response(ser.readln().unwrap().unwrap(), String::from("OK"));
|
||||||
|
|
||||||
// Get our own MAC address
|
// Get our own MAC address
|
||||||
ser.writeln("ATSH").unwrap();
|
ser.writeln("ATSH").unwrap();
|
||||||
let serialhigh = ser.readln().unwrap();
|
let serialhigh = ser.readln().unwrap().unwrap();
|
||||||
let serialhighu64 = u64::from(u32::from_be_bytes(hex::decode(serialhigh).unwrap()));
|
let serialhighu64 = u64::from(u32::from_be_bytes(hex::decode(serialhigh).unwrap().as_slice().try_into().unwrap()));
|
||||||
|
|
||||||
ser.writeln("ATSL").unwrap();
|
ser.writeln("ATSL").unwrap();
|
||||||
let seriallow = ser.readln().unwrap();
|
let seriallow = ser.readln().unwrap().unwrap();
|
||||||
let seriallowu64 = u64::from(u32::from_be_bytes(hex::decode(seriallow).unwrap()));
|
let seriallowu64 = u64::from(u32::from_be_bytes(hex::decode(seriallow).unwrap().as_slice().try_into().unwrap()));
|
||||||
|
|
||||||
let mymac = serialhighu64 << 32 | seriallowu64;
|
let mymac = serialhighu64 << 32 | seriallowu64;
|
||||||
|
|
||||||
// Get maximum packet size
|
// Get maximum packet size
|
||||||
ser.writeln("ATNP").unwrap();
|
ser.writeln("ATNP").unwrap();
|
||||||
let maxpacket = ser.readln().unwrap();
|
let maxpacket = ser.readln().unwrap().unwrap();
|
||||||
let maxpacketsize = usize::from(u16::from_be_bytes(hex::decode(maxpacket).unwrap()));
|
let maxpacketsize = usize::from(u16::from_be_bytes(hex::decode(maxpacket).unwrap().as_slice().try_into().unwrap()));
|
||||||
|
|
||||||
|
|
||||||
// Exit command mode
|
// Exit command mode
|
||||||
ser.writeln("ATCN").unwrap();
|
ser.writeln("ATCN").unwrap();
|
||||||
assert_response(ser.readln().unwrap(), "OK");
|
assert_response(ser.readln().unwrap().unwrap(), String::from("OK"));
|
||||||
|
|
||||||
let ser2 = ser.clone();
|
let ser2 = ser.clone();
|
||||||
thread::spawn(move || writerthread(ser2, maxpacketsize, writerrx));
|
thread::spawn(move || writerthread(ser2, maxpacketsize, writerrx));
|
||||||
|
@ -89,10 +89,10 @@ impl XBTXRequest {
|
|||||||
|
|
||||||
innerframe.put_u8(self.broadcast_radius);
|
innerframe.put_u8(self.broadcast_radius);
|
||||||
innerframe.put_u8(self.transmit_options);
|
innerframe.put_u8(self.transmit_options);
|
||||||
innerframe.put_slice(self.payload);
|
innerframe.put_slice(&self.payload);
|
||||||
|
|
||||||
// That's it for the inner frame. Now fill in the outer frame.
|
// That's it for the inner frame. Now fill in the outer frame.
|
||||||
if let Some(lenu16) = u16::try_from(self.payload.len()) {
|
if let Ok(lenu16) = u16::try_from(self.payload.len()) {
|
||||||
fullframe.put_u16(lenu16);
|
fullframe.put_u16(lenu16);
|
||||||
fullframe.put_slice(&innerframe);
|
fullframe.put_slice(&innerframe);
|
||||||
fullframe.put_u8(xbchecksum(&innerframe));
|
fullframe.put_u8(xbchecksum(&innerframe));
|
||||||
|
Loading…
Reference in New Issue
Block a user