Add satrs::fdir::FaultCounter, an FSFW-style error threshold counter: counts faults, decrements over time when faults stop, and reports when a threshold is exceeded. Two variants for now, mirroring the hk.rs helper pattern: - FaultCounterStd, backed by std::time::Instant - FaultCounterEmbassy, backed by embassy_time::Instant (embassy-time feature), with an optional defmt::Format impl gated on the defmt feature Add satrs::health::HealthTableMapSync::default() for easy construction of a shared, global health table. Wire both into the example app's MGM device handler as the first real FDIR use case: - the minisim MGM model gains SpiFaultMode (None/AllZeros/AllOnes) and a SetSpiFault request, so a stuck SPI bus can be injected for testing, independent of switch state - MgmHandlerLis3Mdl::poll_sensor checks the SPI transfer result: a comm timeout or an all-1s stuck-bus reply (the same pattern the sim already uses for "device off") counts as a fault. Above threshold, the component is marked Faulty in a HealthTableMapSync shared from main.rs. This logic lives in the device handler, not the SPI comm layer, since deciding what a failed transfer means for FDIR is a handler concern. - an all-0s reply is deliberately not treated as a fault, since it collides with a legitimate zero-field reading
82 lines
2.4 KiB
TOML
82 lines
2.4 KiB
TOML
[package]
|
|
name = "satrs"
|
|
version = "0.3.0-alpha.3"
|
|
edition = "2024"
|
|
rust-version = "1.85.0"
|
|
description = "A library collection to build software for remote systems"
|
|
homepage = "https://github.com/us-irs/sat-rs"
|
|
repository = "https://egit.irs.uni-stuttgart.de/rust/sat-rs"
|
|
license = "Apache-2.0"
|
|
keywords = ["no-std", "space", "aerospace"]
|
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
categories = ["aerospace", "aerospace::space-protocols", "no-std", "hardware-support", "embedded"]
|
|
|
|
[dependencies]
|
|
satrs-shared = { version = "0.2", path = "../satrs-shared" }
|
|
spacepackets = { version = "0.18", default-features = false }
|
|
|
|
delegate = "0.13"
|
|
paste = "1"
|
|
derive-new = "0.7"
|
|
num_enum = { version = "0.7", default-features = false }
|
|
cobs = { version = "0.5", default-features = false }
|
|
thiserror = { version = "2", default-features = false }
|
|
|
|
hashbrown = { version = "0.17", optional = true }
|
|
static_cell = { version = "2" }
|
|
heapless = { version = "0.9", optional = true }
|
|
dyn-clone = { version = "1", optional = true }
|
|
downcast-rs = { version = "2", default-features = false, optional = true }
|
|
bus = { version = "2.2", optional = true }
|
|
crossbeam-channel = { version = "0.5", default-features = false, optional = true }
|
|
postcard = { version = "1", features = ["alloc"] }
|
|
serde = { version = "1", default-features = false, optional = true }
|
|
socket2 = { version = "0.6", features = ["all"], optional = true }
|
|
arbitrary-int = "2"
|
|
mio = { version = "1", features = ["os-poll", "net"], optional = true }
|
|
defmt = { version = "1", optional = true }
|
|
embassy-time = { version = "0.5", optional = true }
|
|
|
|
[dev-dependencies]
|
|
serde = "1"
|
|
zerocopy = "0.8"
|
|
once_cell = "1"
|
|
serde_json = "1"
|
|
rand = "0.10"
|
|
tempfile = "3"
|
|
|
|
[dev-dependencies.postcard]
|
|
version = "1"
|
|
|
|
[features]
|
|
default = ["std", "heapless"]
|
|
std = [
|
|
"downcast-rs/std",
|
|
"alloc",
|
|
"bus",
|
|
"crossbeam-channel/std",
|
|
"serde/std",
|
|
"spacepackets/std",
|
|
"num_enum/std",
|
|
"thiserror/std",
|
|
"socket2",
|
|
"mio"
|
|
]
|
|
alloc = [
|
|
"serde/alloc",
|
|
"cobs/alloc",
|
|
"spacepackets/alloc",
|
|
"hashbrown",
|
|
"dyn-clone",
|
|
"downcast-rs"
|
|
]
|
|
serde = ["dep:serde", "spacepackets/serde", "satrs-shared/serde"]
|
|
crossbeam = ["crossbeam-channel"]
|
|
defmt = ["dep:defmt", "spacepackets/defmt", "embassy-time?/defmt"]
|
|
embassy-time = ["dep:embassy-time"]
|
|
test_util = []
|
|
|
|
[package.metadata.docs.rs]
|
|
all-features = true
|
|
rustdoc-args = ["--generate-link-to-definition"]
|