using System.ComponentModel; using System.Runtime.CompilerServices; using ErvProtocol; namespace ErvDashboard.Model { // 각실(거실/침실1~3) 상태 + 제어값 public class RoomState : INotifyPropertyChanged { public int RoomId { get; } // 1=거실, 2~4=침실1~3 public string Name { get; } public RoomState(int id, string name) { RoomId = id; Name = name; } bool _damperSaOpen, _damperEaOpen; int _pm25, _pm10, _voc, _co2, _temp, _humi; AirQuality _airQuality = AirQuality.Normal; int _ledDim; int _loadScore; int _finalVolume; // 급기(SA) 댐퍼 열림/닫힘 (토글, 제어 가능) public bool DamperSaOpen { get => _damperSaOpen; set { if (_damperSaOpen != value) { _damperSaOpen = value; OnChanged(); } } } // 배기(EA) 댐퍼 열림/닫힘 (토글, 제어 가능) public bool DamperEaOpen { get => _damperEaOpen; set { if (_damperEaOpen != value) { _damperEaOpen = value; OnChanged(); } } } // 공기질 센서값 (표시) public int Pm25 { get => _pm25; set { if (_pm25 != value) { _pm25 = value; OnChanged(); } } } public int Pm10 { get => _pm10; set { if (_pm10 != value) { _pm10 = value; OnChanged(); } } } public int Voc { get => _voc; set { if (_voc != value) { _voc = value; OnChanged(); } } } public int Co2 { get => _co2; set { if (_co2 != value) { _co2 = value; OnChanged(); } } } // 온도(℃)·습도(%) (표시) public int Temp { get => _temp; set { if (_temp != value) { _temp = value; OnChanged(); } } } public int Humi { get => _humi; set { if (_humi != value) { _humi = value; OnChanged(); } } } // 공기질 상태코드(1~4, 프로토콜) — L3/L4 가 모두 매우나쁨(1)으로 합쳐지므로 표시는 LoadScore(Level) 사용 public AirQuality AirQuality { get => _airQuality; set { if (_airQuality != value) { _airQuality = value; OnChanged(); } } } // 공기질 표시(좋음/보통/나쁨/매우나쁨/최악)는 각실 Level(=LoadScore 0~4) 기준 — L4(최악, 빨강)까지 구분 public string AirQualityText => LoadScore switch { 0 => "좋음", 1 => "보통", 2 => "나쁨", 3 => "매우나쁨", 4 => "최악", _ => "-", }; // LED 디밍 0~9 (슬라이드, 제어 가능) public int LedDim { get => _ledDim; set { var v = value < 0 ? 0 : value > 9 ? 9 : value; if (_ledDim != v) { _ledDim = v; OnChanged(); } } } // 자동운전 - 각실 부하점수(=Level 0~4, 읽기전용). 변경 시 공기질 표시도 갱신. public int LoadScore { get => _loadScore; set { if (_loadScore != value) { _loadScore = value; OnChanged(); OnChanged(nameof(AirQualityText)); } } } // 자동운전 - 최종 풍량 (읽기전용) public int FinalVolume { get => _finalVolume; set { if (_finalVolume != value) { _finalVolume = value; OnChanged(); } } } public event PropertyChangedEventHandler? PropertyChanged; void OnChanged([CallerMemberName] string? n = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(n)); } }