This commit is contained in:
Tsuki 2024-02-05 22:11:18 +08:00
parent 46b4e57eae
commit 7e536a562a
27 changed files with 736 additions and 340 deletions

9
Cargo.lock generated
View File

@ -506,6 +506,7 @@ dependencies = [
"glue",
"gtk4",
"image",
"indexmap",
"lazy_static",
"libadwaita",
"libloading 0.8.0",
@ -1785,9 +1786,9 @@ dependencies = [
[[package]]
name = "hashbrown"
version = "0.14.0"
version = "0.14.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a"
checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
[[package]]
name = "heapless"
@ -1894,9 +1895,9 @@ checksum = "b2cf49df1085dcfb171460e4592597b84abe50d900fb83efb6e41b20fefd6c2c"
[[package]]
name = "indexmap"
version = "2.0.0"
version = "2.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d"
checksum = "824b2ae422412366ba479e8111fd301f7b5faece8149317bb81925979a53f520"
dependencies = [
"equivalent",
"hashbrown",

View File

@ -85,6 +85,7 @@ futures = "0.3.30"
sorted-vec = "0.8.3"
tracing = "0.1.40"
tracing-subscriber = "0.3.18"
indexmap = "2.2.2"
[build-dependencies]

View File

@ -39,6 +39,10 @@ impl Plugin for ETWSLoader {
.into_iter()
.map(|b| {
let (dimension_len, data) = match b.data {
ValueResult::I16(data) => (
data.len(),
radarg_plugin_interface::VecResult::I16(RVec::from(data)),
),
ValueResult::F32(data) => (
data.len(),
radarg_plugin_interface::VecResult::F32(RVec::from(data)),
@ -91,6 +95,8 @@ impl Plugin for ETWSLoader {
let data_type = match b.info.value_name.as_str() {
"ET" => PluginResultType::ET,
"VIL" => PluginResultType::VIL,
"EB" => PluginResultType::EB,
"DBZ" => PluginResultType::DBZ,
"CR" => PluginResultType::DBZ,
"R" => PluginResultType::R,
@ -164,7 +170,7 @@ mod tests {
fn test() {
let result =
Record::parse_from_path("/Volumes/data2/RadarArray/HangZhou/radarData/OutputProducts/RadarProducts/BasicProductsX/20230822/20230822100400/ZJHZAA_20230822100400_CR.dat.gz")
Record::parse_from_path("/Volumes/data2/RadarArray/HangZhou/radarData/OutputProducts/RadarProducts/BasicProductsX/20230624/20230624000800/ZJHZAA_20230624000800_VIL.dat.gz")
.unwrap();
}
}

View File

@ -18,6 +18,7 @@ pub enum ValueResult {
F64(Vec<f64>),
I32(Vec<i32>),
F32(Vec<f32>),
I16(Vec<i16>),
U64(Vec<u64>),
U32(Vec<u32>),
I8(Vec<i8>),
@ -31,6 +32,7 @@ enum ValueTypes {
F32,
U64,
U32,
I16,
I8,
U8,
}
@ -46,6 +48,49 @@ pub struct Record {
pub blocks: Vec<ParsedBlock>, // Fill in generic types appropriately
}
macro_rules! match_in_macro {
($block:ident,$len:ident,$input:ident,$offset:ident,$scale:ident,$fill_value:ident,$(($branch:path, $t:ty, $bigger:ty,$raw_result:path, $bigger_result:path)),+) => {
{
use std::mem;
let need_trans = $offset != 0.0 || $scale != 1.0;
let trans_to_bigger = $offset.trunc() != $offset || $scale != 1.0;
match $block {
$(
$branch => {
let ratio = mem::size_of::<$t>() / mem::size_of::<u8>();
let (input, result) = take($len * ratio)($input)?;
let result = unsafe {
let ptr = result.as_ptr() as *const $t;
let slice = std::slice::from_raw_parts(ptr, $len);
let slice = slice.to_vec();
if trans_to_bigger {
let offset = $offset as $bigger;
let scale = $scale as $bigger;
$bigger_result(
slice
.into_iter()
.map(|p| if (p as f64 - $fill_value).abs() < f64::EPSILON {p as $bigger} else {(p as $bigger - offset) / scale} )
.collect::<Vec<$bigger>>(),
)
} else {
$raw_result(if need_trans {
let offset = $offset as $t;
slice.into_iter().map(|p| if (p as f64 - $fill_value).abs() < f64::EPSILON {p} else {p - offset}).collect::<Vec<$t>>()
} else {
slice
})
}
};
Ok((input, result))
},
)+
}
}
};
}
impl Record {
pub fn parse_from_path(path: impl AsRef<Path>) -> Result<Self, ETWSError> {
let path = path.as_ref();
@ -215,6 +260,19 @@ impl Record {
Ok((input, hlen))
}
fn _parse_type<'a>(type_str: &'a str) -> ValueTypes {
match type_str {
"b" => ValueTypes::I8,
"B" => ValueTypes::U8,
"i" => ValueTypes::I32,
"I" => ValueTypes::U32,
"f" => ValueTypes::F32,
"d" => ValueTypes::F64,
"h" => ValueTypes::I16,
_ => panic!("Invalid type"),
}
}
fn _parse_matrix(
input: &[u8],
type_: ValueTypes,
@ -224,255 +282,65 @@ impl Record {
scale: f32,
fill_value: f64,
) -> IResult<&[u8], ValueResult> {
use std::mem;
let need_trans = offset != 0.0 || scale != 1.0;
let trans_to_bigger = offset.trunc() != offset || scale != 1.0;
match type_ {
ValueTypes::I64 => {
let ratio = mem::size_of::<i64>() / mem::size_of::<u8>();
let (input, result) = take(len * ratio)(input)?;
let result = unsafe {
let ptr = result.as_ptr() as *const i64;
let slice = std::slice::from_raw_parts(ptr, len);
let slice = slice.to_vec();
if trans_to_bigger {
let offset = offset as f32;
ValueResult::F32(
slice
.into_iter()
.filter(|p| *p as f64 != fill_value)
.map(|p| p as f32 - offset / scale)
.collect::<Vec<f32>>(),
match_in_macro!(
type_,
len,
input,
offset,
scale,
fill_value,
(
ValueTypes::I64,
i64,
f64,
ValueResult::I64,
ValueResult::F64
),
(
ValueTypes::F64,
f64,
f64,
ValueResult::F64,
ValueResult::F64
),
(
ValueTypes::U64,
u64,
f64,
ValueResult::U64,
ValueResult::F64
),
(
ValueTypes::I32,
i32,
f32,
ValueResult::I32,
ValueResult::F32
),
(
ValueTypes::F32,
f32,
f32,
ValueResult::F32,
ValueResult::F32
),
(
ValueTypes::U32,
u32,
f32,
ValueResult::U32,
ValueResult::F32
),
(
ValueTypes::I16,
i16,
f32,
ValueResult::I16,
ValueResult::F32
),
(ValueTypes::I8, i8, f32, ValueResult::I8, ValueResult::F32),
(ValueTypes::U8, u8, f32, ValueResult::U8, ValueResult::F32)
)
} else {
ValueResult::I64(if need_trans {
let offset = offset as i64;
slice
.into_iter()
.filter(|p| *p as f64 != fill_value)
.map(|p| p - offset)
.collect::<Vec<i64>>()
} else {
slice
})
}
};
Ok((input, result))
}
ValueTypes::F64 => {
let ratio = mem::size_of::<f64>() / mem::size_of::<u8>();
let (input, result) = take(len * ratio)(input)?;
let result = unsafe {
let ptr = result.as_ptr() as *const f64;
let slice = std::slice::from_raw_parts(ptr, len);
let slice = slice.to_vec();
ValueResult::F64(if need_trans {
let offset = offset as f64;
slice
.into_iter()
.filter(|p| *p as f64 != fill_value)
.map(|p| p - offset / scale as f64)
.collect::<Vec<f64>>()
} else {
slice
})
};
Ok((input, result))
}
ValueTypes::I32 => {
let ratio = mem::size_of::<i32>() / mem::size_of::<u8>();
let (input, result) = take(len * ratio)(input)?;
let result = unsafe {
let ptr = result.as_ptr() as *const i32;
let slice = std::slice::from_raw_parts(ptr, len);
let slice = slice.to_vec();
if trans_to_bigger {
let offset = offset as f32;
ValueResult::F32(
slice
.into_iter()
.filter(|p| *p as f64 != fill_value)
.map(|p| p as f32 - offset / scale)
.collect::<Vec<f32>>(),
)
} else {
ValueResult::I32(if need_trans {
let offset = offset as i32;
slice
.into_iter()
.filter(|p| *p as f64 != fill_value)
.map(|p| p - offset)
.collect::<Vec<i32>>()
} else {
slice
})
}
};
Ok((input, result))
}
ValueTypes::U32 => {
let ratio = mem::size_of::<u32>() / mem::size_of::<u8>();
let (input, result) = take(len * ratio)(input)?;
let result = unsafe {
let ptr = result.as_ptr() as *const u32;
let slice = std::slice::from_raw_parts(ptr, len);
let slice = slice.to_vec();
if trans_to_bigger {
let offset = offset as f32;
ValueResult::F32(
slice
.into_iter()
.filter(|p| *p as f64 != fill_value)
.map(|p| p as f32 - offset / scale)
.collect::<Vec<f32>>(),
)
} else {
ValueResult::U32(if need_trans {
let offset = offset as u32;
slice
.into_iter()
.filter(|p| *p as f64 != fill_value)
.map(|p| p - offset)
.collect::<Vec<u32>>()
} else {
slice
})
}
};
Ok((input, result))
}
ValueTypes::F32 => {
let ratio = mem::size_of::<f32>() / mem::size_of::<u8>();
let (input, result) = take(len * ratio)(input)?;
let result = unsafe {
let ptr = result.as_ptr() as *const f32;
let slice = std::slice::from_raw_parts(ptr, len);
let slice = slice.to_vec();
ValueResult::F32(if need_trans {
let offset = offset as f32;
slice
.into_iter()
.map(|p| p - offset / scale)
.collect::<Vec<f32>>()
} else {
slice
})
};
Ok((input, result))
}
ValueTypes::U64 => {
let ratio = mem::size_of::<u64>() / mem::size_of::<u8>();
let (input, result) = take(len * ratio)(input)?;
let result = unsafe {
let ptr = result.as_ptr() as *const u64;
let slice = std::slice::from_raw_parts(ptr, len);
let slice = slice.to_vec();
if trans_to_bigger {
let offset = offset as f64;
let scale = scale as f64;
ValueResult::F64(
slice
.into_iter()
.filter(|p| *p as f64 != fill_value)
.map(|p| p as f64 - offset / scale)
.collect::<Vec<f64>>(),
)
} else {
ValueResult::U64(if need_trans {
let offset = offset as u64;
slice
.into_iter()
.filter(|p| *p as f64 != fill_value)
.map(|p| p - offset)
.collect::<Vec<u64>>()
} else {
slice
})
}
};
Ok((input, result))
}
ValueTypes::I8 => {
let (input, result) = take(len)(input)?;
let result = unsafe {
let ptr = result.as_ptr() as *const i8;
let slice = std::slice::from_raw_parts(ptr, len);
let slice = slice.to_vec();
if trans_to_bigger {
let offset = offset as f32;
ValueResult::F32(
slice
.into_iter()
.filter(|p| *p as f64 != fill_value)
.map(|p| p as f32 - offset / scale)
.collect::<Vec<f32>>(),
)
} else {
ValueResult::I8(if need_trans {
let offset = offset as i8;
slice
.into_iter()
.filter(|p| *p as f64 != fill_value)
.map(|p| p - offset)
.collect::<Vec<i8>>()
} else {
slice
})
}
};
Ok((input, result))
}
ValueTypes::U8 => {
let (input, slice) = take(len)(input)?;
let slice = slice.to_vec();
let result = if trans_to_bigger {
let offset = offset as f32;
ValueResult::F32(
slice
.into_iter()
.map(|p| p as f32 - offset / scale)
.collect::<Vec<f32>>(),
)
} else {
ValueResult::U8(if need_trans {
let offset = offset as u8;
slice.into_iter().map(|p| p - offset).collect::<Vec<u8>>()
} else {
slice
})
};
Ok((input, result))
}
}
}
fn _parse_type<'a>(type_str: &'a str) -> ValueTypes {
match type_str {
"b" => ValueTypes::I8,
"B" => ValueTypes::U8,
"i" => ValueTypes::I32,
"I" => ValueTypes::U32,
"f" => ValueTypes::F32,
"d" => ValueTypes::F64,
_ => panic!("Invalid type"),
}
}
}
@ -502,3 +370,231 @@ pub struct ParsedBlock {
pub info: BlockJsonInfo,
pub data: ValueResult,
}
// fn _parse_matrix(
// input: &[u8],
// type_: ValueTypes,
// order: Order,
// len: usize,
// offset: f32,
// scale: f32,
// fill_value: f64,
// ) -> IResult<&[u8], ValueResult> {
// use std::mem;
// let need_trans = offset != 0.0 || scale != 1.0;
// let trans_to_bigger = offset.trunc() != offset || scale != 1.0;
// match type_ {
// ValueTypes::I64 => {
// let ratio = mem::size_of::<i64>() / mem::size_of::<u8>();
// let (input, result) = take(len * ratio)(input)?;
// let result = unsafe {
// let ptr = result.as_ptr() as *const i64;
// let slice = std::slice::from_raw_parts(ptr, len);
// let slice = slice.to_vec();
// if trans_to_bigger {
// let offset = offset as f32;
// ValueResult::F32(
// slice
// .into_iter()
// .map(|p| (p as f32 - offset) / scale)
// .collect::<Vec<f32>>(),
// )
// } else {
// ValueResult::I64(if need_trans {
// let offset = offset as i64;
// slice.into_iter().map(|p| p - offset).collect::<Vec<i64>>()
// } else {
// slice
// })
// }
// };
// Ok((input, result))
// }
// ValueTypes::F64 => {
// let ratio = mem::size_of::<f64>() / mem::size_of::<u8>();
// let (input, result) = take(len * ratio)(input)?;
// let result = unsafe {
// let ptr = result.as_ptr() as *const f64;
// let slice = std::slice::from_raw_parts(ptr, len);
// let slice = slice.to_vec();
// ValueResult::F64(if need_trans {
// let offset = offset as f64;
// slice
// .into_iter()
// .map(|p| (p - offset) / scale as f64)
// .collect::<Vec<f64>>()
// } else {
// slice
// })
// };
// Ok((input, result))
// }
// ValueTypes::I32 => {
// let ratio = mem::size_of::<i32>() / mem::size_of::<u8>();
// let (input, result) = take(len * ratio)(input)?;
// let result = unsafe {
// let ptr = result.as_ptr() as *const i32;
// let slice = std::slice::from_raw_parts(ptr, len);
// let slice = slice.to_vec();
// if trans_to_bigger {
// let offset = offset as f32;
// ValueResult::F32(
// slice
// .into_iter()
// .map(|p| (p as f32 - offset) / scale)
// .collect::<Vec<f32>>(),
// )
// } else {
// ValueResult::I32(if need_trans {
// let offset = offset as i32;
// slice.into_iter().map(|p| p - offset).collect::<Vec<i32>>()
// } else {
// slice
// })
// }
// };
// Ok((input, result))
// }
// ValueTypes::U32 => {
// let ratio = mem::size_of::<u32>() / mem::size_of::<u8>();
// let (input, result) = take(len * ratio)(input)?;
// let result = unsafe {
// let ptr = result.as_ptr() as *const u32;
// let slice = std::slice::from_raw_parts(ptr, len);
// let slice = slice.to_vec();
// if trans_to_bigger {
// let offset = offset as f32;
// ValueResult::F32(
// slice
// .into_iter()
// .map(|p| (p as f32 - offset) / scale)
// .collect::<Vec<f32>>(),
// )
// } else {
// ValueResult::U32(if need_trans {
// let offset = offset as u32;
// slice.into_iter().map(|p| p - offset).collect::<Vec<u32>>()
// } else {
// slice
// })
// }
// };
// Ok((input, result))
// }
// ValueTypes::F32 => {
// let ratio = mem::size_of::<f32>() / mem::size_of::<u8>();
// let (input, result) = take(len * ratio)(input)?;
// let result = unsafe {
// let ptr = result.as_ptr() as *const f32;
// let slice = std::slice::from_raw_parts(ptr, len);
// let slice = slice.to_vec();
// ValueResult::F32(if need_trans {
// let offset = offset as f32;
// slice
// .into_iter()
// .map(|p| (p - offset) / scale)
// .collect::<Vec<f32>>()
// } else {
// slice
// })
// };
// Ok((input, result))
// }
// ValueTypes::U64 => {
// let ratio = mem::size_of::<u64>() / mem::size_of::<u8>();
// let (input, result) = take(len * ratio)(input)?;
// let result = unsafe {
// let ptr = result.as_ptr() as *const u64;
// let slice = std::slice::from_raw_parts(ptr, len);
// let slice = slice.to_vec();
// if trans_to_bigger {
// let offset = offset as f64;
// let scale = scale as f64;
// ValueResult::F64(
// slice
// .into_iter()
// .map(|p| (p as f64 - offset) / scale)
// .collect::<Vec<f64>>(),
// )
// } else {
// ValueResult::U64(if need_trans {
// let offset = offset as u64;
// slice.into_iter().map(|p| p - offset).collect::<Vec<u64>>()
// } else {
// slice
// })
// }
// };
// Ok((input, result))
// }
// ValueTypes::I8 => {
// let (input, result) = take(len)(input)?;
// let result = unsafe {
// let ptr = result.as_ptr() as *const i8;
// let slice = std::slice::from_raw_parts(ptr, len);
// let slice = slice.to_vec();
// if trans_to_bigger {
// let offset = offset as f32;
// ValueResult::F32(
// slice
// .into_iter()
// .map(|p| (p as f32 - offset) / scale)
// .collect::<Vec<f32>>(),
// )
// } else {
// ValueResult::I8(if need_trans {
// let offset = offset as i8;
// slice.into_iter().map(|p| p - offset).collect::<Vec<i8>>()
// } else {
// slice
// })
// }
// };
// Ok((input, result))
// }
// ValueTypes::U8 => {
// let (input, slice) = take(len)(input)?;
// let slice = slice.to_vec();
// let result = if trans_to_bigger {
// let offset = offset as f32;
// ValueResult::F32(
// slice
// .into_iter()
// .map(|p| {
// if p as f64 != fill_value {
// (p as f32 - offset) / scale
// } else {
// p as f32
// }
// })
// .collect::<Vec<f32>>(),
// )
// } else {
// ValueResult::U8(if need_trans {
// let offset = offset as u8;
// slice.into_iter().map(|p| p - offset).collect::<Vec<u8>>()
// } else {
// slice
// })
// };
// Ok((input, result))
// }
// }
// }

View File

@ -1 +1 @@
{"rustc_fingerprint":8475780184195034948,"outputs":{"15729799797837862367":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.dylib\nlib___.dylib\nlib___.a\nlib___.dylib\n/Users/ruomu/.rustup/toolchains/nightly-x86_64-apple-darwin\noff\npacked\nunpacked\n___\ndebug_assertions\noverflow_checks\npanic=\"unwind\"\nproc_macro\nrelocation_model=\"pic\"\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"\"\ntarget_family=\"unix\"\ntarget_feature=\"cmpxchg16b\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_feature=\"sse3\"\ntarget_feature=\"ssse3\"\ntarget_has_atomic\ntarget_has_atomic=\"128\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_has_atomic_equal_alignment=\"16\"\ntarget_has_atomic_equal_alignment=\"32\"\ntarget_has_atomic_equal_alignment=\"64\"\ntarget_has_atomic_equal_alignment=\"8\"\ntarget_has_atomic_equal_alignment=\"ptr\"\ntarget_has_atomic_load_store\ntarget_has_atomic_load_store=\"128\"\ntarget_has_atomic_load_store=\"16\"\ntarget_has_atomic_load_store=\"32\"\ntarget_has_atomic_load_store=\"64\"\ntarget_has_atomic_load_store=\"8\"\ntarget_has_atomic_load_store=\"ptr\"\ntarget_os=\"macos\"\ntarget_pointer_width=\"64\"\ntarget_thread_local\ntarget_vendor=\"apple\"\nunix\n","stderr":""},"4614504638168534921":{"success":true,"status":"","code":0,"stdout":"rustc 1.74.0-nightly (8142a319e 2023-09-13)\nbinary: rustc\ncommit-hash: 8142a319ed5c1d1f96e5a1881a6546e463b77c8f\ncommit-date: 2023-09-13\nhost: x86_64-apple-darwin\nrelease: 1.74.0-nightly\nLLVM version: 17.0.0\n","stderr":""}},"successes":{}}
{"rustc_fingerprint":6534886339914138005,"outputs":{"15729799797837862367":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.dylib\nlib___.dylib\nlib___.a\nlib___.dylib\n/Users/tsuki/.rustup/toolchains/nightly-aarch64-apple-darwin\noff\npacked\nunpacked\n___\ndebug_assertions\noverflow_checks\npanic=\"unwind\"\nproc_macro\nrelocation_model=\"pic\"\ntarget_abi=\"\"\ntarget_arch=\"aarch64\"\ntarget_endian=\"little\"\ntarget_env=\"\"\ntarget_family=\"unix\"\ntarget_feature=\"aes\"\ntarget_feature=\"crc\"\ntarget_feature=\"dit\"\ntarget_feature=\"dotprod\"\ntarget_feature=\"dpb\"\ntarget_feature=\"dpb2\"\ntarget_feature=\"fcma\"\ntarget_feature=\"fhm\"\ntarget_feature=\"flagm\"\ntarget_feature=\"fp16\"\ntarget_feature=\"frintts\"\ntarget_feature=\"jsconv\"\ntarget_feature=\"lor\"\ntarget_feature=\"lse\"\ntarget_feature=\"neon\"\ntarget_feature=\"paca\"\ntarget_feature=\"pacg\"\ntarget_feature=\"pan\"\ntarget_feature=\"pmuv3\"\ntarget_feature=\"ras\"\ntarget_feature=\"rcpc\"\ntarget_feature=\"rcpc2\"\ntarget_feature=\"rdm\"\ntarget_feature=\"sb\"\ntarget_feature=\"sha2\"\ntarget_feature=\"sha3\"\ntarget_feature=\"ssbs\"\ntarget_feature=\"v8.1a\"\ntarget_feature=\"v8.2a\"\ntarget_feature=\"v8.3a\"\ntarget_feature=\"v8.4a\"\ntarget_feature=\"vh\"\ntarget_has_atomic\ntarget_has_atomic=\"128\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_has_atomic_equal_alignment=\"128\"\ntarget_has_atomic_equal_alignment=\"16\"\ntarget_has_atomic_equal_alignment=\"32\"\ntarget_has_atomic_equal_alignment=\"64\"\ntarget_has_atomic_equal_alignment=\"8\"\ntarget_has_atomic_equal_alignment=\"ptr\"\ntarget_has_atomic_load_store\ntarget_has_atomic_load_store=\"128\"\ntarget_has_atomic_load_store=\"16\"\ntarget_has_atomic_load_store=\"32\"\ntarget_has_atomic_load_store=\"64\"\ntarget_has_atomic_load_store=\"8\"\ntarget_has_atomic_load_store=\"ptr\"\ntarget_os=\"macos\"\ntarget_pointer_width=\"64\"\ntarget_thread_local\ntarget_vendor=\"apple\"\nunix\n","stderr":""},"15481046163696847946":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.dylib\nlib___.dylib\nlib___.a\nlib___.dylib\n/Users/tsuki/.rustup/toolchains/nightly-aarch64-apple-darwin\noff\npacked\nunpacked\n___\ndebug_assertions\noverflow_checks\npanic=\"unwind\"\nproc_macro\nrelocation_model=\"pic\"\ntarget_abi=\"\"\ntarget_arch=\"aarch64\"\ntarget_endian=\"little\"\ntarget_env=\"\"\ntarget_family=\"unix\"\ntarget_feature=\"aes\"\ntarget_feature=\"crc\"\ntarget_feature=\"dit\"\ntarget_feature=\"dotprod\"\ntarget_feature=\"dpb\"\ntarget_feature=\"dpb2\"\ntarget_feature=\"fcma\"\ntarget_feature=\"fhm\"\ntarget_feature=\"flagm\"\ntarget_feature=\"fp16\"\ntarget_feature=\"frintts\"\ntarget_feature=\"jsconv\"\ntarget_feature=\"lor\"\ntarget_feature=\"lse\"\ntarget_feature=\"neon\"\ntarget_feature=\"paca\"\ntarget_feature=\"pacg\"\ntarget_feature=\"pan\"\ntarget_feature=\"pmuv3\"\ntarget_feature=\"ras\"\ntarget_feature=\"rcpc\"\ntarget_feature=\"rcpc2\"\ntarget_feature=\"rdm\"\ntarget_feature=\"sb\"\ntarget_feature=\"sha2\"\ntarget_feature=\"sha3\"\ntarget_feature=\"ssbs\"\ntarget_feature=\"v8.1a\"\ntarget_feature=\"v8.2a\"\ntarget_feature=\"v8.3a\"\ntarget_feature=\"v8.4a\"\ntarget_feature=\"vh\"\ntarget_has_atomic\ntarget_has_atomic=\"128\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_has_atomic_equal_alignment=\"128\"\ntarget_has_atomic_equal_alignment=\"16\"\ntarget_has_atomic_equal_alignment=\"32\"\ntarget_has_atomic_equal_alignment=\"64\"\ntarget_has_atomic_equal_alignment=\"8\"\ntarget_has_atomic_equal_alignment=\"ptr\"\ntarget_has_atomic_load_store\ntarget_has_atomic_load_store=\"128\"\ntarget_has_atomic_load_store=\"16\"\ntarget_has_atomic_load_store=\"32\"\ntarget_has_atomic_load_store=\"64\"\ntarget_has_atomic_load_store=\"8\"\ntarget_has_atomic_load_store=\"ptr\"\ntarget_os=\"macos\"\ntarget_pointer_width=\"64\"\ntarget_thread_local\ntarget_vendor=\"apple\"\nunix\n","stderr":""},"4614504638168534921":{"success":true,"status":"","code":0,"stdout":"rustc 1.77.0-nightly (d78329b92 2024-01-13)\nbinary: rustc\ncommit-hash: d78329b92e8d141d19505e7c1527181c4ab87ed4\ncommit-date: 2024-01-13\nhost: aarch64-apple-darwin\nrelease: 1.77.0-nightly\nLLVM version: 17.0.6\n","stderr":""}},"successes":{}}

View File

@ -1 +1 @@
747a3e56d0023d1f
16f3840281ed1c0f

View File

@ -1 +1 @@
{"rustc":2034204546556879275,"features":"[]","target":8454914719411586997,"profile":3567329628440936607,"path":17523903030608720598,"deps":[[3470807962260834726,"serde",false,4787662401497216020],[6147374319788932929,"serde_json",false,13625016085015906423],[6644485573429891122,"thiserror",false,1778660508903088478],[6954241390595330609,"nom",false,2941494162337318825],[8926101378076943148,"byteorder",false,13786993926510157100],[8944703748776155531,"chrono",false,9456401766367467294],[10043922549268360936,"radarg_plugin_interface",false,11802334733291555594],[11138931377059941435,"num_traits",false,2532219253751132008],[12701726091060201577,"abi_stable",false,2027217686562626457],[12732307821348191974,"anyhow",false,10525944046939466143],[12935855096716563853,"flate2",false,6751665531550146114],[16098302879908240583,"nom_derive",false,13622616610426096756]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/etws_loader-826e392dbec97b5d/dep-lib-etws_loader"}}],"rustflags":[],"metadata":41698518999418921,"config":2202906307356721367,"compile_kind":0}
{"rustc":17942353898403517573,"features":"[]","declared_features":"","target":8454914719411586997,"profile":14094339167972473758,"path":17523903030608720598,"deps":[[3470807962260834726,"serde",false,3464438898850424389],[6147374319788932929,"serde_json",false,4018346002534341099],[6644485573429891122,"thiserror",false,15376366722783231122],[6954241390595330609,"nom",false,17004332135801955629],[8926101378076943148,"byteorder",false,6029042559770906212],[8944703748776155531,"chrono",false,14085117952510397354],[10043922549268360936,"radarg_plugin_interface",false,2929903515477199145],[11138931377059941435,"num_traits",false,16208028648554347177],[12701726091060201577,"abi_stable",false,46919867052192855],[12732307821348191974,"anyhow",false,13132421988549874417],[12935855096716563853,"flate2",false,9880693184163145737],[16098302879908240583,"nom_derive",false,9783335926581460414]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/etws_loader-826e392dbec97b5d/dep-lib-etws_loader"}}],"rustflags":[],"metadata":41698518999418921,"config":2202906307356721367,"compile_kind":0}

View File

@ -1,7 +1,7 @@
{"message":"unused imports: `Write`, `self`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":323,"byte_end":327,"line_start":13,"line_end":13,"column_start":15,"column_end":19,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":15,"highlight_end":19}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/parser.rs","byte_start":335,"byte_end":340,"line_start":13,"line_end":13,"column_start":27,"column_end":32,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":27,"highlight_end":32}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(unused_imports)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null},{"message":"remove the unused imports","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":323,"byte_end":329,"line_start":13,"line_end":13,"column_start":15,"column_end":21,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":15,"highlight_end":21}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null},{"file_name":"src/parser.rs","byte_start":333,"byte_end":340,"line_start":13,"line_end":13,"column_start":25,"column_end":32,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":25,"highlight_end":32}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused imports: `Write`, `self`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:13:15\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m13\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0muse std::io::{self, Read, Write};\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(unused_imports)]` on by default\u001b[0m\n\n"}
{"message":"unused import: `RNone`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/lib.rs","byte_start":180,"byte_end":185,"line_start":9,"line_end":9,"column_start":9,"column_end":14,"is_primary":true,"text":[{"text":" RNone, ROk,","highlight_start":9,"highlight_end":14}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"remove the unused import","code":null,"level":"help","spans":[{"file_name":"src/lib.rs","byte_start":180,"byte_end":187,"line_start":9,"line_end":9,"column_start":9,"column_end":16,"is_primary":true,"text":[{"text":" RNone, ROk,","highlight_start":9,"highlight_end":16}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused import: `RNone`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/lib.rs:9:9\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m9\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m RNone, ROk,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\n\n"}
{"message":"unused variable: `hlen2`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":4573,"byte_end":4578,"line_start":153,"line_end":153,"column_start":21,"column_end":26,"is_primary":true,"text":[{"text":" let (input, hlen2) = Self::_parse_u32(input, order)?;","highlight_start":21,"highlight_end":26}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(unused_variables)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null},{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":4573,"byte_end":4578,"line_start":153,"line_end":153,"column_start":21,"column_end":26,"is_primary":true,"text":[{"text":" let (input, hlen2) = Self::_parse_u32(input, order)?;","highlight_start":21,"highlight_end":26}],"label":null,"suggested_replacement":"_hlen2","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `hlen2`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:153:21\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m153\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m let (input, hlen2) = Self::_parse_u32(input, order)?;\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_hlen2`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(unused_variables)]` on by default\u001b[0m\n\n"}
{"message":"unused variable: `order`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":6566,"byte_end":6571,"line_start":221,"line_end":221,"column_start":9,"column_end":14,"is_primary":true,"text":[{"text":" order: Order,","highlight_start":9,"highlight_end":14}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":6566,"byte_end":6571,"line_start":221,"line_end":221,"column_start":9,"column_end":14,"is_primary":true,"text":[{"text":" order: Order,","highlight_start":9,"highlight_end":14}],"label":null,"suggested_replacement":"_order","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `order`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:221:9\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m221\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m order: Order,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_order`\u001b[0m\n\n"}
{"message":"unused variable: `dimension_len`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/lib.rs","byte_start":1019,"byte_end":1032,"line_start":41,"line_end":41,"column_start":26,"column_end":39,"is_primary":true,"text":[{"text":" let (dimension_len, data) = match b.data {","highlight_start":26,"highlight_end":39}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/lib.rs","byte_start":1019,"byte_end":1032,"line_start":41,"line_end":41,"column_start":26,"column_end":39,"is_primary":true,"text":[{"text":" let (dimension_len, data) = match b.data {","highlight_start":26,"highlight_end":39}],"label":null,"suggested_replacement":"_dimension_len","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `dimension_len`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/lib.rs:41:26\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m41\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m let (dimension_len, data) = match b.data {\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_dimension_len`\u001b[0m\n\n"}
{"message":"variants `I64` and `U64` are never constructed","code":{"code":"dead_code","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":544,"byte_end":554,"line_start":27,"line_end":27,"column_start":6,"column_end":16,"is_primary":false,"text":[{"text":"enum ValueTypes {","highlight_start":6,"highlight_end":16}],"label":"variants in this enum","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/parser.rs","byte_start":561,"byte_end":564,"line_start":28,"line_end":28,"column_start":5,"column_end":8,"is_primary":true,"text":[{"text":" I64,","highlight_start":5,"highlight_end":8}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/parser.rs","byte_start":597,"byte_end":600,"line_start":32,"line_end":32,"column_start":5,"column_end":8,"is_primary":true,"text":[{"text":" U64,","highlight_start":5,"highlight_end":8}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(dead_code)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: variants `I64` and `U64` are never constructed\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:28:5\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m27\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0menum ValueTypes {\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m----------\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12mvariants in this enum\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m28\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m I64,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m...\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m32\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m U64,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(dead_code)]` on by default\u001b[0m\n\n"}
{"message":"6 warnings emitted","code":null,"level":"warning","spans":[],"children":[],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: 6 warnings emitted\u001b[0m\n\n"}
{"$message_type":"diagnostic","message":"unused imports: `Write`, `self`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":323,"byte_end":327,"line_start":13,"line_end":13,"column_start":15,"column_end":19,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":15,"highlight_end":19}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/parser.rs","byte_start":335,"byte_end":340,"line_start":13,"line_end":13,"column_start":27,"column_end":32,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":27,"highlight_end":32}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(unused_imports)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null},{"message":"remove the unused imports","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":323,"byte_end":329,"line_start":13,"line_end":13,"column_start":15,"column_end":21,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":15,"highlight_end":21}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null},{"file_name":"src/parser.rs","byte_start":333,"byte_end":340,"line_start":13,"line_end":13,"column_start":25,"column_end":32,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":25,"highlight_end":32}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused imports: `Write`, `self`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:13:15\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m13\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0muse std::io::{self, Read, Write};\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(unused_imports)]` on by default\u001b[0m\n\n"}
{"$message_type":"diagnostic","message":"unused import: `RNone`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/lib.rs","byte_start":180,"byte_end":185,"line_start":9,"line_end":9,"column_start":9,"column_end":14,"is_primary":true,"text":[{"text":" RNone, ROk,","highlight_start":9,"highlight_end":14}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"remove the unused import","code":null,"level":"help","spans":[{"file_name":"src/lib.rs","byte_start":180,"byte_end":187,"line_start":9,"line_end":9,"column_start":9,"column_end":16,"is_primary":true,"text":[{"text":" RNone, ROk,","highlight_start":9,"highlight_end":16}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused import: `RNone`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/lib.rs:9:9\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m9\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m RNone, ROk,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\n\n"}
{"$message_type":"diagnostic","message":"unused variable: `hlen2`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":6651,"byte_end":6656,"line_start":198,"line_end":198,"column_start":21,"column_end":26,"is_primary":true,"text":[{"text":" let (input, hlen2) = Self::_parse_u32(input, order)?;","highlight_start":21,"highlight_end":26}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(unused_variables)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null},{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":6651,"byte_end":6656,"line_start":198,"line_end":198,"column_start":21,"column_end":26,"is_primary":true,"text":[{"text":" let (input, hlen2) = Self::_parse_u32(input, order)?;","highlight_start":21,"highlight_end":26}],"label":null,"suggested_replacement":"_hlen2","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `hlen2`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:198:21\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m198\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m let (input, hlen2) = Self::_parse_u32(input, order)?;\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_hlen2`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(unused_variables)]` on by default\u001b[0m\n\n"}
{"$message_type":"diagnostic","message":"unused variable: `order`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":9035,"byte_end":9040,"line_start":279,"line_end":279,"column_start":9,"column_end":14,"is_primary":true,"text":[{"text":" order: Order,","highlight_start":9,"highlight_end":14}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":9035,"byte_end":9040,"line_start":279,"line_end":279,"column_start":9,"column_end":14,"is_primary":true,"text":[{"text":" order: Order,","highlight_start":9,"highlight_end":14}],"label":null,"suggested_replacement":"_order","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `order`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:279:9\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m279\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m order: Order,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_order`\u001b[0m\n\n"}
{"$message_type":"diagnostic","message":"unused variable: `dimension_len`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/lib.rs","byte_start":1019,"byte_end":1032,"line_start":41,"line_end":41,"column_start":26,"column_end":39,"is_primary":true,"text":[{"text":" let (dimension_len, data) = match b.data {","highlight_start":26,"highlight_end":39}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/lib.rs","byte_start":1019,"byte_end":1032,"line_start":41,"line_end":41,"column_start":26,"column_end":39,"is_primary":true,"text":[{"text":" let (dimension_len, data) = match b.data {","highlight_start":26,"highlight_end":39}],"label":null,"suggested_replacement":"_dimension_len","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `dimension_len`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/lib.rs:41:26\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m41\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m let (dimension_len, data) = match b.data {\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_dimension_len`\u001b[0m\n\n"}
{"$message_type":"diagnostic","message":"variants `I64` and `U64` are never constructed","code":{"code":"dead_code","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":563,"byte_end":573,"line_start":28,"line_end":28,"column_start":6,"column_end":16,"is_primary":false,"text":[{"text":"enum ValueTypes {","highlight_start":6,"highlight_end":16}],"label":"variants in this enum","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/parser.rs","byte_start":580,"byte_end":583,"line_start":29,"line_end":29,"column_start":5,"column_end":8,"is_primary":true,"text":[{"text":" I64,","highlight_start":5,"highlight_end":8}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/parser.rs","byte_start":616,"byte_end":619,"line_start":33,"line_end":33,"column_start":5,"column_end":8,"is_primary":true,"text":[{"text":" U64,","highlight_start":5,"highlight_end":8}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(dead_code)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: variants `I64` and `U64` are never constructed\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:29:5\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m28\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0menum ValueTypes {\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m----------\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12mvariants in this enum\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m29\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m I64,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m...\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m33\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m U64,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(dead_code)]` on by default\u001b[0m\n\n"}
{"$message_type":"diagnostic","message":"6 warnings emitted","code":null,"level":"warning","spans":[],"children":[],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: 6 warnings emitted\u001b[0m\n\n"}

View File

@ -1,8 +1,8 @@
/Users/ruomu/projects/cinrad_g/etws_loader/target/release/deps/libetws_loader.dylib: src/lib.rs src/error.rs src/parser.rs
/Users/tsuki/projects/radar-g/etws_loader/target/release/deps/libetws_loader.dylib: src/lib.rs src/error.rs src/parser.rs
/Users/ruomu/projects/cinrad_g/etws_loader/target/release/deps/libetws_loader.rlib: src/lib.rs src/error.rs src/parser.rs
/Users/tsuki/projects/radar-g/etws_loader/target/release/deps/libetws_loader.rlib: src/lib.rs src/error.rs src/parser.rs
/Users/ruomu/projects/cinrad_g/etws_loader/target/release/deps/etws_loader.d: src/lib.rs src/error.rs src/parser.rs
/Users/tsuki/projects/radar-g/etws_loader/target/release/deps/etws_loader.d: src/lib.rs src/error.rs src/parser.rs
src/lib.rs:
src/error.rs:

View File

@ -1 +1 @@
/Users/ruomu/projects/cinrad_g/etws_loader/target/release/libetws_loader.dylib: /Users/ruomu/projects/cinrad_g/etws_loader/src/error.rs /Users/ruomu/projects/cinrad_g/etws_loader/src/lib.rs /Users/ruomu/projects/cinrad_g/etws_loader/src/parser.rs /Users/ruomu/projects/cinrad_g/radarg_plugin_interface/src/error.rs /Users/ruomu/projects/cinrad_g/radarg_plugin_interface/src/lib.rs
/Users/tsuki/projects/radar-g/etws_loader/target/release/libetws_loader.dylib: /Users/tsuki/projects/radar-g/etws_loader/src/error.rs /Users/tsuki/projects/radar-g/etws_loader/src/lib.rs /Users/tsuki/projects/radar-g/etws_loader/src/parser.rs /Users/tsuki/projects/radar-g/radarg_plugin_interface/src/error.rs /Users/tsuki/projects/radar-g/radarg_plugin_interface/src/lib.rs

View File

@ -37,6 +37,7 @@ pub enum VecResult {
I64(RVec<i64>),
F64(RVec<f64>),
I32(RVec<i32>),
I16(RVec<i16>),
F32(RVec<f32>),
U64(RVec<u64>),
U32(RVec<u32>),

View File

@ -1,8 +1,10 @@
use std::fmt::Debug;
use crate::widgets::render::Layer;
use crate::widgets::{render::Layer, widget::Widget};
pub enum MonitorInputMsg {
AddWidget(Box<dyn Widget>),
RemoveWidget,
AddLayer(Layer),
RemoveLayer(String),
UpdateLayer((String, Box<dyn Fn(&mut Layer) + 'static>)),
@ -16,6 +18,8 @@ impl Debug for MonitorInputMsg {
MonitorInputMsg::RemoveLayer(_) => write!(f, "MonitorInputMsg::RemoveLayer"),
MonitorInputMsg::UpdateLayer(_) => write!(f, "MonitorInputMsg::UpdateLayer"),
MonitorInputMsg::None => write!(f, "MonitorInputMsg::None"),
MonitorInputMsg::AddWidget(_) => write!(f, "MonitorInputMsg::AddWidget"),
MonitorInputMsg::RemoveWidget => write!(f, "MonitorInputMsg::RemoveWidget"),
}
}
}

View File

@ -1,6 +1,10 @@
use super::messages::{MonitorInputMsg, MonitorOutputMsg};
use crate::pipeline::offscreen_renderer::OffscreenRenderer;
use crate::widgets::predefined::color_mapper::BoundaryNorm;
use crate::widgets::predefined::widgets::ColorBar;
use crate::widgets::render::{RenderConfig, Target, CMS};
use crate::widgets::widget::{Widget, WidgetType};
use crate::widgets::WidgetFrame;
use crate::{
coords::{proj::Mercator, Mapper},
widgets::dynamic_col::DynamicCol,
@ -29,6 +33,8 @@ pub struct MonitorModel {
sidebar_width: i32,
new_layer: i8,
#[no_eq]
widgets: Vec<WidgetFrame>,
#[no_eq]
layers: Rc<RefCell<HashMap<String, Layer>>>,
#[no_eq]
sidebar: Controller<SideBarModel>,
@ -66,6 +72,7 @@ impl Component for MonitorModel {
set_start_child=&gtk::Frame{
add_css_class: "rb",
set_margin_all: 5,
#[name="widget_layer"]
gtk::Overlay{
#[wrap(Some)]
set_child = &Render{
@ -84,7 +91,10 @@ impl Component for MonitorModel {
set_margin_all:10,
set_valign: gtk::Align::Start,
set_halign: gtk::Align::End,
}
},
#[track = "model.changed(MonitorModel::new_layer())"]
#[iterate]
add_overlay: &model.widgets
},
},
@ -97,9 +107,22 @@ impl Component for MonitorModel {
}
fn update(&mut self, message: Self::Input, sender: ComponentSender<Self>, root: &Self::Root) {
self.reset();
match message {
MonitorInputMsg::AddLayer(layer) => {
let need_prepare = { layer.get_prepare().lock().unwrap().is_some() };
{
let mut layers = self.layers.borrow_mut();
if !layers.contains_key(layer.name.as_str()) {
let mut widgets = layer.widgets.lock().unwrap();
if widgets.is_some() {
let ws = widgets.take().unwrap();
ws.into_iter().for_each(|w| {
sender.input(MonitorInputMsg::AddWidget(w));
});
}
}
}
if need_prepare {
sender.oneshot_command(async move {
let mut back = OffscreenRenderer::new(3000, 3000).unwrap();
@ -118,14 +141,18 @@ impl Component for MonitorModel {
MonitorCommand::NewLayer(layer)
});
} else {
self.layers
.borrow_mut()
.get_mut(layer.name.as_str())
.map(|v| *v = layer);
sender
.output_sender()
.send(MonitorOutputMsg::LayerAdded(0))
.unwrap();
{
let mut layers = self.layers.borrow_mut();
if layers.contains_key(layer.name.as_str()) {
let p = layers.get_mut(layer.name.as_str()).unwrap();
*p = layer;
} else {
layers.insert(layer.name.clone(), layer);
}
}
let raw_id = self.get_new_layer();
self.set_new_layer(*raw_id + 1);
self.sidebar.sender().send(Msg::RefreshList);
}
}
@ -143,6 +170,16 @@ impl Component for MonitorModel {
.send(MonitorOutputMsg::LayerUpdated(0))
.unwrap();
}
MonitorInputMsg::AddWidget(widget) => match widget.widget_type() {
WidgetType::Cairo => {
let frame = WidgetFrame::new();
frame.set_widget(widget);
self.widgets.push(frame);
}
WidgetType::OpenGl => {}
_ => {}
},
MonitorInputMsg::RemoveWidget => {}
MonitorInputMsg::None => {}
}
}
@ -167,6 +204,7 @@ impl Component for MonitorModel {
let model = MonitorModel {
render_range: (4.0, 53.3, 73.3, 135.0),
new_layer: 0,
widgets: vec![],
render_cfg,
sidebar_open: true,
sidebar_width: 400,
@ -188,7 +226,6 @@ impl Component for MonitorModel {
self.reset();
match msg {
MonitorCommand::NewLayer(layer) => {
// self.layers.push(layer);
self.layers.borrow_mut().insert(layer.name.clone(), layer);
self.set_render_range((29.13, 30.16, 119.53, 121.13));
self.sidebar.sender().send(Msg::RefreshList).unwrap();

View File

@ -1,7 +1,9 @@
pub mod dynamic_col;
pub mod render;
pub mod timeline;
pub mod widget_frame;
pub use dynamic_col::*;
pub use render::*;
pub use timeline::*;
pub use widget_frame::*;

View File

@ -1,6 +1,6 @@
use super::super::{cms::CMS, Render};
use crate::coords::Range;
use crate::pipeline::offscreen_renderer::CanvasWrapper;
use crate::{coords::Range, widgets::widget::Widget};
use femtovg::{renderer::OpenGl, Canvas, ImageId};
use std::{
cell::{Ref, RefCell},
@ -34,6 +34,7 @@ pub type LayerImplSync = Arc<Mutex<Box<dyn LayerImpl + Send + Sync>>>;
pub struct Layer {
pub visiable: bool,
pub name: String,
pub widgets: Arc<Mutex<Option<Vec<Box<dyn Widget>>>>>,
target: Arc<Mutex<Option<Target>>>,
prepare: PrepareFunc,
imp: Option<Arc<Mutex<Box<dyn LayerImpl + Send + Sync>>>>,
@ -62,6 +63,7 @@ impl Layer {
>(
visiable: bool,
draw: F,
widgets: Option<Vec<Box<dyn Widget>>>,
layer_name: String,
prepare: Option<PREPARE>,
imp: Option<IMP>,
@ -70,6 +72,7 @@ impl Layer {
visiable,
target: Arc::new(Mutex::new(None)),
name: layer_name,
widgets: Arc::new(Mutex::new(widgets)),
prepare: Arc::new(Mutex::new(prepare.map(|p| {
Box::new(move |a, b, c| p(a, b, c))
as Box<

View File

@ -7,21 +7,15 @@ pub trait ColorMapper<T: NumOps + PartialOrd + FromPrimitive + AsPrimitive<f64>>
{
fn map_value_to_color(&self, value: T, invalid: T) -> Option<femtovg::Color>;
fn map_min_to_max(&self, mut min: T, max: T, len: usize) -> Vec<femtovg::Color> {
let step = (max - min).as_() / len as f64;
let mut colors = Vec::new();
while min <= max {
colors.push(self.map_value_to_color(min, self.invalid()).unwrap());
min = min + T::from_f64(step).unwrap();
}
colors
}
fn map_min_to_max(&self) -> Vec<femtovg::Color>;
fn labels(&self) -> Vec<String>;
fn min_max(&self) -> (T, T);
fn invalid(&self) -> T;
}
#[derive(Debug)]
#[derive(Debug, Clone)]
pub struct BoundaryNorm<T: NumOps + PartialOrd> {
boundaries: Vec<T>,
extrand: bool,
@ -106,4 +100,18 @@ where
fn invalid(&self) -> T {
self.invalid_value.clone()
}
fn map_min_to_max(&self) -> Vec<femtovg::Color> {
self.boundaries
.iter()
.map(|x| self.map_value_to_color(*x, self.invalid_value).unwrap())
.collect()
}
fn labels(&self) -> Vec<String> {
self.boundaries
.iter()
.map(|x| format!("{:.2}", x.as_()))
.collect()
}
}

View File

@ -10,6 +10,7 @@ use std::sync::Mutex;
use super::super::{
cms::CMS, widget::Widget, Layer, LayerImpl, LayerImplSync, Render, Target, TargetType,
};
use super::widgets::ColorBar;
use crate::data::{AsyncDataLoader, DataLoader, Radar2d};
use crate::pipeline::offscreen_renderer::CanvasWrapper;
use tokio::task;
@ -33,7 +34,7 @@ impl Layer {
+ Sync
+ FromPrimitive
+ AsPrimitive<f64>,
CMAP: ColorMapper<T> + 'static,
CMAP: ColorMapper<T> + 'static + Clone,
{
Self::new(
true,
@ -71,6 +72,12 @@ impl Layer {
}
}
},
Some(vec![Box::new(ColorBar::new(
color_map.clone(),
[5.0, 5.0, 5.0, 5.0],
(80.0, 280.0),
[0, 10, 50, 0],
))]),
layer_name,
Some(
move |renderer: LayerImplSync, c: Arc<Mutex<CanvasWrapper>>, cms: CMS| {
@ -102,7 +109,7 @@ impl Layer {
+ Send
+ FromPrimitive
+ AsPrimitive<f64>,
CMAP: ColorMapper<T> + 'static,
CMAP: ColorMapper<T> + 'static + Clone,
LOADER: DataLoader<T, Radar2d<T>>,
{
let data = loader.load(path).unwrap();
@ -127,7 +134,7 @@ impl Layer {
+ Sync
+ FromPrimitive
+ AsPrimitive<f64>,
CMAP: ColorMapper<T> + 'static,
CMAP: ColorMapper<T> + 'static + Clone,
LOADER: AsyncDataLoader<T, Radar2d<T>>,
{
let data = loader.load(path).await.unwrap();
@ -135,16 +142,42 @@ impl Layer {
}
}
impl Layer {
pub fn widget_layer<T: Widget + Send + Sync + Debug>(widget: T) -> Self {
Self::new(
true,
|s, render, (w, h)| {
let imp = s.get_imp().unwrap();
},
"widget".into(),
None::<FnOnce(LayerImplSync, Arc<Mutex<CanvasWrapper>>, CMS) -> Target + Send + Sync + 'static>,
Some(widget),
)
}
}
// impl Layer {
// pub fn widget_layer<T: Widget + Send + Sync + Debug + 'static>(
// widget: T,
// visiable: bool,
// ) -> Self {
// Self::new(
// visiable,
// |s, render, (w, h)| {
// let imp = s.get_imp().unwrap();
// let mut canvas = render.get_canvas();
// let canvas = canvas.as_mut().unwrap();
// let cms = render.create_cms();
// imp.lock().unwrap().draw(canvas, cms);
// },
// "widget".into(),
// None::<
// Box<
// dyn FnOnce(LayerImplSync, Arc<Mutex<CanvasWrapper>>, CMS) -> Target
// + Send
// + Sync,
// >,
// >,
// Some(widget),
// )
// }
// pub fn colorbar_layer<V, T>(
// visiable: bool,
// color_mapper: T,
// padding: [f32; 4],
// origin: (f32, f32),
// ) -> Self
// where
// V: num_traits::NumOps + PartialOrd + FromPrimitive + AsPrimitive<f64> + Debug + Send + Sync,
// T: ColorMapper<V> + 'static,
// {
// Self::widget_layer(ColorBar::new(color_mapper, padding, origin), visiable)
// }
// }

View File

@ -1,8 +1,12 @@
use super::{
super::widget::{Widget as WidgetTrait, WidgetType},
super::Layer,
color_mapper::ColorMapper,
};
use crate::widgets::CMS;
use femtovg::{renderer::OpenGl, Canvas, Color, Paint, Path};
use num_traits::*;
use super::{super::widget::Widget as WidgetTrait, super::Layer, color_mapper::ColorMapper};
#[derive(Debug)]
pub struct ColorBar<V, T>
where
V: num_traits::NumOps + PartialOrd + FromPrimitive + AsPrimitive<f64>,
@ -10,38 +14,91 @@ where
{
color_mapper: T,
padding: [f32; 4],
width: Option<f32>,
height: Option<f32>,
origin: (f32, f32),
width: f32,
height: f32,
margin: [i32; 4],
color_list: Vec<femtovg::Color>,
phantom: std::marker::PhantomData<V>,
}
impl<V, T> WidgetTrait for ColorBar<V, T>
impl<V, T> ColorBar<V, T>
where
V: num_traits::NumOps + PartialOrd + FromPrimitive + AsPrimitive<f64>,
T: ColorMapper<V>,
{
fn render(&self, canvas: &mut Canvas<OpenGl>, cms: CMS) {
let (w, h) = (canvas.width(), canvas.height());
let bar_width = self.width.unwrap_or(w as f32) - self.padding[1] - self.padding[3];
let bar_height = self.height.unwrap_or(10.0);
let (x, y) = self.origin;
pub fn new(color_mapper: T, padding: [f32; 4], size: (f32, f32), margin: [i32; 4]) -> Self {
let (l, ll) = color_mapper.min_max();
let invalid = color_mapper.invalid();
let colors = color_mapper.map_min_to_max();
let (l, ll) = self.color_mapper.min_max();
let invalid = self.color_mapper.invalid();
let colors = self.color_mapper.map_min_to_max(l, ll, 100);
let b_w = w as f32 / 100.0;
for (i, color) in colors.into_iter().enumerate() {
let x = x + i as f32 * b_w;
let y = y;
let w = b_w;
let h = bar_height;
let mut path = Path::new();
path.rect(x, y, w, h);
let paint = Paint::color(color);
canvas.fill_path(&path, &paint);
Self {
color_list: colors,
color_mapper,
padding,
width: size.0,
height: size.1,
margin,
phantom: std::marker::PhantomData,
}
}
}
impl<V, T> WidgetTrait for ColorBar<V, T>
where
V: num_traits::NumOps + PartialOrd + FromPrimitive + AsPrimitive<f64> + Send + Sync,
T: ColorMapper<V> + 'static,
{
fn cairo_render(&self, canvas: &cairo::Context, w: f32, h: f32) {
let bar_width = 10;
let bar_height = h - self.padding[0] - self.padding[2];
let (x, y) = (self.padding[3], self.padding[0]);
let b_h = bar_height / self.color_list.len() as f32;
for ((i, color), label) in self
.color_list
.iter()
.enumerate()
.zip(self.color_mapper.labels())
{
let y = y + i as f32 * b_h;
canvas.set_source_rgba(
color.r as f64,
color.g as f64,
color.b as f64,
color.a as f64,
);
canvas.rectangle(x as f64, y as f64, bar_width as f64, b_h as f64);
canvas.fill();
let extents = canvas.text_extents(&label).unwrap();
canvas.move_to(
(x + bar_width as f32 + 5.0) as f64,
y as f64 + extents.height() / 2.0 as f64,
);
canvas.set_source_rgba(1.0, 1.0, 1.0, 1.0);
canvas.show_text(&label);
}
}
fn location(&self) -> (gtk::Align, gtk::Align) {
(gtk::Align::End, gtk::Align::End)
}
fn size(&self) -> (f32, f32) {
(self.width, self.height)
}
fn widget_type(&self) -> WidgetType {
WidgetType::Cairo
}
fn margin(&self) -> [i32; 4] {
self.margin
}
fn padding(&self) -> [i32; 4] {
[10, 10, 10, 10]
}
}

View File

@ -1,3 +1,3 @@
mod widget;
pub use widget::Widget;
pub use widget::{Widget, WidgetType};

View File

@ -1,14 +1,24 @@
use crate::widgets::{Layer, LayerImpl, Render, CMS};
use femtovg::{renderer::OpenGl, Canvas};
use gtk::Align;
use std::{fmt::Debug, rc::Rc};
pub trait Widget {
fn render(&self, canvas: &mut Canvas<OpenGl>, cms: CMS);
pub enum WidgetType {
OpenGl,
Cairo,
Other,
}
impl<T: Widget + Debug> LayerImpl for T {
fn draw(&self, canvas: &mut Canvas<OpenGl>, cms: CMS) -> Option<crate::widgets::Target> {
self.render( canvas, cms);
None
pub trait Widget: 'static + Send + Sync {
fn opengl_render(&self, canvas: &mut Canvas<OpenGl>, cms: CMS) {}
fn cairo_render(&self, canvas: &cairo::Context, w: f32, h: f32) {}
fn widget_type(&self) -> WidgetType;
fn size(&self) -> (f32, f32);
fn location(&self) -> (Align, Align);
fn margin(&self) -> [i32; 4];
fn padding(&self) -> [i32; 4] {
[20, 50, 20, 50]
}
}

View File

@ -243,7 +243,11 @@ impl TimeLine {
}
pub fn set_selection(&self, selection: Option<Selection>) {
self.imp().selection.replace(selection);
self.imp().drawing_area.borrow().as_ref().map(|d| d.queue_draw());
self.imp()
.drawing_area
.borrow()
.as_ref()
.map(|d| d.queue_draw());
}
pub fn set_border_radius(&self) {}

View File

@ -0,0 +1,60 @@
use crate::widgets::widget::Widget;
use chrono::{prelude::*, Duration};
use gtk::glib::{self, prelude::*, ParamSpec, Properties, Property, Value};
use gtk::prelude::*;
use gtk::subclass::prelude::*;
use std::cell::{Cell, RefCell};
use std::rc::Rc;
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum Selection {
Slice((DateTime<Utc>, DateTime<Utc>)),
Point(DateTime<Utc>),
}
// #[derive(Properties)]
// #[properties(wrapper_type = super::WidgetFrame)]
pub struct WidgetFrame {
pub(super) drawing_area: RefCell<Option<gtk::DrawingArea>>,
pub(super) height: Cell<u32>,
pub(super) width: Cell<u32>,
pub(super) widget: Rc<RefCell<Option<Box<dyn Widget>>>>,
}
impl Default for WidgetFrame {
fn default() -> Self {
Self {
drawing_area: RefCell::new(None),
height: Cell::new(40),
width: Cell::new(380),
widget: Rc::new(RefCell::new(None)),
}
}
}
#[glib::object_subclass]
impl ObjectSubclass for WidgetFrame {
const NAME: &'static str = "WidgetFrame";
type Type = super::WidgetFrame;
type ParentType = gtk::Widget;
fn class_init(klass: &mut Self::Class) {
klass.set_layout_manager_type::<gtk::BoxLayout>();
}
}
impl ObjectImpl for WidgetFrame {
// fn properties() -> &'static [ParamSpec] {
// Self::derived_properties()
// }
// fn set_property(&self, id: usize, value: &Value, pspec: &ParamSpec) {
// Self::derived_set_property(&self, id, value, pspec);
// }
// fn property(&self, id: usize, pspec: &ParamSpec) -> Value {
// Self::derived_property(&self, id, pspec)
// }
}
impl WidgetImpl for WidgetFrame {}

View File

@ -0,0 +1,73 @@
use self::widget::Widget;
pub use super::*;
mod imp;
use chrono::{prelude::*, DateTime, Duration, Utc};
use glib::clone;
pub use glib::subclass::prelude::*;
use gtk::prelude::*;
glib::wrapper! {
pub struct WidgetFrame(ObjectSubclass<imp::WidgetFrame>)
@extends gtk::Widget;
}
impl Default for WidgetFrame {
fn default() -> Self {
Self::new()
}
}
impl WidgetFrame {
pub fn new() -> Self {
let this: Self = glib::Object::new();
let frame = gtk::Frame::new(None);
frame.set_hexpand(true);
frame.set_vexpand(true);
let drawing_area = gtk::DrawingArea::new();
let settings = gtk::Settings::default().unwrap();
let prefers_dark_theme = settings.is_gtk_application_prefer_dark_theme();
frame.set_child(Some(&drawing_area));
frame.set_parent(&this);
this.imp().drawing_area.replace(Some(drawing_area));
this
}
pub fn set_widget(&self, widget: Box<dyn Widget>) {
self.imp().widget.replace(Some(widget));
let drawing_area = self.imp().drawing_area.borrow();
let drawing_area = drawing_area.as_ref().unwrap();
let widget = self.imp().widget.clone();
let widget_ref = widget.borrow();
let widget_ref = widget_ref.as_ref().unwrap();
let (w, h) = widget_ref.size();
let margin = widget_ref.margin();
let location = widget_ref.location();
self.set_halign(location.0);
self.set_valign(location.1);
self.set_margin_top(margin[0]);
self.set_margin_bottom(margin[2]);
self.set_margin_start(margin[3]);
self.set_margin_end(margin[1]);
self.set_width_request(w as i32);
self.set_height_request(h as i32);
let padding = widget_ref.padding();
drawing_area.set_margin_top(padding[0]);
drawing_area.set_margin_bottom(padding[2]);
drawing_area.set_margin_start(padding[3]);
drawing_area.set_margin_end(padding[1]);
drawing_area.set_height_request(h as i32 - padding[0] - padding[2]);
drawing_area.set_width_request(w as i32 - padding[1] - padding[3]);
drawing_area.set_draw_func(clone!(@strong widget => move |_, canvas, x, y| {
let widget = widget.borrow();
let widget = widget.as_ref().unwrap();
widget.cairo_render(canvas,x as f32,y as f32);
}));
drawing_area.queue_draw();
}
}