5a96a696b1
- 펌웨어(program), C# 대시보드(TestProgram), 시뮬레이터(Simulator), 프로토콜/문서(Protocol, doc) 전체를 단일 저장소로 통합 - program 폴더의 별도 git 저장소를 제거하고 통합 저장소에 흡수 - 빌드 산출물(program/build, bin/obj, *.o/.elf/.bin/.hex 등) .gitignore 처리 - 사내 Synology NAS Git 원격 연결 예정 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
81 lines
3.4 KiB
C#
81 lines
3.4 KiB
C#
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));
|
|
}
|
|
}
|