Compare commits
No commits in common. "main" and "master" have entirely different histories.
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
/target
|
||||
.idea
|
||||
|
||||
*/target/*
|
||||
9
.schema.xml
Normal file
9
.schema.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<schemalist gettext-domain="radar-g">
|
||||
<schema id="org.tsuki.radar_g" path="/org/tsuki/radar_g/">
|
||||
<key name="some-setting" type="b">
|
||||
<default>false</default>
|
||||
<summary>Some boolean setting</summary>
|
||||
<description>A description of what this setting does.</description>
|
||||
</key>
|
||||
</schema>
|
||||
</schemalist>
|
||||
5343
Cargo.lock
generated
Normal file
5343
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
91
Cargo.toml
Normal file
91
Cargo.toml
Normal file
@ -0,0 +1,91 @@
|
||||
[package]
|
||||
name = "cinrad_g"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
|
||||
[dependencies]
|
||||
cairo-rs = { version = "0.17.0" }
|
||||
# glib = "0.17.9"
|
||||
gtk = { version = "0.8.1", package = "gtk4", features = ["v4_12"] }
|
||||
geo-types = "0.7.9"
|
||||
shapefile = { version = "0.4", features = ["geo-types"] }
|
||||
thiserror = "1.0.40"
|
||||
num-traits = "0.2.15"
|
||||
npyz = { version = "0.8.0", features = ["npz"] }
|
||||
ndarray = { version = "0.15.6", features = ["rayon"] }
|
||||
quadtree_rs = "0.1.2"
|
||||
proj-sys = "0.23.1"
|
||||
glib-macros = "0.19.2"
|
||||
svg = "0.13.1"
|
||||
libloading = "0.8.3"
|
||||
glue = "0.8.7"
|
||||
epoxy = "0.1.0"
|
||||
femtovg = "0.9.0"
|
||||
glow = "0.13.1"
|
||||
proj = "0.27.2"
|
||||
image = "0.24.7"
|
||||
anyhow = "1.0.72"
|
||||
relm4 = { version = "0.8.1", features = ["libadwaita"] }
|
||||
relm4-components = "0.8.1"
|
||||
rstar = "*"
|
||||
geo = "0.26.0"
|
||||
topojson = "0.5.1"
|
||||
geojson = "0.24.1"
|
||||
plotters = "0.3.5"
|
||||
core_extensions = { version = "1.5.2", default_features = false, features = [
|
||||
"std",
|
||||
] }
|
||||
plotters-backend = "0.3.5"
|
||||
tokio = { version = "1.36.0", features = ["full"] }
|
||||
async-trait = "0.1.77"
|
||||
lazy_static = "1.4.0"
|
||||
once_cell = "1.19.0"
|
||||
relm4-icons = { version = "0.8.2" }
|
||||
surfman = "0.8.1"
|
||||
euclid = "0.22.9"
|
||||
gl = "0.14.0"
|
||||
crossbeam = "0.8.4"
|
||||
chrono = "0.4.32"
|
||||
tracker = "0.2.1"
|
||||
abi_stable = "0.11.3"
|
||||
serde = "1.0.196"
|
||||
serde_json = "1.0.112"
|
||||
flate2 = "1.0.28"
|
||||
toml = "0.8.8"
|
||||
dirs = "5.0.1"
|
||||
regex = "1.10.3"
|
||||
smallvec = "1.13.1"
|
||||
rayon = "1.8.1"
|
||||
futures = "0.3.30"
|
||||
sorted-vec = "0.8.3"
|
||||
tracing = "0.1.40"
|
||||
tracing-subscriber = "0.3.18"
|
||||
indexmap = "2.2.2"
|
||||
tokio-condvar = "0.1.0"
|
||||
imgref = "1.10.1"
|
||||
rgb = "0.8.37"
|
||||
slippy-map-tiles = "0.16.0"
|
||||
reqwest = "0.11.25"
|
||||
url = "2.5.0"
|
||||
quick_cache = "0.4.1"
|
||||
fns = "0.0.7"
|
||||
|
||||
|
||||
[build-dependencies]
|
||||
glib-build-tools = "0.17.0"
|
||||
[dependencies.geo-macros]
|
||||
path = "geo-macros"
|
||||
|
||||
[dependencies.radarg_plugin_interface]
|
||||
path = "radarg_plugin_interface"
|
||||
|
||||
#[dependencies.etws_loader]
|
||||
#path = "etws_loader"
|
||||
|
||||
[dependencies.adw]
|
||||
package = "libadwaita"
|
||||
version = "0.6.0"
|
||||
features = ["v1_4"]
|
||||
9
LICENSE
9
LICENSE
@ -1,9 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) <year> <copyright holders>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
395
back.txt
Normal file
395
back.txt
Normal file
@ -0,0 +1,395 @@
|
||||
|
||||
Layer::geojson_layer_with_path(
|
||||
"/Users/tsuki/Downloads/new_zhejiang.json",
|
||||
true,
|
||||
|_self, c, render, _| {
|
||||
if let Some(json_resources) = _self.get_resources() {
|
||||
if let Resources::GeoJson(geojson) = json_resources.deref() {
|
||||
MapRender::test(&geojson, c, render);
|
||||
}
|
||||
}
|
||||
},
|
||||
),
|
||||
Layer::new(true, None, |s, c, render, _| {
|
||||
if let Some(target) = s.render_target() {
|
||||
if let Ok(_) = c.image_size(target.target) {
|
||||
let (x, y) = target.size(render);
|
||||
let (ox, oy) = target.origin(render);
|
||||
let painter = Paint::image(target.target, ox, oy, x, y, 0.0, 1.0);
|
||||
let mut path = Path::new();
|
||||
path.rect(ox, oy, x, y);
|
||||
c.fill_path(&path, &painter);
|
||||
}
|
||||
} else {
|
||||
let renderer = RadarEchoRenderer::new(BoundaryNorm::new(
|
||||
vec![0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65],
|
||||
vec![
|
||||
Color::rgb(0, 172, 164),
|
||||
Color::rgb(192, 192, 254),
|
||||
Color::rgb(122, 114, 238),
|
||||
Color::rgb(30, 38, 208),
|
||||
Color::rgb(166, 252, 168),
|
||||
Color::rgb(0, 234, 0),
|
||||
Color::rgb(16, 146, 26),
|
||||
Color::rgb(252, 244, 100),
|
||||
Color::rgb(200, 200, 2),
|
||||
Color::rgb(140, 140, 0),
|
||||
Color::rgb(254, 172, 172),
|
||||
Color::rgb(254, 100, 92),
|
||||
Color::rgb(238, 2, 48),
|
||||
Color::rgb(212, 142, 254),
|
||||
Color::rgb(170, 36, 250),
|
||||
],
|
||||
true,
|
||||
));
|
||||
let loader = Npz;
|
||||
let data: RadarData2d<i8, OwnedRepr<i8>> = loader
|
||||
.load("/Users/tsuki/projects/radar-g/test2.npz")
|
||||
.unwrap();
|
||||
let img = renderer.render(render, c, &data);
|
||||
if let Ok(_) = c.image_size(img.target) {
|
||||
let (x, y) = img.size(render);
|
||||
let (ox, oy) = img.origin(render);
|
||||
println!("{} {} {} {}", x, y, ox, oy);
|
||||
let painter = Paint::image(img.target, ox, oy, x, y, 0.0, 1.0);
|
||||
let mut path = Path::new();
|
||||
path.rect(ox, oy, x, y);
|
||||
s.set_render_target(img);
|
||||
c.fill_path(&path, &painter);
|
||||
c.flush();
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
############# TEMPLATES ###################
|
||||
// Monitor::new(
|
||||
// Render::new(
|
||||
// Some(Mapper::new(
|
||||
// Proj::new(Mercator::default().build().as_str()).unwrap(),
|
||||
// (119.539..121.135).into(),
|
||||
// (29.13..30.164).into(),
|
||||
// )),
|
||||
// RenderConfig { padding: [50.0;4] }
|
||||
// )
|
||||
// )
|
||||
|
||||
|
||||
|
||||
// Layer::grid_render_layer_with_path(
|
||||
// "/users/tsuki/projects/radar-g/test2.npz",
|
||||
// Npz,
|
||||
// BoundaryNorm::default(),
|
||||
// )
|
||||
|
||||
|
||||
|
||||
// fn resample(
|
||||
// &self,
|
||||
// width_rate: f64,
|
||||
// height_rate: f64,
|
||||
// filter_len: f64,
|
||||
// ) -> Result<RadarData2d<T, OwnedRepr<T>>, DataError> {
|
||||
// let width_rate = width_rate.min(1.0);
|
||||
// let height_rate = height_rate.min(1.0);
|
||||
// match self.coord_type {
|
||||
// CoordType::Polar => Err(DataError::FormatError),
|
||||
// CoordType::LatLon => {
|
||||
// let width_filtered: ArrayBase<ndarray::OwnedRepr<T>, Ix2> =
|
||||
// Self::_resample(&self.data, width_rate, filter_len);
|
||||
|
||||
// let result: ArrayBase<OwnedRepr<T>, Ix2> =
|
||||
// Self::_resample(&width_filtered.t(), height_rate, filter_len)
|
||||
// .t()
|
||||
// .to_owned();
|
||||
|
||||
// let new_dim1: ArrayBase<OwnedRepr<f64>, Ix1> = Self::_resample(
|
||||
// &Array2::from_shape_vec((1, self.dim1.len()), self.dim1.to_vec()).unwrap(),
|
||||
// width_rate,
|
||||
// filter_len,
|
||||
// )
|
||||
// .slice(s![0, ..])
|
||||
// .to_owned();
|
||||
|
||||
// let new_dim2: ArrayBase<OwnedRepr<f64>, Ix1> = Self::_resample(
|
||||
// &Array2::from_shape_vec((1, self.dim2.len()), self.dim2.to_vec()).unwrap(),
|
||||
// height_rate,
|
||||
// filter_len,
|
||||
// )
|
||||
// .slice(s![0, ..])
|
||||
// .to_owned();
|
||||
|
||||
// Ok(RadarData2d {
|
||||
// dim1: new_dim1,
|
||||
// dim2: new_dim2,
|
||||
// data: result,
|
||||
// coord_type: self.coord_type.to_owned(),
|
||||
// })
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// fn _resample<'a, V, R: ndarray::Data<Elem = V>>(
|
||||
// data: &'a ArrayBase<R, Ix2>,
|
||||
// rate: f64,
|
||||
// filter_len: f64,
|
||||
// ) -> Array2<V>
|
||||
// where
|
||||
// V: Num + Clone + AsPrimitive<f64> + FromPrimitive,
|
||||
// {
|
||||
// let ori_width = data.ncols();
|
||||
// let ori_height = data.nrows();
|
||||
|
||||
// let new_width = (ori_width as f64 * rate).ceil() as usize;
|
||||
// let mut result: Array2<V> = Array2::zeros((ori_height, new_width));
|
||||
// (0..ori_height).into_iter().for_each(|height| {
|
||||
// for width in 0..new_width {
|
||||
// let center_x = (width as f64 + 0.5) / new_width as f64 * ori_width as f64;
|
||||
// let filter_start = center_x - filter_len / 2.0;
|
||||
// let start_idx = (filter_start - 0.5).ceil() as usize;
|
||||
|
||||
// let mut value_sum = 0.0;
|
||||
// let mut filter_sum = 0.0;
|
||||
|
||||
// for i in 0..filter_len as usize {
|
||||
// let input_x = start_idx + i;
|
||||
// let weight = windowed_sinc(
|
||||
// (input_x as f64 + 0.5 - center_x) * rate,
|
||||
// (input_x as f64 + 0.5 - filter_start) / filter_len,
|
||||
// );
|
||||
// value_sum += weight * data[[height, input_x.clamp(0, ori_width - 1)]].as_();
|
||||
// filter_sum += weight;
|
||||
// }
|
||||
|
||||
// result[[height, width]] = V::from_f64(value_sum / filter_sum).unwrap();
|
||||
// }
|
||||
// });
|
||||
// result
|
||||
// }
|
||||
|
||||
// pub struct LevelData<T: Num + Clone + PartialEq + PartialOrd>(
|
||||
// pub Quadtree<i64, RadarData2d<T, OwnedRepr<T>>>,
|
||||
// );
|
||||
|
||||
// impl<T> LevelData<T>
|
||||
// where
|
||||
// T: Num + Clone + AsPrimitive<f64> + FromPrimitive + Debug + PartialEq + PartialOrd,
|
||||
// {
|
||||
// fn value(
|
||||
// level_data: Vec<RadarData2d<T, OwnedRepr<T>>>,
|
||||
// level_num: usize,
|
||||
// ) -> Vec<RadarData2d<T, OwnedRepr<T>>> {
|
||||
// if level_num == 0 {
|
||||
// return level_data;
|
||||
// }
|
||||
|
||||
// let mut result: Vec<RadarData2d<T, OwnedRepr<T>>> =
|
||||
// Vec::with_capacity(level_data.len() * 4);
|
||||
|
||||
// let results = level_data
|
||||
// .iter()
|
||||
// .flat_map(|v| v.split().into_iter().map(|x| x.value_to_owned()));
|
||||
|
||||
// result.extend(results);
|
||||
|
||||
// return Self::value(result, level_num - 1);
|
||||
// }
|
||||
|
||||
// fn new(data: &RadarData2d<T, OwnedRepr<T>>, level: usize, rate: f64) -> Self {
|
||||
// // let rate = 1.0 / level as f64;
|
||||
// let resampled = data.resample(rate, rate, 2.0).unwrap();
|
||||
// let blocks = Self::value(vec![resampled], level);
|
||||
// let mut tree: Quadtree<i64, RadarData2d<T, OwnedRepr<T>>> =
|
||||
// quadtree_rs::Quadtree::new(level);
|
||||
|
||||
// blocks.into_iter().for_each(|block| {
|
||||
// tree.insert(
|
||||
// AreaBuilder::default()
|
||||
// .anchor(quadtree_rs::point::Point {
|
||||
// x: *block.dim1.first().unwrap() as i64,
|
||||
// y: *block.dim2.first().unwrap() as i64,
|
||||
// })
|
||||
// .dimensions((block.dim1.len() as i64, block.dim2.len() as i64))
|
||||
// .build()
|
||||
// .unwrap(),
|
||||
// block,
|
||||
// );
|
||||
// });
|
||||
|
||||
// Self(tree)
|
||||
// }
|
||||
// }
|
||||
|
||||
// pub fn levels<T>(data: Radar2d<T>, levels: usize) -> Vec<LevelData<T>>
|
||||
// where
|
||||
// T: Num + Clone + AsPrimitive<f64> + FromPrimitive + Debug,
|
||||
// T: PartialEq + PartialOrd,
|
||||
// {
|
||||
// let numerator = 1.0 / levels as f64;
|
||||
// (0..levels)
|
||||
// .into_iter()
|
||||
// .map(|level| LevelData::new(&data, level + 1, 1.0 - level as f64 * numerator))
|
||||
// .collect()
|
||||
// }
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#[inline]
|
||||
fn windowed_sinc(x: f64, y: f64) -> f64 {
|
||||
let x = x * PI;
|
||||
let sinc = if x != 0.0 { f64::sin(x) / x } else { 1.0 };
|
||||
let window = if 0f64 <= y && y <= 1.0 {
|
||||
1.0 - (y - 0.5).abs() * 2.0
|
||||
} else {
|
||||
0f64
|
||||
};
|
||||
sinc * window
|
||||
}
|
||||
|
||||
pub enum DownSampleMeth {
|
||||
STD,
|
||||
MEAN,
|
||||
VAR,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub enum CoordType {
|
||||
Polar,
|
||||
LatLon,
|
||||
}
|
||||
|
||||
|
||||
// let levels: Vec<i8> = vec![0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65];
|
||||
// let colors = vec![
|
||||
// RGBABuilder::default()
|
||||
// .red(0 as f32 / 255.0)
|
||||
// .green(172 as f32 / 255.0)
|
||||
// .blue(164 as f32 / 255.0)
|
||||
// .build(),
|
||||
// RGBABuilder::default()
|
||||
// .red(192 as f32 / 255.0)
|
||||
// .green(192 as f32 / 255.0)
|
||||
// .blue(254 as f32 / 255.0)
|
||||
// .build(),
|
||||
// RGBABuilder::default()
|
||||
// .red(122 as f32 / 255.0)
|
||||
// .green(114 as f32 / 255.0)
|
||||
// .blue(238 as f32 / 255.0)
|
||||
// .build(),
|
||||
// RGBABuilder::default()
|
||||
// .red(30 as f32 / 255.0)
|
||||
// .green(38 as f32 / 255.0)
|
||||
// .blue(208 as f32 / 255.0)
|
||||
// .build(),
|
||||
// RGBABuilder::default()
|
||||
// .red(166 as f32 / 255.0)
|
||||
// .green(252 as f32 / 255.0)
|
||||
// .blue(168 as f32 / 255.0)
|
||||
// .build(),
|
||||
// RGBABuilder::default()
|
||||
// .red(0 as f32 / 255.0)
|
||||
// .green(234 as f32 / 255.0)
|
||||
// .blue(0 as f32 / 255.0)
|
||||
// .build(),
|
||||
// RGBABuilder::default()
|
||||
// .red(16 as f32 / 255.0)
|
||||
// .green(146 as f32 / 255.0)
|
||||
// .blue(26 as f32 / 255.0)
|
||||
// .build(),
|
||||
// RGBABuilder::default()
|
||||
// .red(252 as f32 / 255.0)
|
||||
// .green(244 as f32 / 255.0)
|
||||
// .blue(100 as f32 / 255.0)
|
||||
// .build(),
|
||||
// RGBABuilder::default()
|
||||
// .red(200 as f32 / 255.0)
|
||||
// .green(200 as f32 / 255.0)
|
||||
// .blue(2 as f32 / 255.0)
|
||||
// .build(),
|
||||
// RGBABuilder::default()
|
||||
// .red(140 as f32 / 255.0)
|
||||
// .green(140 as f32 / 255.0)
|
||||
// .blue(0 as f32 / 255.0)
|
||||
// .build(),
|
||||
// RGBABuilder::default()
|
||||
// .red(254 as f32 / 255.0)
|
||||
// .green(172 as f32 / 255.0)
|
||||
// .blue(172 as f32 / 255.0)
|
||||
// .build(),
|
||||
// RGBABuilder::default()
|
||||
// .red(254 as f32 / 255.0)
|
||||
// .green(100 as f32 / 255.0)
|
||||
// .blue(92 as f32 / 255.0)
|
||||
// .build(),
|
||||
// RGBABuilder::default()
|
||||
// .red(238 as f32 / 255.0)
|
||||
// .green(2 as f32 / 255.0)
|
||||
// .blue(48 as f32 / 255.0)
|
||||
// .build(),
|
||||
// RGBABuilder::default()
|
||||
// .red(212 as f32 / 255.0)
|
||||
// .green(142 as f32 / 255.0)
|
||||
// .blue(254 as f32 / 255.0)
|
||||
// .build(),
|
||||
// RGBABuilder::default()
|
||||
// .red(170 as f32 / 255.0)
|
||||
// .green(36 as f32 / 255.0)
|
||||
// .blue(250 as f32 / 255.0)
|
||||
// .build(),
|
||||
// ];
|
||||
|
||||
|
||||
|
||||
// let texture = ctx.create_texture().expect("Cannot create texture");
|
||||
|
||||
// ctx.bind_texture(glow::TEXTURE_2D, Some(texture));
|
||||
// ctx.tex_image_2d(
|
||||
// glow::TEXTURE_2D,
|
||||
// 0,
|
||||
// glow::RGBA as i32,
|
||||
// 3000,
|
||||
// 3000,
|
||||
// 0,
|
||||
// glow::RGBA,
|
||||
// glow::UNSIGNED_BYTE,
|
||||
// None,
|
||||
// );
|
||||
// ctx.tex_parameter_i32(
|
||||
// glow::TEXTURE_2D,
|
||||
// glow::TEXTURE_MIN_FILTER,
|
||||
// glow::LINEAR as i32,
|
||||
// );
|
||||
// ctx.tex_parameter_i32(
|
||||
// glow::TEXTURE_2D,
|
||||
// glow::TEXTURE_MAG_FILTER,
|
||||
// glow::LINEAR as i32,
|
||||
// );
|
||||
// ctx.framebuffer_texture_2d(
|
||||
// glow::FRAMEBUFFER,
|
||||
// glow::COLOR_ATTACHMENT0,
|
||||
// glow::TEXTURE_2D,
|
||||
// Some(texture),
|
||||
// 0,
|
||||
// );
|
||||
|
||||
// let depth_buffer = ctx
|
||||
// .create_renderbuffer()
|
||||
// .expect("Cannot create renderbuffer");
|
||||
// ctx.bind_renderbuffer(glow::RENDERBUFFER, Some(depth_buffer));
|
||||
// ctx.renderbuffer_storage(glow::RENDERBUFFER, glow::DEPTH_COMPONENT16, 3000, 3000);
|
||||
// ctx.framebuffer_renderbuffer(
|
||||
// glow::FRAMEBUFFER,
|
||||
// glow::DEPTH_ATTACHMENT,
|
||||
// glow::RENDERBUFFER,
|
||||
// Some(depth_buffer),
|
||||
// );
|
||||
// // let id = NonZeroU32::new(ctx.get_parameter_i32(glow::DRAW_FRAMEBUFFER_BINDING) as u32)
|
||||
// // .expect("No GTK provided framebuffer binding");
|
||||
|
||||
|
||||
8
build.rs
Normal file
8
build.rs
Normal file
@ -0,0 +1,8 @@
|
||||
fn main() {
|
||||
glib_build_tools::compile_resources(
|
||||
&["data"],
|
||||
// "src/resources/resources.gresource.xml",
|
||||
"data/css.gresource.xml",
|
||||
"css.gresource",
|
||||
);
|
||||
}
|
||||
9
check.py
Normal file
9
check.py
Normal file
@ -0,0 +1,9 @@
|
||||
import numpy as np
|
||||
|
||||
data = np.load("/Users/tsuki/projects/radar-g/test2.npz")
|
||||
|
||||
print(data['lat'][0])
|
||||
print(data['lat'][-1])
|
||||
|
||||
print(data['lon'][0])
|
||||
print(data['lon'][-1])
|
||||
2
config.toml
Normal file
2
config.toml
Normal file
@ -0,0 +1,2 @@
|
||||
[plugins]
|
||||
etws_loader = { version = "0.1.0" }
|
||||
6
data/css.gresource.xml
Normal file
6
data/css.gresource.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<gresources>
|
||||
<gresource prefix="org/tsuki/radar_g/css/">
|
||||
<file alias="main.css">css/main.css</file>
|
||||
</gresource>
|
||||
</gresources>
|
||||
45
data/css/main.css
Normal file
45
data/css/main.css
Normal file
@ -0,0 +1,45 @@
|
||||
.rb {
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
paned>separator {
|
||||
color: transparent;
|
||||
}
|
||||
|
||||
.h1 {
|
||||
font-size: 25px;
|
||||
font-weight: bold;
|
||||
line-height: 1.25;
|
||||
}
|
||||
|
||||
.h2 {
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
line-height: 1.25;
|
||||
}
|
||||
|
||||
.h3 {
|
||||
font-size: 15px;
|
||||
font-weight: bold;
|
||||
line-height: 1.25;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.content {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.tooltip {
|
||||
font-size: 8px;
|
||||
}
|
||||
|
||||
.lv {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
|
||||
row:selected {
|
||||
background: #313131;
|
||||
color: #fff;
|
||||
border-radius: 5px;
|
||||
}
|
||||
780
etws_loader/Cargo.lock
generated
Normal file
780
etws_loader/Cargo.lock
generated
Normal file
@ -0,0 +1,780 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "abi_stable"
|
||||
version = "0.11.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "69d6512d3eb05ffe5004c59c206de7f99c34951504056ce23fc953842f12c445"
|
||||
dependencies = [
|
||||
"abi_stable_derive",
|
||||
"abi_stable_shared",
|
||||
"const_panic",
|
||||
"core_extensions",
|
||||
"crossbeam-channel",
|
||||
"generational-arena",
|
||||
"libloading",
|
||||
"lock_api",
|
||||
"parking_lot",
|
||||
"paste",
|
||||
"repr_offset",
|
||||
"rustc_version",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"serde_json",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "abi_stable_derive"
|
||||
version = "0.11.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d7178468b407a4ee10e881bc7a328a65e739f0863615cca4429d43916b05e898"
|
||||
dependencies = [
|
||||
"abi_stable_shared",
|
||||
"as_derive_utils",
|
||||
"core_extensions",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"rustc_version",
|
||||
"syn 1.0.109",
|
||||
"typed-arena",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "abi_stable_shared"
|
||||
version = "0.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b2b5df7688c123e63f4d4d649cba63f2967ba7f7861b1664fca3f77d3dad2b63"
|
||||
dependencies = [
|
||||
"core_extensions",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "adler"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
|
||||
|
||||
[[package]]
|
||||
name = "android-tzdata"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
|
||||
|
||||
[[package]]
|
||||
name = "android_system_properties"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.79"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca"
|
||||
|
||||
[[package]]
|
||||
name = "as_derive_utils"
|
||||
version = "0.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ff3c96645900a44cf11941c111bd08a6573b0e2f9f69bc9264b179d8fae753c4"
|
||||
dependencies = [
|
||||
"core_extensions",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 1.0.109",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "1.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||
|
||||
[[package]]
|
||||
name = "bumpalo"
|
||||
version = "3.14.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.0.83"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||
|
||||
[[package]]
|
||||
name = "chrono"
|
||||
version = "0.4.33"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb"
|
||||
dependencies = [
|
||||
"android-tzdata",
|
||||
"iana-time-zone",
|
||||
"js-sys",
|
||||
"num-traits",
|
||||
"serde",
|
||||
"wasm-bindgen",
|
||||
"windows-targets 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "const_panic"
|
||||
version = "0.2.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6051f239ecec86fde3410901ab7860d458d160371533842974fc61f96d15879b"
|
||||
|
||||
[[package]]
|
||||
name = "core-foundation-sys"
|
||||
version = "0.8.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
|
||||
|
||||
[[package]]
|
||||
name = "core_extensions"
|
||||
version = "1.5.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "92c71dc07c9721607e7a16108336048ee978c3a8b129294534272e8bac96c0ee"
|
||||
dependencies = [
|
||||
"core_extensions_proc_macros",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "core_extensions_proc_macros"
|
||||
version = "1.5.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "69f3b219d28b6e3b4ac87bc1fc522e0803ab22e055da177bff0068c4150c61a6"
|
||||
|
||||
[[package]]
|
||||
name = "crc32fast"
|
||||
version = "1.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-channel"
|
||||
version = "0.5.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.8.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345"
|
||||
|
||||
[[package]]
|
||||
name = "etws_loader"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"abi_stable",
|
||||
"anyhow",
|
||||
"byteorder",
|
||||
"chrono",
|
||||
"flate2",
|
||||
"nom",
|
||||
"nom-derive",
|
||||
"num-traits",
|
||||
"radarg_plugin_interface",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "flate2"
|
||||
version = "1.0.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e"
|
||||
dependencies = [
|
||||
"crc32fast",
|
||||
"miniz_oxide",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "generational-arena"
|
||||
version = "0.2.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "877e94aff08e743b651baaea359664321055749b398adff8740a7399af7796e7"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "iana-time-zone"
|
||||
version = "0.1.59"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539"
|
||||
dependencies = [
|
||||
"android_system_properties",
|
||||
"core-foundation-sys",
|
||||
"iana-time-zone-haiku",
|
||||
"js-sys",
|
||||
"wasm-bindgen",
|
||||
"windows-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "iana-time-zone-haiku"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
|
||||
dependencies = [
|
||||
"cc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itoa"
|
||||
version = "1.0.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c"
|
||||
|
||||
[[package]]
|
||||
name = "js-sys"
|
||||
version = "0.3.67"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1"
|
||||
dependencies = [
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.152"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7"
|
||||
|
||||
[[package]]
|
||||
name = "libloading"
|
||||
version = "0.7.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lock_api"
|
||||
version = "0.4.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"scopeguard",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.20"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.7.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
|
||||
|
||||
[[package]]
|
||||
name = "minimal-lexical"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
|
||||
|
||||
[[package]]
|
||||
name = "miniz_oxide"
|
||||
version = "0.7.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
|
||||
dependencies = [
|
||||
"adler",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nom"
|
||||
version = "7.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
"minimal-lexical",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nom-derive"
|
||||
version = "0.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1ff943d68b88d0b87a6e0d58615e8fa07f9fd5a1319fa0a72efc1f62275c79a7"
|
||||
dependencies = [
|
||||
"nom",
|
||||
"nom-derive-impl",
|
||||
"rustversion",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nom-derive-impl"
|
||||
version = "0.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cd0b9a93a84b0d3ec3e70e02d332dc33ac6dfac9cde63e17fcb77172dededa62"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 1.0.109",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-traits"
|
||||
version = "0.2.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.19.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
|
||||
|
||||
[[package]]
|
||||
name = "parking_lot"
|
||||
version = "0.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
|
||||
dependencies = [
|
||||
"lock_api",
|
||||
"parking_lot_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "parking_lot_core"
|
||||
version = "0.9.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"redox_syscall",
|
||||
"smallvec",
|
||||
"windows-targets 0.48.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "paste"
|
||||
version = "1.0.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.78"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "radarg_plugin_interface"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"abi_stable",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "repr_offset"
|
||||
version = "0.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fb1070755bd29dffc19d0971cab794e607839ba2ef4b69a9e6fbc8733c1b72ea"
|
||||
dependencies = [
|
||||
"tstr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustc_version"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
|
||||
dependencies = [
|
||||
"semver",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustversion"
|
||||
version = "1.0.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
version = "1.0.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c"
|
||||
|
||||
[[package]]
|
||||
name = "scopeguard"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
||||
|
||||
[[package]]
|
||||
name = "semver"
|
||||
version = "1.0.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0"
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.196"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.196"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.48",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_json"
|
||||
version = "1.0.112"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4d1bd37ce2324cf3bf85e5a25f96eb4baf0d5aa6eba43e7ae8958870c4ec48ed"
|
||||
dependencies = [
|
||||
"itoa",
|
||||
"ryu",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "smallvec"
|
||||
version = "1.13.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.109"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.48"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror"
|
||||
version = "1.0.56"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad"
|
||||
dependencies = [
|
||||
"thiserror-impl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror-impl"
|
||||
version = "1.0.56"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.48",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tstr"
|
||||
version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cca3264971090dec0feef3b455a3c178f02762f7550cf4592991ac64b3be2d7e"
|
||||
dependencies = [
|
||||
"tstr_proc_macros",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tstr_proc_macros"
|
||||
version = "0.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e78122066b0cb818b8afd08f7ed22f7fdbc3e90815035726f0840d0d26c0747a"
|
||||
|
||||
[[package]]
|
||||
name = "typed-arena"
|
||||
version = "2.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen"
|
||||
version = "0.2.90"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"wasm-bindgen-macro",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-backend"
|
||||
version = "0.2.90"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd"
|
||||
dependencies = [
|
||||
"bumpalo",
|
||||
"log",
|
||||
"once_cell",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.48",
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro"
|
||||
version = "0.2.90"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999"
|
||||
dependencies = [
|
||||
"quote",
|
||||
"wasm-bindgen-macro-support",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro-support"
|
||||
version = "0.2.90"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.48",
|
||||
"wasm-bindgen-backend",
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-shared"
|
||||
version = "0.2.90"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b"
|
||||
|
||||
[[package]]
|
||||
name = "winapi"
|
||||
version = "0.3.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
|
||||
dependencies = [
|
||||
"winapi-i686-pc-windows-gnu",
|
||||
"winapi-x86_64-pc-windows-gnu",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winapi-i686-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||
|
||||
[[package]]
|
||||
name = "winapi-x86_64-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.52.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
|
||||
dependencies = [
|
||||
"windows-targets 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-targets"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
|
||||
dependencies = [
|
||||
"windows_aarch64_gnullvm 0.48.5",
|
||||
"windows_aarch64_msvc 0.48.5",
|
||||
"windows_i686_gnu 0.48.5",
|
||||
"windows_i686_msvc 0.48.5",
|
||||
"windows_x86_64_gnu 0.48.5",
|
||||
"windows_x86_64_gnullvm 0.48.5",
|
||||
"windows_x86_64_msvc 0.48.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-targets"
|
||||
version = "0.52.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
|
||||
dependencies = [
|
||||
"windows_aarch64_gnullvm 0.52.0",
|
||||
"windows_aarch64_msvc 0.52.0",
|
||||
"windows_i686_gnu 0.52.0",
|
||||
"windows_i686_msvc 0.52.0",
|
||||
"windows_x86_64_gnu 0.52.0",
|
||||
"windows_x86_64_gnullvm 0.52.0",
|
||||
"windows_x86_64_msvc 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_gnullvm"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_gnullvm"
|
||||
version = "0.52.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_msvc"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_msvc"
|
||||
version = "0.52.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_gnu"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_gnu"
|
||||
version = "0.52.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_msvc"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_msvc"
|
||||
version = "0.52.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnu"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnu"
|
||||
version = "0.52.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnullvm"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnullvm"
|
||||
version = "0.52.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_msvc"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_msvc"
|
||||
version = "0.52.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
|
||||
26
etws_loader/Cargo.toml
Normal file
26
etws_loader/Cargo.toml
Normal file
@ -0,0 +1,26 @@
|
||||
[package]
|
||||
name = "etws_loader"
|
||||
version = "0.1.0"
|
||||
authors = ["tsuki <tsuki@keitsuki.top>"]
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
abi_stable = "*"
|
||||
anyhow = "1.0.79"
|
||||
byteorder = "1.5.0"
|
||||
chrono = {version="0.4.33", features=["serde"]}
|
||||
flate2 = "1.0.28"
|
||||
nom = "7.1.3"
|
||||
nom-derive = "0.10.1"
|
||||
num-traits = "0.2.17"
|
||||
serde = { version = "1.0.196", features = ["derive"] }
|
||||
serde_json = "1.0.112"
|
||||
thiserror = "1.0.56"
|
||||
|
||||
[dependencies.radarg_plugin_interface]
|
||||
version="0.1"
|
||||
path="../radarg_plugin_interface"
|
||||
|
||||
[lib]
|
||||
name = "etws_loader"
|
||||
crate-type = ["cdylib",'rlib']
|
||||
14
etws_loader/src/error.rs
Normal file
14
etws_loader/src/error.rs
Normal file
@ -0,0 +1,14 @@
|
||||
use thiserror::Error;
|
||||
#[derive(Debug, Error)]
|
||||
pub enum ETWSError {
|
||||
#[error("IO Error")]
|
||||
IOError {
|
||||
#[from]
|
||||
source: std::io::Error,
|
||||
},
|
||||
#[error("Format Error")]
|
||||
FormatError {
|
||||
#[from]
|
||||
source: anyhow::Error,
|
||||
},
|
||||
}
|
||||
203
etws_loader/src/lib.rs
Normal file
203
etws_loader/src/lib.rs
Normal file
@ -0,0 +1,203 @@
|
||||
mod error;
|
||||
mod parser;
|
||||
use abi_stable::{
|
||||
export_root_module,
|
||||
prefix_type::PrefixTypeTrait,
|
||||
sabi_extern_fn,
|
||||
sabi_trait::prelude::TD_Opaque,
|
||||
std_types::{
|
||||
RNone, ROk,
|
||||
ROption::RSome,
|
||||
RResult::{self, RErr},
|
||||
RStr, RString, RVec,
|
||||
},
|
||||
};
|
||||
use parser::{Record, ValueResult};
|
||||
use radarg_plugin_interface::{
|
||||
CoordType, Error, MetaData, Plugin, PluginId, PluginMod, PluginMod_Ref, PluginResult,
|
||||
PluginResultType, PluginType, Plugin_TO,
|
||||
};
|
||||
|
||||
#[export_root_module]
|
||||
fn instantiate_root_module() -> PluginMod_Ref {
|
||||
PluginMod { new }.leak_into_prefix()
|
||||
}
|
||||
|
||||
struct ETWSLoader {
|
||||
id: PluginId,
|
||||
}
|
||||
|
||||
impl Plugin for ETWSLoader {
|
||||
fn plugin_id(&self) -> &PluginId {
|
||||
&self.id
|
||||
}
|
||||
|
||||
fn load(&self, path: RStr<'_>) -> RResult<PluginResult, Error> where {
|
||||
let mut lat_range = [0.0, 0.0];
|
||||
let mut lon_range = [0.0, 0.0];
|
||||
if let Ok(record) = Record::parse_from_path(path.to_string()) {
|
||||
let result_blocks = record
|
||||
.blocks
|
||||
.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)),
|
||||
),
|
||||
ValueResult::F64(data) => (
|
||||
data.len(),
|
||||
radarg_plugin_interface::VecResult::F64(RVec::from(data)),
|
||||
),
|
||||
ValueResult::I32(data) => (
|
||||
data.len(),
|
||||
radarg_plugin_interface::VecResult::I32(RVec::from(data)),
|
||||
),
|
||||
ValueResult::U32(data) => (
|
||||
data.len(),
|
||||
radarg_plugin_interface::VecResult::U32(RVec::from(data)),
|
||||
),
|
||||
ValueResult::I64(data) => (
|
||||
data.len(),
|
||||
radarg_plugin_interface::VecResult::I64(RVec::from(data)),
|
||||
),
|
||||
ValueResult::U64(data) => (
|
||||
data.len(),
|
||||
radarg_plugin_interface::VecResult::U64(RVec::from(data)),
|
||||
),
|
||||
ValueResult::I8(data) => (
|
||||
data.len(),
|
||||
radarg_plugin_interface::VecResult::I8(RVec::from(data)),
|
||||
),
|
||||
ValueResult::U8(data) => (
|
||||
data.len(),
|
||||
radarg_plugin_interface::VecResult::U8(RVec::from(data)),
|
||||
),
|
||||
};
|
||||
let dimension_des = b.info.dimension_des;
|
||||
let c = if dimension_des.contains(&format!("lat")) {
|
||||
CoordType::Cartesian
|
||||
} else if dimension_des.contains(&format!("ele"))
|
||||
|| dimension_des.contains(&format!("elevation"))
|
||||
{
|
||||
CoordType::Polar
|
||||
} else {
|
||||
CoordType::Other
|
||||
};
|
||||
|
||||
|
||||
|
||||
let shape = match b.info.dimension_size.len() {
|
||||
1 => radarg_plugin_interface::DataShape::Vector,
|
||||
2 => {
|
||||
let lat = b.info.dimension_values.get(0).unwrap();
|
||||
let lon = b.info.dimension_values.get(1).unwrap();
|
||||
lat_range = [lat[0], lat[lat.len() - 1]];
|
||||
lon_range = [lon[0], lon[lon.len() - 1]];
|
||||
radarg_plugin_interface::DataShape::Matrix
|
||||
},
|
||||
_ => {
|
||||
let lat = b.info.dimension_values.get(1).unwrap();
|
||||
let lon = b.info.dimension_values.get(2).unwrap();
|
||||
lat_range = [lat[0], lat[lat.len() - 1]];
|
||||
lon_range = [lon[0], lon[lon.len() - 1]];
|
||||
radarg_plugin_interface::DataShape::Cube
|
||||
},
|
||||
};
|
||||
|
||||
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,
|
||||
"V" => PluginResultType::V,
|
||||
"ZDR" => PluginResultType::ZDR,
|
||||
"PHIDP" => PluginResultType::PHIDP,
|
||||
"KDP" => PluginResultType::KDP,
|
||||
"CC" => PluginResultType::CC,
|
||||
"HCA" => PluginResultType::HCA,
|
||||
"QPE" => PluginResultType::QPE,
|
||||
"QPF" => PluginResultType::QPF,
|
||||
"FR" => PluginResultType::DBZ,
|
||||
_ => PluginResultType::Unknown,
|
||||
};
|
||||
|
||||
radarg_plugin_interface::Block {
|
||||
data: data,
|
||||
shape,
|
||||
size: RVec::from(b.info.dimension_size)
|
||||
.into_iter()
|
||||
.map(|p| p as usize)
|
||||
.collect::<RVec<_>>(),
|
||||
datetime: record.filetime.timestamp(),
|
||||
dimensions: RVec::from(vec![RString::from("time")]),
|
||||
coord_type: c,
|
||||
dimension_values: RVec::from(
|
||||
b.info
|
||||
.dimension_values
|
||||
.into_iter()
|
||||
.map(|p| RVec::from(p))
|
||||
.collect::<Vec<_>>(),
|
||||
),
|
||||
fill_value: b.info.fill_value,
|
||||
data_type,
|
||||
}
|
||||
})
|
||||
.collect::<RVec<_>>();
|
||||
|
||||
let meta = MetaData {
|
||||
datetime: RSome(record.filetime.timestamp()),
|
||||
site_info: RNone,
|
||||
lon_range: RSome(lon_range),
|
||||
lat_range: RSome(lat_range),
|
||||
data_format: RSome("Eastone Washon Radar".into()),
|
||||
other_info: RNone,
|
||||
};
|
||||
ROk(PluginResult {
|
||||
datetime: RString::from(record.filetime.format("%Y%m%d%H%M").to_string()),
|
||||
blocks: result_blocks,
|
||||
meta,
|
||||
})
|
||||
} else {
|
||||
RErr(Error::UnsupportedFormat)
|
||||
}
|
||||
}
|
||||
|
||||
fn plugin_info(&self) -> radarg_plugin_interface::PluginInfo where {
|
||||
radarg_plugin_interface::PluginInfo {
|
||||
name: "ETWS_Loader".into(),
|
||||
version: "0.1.0".into(),
|
||||
author: "Tsuki".into(),
|
||||
description: RSome("ETWS Loader".into()),
|
||||
url: RSome("https://keitsuki.club".into()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[sabi_extern_fn]
|
||||
pub fn new(plugin_id: PluginId) -> RResult<PluginType, Error> {
|
||||
let this = ETWSLoader { id: plugin_id };
|
||||
ROk(Plugin_TO::from_value(this, TD_Opaque))
|
||||
}
|
||||
|
||||
// 测试模块
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
// 导入外部作用域中的所有项
|
||||
use super::*;
|
||||
|
||||
// 一个简单的测试
|
||||
#[test]
|
||||
|
||||
fn test() {
|
||||
let result =
|
||||
Record::parse_from_path("/Volumes/data2/RadarArray/HangZhou/radarData/OutputProducts/RadarProducts/FuseDataX/20220727/ZJHZAA_20220727200000_FR.dat.gz")
|
||||
.unwrap();
|
||||
}
|
||||
}
|
||||
600
etws_loader/src/parser.rs
Normal file
600
etws_loader/src/parser.rs
Normal file
@ -0,0 +1,600 @@
|
||||
use crate::error::ETWSError;
|
||||
use byteorder::{BigEndian, ByteOrder, LittleEndian};
|
||||
use chrono::{DateTime, NaiveDateTime, Utc};
|
||||
use flate2::read::GzDecoder;
|
||||
use nom::{
|
||||
bytes::complete::{tag, take},
|
||||
multi::count,
|
||||
IResult,
|
||||
};
|
||||
use nom_derive::*;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::fs::File;
|
||||
use std::io::{self, Read, Write};
|
||||
use std::path::Path;
|
||||
|
||||
pub enum ValueResult {
|
||||
I64(Vec<i64>),
|
||||
F64(Vec<f64>),
|
||||
I32(Vec<i32>),
|
||||
F32(Vec<f32>),
|
||||
I16(Vec<i16>),
|
||||
U64(Vec<u64>),
|
||||
U32(Vec<u32>),
|
||||
I8(Vec<i8>),
|
||||
U8(Vec<u8>),
|
||||
}
|
||||
|
||||
enum ValueTypes {
|
||||
I64,
|
||||
F64,
|
||||
I32,
|
||||
F32,
|
||||
U64,
|
||||
U32,
|
||||
I16,
|
||||
I8,
|
||||
U8,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy)]
|
||||
enum Order {
|
||||
BigEndian,
|
||||
LittleEndian,
|
||||
}
|
||||
|
||||
pub struct Record {
|
||||
pub filetime: DateTime<Utc>,
|
||||
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();
|
||||
if !(path.ends_with(".dat") || !path.ends_with(".dat.gz")) {
|
||||
return Err(std::io::Error::new(
|
||||
std::io::ErrorKind::InvalidInput,
|
||||
"Invalid file extension",
|
||||
)
|
||||
.into());
|
||||
}
|
||||
|
||||
if !path.exists() {
|
||||
return Err(std::io::Error::new(std::io::ErrorKind::NotFound, "File not found").into());
|
||||
}
|
||||
|
||||
let mut file = File::open(path)?;
|
||||
let binary_data = if path.extension().unwrap() == "gz" {
|
||||
let mut result: Vec<u8> = Vec::new();
|
||||
let mut decoder = GzDecoder::new(file);
|
||||
decoder.read_to_end(&mut result)?;
|
||||
result
|
||||
} else {
|
||||
let mut result = Vec::new();
|
||||
file.read_to_end(&mut result)?;
|
||||
result
|
||||
};
|
||||
|
||||
let (_, parsed) =
|
||||
Self::_parse(binary_data.as_slice()).map_err(|_| anyhow::Error::msg("Parse error"))?;
|
||||
|
||||
Ok(parsed)
|
||||
}
|
||||
|
||||
fn _parse(binary_data: &[u8]) -> IResult<&[u8], Record> {
|
||||
let start_tag = b"UNI_DATA";
|
||||
let (input, _) = tag(start_tag)(binary_data)?;
|
||||
let (input, order) = Self::_parse_split_fn(input, 8, 8, Self::_parse_order)?;
|
||||
let (input, hlen) = take(4usize)(input)?;
|
||||
|
||||
let hlen = match order {
|
||||
Order::BigEndian => BigEndian::read_u32(hlen),
|
||||
_ => LittleEndian::read_u32(hlen),
|
||||
};
|
||||
let (input, record_info) = Self::_parse_split_fn(input, 0, 8, |input| {
|
||||
let (input, p) = take(hlen)(input)?;
|
||||
let p: RecordInfo = serde_json::from_slice(p).unwrap();
|
||||
Ok((input, p))
|
||||
})?;
|
||||
|
||||
let (input, blocks) =
|
||||
count(Self::_parse_block_fn(order), record_info.block_num as usize)(input)?;
|
||||
|
||||
let data_time =
|
||||
NaiveDateTime::parse_from_str(&record_info.file_time, r"%Y%m%d%H%M%S").unwrap();
|
||||
let filetime = data_time.and_utc();
|
||||
|
||||
Ok((input, Record { filetime, blocks }))
|
||||
}
|
||||
|
||||
fn _parse_order(input: &[u8]) -> IResult<&[u8], Order> {
|
||||
let (input, order) = take(4usize)(input)?;
|
||||
let result = if order == b"LEND" {
|
||||
Order::LittleEndian
|
||||
} else {
|
||||
Order::BigEndian
|
||||
};
|
||||
let (input, _) = take(4usize)(input)?;
|
||||
Ok((input, result))
|
||||
}
|
||||
|
||||
fn _parse_split(input: &[u8], s: usize, fore: usize, after: usize) -> IResult<&[u8], &[u8]> {
|
||||
let (input, _) = take(fore)(input)?;
|
||||
let (input, result) = take(s)(input)?;
|
||||
let (input, _) = take(after)(input)?;
|
||||
Ok((input, result))
|
||||
}
|
||||
|
||||
fn _parse_split_fn<E, F: Fn(&[u8]) -> IResult<&[u8], E>>(
|
||||
input: &[u8],
|
||||
fore: usize,
|
||||
after: usize,
|
||||
f: F,
|
||||
) -> IResult<&[u8], E> {
|
||||
let (input, _) = take(fore)(input)?;
|
||||
let (input, result) = (f)(input)?;
|
||||
let (input, _) = take(after)(input)?;
|
||||
Ok((input, result))
|
||||
}
|
||||
|
||||
fn _parse_block_fn(order: Order) -> impl FnMut(&[u8]) -> IResult<&[u8], ParsedBlock> {
|
||||
move |input| Self::_parse_split_fn(input, 0, 0, |input| Self::_parse_block(input, order))
|
||||
}
|
||||
|
||||
fn _parse_block(input: &[u8], order: Order) -> IResult<&[u8], ParsedBlock> {
|
||||
let (input, _) = take(8usize)(input)?;
|
||||
let (input, hlen1) = Self::_parse_u32(input, order)?;
|
||||
let (input, block_info) = Self::_parse_split_fn(input, 0, 8, |input| {
|
||||
let (input, p) = take(hlen1)(input)?;
|
||||
|
||||
let p: BlockJsonInfo = serde_json::from_slice(p).unwrap();
|
||||
Ok((input, p))
|
||||
})?;
|
||||
|
||||
let (input, _) = take(8usize)(input)?; // skip 8 bytes
|
||||
let (input, hlen2) = Self::_parse_u32(input, order)?;
|
||||
let dimension_size = block_info.dimension_size.clone();
|
||||
let size = dimension_size.iter().fold(1, |acc, x| acc * x) as usize;
|
||||
let value_type = block_info.value_type.clone();
|
||||
let value_type = Self::_parse_type(&value_type);
|
||||
|
||||
let (input, data) = Self::_parse_matrix(
|
||||
input,
|
||||
value_type,
|
||||
order,
|
||||
size,
|
||||
block_info.value_offset,
|
||||
block_info.value_scale,
|
||||
block_info.fill_value,
|
||||
)?;
|
||||
|
||||
Ok((
|
||||
input,
|
||||
ParsedBlock {
|
||||
info: block_info,
|
||||
data,
|
||||
},
|
||||
))
|
||||
}
|
||||
|
||||
fn _parse_i32(input: &[u8], order: Order) -> IResult<&[u8], i32> {
|
||||
let (input, hlen) = take(4usize)(input)?;
|
||||
let hlen = match order {
|
||||
Order::BigEndian => BigEndian::read_i32(hlen),
|
||||
_ => LittleEndian::read_i32(hlen),
|
||||
};
|
||||
|
||||
Ok((input, hlen))
|
||||
}
|
||||
|
||||
fn _parse_u32(input: &[u8], order: Order) -> IResult<&[u8], u32> {
|
||||
let (input, hlen) = take(4usize)(input)?;
|
||||
let hlen = match order {
|
||||
Order::BigEndian => BigEndian::read_u32(hlen),
|
||||
_ => LittleEndian::read_u32(hlen),
|
||||
};
|
||||
|
||||
Ok((input, hlen))
|
||||
}
|
||||
|
||||
fn _parse_i64(input: &[u8], order: Order) -> IResult<&[u8], i64> {
|
||||
let (input, hlen) = take(8usize)(input)?;
|
||||
let hlen = match order {
|
||||
Order::BigEndian => BigEndian::read_i64(hlen),
|
||||
_ => LittleEndian::read_i64(hlen),
|
||||
};
|
||||
|
||||
Ok((input, hlen))
|
||||
}
|
||||
|
||||
fn _parse_u64(input: &[u8], order: Order) -> IResult<&[u8], u64> {
|
||||
let (input, hlen) = take(8usize)(input)?;
|
||||
let hlen = match order {
|
||||
Order::BigEndian => BigEndian::read_u64(hlen),
|
||||
_ => LittleEndian::read_u64(hlen),
|
||||
};
|
||||
|
||||
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,
|
||||
order: Order,
|
||||
len: usize,
|
||||
offset: f32,
|
||||
scale: f32,
|
||||
fill_value: f64,
|
||||
) -> IResult<&[u8], ValueResult> {
|
||||
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)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
struct RecordInfo {
|
||||
file_time: String,
|
||||
block_num: i32,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
pub struct BlockJsonInfo {
|
||||
pub value_name: String,
|
||||
pub value_des: String,
|
||||
pub value_type: String,
|
||||
pub dimension_size: Vec<u64>,
|
||||
pub dimension: usize,
|
||||
pub dimension_des: Vec<String>,
|
||||
pub dimension_start: Vec<f64>,
|
||||
pub dimension_end: Vec<f64>,
|
||||
pub dimension_values: Vec<Vec<f64>>,
|
||||
pub fill_value: f64,
|
||||
pub value_scale: f32,
|
||||
pub value_offset: f32,
|
||||
}
|
||||
|
||||
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))
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
1
etws_loader/target/.rustc_info.json
Normal file
1
etws_loader/target/.rustc_info.json
Normal file
@ -0,0 +1 @@
|
||||
{"rustc_fingerprint":6534886339914138005,"outputs":{"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":""},"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":""}},"successes":{}}
|
||||
3
etws_loader/target/CACHEDIR.TAG
Normal file
3
etws_loader/target/CACHEDIR.TAG
Normal file
@ -0,0 +1,3 @@
|
||||
Signature: 8a477f597d28d172789f06886806bc55
|
||||
# This file is a cache directory tag created by cargo.
|
||||
# For information about cache directory tags see https://bford.info/cachedir/
|
||||
0
etws_loader/target/debug/.cargo-lock
Normal file
0
etws_loader/target/debug/.cargo-lock
Normal file
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
b64d46ab3ab7091c
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":2034204546556879275,"features":"[\"channels\", \"crossbeam-channel\", \"default\", \"serde_json\"]","target":701087079898301699,"profile":16209747773763956088,"path":3483666061643384809,"deps":[[75838619123750943,"const_panic",false,12691611242057761700],[376510933113901675,"generational_arena",false,13937842665477031649],[511886667611543159,"repr_offset",false,16828736502814221855],[2334936782960947306,"lock_api",false,1814916025853382219],[3470807962260834726,"serde",false,2576951082755195512],[4860695056264358199,"libloading",false,5824429438708793824],[6147374319788932929,"serde_json",false,11236813085233191832],[6343765419002388362,"serde_derive",false,9627720618521990881],[7131157336065139194,"parking_lot",false,5851677261104018123],[12155930792469046819,"abi_stable_shared",false,1817612520392020941],[13893895338837028091,"abi_stable_derive",false,8573669010448238979],[15340987198089805406,"paste",false,12489583535308820193],[15600852585069698717,"crossbeam_channel",false,15516608726300844274],[15864077453136584493,"core_extensions",false,3951692198506941310]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/abi_stable-9eb39852acc98e54/dep-lib-abi_stable"}}],"rustflags":[],"metadata":9435643437466700796,"config":2202906307356721367,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
f51585f9eca8801c
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":2034204546556879275,"features":"[\"channels\", \"crossbeam-channel\", \"default\", \"serde_json\"]","target":701087079898301699,"profile":16209747773763956088,"path":3483666061643384809,"deps":[[75838619123750943,"const_panic",false,12691611242057761700],[376510933113901675,"generational_arena",false,13937842665477031649],[511886667611543159,"repr_offset",false,16828736502814221855],[2334936782960947306,"lock_api",false,1814916025853382219],[3470807962260834726,"serde",false,9399666183325579216],[4860695056264358199,"libloading",false,5824429438708793824],[6147374319788932929,"serde_json",false,13097563080143870957],[6343765419002388362,"serde_derive",false,2362000623912333219],[7131157336065139194,"parking_lot",false,5851677261104018123],[12155930792469046819,"abi_stable_shared",false,1817612520392020941],[13893895338837028091,"abi_stable_derive",false,8573669010448238979],[15340987198089805406,"paste",false,12489583535308820193],[15600852585069698717,"crossbeam_channel",false,15516608726300844274],[15864077453136584493,"core_extensions",false,3951692198506941310]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/abi_stable-b1a6858d85dd1136/dep-lib-abi_stable"}}],"rustflags":[],"metadata":9435643437466700796,"config":2202906307356721367,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
83c98a2d8acafb76
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":2034204546556879275,"features":"[]","target":9605427451028622447,"profile":13904479058746662784,"path":1099273460411680649,"deps":[[9618700007800273094,"quote",false,6379146116811555066],[12155930792469046819,"abi_stable_shared",false,11203920157373099594],[13139357714157917144,"as_derive_utils",false,5632803739914540072],[13655734084378430773,"typed_arena",false,7437203902841699976],[15864077453136584493,"core_extensions",false,3709068585806090695],[16285336375947054926,"proc_macro2",false,16188898386888559878],[17143850428905299221,"syn",false,1384463259395083165]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/abi_stable_derive-fde60242f08ff382/dep-lib-abi_stable_derive"}}],"rustflags":[],"metadata":12997815436956875762,"config":2202906307356721367,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
4aee0fb005527c9b
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":2034204546556879275,"features":"[]","target":12698902921255915372,"profile":16209747773763956088,"path":6889060375905054719,"deps":[[15864077453136584493,"core_extensions",false,3709068585806090695]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/abi_stable_shared-7467ad0bb26bb0d7/dep-lib-abi_stable_shared"}}],"rustflags":[],"metadata":12997815436956875762,"config":2202906307356721367,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
cdd34409f5743919
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":2034204546556879275,"features":"[]","target":12698902921255915372,"profile":16209747773763956088,"path":6889060375905054719,"deps":[[15864077453136584493,"core_extensions",false,3951692198506941310]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/abi_stable_shared-8268aabae3931dea/dep-lib-abi_stable_shared"}}],"rustflags":[],"metadata":12997815436956875762,"config":2202906307356721367,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
5ab9b882d56ac979
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":2034204546556879275,"features":"[]","target":4568273168033506088,"profile":16209747773763956088,"path":6636319934073535045,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/adler-eda12c9f4b25ced4/dep-lib-adler"}}],"rustflags":[],"metadata":10673633425720882208,"config":2202906307356721367,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
8a60dd2393e4805c
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":2034204546556879275,"features":"[\"default\", \"std\"]","target":18338613112069040866,"profile":16209747773763956088,"path":12467799346501152726,"deps":[[12732307821348191974,"build_script_build",false,13267540570474358888]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anyhow-4471721bd4161c6d/dep-lib-anyhow"}}],"rustflags":[],"metadata":17154292783084528516,"config":2202906307356721367,"compile_kind":0}
|
||||
@ -0,0 +1 @@
|
||||
682835badac51fb8
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":2034204546556879275,"features":"","target":0,"profile":0,"path":0,"deps":[[12732307821348191974,"build_script_build",false,12627723519205405700]],"local":[{"RerunIfChanged":{"output":"debug/build/anyhow-954605a42df9fdf6/output","paths":["build/probe.rs"]}}],"rustflags":[],"metadata":0,"config":0,"compile_kind":0}
|
||||
@ -0,0 +1 @@
|
||||
047415dca2af3eaf
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":2034204546556879275,"features":"[\"default\", \"std\"]","target":2297296889237502566,"profile":13904479058746662784,"path":3351817288307809929,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anyhow-a70c9949da6a082d/dep-build-script-build-script-build"}}],"rustflags":[],"metadata":17154292783084528516,"config":2202906307356721367,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
2814195728bd2b4e
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":2034204546556879275,"features":"[]","target":1400909187434544587,"profile":13904479058746662784,"path":6682596017441764228,"deps":[[9618700007800273094,"quote",false,6379146116811555066],[15864077453136584493,"core_extensions",false,3709068585806090695],[16285336375947054926,"proc_macro2",false,16188898386888559878],[17143850428905299221,"syn",false,1384463259395083165]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/as_derive_utils-d41208c8ed09bbf4/dep-lib-as_derive_utils"}}],"rustflags":[],"metadata":7370422634555397116,"config":2202906307356721367,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
69f94948ff09b377
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":2034204546556879275,"features":"[]","target":14886237245231788030,"profile":13904479058746662784,"path":14015843474043098663,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/autocfg-12a56df7b7c0b956/dep-lib-autocfg"}}],"rustflags":[],"metadata":13102859075309379048,"config":2202906307356721367,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
a29097e770176155
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":2034204546556879275,"features":"[\"default\", \"std\"]","target":18335588937564793828,"profile":16209747773763956088,"path":8958115263489412291,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/byteorder-444b7f7a82990a29/dep-lib-byteorder"}}],"rustflags":[],"metadata":5398730104718078656,"config":2202906307356721367,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
1c4cb16f379816cc
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":2034204546556879275,"features":"[]","target":10623512480563079566,"profile":16209747773763956088,"path":17367574703338398341,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/cfg-if-f6104691743a3683/dep-lib-cfg-if"}}],"rustflags":[],"metadata":8462187951337715540,"config":2202906307356721367,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
1984459a51c0dfbb
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":2034204546556879275,"features":"[\"alloc\", \"android-tzdata\", \"clock\", \"default\", \"iana-time-zone\", \"js-sys\", \"now\", \"oldtime\", \"std\", \"wasm-bindgen\", \"wasmbind\", \"winapi\", \"windows-targets\"]","target":11745563112108967737,"profile":16209747773763956088,"path":11247779219060438002,"deps":[[11138931377059941435,"num_traits",false,12000539450629646242],[14035281238073165402,"iana_time_zone",false,5697753900861887262]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/chrono-71ba641e27f18940/dep-lib-chrono"}}],"rustflags":[],"metadata":9803565982372010724,"config":2202906307356721367,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
29415f43220f4d26
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":2034204546556879275,"features":"[\"alloc\", \"android-tzdata\", \"clock\", \"default\", \"iana-time-zone\", \"js-sys\", \"now\", \"oldtime\", \"serde\", \"std\", \"wasm-bindgen\", \"wasmbind\", \"winapi\", \"windows-targets\"]","target":11745563112108967737,"profile":16209747773763956088,"path":11247779219060438002,"deps":[[3470807962260834726,"serde",false,2576951082755195512],[11138931377059941435,"num_traits",false,12000539450629646242],[14035281238073165402,"iana_time_zone",false,5697753900861887262]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/chrono-c4e48e62783c44d3/dep-lib-chrono"}}],"rustflags":[],"metadata":9803565982372010724,"config":2202906307356721367,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
f3f6bc4be737c711
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":2034204546556879275,"features":"[\"alloc\", \"android-tzdata\", \"clock\", \"default\", \"iana-time-zone\", \"js-sys\", \"now\", \"oldtime\", \"serde\", \"std\", \"wasm-bindgen\", \"wasmbind\", \"winapi\", \"windows-targets\"]","target":11745563112108967737,"profile":16209747773763956088,"path":11247779219060438002,"deps":[[3470807962260834726,"serde",false,9399666183325579216],[11138931377059941435,"num_traits",false,12000539450629646242],[14035281238073165402,"iana_time_zone",false,5697753900861887262]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/chrono-f6a1c6bb5be42a2d/dep-lib-chrono"}}],"rustflags":[],"metadata":9803565982372010724,"config":2202906307356721367,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
a403357e2ea921b0
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":2034204546556879275,"features":"[]","target":5894236464472984878,"profile":16209747773763956088,"path":5898848853681656166,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/const_panic-5e4aff3d8b836cc1/dep-lib-const_panic"}}],"rustflags":[],"metadata":16622668056747015544,"config":2202906307356721367,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
2df94fd56842746a
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":2034204546556879275,"features":"[\"default\", \"link\"]","target":8020353244595097195,"profile":16209747773763956088,"path":6973137832163423786,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/core-foundation-sys-e40f6c3da6ccd76a/dep-lib-core-foundation-sys"}}],"rustflags":[],"metadata":7246173313922784557,"config":2202906307356721367,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
c75188303a427933
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":2034204546556879275,"features":"[\"alloc\", \"iterators\", \"self_ops\", \"slices\", \"std\", \"type_level_bool\"]","target":18436429881084749908,"profile":13904479058746662784,"path":5901368123383174012,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/core_extensions-434aa31566851167/dep-lib-core_extensions"}}],"rustflags":[],"metadata":3830408521381924977,"config":2202906307356721367,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
7e4bb0191e3bd736
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":2034204546556879275,"features":"[\"alloc\", \"core_extensions_proc_macros\", \"enable_proc_macro_crate\", \"iterators\", \"macro_utils\", \"self_ops\", \"slices\", \"std\", \"type_asserts\", \"type_identity\", \"type_level_bool\", \"void\"]","target":18436429881084749908,"profile":16209747773763956088,"path":5901368123383174012,"deps":[[2740732257086883650,"core_extensions_proc_macros",false,13895181402411839407]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/core_extensions-841f75e9f60fa115/dep-lib-core_extensions"}}],"rustflags":[],"metadata":3830408521381924977,"config":2202906307356721367,"compile_kind":0}
|
||||
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user