diff --git a/Cargo.lock b/Cargo.lock index 6910318..5018c21 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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", diff --git a/Cargo.toml b/Cargo.toml index 1aa8718..ad02196 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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] diff --git a/etws_loader/src/lib.rs b/etws_loader/src/lib.rs index 1597171..674babe 100644 --- a/etws_loader/src/lib.rs +++ b/etws_loader/src/lib.rs @@ -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(); } } diff --git a/etws_loader/src/parser.rs b/etws_loader/src/parser.rs index 4ba80b6..aa5bd6f 100644 --- a/etws_loader/src/parser.rs +++ b/etws_loader/src/parser.rs @@ -18,6 +18,7 @@ pub enum ValueResult { F64(Vec), I32(Vec), F32(Vec), + I16(Vec), U64(Vec), U32(Vec), I8(Vec), @@ -31,6 +32,7 @@ enum ValueTypes { F32, U64, U32, + I16, I8, U8, } @@ -46,6 +48,49 @@ pub struct Record { pub blocks: Vec, // 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::(); + 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::>(), + ) + } 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::>() + } else { + slice + }) + } + }; + Ok((input, result)) + }, + )+ + } + } + + }; +} + impl Record { pub fn parse_from_path(path: impl AsRef) -> Result { 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::() / mem::size_of::(); - 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::>(), - ) - } 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::>() - } else { - slice - }) - } - }; - - Ok((input, result)) - } - ValueTypes::F64 => { - let ratio = mem::size_of::() / mem::size_of::(); - 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::>() - } else { - slice - }) - }; - - Ok((input, result)) - } - ValueTypes::I32 => { - let ratio = mem::size_of::() / mem::size_of::(); - 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::>(), - ) - } 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::>() - } else { - slice - }) - } - }; - - Ok((input, result)) - } - - ValueTypes::U32 => { - let ratio = mem::size_of::() / mem::size_of::(); - 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::>(), - ) - } 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::>() - } else { - slice - }) - } - }; - - Ok((input, result)) - } - ValueTypes::F32 => { - let ratio = mem::size_of::() / mem::size_of::(); - 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::>() - } else { - slice - }) - }; - - Ok((input, result)) - } - ValueTypes::U64 => { - let ratio = mem::size_of::() / mem::size_of::(); - 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::>(), - ) - } 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::>() - } 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::>(), - ) - } 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::>() - } 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::>(), - ) - } else { - ValueResult::U8(if need_trans { - let offset = offset as u8; - slice.into_iter().map(|p| p - offset).collect::>() - } 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"), - } + 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) + ) } } @@ -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::() / mem::size_of::(); +// 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::>(), +// ) +// } else { +// ValueResult::I64(if need_trans { +// let offset = offset as i64; +// slice.into_iter().map(|p| p - offset).collect::>() +// } else { +// slice +// }) +// } +// }; + +// Ok((input, result)) +// } +// ValueTypes::F64 => { +// let ratio = mem::size_of::() / mem::size_of::(); +// 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::>() +// } else { +// slice +// }) +// }; + +// Ok((input, result)) +// } +// ValueTypes::I32 => { +// let ratio = mem::size_of::() / mem::size_of::(); +// 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::>(), +// ) +// } else { +// ValueResult::I32(if need_trans { +// let offset = offset as i32; +// slice.into_iter().map(|p| p - offset).collect::>() +// } else { +// slice +// }) +// } +// }; + +// Ok((input, result)) +// } + +// ValueTypes::U32 => { +// let ratio = mem::size_of::() / mem::size_of::(); +// 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::>(), +// ) +// } else { +// ValueResult::U32(if need_trans { +// let offset = offset as u32; +// slice.into_iter().map(|p| p - offset).collect::>() +// } else { +// slice +// }) +// } +// }; + +// Ok((input, result)) +// } +// ValueTypes::F32 => { +// let ratio = mem::size_of::() / mem::size_of::(); +// 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::>() +// } else { +// slice +// }) +// }; + +// Ok((input, result)) +// } +// ValueTypes::U64 => { +// let ratio = mem::size_of::() / mem::size_of::(); +// 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::>(), +// ) +// } else { +// ValueResult::U64(if need_trans { +// let offset = offset as u64; +// slice.into_iter().map(|p| p - offset).collect::>() +// } 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::>(), +// ) +// } else { +// ValueResult::I8(if need_trans { +// let offset = offset as i8; +// slice.into_iter().map(|p| p - offset).collect::>() +// } 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::>(), +// ) +// } else { +// ValueResult::U8(if need_trans { +// let offset = offset as u8; +// slice.into_iter().map(|p| p - offset).collect::>() +// } else { +// slice +// }) +// }; + +// Ok((input, result)) +// } +// } +// } diff --git a/etws_loader/target/.rustc_info.json b/etws_loader/target/.rustc_info.json index 93dab57..4943425 100644 --- a/etws_loader/target/.rustc_info.json +++ b/etws_loader/target/.rustc_info.json @@ -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":{}} \ No newline at end of file +{"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":{}} \ No newline at end of file diff --git a/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader b/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader index b9b1390..928d854 100644 --- a/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader +++ b/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader @@ -1 +1 @@ -747a3e56d0023d1f \ No newline at end of file +16f3840281ed1c0f \ No newline at end of file diff --git a/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader.json b/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader.json index 2a14595..2d45bde 100644 --- a/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader.json +++ b/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/lib-etws_loader.json @@ -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} \ No newline at end of file +{"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} \ No newline at end of file diff --git a/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/output-lib-etws_loader b/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/output-lib-etws_loader index ccf98c1..9458257 100644 --- a/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/output-lib-etws_loader +++ b/etws_loader/target/release/.fingerprint/etws_loader-826e392dbec97b5d/output-lib-etws_loader @@ -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"} diff --git a/etws_loader/target/release/deps/etws_loader.d b/etws_loader/target/release/deps/etws_loader.d index aa4f077..2025c0d 100644 --- a/etws_loader/target/release/deps/etws_loader.d +++ b/etws_loader/target/release/deps/etws_loader.d @@ -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: diff --git a/etws_loader/target/release/deps/libetws_loader.dylib b/etws_loader/target/release/deps/libetws_loader.dylib index ac05223..99a5167 100755 Binary files a/etws_loader/target/release/deps/libetws_loader.dylib and b/etws_loader/target/release/deps/libetws_loader.dylib differ diff --git a/etws_loader/target/release/deps/libetws_loader.rlib b/etws_loader/target/release/deps/libetws_loader.rlib index 8966908..8aac226 100644 Binary files a/etws_loader/target/release/deps/libetws_loader.rlib and b/etws_loader/target/release/deps/libetws_loader.rlib differ diff --git a/etws_loader/target/release/libetws_loader.d b/etws_loader/target/release/libetws_loader.d index 40adfb4..77c9b50 100644 --- a/etws_loader/target/release/libetws_loader.d +++ b/etws_loader/target/release/libetws_loader.d @@ -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 diff --git a/etws_loader/target/release/libetws_loader.dylib b/etws_loader/target/release/libetws_loader.dylib index ac05223..99a5167 100755 Binary files a/etws_loader/target/release/libetws_loader.dylib and b/etws_loader/target/release/libetws_loader.dylib differ diff --git a/etws_loader/target/release/libetws_loader.rlib b/etws_loader/target/release/libetws_loader.rlib index 8966908..8aac226 100644 Binary files a/etws_loader/target/release/libetws_loader.rlib and b/etws_loader/target/release/libetws_loader.rlib differ diff --git a/radarg_plugin_interface/src/lib.rs b/radarg_plugin_interface/src/lib.rs index fcf05be..14200c5 100644 --- a/radarg_plugin_interface/src/lib.rs +++ b/radarg_plugin_interface/src/lib.rs @@ -37,6 +37,7 @@ pub enum VecResult { I64(RVec), F64(RVec), I32(RVec), + I16(RVec), F32(RVec), U64(RVec), U32(RVec), diff --git a/src/components/monitor/messages.rs b/src/components/monitor/messages.rs index 7973b26..813abfb 100644 --- a/src/components/monitor/messages.rs +++ b/src/components/monitor/messages.rs @@ -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), + RemoveWidget, AddLayer(Layer), RemoveLayer(String), UpdateLayer((String, Box)), @@ -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"), } } } diff --git a/src/components/monitor/monitor.rs b/src/components/monitor/monitor.rs index 9f3bace..12a0fe1 100644 --- a/src/components/monitor/monitor.rs +++ b/src/components/monitor/monitor.rs @@ -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, + #[no_eq] layers: Rc>>, #[no_eq] sidebar: Controller, @@ -66,6 +72,7 @@ impl Component for MonitorModel { set_start_child=>k::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, 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(); diff --git a/src/widgets/mod.rs b/src/widgets/mod.rs index f768cdc..e96f512 100644 --- a/src/widgets/mod.rs +++ b/src/widgets/mod.rs @@ -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::*; diff --git a/src/widgets/render/interior/layers.rs b/src/widgets/render/interior/layers.rs index 71c42e0..6f44125 100644 --- a/src/widgets/render/interior/layers.rs +++ b/src/widgets/render/interior/layers.rs @@ -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>>; pub struct Layer { pub visiable: bool, pub name: String, + pub widgets: Arc>>>>, target: Arc>>, prepare: PrepareFunc, imp: Option>>>, @@ -62,6 +63,7 @@ impl Layer { >( visiable: bool, draw: F, + widgets: Option>>, layer_name: String, prepare: Option, imp: Option, @@ -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< diff --git a/src/widgets/render/predefined/color_mapper.rs b/src/widgets/render/predefined/color_mapper.rs index 7db2939..9085d8d 100644 --- a/src/widgets/render/predefined/color_mapper.rs +++ b/src/widgets/render/predefined/color_mapper.rs @@ -7,21 +7,15 @@ pub trait ColorMapper> { fn map_value_to_color(&self, value: T, invalid: T) -> Option; - fn map_min_to_max(&self, mut min: T, max: T, len: usize) -> Vec { - 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; + + fn labels(&self) -> Vec; fn min_max(&self) -> (T, T); fn invalid(&self) -> T; } -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct BoundaryNorm { boundaries: Vec, extrand: bool, @@ -106,4 +100,18 @@ where fn invalid(&self) -> T { self.invalid_value.clone() } + + fn map_min_to_max(&self) -> Vec { + self.boundaries + .iter() + .map(|x| self.map_value_to_color(*x, self.invalid_value).unwrap()) + .collect() + } + + fn labels(&self) -> Vec { + self.boundaries + .iter() + .map(|x| format!("{:.2}", x.as_())) + .collect() + } } diff --git a/src/widgets/render/predefined/layers.rs b/src/widgets/render/predefined/layers.rs index 4c0bd7d..5018eda 100644 --- a/src/widgets/render/predefined/layers.rs +++ b/src/widgets/render/predefined/layers.rs @@ -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, - CMAP: ColorMapper + 'static, + CMAP: ColorMapper + '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>, cms: CMS| { @@ -102,7 +109,7 @@ impl Layer { + Send + FromPrimitive + AsPrimitive, - CMAP: ColorMapper + 'static, + CMAP: ColorMapper + 'static + Clone, LOADER: DataLoader>, { let data = loader.load(path).unwrap(); @@ -127,7 +134,7 @@ impl Layer { + Sync + FromPrimitive + AsPrimitive, - CMAP: ColorMapper + 'static, + CMAP: ColorMapper + 'static + Clone, LOADER: AsyncDataLoader>, { let data = loader.load(path).await.unwrap(); @@ -135,16 +142,42 @@ impl Layer { } } -impl Layer { - pub fn widget_layer(widget: T) -> Self { - Self::new( - true, - |s, render, (w, h)| { - let imp = s.get_imp().unwrap(); - }, - "widget".into(), - None::>, CMS) -> Target + Send + Sync + 'static>, - Some(widget), - ) - } -} +// impl Layer { +// pub fn widget_layer( +// 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>, CMS) -> Target +// + Send +// + Sync, +// >, +// >, +// Some(widget), +// ) +// } + +// pub fn colorbar_layer( +// visiable: bool, +// color_mapper: T, +// padding: [f32; 4], +// origin: (f32, f32), +// ) -> Self +// where +// V: num_traits::NumOps + PartialOrd + FromPrimitive + AsPrimitive + Debug + Send + Sync, +// T: ColorMapper + 'static, +// { +// Self::widget_layer(ColorBar::new(color_mapper, padding, origin), visiable) +// } +// } diff --git a/src/widgets/render/predefined/widgets.rs b/src/widgets/render/predefined/widgets.rs index a39067c..6b844c0 100644 --- a/src/widgets/render/predefined/widgets.rs +++ b/src/widgets/render/predefined/widgets.rs @@ -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 where V: num_traits::NumOps + PartialOrd + FromPrimitive + AsPrimitive, @@ -10,38 +14,91 @@ where { color_mapper: T, padding: [f32; 4], - width: Option, - height: Option, - origin: (f32, f32), + width: f32, + height: f32, + margin: [i32; 4], + color_list: Vec, phantom: std::marker::PhantomData, } -impl WidgetTrait for ColorBar +impl ColorBar where V: num_traits::NumOps + PartialOrd + FromPrimitive + AsPrimitive, T: ColorMapper, { - fn render(&self, canvas: &mut Canvas, 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 WidgetTrait for ColorBar +where + V: num_traits::NumOps + PartialOrd + FromPrimitive + AsPrimitive + Send + Sync, + T: ColorMapper + '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] + } +} diff --git a/src/widgets/render/widget/mod.rs b/src/widgets/render/widget/mod.rs index 31a3368..b1f9020 100644 --- a/src/widgets/render/widget/mod.rs +++ b/src/widgets/render/widget/mod.rs @@ -1,3 +1,3 @@ mod widget; -pub use widget::Widget; +pub use widget::{Widget, WidgetType}; diff --git a/src/widgets/render/widget/widget.rs b/src/widgets/render/widget/widget.rs index 04e3a27..e800975 100644 --- a/src/widgets/render/widget/widget.rs +++ b/src/widgets/render/widget/widget.rs @@ -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, cms: CMS); +pub enum WidgetType { + OpenGl, + Cairo, + Other, } -impl LayerImpl for T { - fn draw(&self, canvas: &mut Canvas, cms: CMS) -> Option { - self.render( canvas, cms); - None +pub trait Widget: 'static + Send + Sync { + fn opengl_render(&self, canvas: &mut Canvas, 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] } } diff --git a/src/widgets/timeline/mod.rs b/src/widgets/timeline/mod.rs index 8252196..df4665a 100644 --- a/src/widgets/timeline/mod.rs +++ b/src/widgets/timeline/mod.rs @@ -243,7 +243,11 @@ impl TimeLine { } pub fn set_selection(&self, selection: Option) { 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) {} diff --git a/src/widgets/widget_frame/imp.rs b/src/widgets/widget_frame/imp.rs new file mode 100644 index 0000000..4ece78f --- /dev/null +++ b/src/widgets/widget_frame/imp.rs @@ -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, DateTime)), + Point(DateTime), +} + +// #[derive(Properties)] +// #[properties(wrapper_type = super::WidgetFrame)] +pub struct WidgetFrame { + pub(super) drawing_area: RefCell>, + pub(super) height: Cell, + pub(super) width: Cell, + pub(super) widget: Rc>>>, +} + +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::(); + } +} + +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 {} diff --git a/src/widgets/widget_frame/mod.rs b/src/widgets/widget_frame/mod.rs new file mode 100644 index 0000000..1d2d50e --- /dev/null +++ b/src/widgets/widget_frame/mod.rs @@ -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) + @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) { + 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(); + } +}