Compare commits
4 Commits
1c56fdb5bd
...
f9777b124b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f9777b124b | ||
|
|
81f768a12a | ||
|
|
cf57876e67 | ||
|
|
2becccd064 |
4
.vscode/launch.json
vendored
4
.vscode/launch.json
vendored
@@ -19,7 +19,9 @@
|
|||||||
"kind": "bin"
|
"kind": "bin"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"args": [],
|
"args": [
|
||||||
|
"./test_data/s1_high_resistance_bike.hea"
|
||||||
|
],
|
||||||
"cwd": "${workspaceFolder}"
|
"cwd": "${workspaceFolder}"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use std::{collections::HashMap, u64, vec};
|
use std::{collections::HashMap, hash::Hash, u64, vec};
|
||||||
|
|
||||||
use crate::SignalFormat;
|
use crate::SignalFormat;
|
||||||
|
|
||||||
@@ -153,7 +153,7 @@ enum AdcBlockKeys {
|
|||||||
///
|
///
|
||||||
/// By minimum, only carries the `filename`, `format`, and `adc_zero` attributes
|
/// By minimum, only carries the `filename`, `format`, and `adc_zero` attributes
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
struct SignalSpec {
|
pub struct SignalSpec {
|
||||||
filename: String,
|
filename: String,
|
||||||
format: SignalFormat,
|
format: SignalFormat,
|
||||||
samples_frame: Option<u64>,
|
samples_frame: Option<u64>,
|
||||||
@@ -410,7 +410,7 @@ impl Header {
|
|||||||
///
|
///
|
||||||
/// Initializes the signal_specs vector with the correct capacity provided
|
/// Initializes the signal_specs vector with the correct capacity provided
|
||||||
/// by the record.
|
/// by the record.
|
||||||
fn from_record(record: Record) -> Header {
|
fn with_record(record: Record) -> Header {
|
||||||
let capacity = record.signal_count;
|
let capacity = record.signal_count;
|
||||||
Header { record: Some(record), signal_specs: Vec::with_capacity(capacity) }
|
Header { record: Some(record), signal_specs: Vec::with_capacity(capacity) }
|
||||||
}
|
}
|
||||||
@@ -425,6 +425,14 @@ impl Header {
|
|||||||
None => true
|
None => true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn signals_per_file(&self) -> HashMap<String, u64> {
|
||||||
|
let mut map: HashMap<String, u64> = HashMap::new();
|
||||||
|
for signal in &self.signal_specs {
|
||||||
|
map.entry(signal.filename.clone()).and_modify(|val: &mut u64| *val += 1 ).or_insert(1);
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Attempts to parse the header file.
|
/// Attempts to parse the header file.
|
||||||
@@ -448,7 +456,7 @@ pub fn parse_header(header_data: &str) -> Result<Header, &str> {
|
|||||||
match possible_record {
|
match possible_record {
|
||||||
Ok(rec) => {
|
Ok(rec) => {
|
||||||
specs_max = rec.signal_count;
|
specs_max = rec.signal_count;
|
||||||
header = Header::from_record(rec);
|
header = Header::with_record(rec);
|
||||||
found_record = true;
|
found_record = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
57
src/main.rs
57
src/main.rs
@@ -1,7 +1,10 @@
|
|||||||
use std::{env::{self}, io::Error, path::Path};
|
use std::{env::{self}, path::Path};
|
||||||
use std::fs;
|
use std::fs;
|
||||||
|
|
||||||
pub mod headparse; // The HEAder parsing
|
pub mod headparse; // The HEAder parsing
|
||||||
|
pub mod signal_data;
|
||||||
|
|
||||||
|
use crate::{headparse::Header, signal_data::SignalData};
|
||||||
|
|
||||||
/// Use for handling possible formats of the WFDB data
|
/// Use for handling possible formats of the WFDB data
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
@@ -11,7 +14,7 @@ enum SignalFormat {
|
|||||||
Unimpl = 0
|
Unimpl = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() -> Result<(), Error>{
|
fn main() -> Result<(), String>{
|
||||||
let args: Vec<String> = env::args().collect();
|
let args: Vec<String> = env::args().collect();
|
||||||
|
|
||||||
if args.len() <= 1 || args.contains(&"help".to_string()) {
|
if args.len() <= 1 || args.contains(&"help".to_string()) {
|
||||||
@@ -29,14 +32,40 @@ fn main() -> Result<(), Error>{
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Parse the header information
|
||||||
|
let header: Header;
|
||||||
|
{
|
||||||
let hea_file_result = fs::read_to_string(filepath);
|
let hea_file_result = fs::read_to_string(filepath);
|
||||||
match hea_file_result {
|
match hea_file_result {
|
||||||
Ok(file_data) => {
|
Ok(file_data) => {
|
||||||
let header = headparse::parse_header(file_data.as_str());
|
match headparse::parse_header(file_data.as_str()) {
|
||||||
dbg!(header);
|
Ok(h) => {header = h}
|
||||||
|
Err(e) => {return Err(e.to_string())}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(e) => {return Err("error: Provided file cannot be opened".to_string())}
|
||||||
}
|
}
|
||||||
Err(e) => return Err(e)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let path_parent: String;
|
||||||
|
{
|
||||||
|
// This is cursed lol
|
||||||
|
match filepath.parent() {
|
||||||
|
Some(p) => {
|
||||||
|
match p.to_str() {
|
||||||
|
Some(str) => {
|
||||||
|
path_parent = str.to_string();
|
||||||
|
}
|
||||||
|
None => {path_parent = "".to_string()}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
None => {path_parent = "".to_string()}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let parsed_signals = get_all_data(header, path_parent);
|
||||||
|
|
||||||
println!("Hello, world!");
|
println!("Hello, world!");
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@@ -44,4 +73,16 @@ fn main() -> Result<(), Error>{
|
|||||||
fn help() {
|
fn help() {
|
||||||
println!("Conversion of WFDB files to a more human readable format. By default to a CSV.");
|
println!("Conversion of WFDB files to a more human readable format. By default to a CSV.");
|
||||||
println!("\nUse in the format \"wfdb_corrosion (.hea filename)\"")
|
println!("\nUse in the format \"wfdb_corrosion (.hea filename)\"")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_signal_data(spec: headparse::SignalSpec, offset: u64, data_length: usize) -> SignalData {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_all_data(header: Header, header_root: String) -> Vec<SignalData> {
|
||||||
|
let signal_counts = header.signals_per_file();
|
||||||
|
for (filename, sigcount) in signal_counts {
|
||||||
|
|
||||||
|
}
|
||||||
|
todo!()
|
||||||
}
|
}
|
||||||
48
src/signal_data.rs
Normal file
48
src/signal_data.rs
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
/// Holds fully processed signal data already parsed from the .dat file, ready
|
||||||
|
/// to be outputted in a practical way
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct SignalData {
|
||||||
|
name: String,
|
||||||
|
values: Vec<f64>,
|
||||||
|
unit: String
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SignalData {
|
||||||
|
/// Creates a [`SignalData`](crate::SignalData) with a name and an empty
|
||||||
|
/// `values` vector and `unit` string.
|
||||||
|
///
|
||||||
|
/// The `values` vector is initialized with no capacity, which causes this
|
||||||
|
/// struct to be quite a bit slower. This method is thus not suggested, use
|
||||||
|
/// [`SignalData::with_name_and_capacity`](crate::SignalData::with_name_and_capacity)
|
||||||
|
/// when you know how much you want to allocate
|
||||||
|
///
|
||||||
|
/// # Arguments
|
||||||
|
/// * `name` - The name of the Signal
|
||||||
|
pub fn with_name(name: String) -> SignalData {
|
||||||
|
SignalData { name: name, values: vec![], unit: String::new() }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Creates a [`SignalData`](crate::SignalData) with a name and a
|
||||||
|
/// `values` vector of a certain capacity and an empty `unit` string.
|
||||||
|
///
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// * `name` - The name of the Signal
|
||||||
|
/// * `capacity` - The capacity with which the `values` vector will be
|
||||||
|
/// initialized
|
||||||
|
pub fn with_name_and_capacity(name: String, capacity: usize) -> SignalData {
|
||||||
|
SignalData { name: name, values: Vec::with_capacity(capacity), unit: String::new() }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Appends a value to `values` inside the struct
|
||||||
|
pub fn push(&mut self, value: f64) {
|
||||||
|
self.values.push(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Appends data copied from the supplied `data` argument to the end of the
|
||||||
|
/// `values` vector inside the struct
|
||||||
|
pub fn append_copy(&mut self, data: Vec<f64>) {
|
||||||
|
let mut to_add: Vec<f64> = data;
|
||||||
|
to_add.append(&mut self.values);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user