Skip to content
This repository was archived by the owner on Dec 15, 2021. It is now read-only.

Commit 6fd6291

Browse files
author
Alex Helfet
committed
Finished converting into a library: new Decoder struct, decoder module, error module in lib.
1 parent 4b9cc6b commit 6fd6291

File tree

4 files changed

+88
-63
lines changed

4 files changed

+88
-63
lines changed

src/bin/itmdump.rs

Lines changed: 6 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -4,42 +4,19 @@
44
extern crate chrono;
55
extern crate clap;
66
extern crate env_logger;
7-
#[macro_use]
8-
extern crate error_chain;
9-
extern crate heapless;
107
extern crate itm;
11-
extern crate libc;
128
#[macro_use]
139
extern crate log;
14-
extern crate ref_slice;
15-
1610

1711
use clap::{Arg, App, ArgMatches};
18-
use heapless::Vec as HVec;
19-
use itm::packet::{self, Packet, Instrumentation};
12+
use itm::{packet, Decoder};
13+
use itm::error::{Error, ErrorKind, Result, ResultExt};
2014
use log::{LogRecord, LogLevelFilter};
2115
use std::fs::File;
22-
use std::io::{Read, Write};
16+
use std::io::Write;
2317
use std::time::Duration;
2418
use std::{env, io, process, thread};
2519

26-
use errors::{Error, ErrorKind, Result, ResultExt};
27-
28-
mod errors {
29-
error_chain! {
30-
foreign_links {
31-
Io(::std::io::Error);
32-
}
33-
34-
errors {
35-
UnknownHeader(b: u8) {
36-
description("unknown header byte"),
37-
display("unknown header byte: {:x}", b),
38-
}
39-
}
40-
}
41-
}
42-
4320
fn main() {
4421
// Initialise logging.
4522
env_logger::LogBuilder::new()
@@ -117,12 +94,13 @@ fn run() -> Result<()> {
11794

11895
let follow = matches.is_present("follow");
11996

120-
let mut stream = open_read(&matches)?;
97+
let read = open_read(&matches)?;
98+
let mut decoder = Decoder::new(read);
12199

122100
let stdout = io::stdout();
123101
let mut stdout = stdout.lock();
124102
loop {
125-
let p = read_packet(&mut stream);
103+
let p = decoder.read_packet();
126104
match p {
127105
Ok(p) => {
128106
match p.kind {
@@ -175,38 +153,3 @@ fn open_read<'a>(matches: &ArgMatches) -> Result<impl io::Read + 'a> {
175153
})
176154
}
177155

178-
fn read_packet(input: &mut Read) -> Result<Packet> {
179-
let mut header = [0; 1];
180-
input.read_exact(&mut header)?;
181-
let header = header[0];
182-
match header & 0b111 {
183-
0b001|0b010|0b011 => {
184-
// Instrumentation packet.
185-
let mut ud = Instrumentation {
186-
payload: HVec::new(),
187-
port: header >> 3,
188-
};
189-
190-
let payload_size =
191-
match header & 0b11 {
192-
0b01 => 1,
193-
0b10 => 2,
194-
0b11 => 4,
195-
_ => unreachable!(), // Contradicts match on last 3 bits.
196-
};
197-
ud.payload.resize_default(payload_size)
198-
.expect("payload_size <= payload.capacity");
199-
input.read_exact(&mut *ud.payload)?;
200-
201-
Ok(Packet {
202-
header: header,
203-
kind: packet::Kind::Instrumentation(ud),
204-
})
205-
},
206-
_ => {
207-
return Err(Error::from(ErrorKind::UnknownHeader(header)));
208-
}
209-
}
210-
}
211-
212-
// TODO: Add parse tests.

src/decoder.rs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
//! Parse ITM packets from bytes and streams.
2+
3+
use error::{Error, ErrorKind, Result};
4+
use heapless::Vec as HVec;
5+
use packet::{self, Packet, Instrumentation};
6+
use std::io::Read;
7+
8+
pub struct Decoder<R: Read> {
9+
inner: R,
10+
}
11+
12+
impl<R: Read> Decoder<R> {
13+
// TODO: Builder pattern.
14+
15+
pub fn new(inner: R) -> Decoder<R> {
16+
Decoder::<R> {
17+
inner: inner,
18+
}
19+
}
20+
21+
pub fn read_packet(&mut self) -> Result<Packet> {
22+
let mut header = [0; 1];
23+
self.inner.read_exact(&mut header)?;
24+
let header = header[0];
25+
match header & 0b111 {
26+
0b001|0b010|0b011 => {
27+
// Instrumentation packet.
28+
let mut ud = Instrumentation {
29+
payload: HVec::new(),
30+
port: header >> 3,
31+
};
32+
33+
let payload_size =
34+
match header & 0b11 {
35+
0b01 => 1,
36+
0b10 => 2,
37+
0b11 => 4,
38+
_ => unreachable!(), // Contradicts match on last 3 bits.
39+
};
40+
ud.payload.resize_default(payload_size)
41+
.expect("payload_size <= payload.capacity");
42+
self.inner.read_exact(&mut *ud.payload)?;
43+
44+
Ok(Packet {
45+
header: header,
46+
kind: packet::Kind::Instrumentation(ud),
47+
})
48+
},
49+
_ => {
50+
return Err(Error::from(ErrorKind::UnknownHeader(header)));
51+
}
52+
}
53+
}
54+
}
55+
56+
// TODO: Parse tests.

src/error.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//! Representations of errors returned by this crate.
2+
3+
use std::io;
4+
5+
error_chain! {
6+
foreign_links {
7+
Io(io::Error);
8+
}
9+
10+
errors {
11+
UnknownHeader(b: u8) {
12+
description("unknown header byte"),
13+
display("unknown header byte: {:x}", b),
14+
}
15+
}
16+
}

src/lib.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,16 @@
8888
8989
#![deny(warnings)]
9090

91+
#[macro_use]
92+
extern crate error_chain;
9193
extern crate heapless;
94+
#[allow(unused_imports)] // No logging yet.
95+
#[macro_use]
96+
extern crate log;
97+
98+
pub mod decoder;
99+
pub use decoder::Decoder;
100+
101+
pub mod error;
92102

93103
pub mod packet;

0 commit comments

Comments
 (0)