1
Fork 0

builder pattern for configs

This commit is contained in:
Andy Killorin 2025-03-08 19:09:30 -05:00
parent 05c7904513
commit 21e269bc43
Signed by: ank
GPG key ID: 23F9463ECB67FE8C
5 changed files with 67 additions and 11 deletions

View file

@ -1,3 +1,6 @@
[lib]
crate-type = ["dylib"]
[package]
name = "auto"
version = "0.1.0"

View file

@ -1,12 +1,29 @@
use std::{collections::VecDeque, ops::Sub};
use std::{collections::VecDeque, ops::Sub, pin::Pin};
use common::CamState;
use interface::auto::AutoInterface;
use interface::auto::{AutoInterface, Configurable};
#[unsafe(no_mangle)]
pub fn entry(interface: AutoInterface) -> Pin<Box<dyn Future<Output = ()> + Send>> {
Box::pin(auto(interface))
}
#[unsafe(no_mangle)]
pub static NAME: &'static str = "scanseek v1";
const AUTO_GAP: i16 = 140; /// mm tofs must drop to count as a hit
const AUTO_SELF_OCCLUSION: u16 = 130; /// minimum
async fn auto (interface: &AutoInterface) {
#[unsafe(no_mangle)]
pub static CONFIGS: &[Configurable] = &[
Configurable::new("auto minimum gap").range(0. .. 300.).default(140.)
.description("distance (mm) distance measurements must instantaneously drop to indicate a detection. This should line up with the size of the smallest robot you compete against"),
Configurable::new("auto self occlusion").range(0. .. 200.).default(143.)
.description("distance (mm) below which measurements are considered noise in the scan phase"),
];
async fn auto (interface: AutoInterface) {
let mut tof_l = Stats::new();
let mut tof_r = Stats::new();
loop {

22
interface/Cargo.lock generated
View file

@ -1060,9 +1060,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
[[package]]
name = "crunchy"
version = "0.2.3"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929"
checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
[[package]]
name = "crypto-common"
@ -1150,7 +1150,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d72e9c39f6e11a2e922d04a34ec5e7ef522ea3f5a1acfca7a19d16ad5fe50f5"
dependencies = [
"bytemuck",
"emath",
"emath 0.30.0",
"serde",
]
@ -1201,7 +1201,7 @@ checksum = "252d52224d35be1535d7fd1d6139ce071fb42c9097773e79f7665604f5596b5e"
dependencies = [
"accesskit",
"ahash",
"emath",
"emath 0.30.0",
"epaint",
"log",
"nohash-hasher",
@ -1308,6 +1308,12 @@ dependencies = [
"serde",
]
[[package]]
name = "emath"
version = "0.31.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e4cadcff7a5353ba72b7fea76bf2122b5ebdbc68e8155aa56dfdea90083fe1b"
[[package]]
name = "embedded-io"
version = "0.4.0"
@ -1389,7 +1395,7 @@ dependencies = [
"ahash",
"bytemuck",
"ecolor",
"emath",
"emath 0.30.0",
"epaint_default_fonts",
"log",
"nohash-hasher",
@ -1666,9 +1672,9 @@ dependencies = [
[[package]]
name = "glob"
version = "0.3.2"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"
checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
[[package]]
name = "glow"
@ -2124,9 +2130,11 @@ dependencies = [
"eframe",
"egui-toast",
"egui_extras",
"emath 0.31.1",
"heapless",
"home",
"image",
"libloading",
"pitch-detection",
"postcard",
"rust-music-theory",

View file

@ -21,3 +21,5 @@ home = "0.5.11"
atomic_float = "1.1.0"
chrono = "0.4.40"
image = "0.25.5"
libloading = "0.8.6"
emath = "0.31.1"

View file

@ -1,4 +1,4 @@
use std::{collections::VecDeque, ops::{Div, Sub}};
use std::{collections::VecDeque, ops::{Div, Range, Sub}};
use common::{CamState, ControlPacket, SensorData};
use anyhow::Result;
@ -28,11 +28,37 @@ impl AutoInterface {
pub struct Configurable {
pub name: &'static str,
pub description: Option<&'static str>,
pub default: f32,
pub min: f32,
pub max: f32,
}
impl Configurable {
pub const fn new(name: &'static str) -> Self {
Self { name, description: None, default: 0.0, min: 0.0, max: 1.0 }
}
pub const fn range(self, range: Range<f32>) -> Self {
Self { min: range.start, max: range.end, ..self }
}
pub const fn description(self, description: &'static str) -> Self {
Self { description: Some(description), ..self }
}
pub const fn default(self, default: f32) -> Self {
Self { default, ..self }
}
pub const fn name(&'static self) -> &'static str {
self.name
}
}
impl Default for Configurable {
fn default() -> Self {
Self { name: Default::default(), description: Default::default(), default: Default::default(), min: 0.0, max: 1.0 }
}
}
/// A fake trait in the sense that these methods are exposed as symbols, not trait methods
pub trait Auto {
/// entrypoint