Initial commit
commit
1ceebcce17
|
@ -0,0 +1,3 @@
|
|||
/target
|
||||
/Cargo.lock
|
||||
/.idea
|
|
@ -0,0 +1,9 @@
|
|||
[package]
|
||||
name = "bone_rs"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
bitfield = "0.14.0"
|
|
@ -0,0 +1,4 @@
|
|||
#![cfg_attr(not(test), no_std)]
|
||||
|
||||
pub mod packet;
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
use bitfield::bitfield;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum BonePacketError {
|
||||
SourceBufferTooSmall,
|
||||
}
|
||||
|
||||
bitfield! {
|
||||
#[derive(PartialEq, Clone)]
|
||||
pub struct BonePacketHeader(u64);
|
||||
impl Debug;
|
||||
u16;
|
||||
version, set_version: 2, 0;
|
||||
sec_header_count, set_sec_header_count: 7, 3;
|
||||
category, set_category: 23, 8;
|
||||
unique_id, set_unique_id: 39, 24;
|
||||
seq_type, set_seq_type: 42, 40;
|
||||
seq_count, set_seq_count: 47, 43;
|
||||
length, set_length: 63, 48;
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct BonePacket<'a> {
|
||||
header: BonePacketHeader,
|
||||
data: &'a [u8]
|
||||
}
|
||||
|
||||
impl<'a> TryFrom<&'a [u8]> for BonePacket<'a> {
|
||||
type Error = BonePacketError;
|
||||
|
||||
fn try_from(buf: &'a [u8]) -> Result<Self, Self::Error> {
|
||||
if buf.len() < 8 {
|
||||
return Err(BonePacketError::SourceBufferTooSmall)
|
||||
}
|
||||
|
||||
let header: u64 = (buf[7] as u64) << 56 | (buf[6] as u64) << 48 | (buf[5] as u64) << 40 | (buf[4] as u64) << 32 | (buf[3] as u64) << 24 | (buf[2] as u64) << 16 | (buf[1] as u64) << 8 | buf[0] as u64;
|
||||
|
||||
let data = &buf[8..];
|
||||
|
||||
Ok(BonePacket {
|
||||
header: BonePacketHeader(header),
|
||||
data
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::packet::{BonePacket, BonePacketHeader};
|
||||
|
||||
#[test]
|
||||
fn test_header_to_from_bytes() {
|
||||
let mut header = BonePacketHeader(0x0);
|
||||
header.set_version(0);
|
||||
header.set_sec_header_count(1);
|
||||
header.set_category(5);
|
||||
header.set_unique_id(42069);
|
||||
header.set_seq_type(1);
|
||||
header.set_seq_count(100);
|
||||
header.set_length(500);
|
||||
|
||||
let buf = header.0.clone();
|
||||
|
||||
let header2 = BonePacketHeader(buf);
|
||||
|
||||
assert_eq!(header, header2)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_from_array() {
|
||||
let mut header = BonePacketHeader(0x0);
|
||||
header.set_version(0);
|
||||
header.set_sec_header_count(1);
|
||||
header.set_category(5);
|
||||
header.set_unique_id(42069);
|
||||
header.set_seq_type(1);
|
||||
header.set_seq_count(100);
|
||||
header.set_length(500);
|
||||
|
||||
let buf = header.0.to_ne_bytes();
|
||||
|
||||
println!("{:?}", buf);
|
||||
let packet = BonePacket::try_from(buf.as_slice()).unwrap();
|
||||
|
||||
assert_eq!(header, packet.header);
|
||||
assert_eq!(0, packet.data.len());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue