using CommunityToolkit.Mvvm.ComponentModel; using HC_APTBS.Services; namespace HC_APTBS.ViewModels.Pages { /// /// ViewModel for the Bench navigation page. /// /// Groups the bench-related child ViewModels owned by /// together with page-specific façades /// (temperature control, relay bank, pressure trace, interlock banner) /// that only the Bench page consumes. /// public sealed class BenchPageViewModel : ObservableObject { /// Root ViewModel — owns services, live readings, and global commands. public MainViewModel Root { get; } /// Manual bench controls (direction, RPM start/stop, oil pump, counter). public BenchControlViewModel BenchControl => Root.BenchControl; /// Real-time flowmeter charts (Q-Delivery, Q-Over). public FlowmeterChartViewModel FlowmeterChart => Root.FlowmeterChart; /// Encoder angle monitoring (PSG, INJ, Manual, Lock Angle). public AngleDisplayViewModel AngleDisplay => Root.AngleDisplay; /// Temperature PID setpoint + heater / cooler relay toggles. public TemperatureControlViewModel TempControl { get; } /// Auxiliary relay toggle bank (Electronic, Flasher, Pulse4Signal). public RelayBankViewModel RelayBank { get; } /// Real-time pressure traces (P1, P2). public PressureTraceChartViewModel PressureTrace { get; } = new(); /// Soft safety interlock banner state (oil pump / RPM limit). public InterlockBannerViewModel Interlock { get; } /// Root view-model providing live bench readings and child VMs. /// Bench service for setpoint and relay control. /// Configuration service for safety limits and defaults. public BenchPageViewModel( MainViewModel root, IBenchService benchService, IConfigurationService configService) { Root = root; TempControl = new TemperatureControlViewModel(benchService, configService); RelayBank = new RelayBankViewModel(benchService); Interlock = new InterlockBannerViewModel(configService); } /// /// Called from to feed the /// page-scoped VMs (pressure trace, interlock banner) from the latest /// bench readings. Keeping this here avoids adding page-specific logic /// to the root ViewModel. /// public void RefreshFromTick() { PressureTrace.AddSamples(Root.Pressure, Root.Pressure2); Interlock.Update(Root.BenchRpm, BenchControl.IsOilPumpOn); } } }