feat(v0.3): Power-сервис на FSM — dev-mock кормит события, grace+durable-barrier
P7.2: service.rs оборачивает PowerFsm — D-Bus state/signals из FSM; apply_event исполняет действия (эмит сигналов, фоновый grace-таймер, durable-barrier sync). dev-mock SetAcc/SetIgnition/TriggerShutdown/AbortShutdown кормят входы FSM. FSM: AccOff → AccChanged(false)+ShutdownImminent (сохранён walking-skeleton-регресс). Integration: ShutdownImminent + abort. zbus → tokio-executor (default-features=false, features=["tokio"]) — иначе tokio::spawn в хендлере паникует (async-io). test-integration --test-threads=1 (тесты владеют одним именем на шине). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Alexander <akotenev2003@gmail.com>
This commit is contained in:
@@ -102,7 +102,16 @@ impl PowerFsm {
|
||||
self.state = Accessory;
|
||||
vec![]
|
||||
}
|
||||
(Accessory | Running, E::AccOff) => self.begin_shutdown(ShutdownReason::AccOff),
|
||||
// ACC-off: линия ACC сменилась (AccChanged) + старт shutdown.
|
||||
(Accessory | Running, E::AccOff) => {
|
||||
self.state = ShuttingDown { phase: Abortable, reason: ShutdownReason::AccOff };
|
||||
vec![
|
||||
Action::AccChanged(false),
|
||||
Action::ShutdownImminent(ShutdownReason::AccOff),
|
||||
Action::StartGrace,
|
||||
]
|
||||
}
|
||||
// under-voltage/thermal: ACC не менялся → без AccChanged.
|
||||
(Accessory | Running, E::UnderVoltage) => self.begin_shutdown(ShutdownReason::UnderVoltage),
|
||||
(Accessory | Running, E::ThermalTrip) => self.begin_shutdown(ShutdownReason::Thermal),
|
||||
(ShuttingDown { phase: Abortable, .. }, E::AccOn) => {
|
||||
@@ -149,7 +158,11 @@ mod tests {
|
||||
let mut f = PowerFsm::new(); // Running
|
||||
assert_eq!(
|
||||
f.step(Event::AccOff),
|
||||
vec![Action::ShutdownImminent(ShutdownReason::AccOff), Action::StartGrace]
|
||||
vec![
|
||||
Action::AccChanged(false),
|
||||
Action::ShutdownImminent(ShutdownReason::AccOff),
|
||||
Action::StartGrace
|
||||
]
|
||||
);
|
||||
assert_eq!(f.power_state(), PowerState::ShuttingDown);
|
||||
assert_eq!(f.source(), PowerSource::HoldupCap);
|
||||
|
||||
Reference in New Issue
Block a user