chore: HERV 통합 저장소 초기 커밋

- 펌웨어(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>
This commit is contained in:
2026-06-15 21:44:23 +09:00
commit 5a96a696b1
265 changed files with 76458 additions and 0 deletions
+189
View File
@@ -0,0 +1,189 @@
<UserControl x:Class="DiffuserSimulator.RoomPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- 디퓨저 각실(방) 1개 패널 — 디자이너에서 이 레이아웃만 수정하면 5실에 모두 반영됨.
컨트롤 동작(이벤트)은 MainWindow.BuildRoomPanels 에서 연결한다. -->
<Border Background="{StaticResource SecondaryBgBrush}" CornerRadius="8" Padding="10" Margin="3">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel>
<!-- 헤더: 활성 체크 + 색상 + 이름 / 상태 -->
<Grid Margin="0,0,0,6">
<StackPanel Orientation="Horizontal">
<CheckBox x:Name="ChkEnabled" VerticalAlignment="Center" Margin="0,0,6,0"/>
<Ellipse x:Name="HdrColor" Width="8" Height="8" Fill="#7DCFFF"
Margin="0,0,5,0" VerticalAlignment="Center"/>
<TextBlock x:Name="HdrName" Text="거실" FontSize="14" FontWeight="Bold"
Foreground="{StaticResource TextPrimaryBrush}"/>
</StackPanel>
<TextBlock x:Name="TxtStatus" Text="대기" FontSize="10" HorizontalAlignment="Right"
VerticalAlignment="Center" Foreground="Gray"/>
</Grid>
<TextBlock x:Name="TxtRxCount" Text="수신: 0" FontSize="9"
Foreground="{StaticResource TextSecondaryBrush}" Margin="0,0,0,4"/>
<Separator Background="{StaticResource BorderBrush}" Margin="0,4,0,4"/>
<!-- 배기(RA) 디퓨저 -->
<Grid Margin="0,4,0,2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="배기 댐퍼(열림)" FontSize="11" VerticalAlignment="Center"
Foreground="{StaticResource TextPrimaryBrush}"/>
<ToggleButton x:Name="TglEA" Grid.Column="1" Style="{StaticResource ToggleSwitch}"/>
</Grid>
<Grid Margin="0,0,0,3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="52"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="TxtEALabel" Text="RA 각도" FontSize="10" VerticalAlignment="Center"
Foreground="{StaticResource TextSecondaryBrush}"/>
<TextBox x:Name="TbEAAngle" Grid.Column="1" Text="0" FontSize="11" Padding="4,2"
Background="{StaticResource CardBgBrush}" Foreground="{StaticResource TextPrimaryBrush}"
BorderBrush="{StaticResource BorderBrush}" BorderThickness="1"/>
</Grid>
<!-- RA2 (거실2 = ID2 0x00) — 거실 전용. 힘펠 모드에서만 활성 -->
<Grid x:Name="GridEA2" Margin="0,0,0,3" Visibility="Collapsed">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="52"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="RA2 각도" FontSize="10" VerticalAlignment="Center"
Foreground="{StaticResource TextSecondaryBrush}"/>
<TextBox x:Name="TbEAAngle2" Grid.Column="1" Text="0" FontSize="11" Padding="4,2"
Background="{StaticResource CardBgBrush}" Foreground="{StaticResource TextPrimaryBrush}"
BorderBrush="{StaticResource BorderBrush}" BorderThickness="1"/>
</Grid>
<CheckBox x:Name="ChkCloseRA" Content="RA 수동 닫기" FontSize="10"
Foreground="{StaticResource TextSecondaryBrush}" Margin="0,2,0,2"/>
<Separator Background="{StaticResource BorderBrush}" Margin="0,4,0,4"/>
<!-- 공기질 센서값 -->
<TextBlock Text="공기질 센서값" FontSize="11" FontWeight="SemiBold"
Foreground="{StaticResource TextSecondaryBrush}" Margin="0,2,0,4"/>
<Grid Margin="0,0,0,3">
<Grid.ColumnDefinitions><ColumnDefinition Width="52"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions>
<TextBlock Text="PM2.5" FontSize="10" VerticalAlignment="Center" Foreground="{StaticResource TextSecondaryBrush}"/>
<TextBox x:Name="TbPM25" Grid.Column="1" Text="25" FontSize="11" Padding="4,2"
Background="{StaticResource CardBgBrush}" Foreground="{StaticResource TextPrimaryBrush}"
BorderBrush="{StaticResource BorderBrush}" BorderThickness="1"/>
</Grid>
<Grid Margin="0,0,0,3">
<Grid.ColumnDefinitions><ColumnDefinition Width="52"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions>
<TextBlock Text="PM10" FontSize="10" VerticalAlignment="Center" Foreground="{StaticResource TextSecondaryBrush}"/>
<TextBox x:Name="TbPM10" Grid.Column="1" Text="30" FontSize="11" Padding="4,2"
Background="{StaticResource CardBgBrush}" Foreground="{StaticResource TextPrimaryBrush}"
BorderBrush="{StaticResource BorderBrush}" BorderThickness="1"/>
</Grid>
<Grid Margin="0,0,0,3">
<Grid.ColumnDefinitions><ColumnDefinition Width="52"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions>
<TextBlock Text="CO₂" FontSize="10" VerticalAlignment="Center" Foreground="{StaticResource TextSecondaryBrush}"/>
<TextBox x:Name="TbCO2" Grid.Column="1" Text="850" FontSize="11" Padding="4,2"
Background="{StaticResource CardBgBrush}" Foreground="{StaticResource TextPrimaryBrush}"
BorderBrush="{StaticResource BorderBrush}" BorderThickness="1"/>
</Grid>
<Grid Margin="0,0,0,3">
<Grid.ColumnDefinitions><ColumnDefinition Width="52"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions>
<TextBlock Text="VOC" FontSize="10" VerticalAlignment="Center" Foreground="{StaticResource TextSecondaryBrush}"/>
<TextBox x:Name="TbVOC" Grid.Column="1" Text="115" FontSize="11" Padding="4,2"
Background="{StaticResource CardBgBrush}" Foreground="{StaticResource TextPrimaryBrush}"
BorderBrush="{StaticResource BorderBrush}" BorderThickness="1"/>
</Grid>
<Grid Margin="0,0,0,3">
<Grid.ColumnDefinitions><ColumnDefinition Width="52"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions>
<TextBlock Text="TVOC" FontSize="10" VerticalAlignment="Center" Foreground="{StaticResource TextSecondaryBrush}"/>
<TextBox x:Name="TbTVOC" Grid.Column="1" Text="250" FontSize="11" Padding="4,2"
Background="{StaticResource CardBgBrush}" Foreground="{StaticResource TextPrimaryBrush}"
BorderBrush="{StaticResource BorderBrush}" BorderThickness="1"/>
</Grid>
<Grid Margin="0,0,0,3">
<Grid.ColumnDefinitions><ColumnDefinition Width="52"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions>
<TextBlock Text="온도" FontSize="10" VerticalAlignment="Center" Foreground="{StaticResource TextSecondaryBrush}"/>
<TextBox x:Name="TbTemp" Grid.Column="1" Text="25" FontSize="11" Padding="4,2"
Background="{StaticResource CardBgBrush}" Foreground="{StaticResource TextPrimaryBrush}"
BorderBrush="{StaticResource BorderBrush}" BorderThickness="1"/>
</Grid>
<Grid Margin="0,0,0,3">
<Grid.ColumnDefinitions><ColumnDefinition Width="52"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions>
<TextBlock Text="습도" FontSize="10" VerticalAlignment="Center" Foreground="{StaticResource TextSecondaryBrush}"/>
<TextBox x:Name="TbHumidity" Grid.Column="1" Text="50" FontSize="11" Padding="4,2"
Background="{StaticResource CardBgBrush}" Foreground="{StaticResource TextPrimaryBrush}"
BorderBrush="{StaticResource BorderBrush}" BorderThickness="1"/>
</Grid>
<!-- 공기질 프리셋 (RbNoSensor=센서없음). GroupName 없이 부모 UniformGrid 단위로 그룹화 → 실별 독립 -->
<TextBlock Text="프리셋" FontSize="9" Foreground="{StaticResource TextSecondaryBrush}" Margin="0,2,0,4"/>
<UniformGrid Columns="2" Margin="0,2,0,4">
<RadioButton x:Name="RbGood" Content="좋음" Foreground="DodgerBlue" FontSize="10" FontWeight="SemiBold" Margin="0,0,0,2"/>
<RadioButton x:Name="RbNormal" Content="보통" Foreground="LimeGreen" FontSize="10" FontWeight="SemiBold" Margin="0,0,0,2" IsChecked="True"/>
<RadioButton x:Name="RbBad" Content="나쁨" Foreground="Orange" FontSize="10" FontWeight="SemiBold" Margin="0,0,0,2"/>
<RadioButton x:Name="RbVeryBad" Content="매우나쁨" Foreground="OrangeRed" FontSize="10" FontWeight="SemiBold" Margin="0,0,0,2"/>
<RadioButton x:Name="RbWorst" Content="최악" Foreground="Red" FontSize="10" FontWeight="SemiBold" Margin="0,0,0,2"/>
<RadioButton x:Name="RbNoSensor" Content="센서없음" Foreground="Gray" FontSize="10" FontWeight="SemiBold" Margin="0,0,0,2"/>
</UniformGrid>
<!-- 프리셋모드 (센서값 밴드 선택). 기본 NORMAL -->
<TextBlock Text="프리셋모드" FontSize="9" Foreground="{StaticResource TextSecondaryBrush}" Margin="0,2,0,4"/>
<UniformGrid Columns="2" Margin="0,2,0,4">
<RadioButton x:Name="RbEco" Content="ECO" Foreground="MediumAquamarine" FontSize="10" FontWeight="SemiBold" Margin="0,0,0,2"/>
<RadioButton x:Name="RbNorm" Content="NORMAL" Foreground="LimeGreen" FontSize="10" FontWeight="SemiBold" Margin="0,0,0,2" IsChecked="True"/>
<RadioButton x:Name="RbTurbo" Content="TURBO" Foreground="Orange" FontSize="10" FontWeight="SemiBold" Margin="0,0,0,2"/>
</UniformGrid>
<!-- LED -->
<Grid Margin="0,4,0,2">
<TextBlock Text="LED" FontSize="11" Foreground="{StaticResource TextPrimaryBrush}"/>
<TextBlock x:Name="TxtLedVal" Text="0 (OFF)" FontSize="11" FontWeight="Bold"
HorizontalAlignment="Right" Foreground="{StaticResource AccentYellowBrush}"/>
</Grid>
<Slider x:Name="SldLed" Minimum="0" Maximum="9" IsSnapToTickEnabled="True"
TickFrequency="1" TickPlacement="BottomRight" Value="0"/>
<CheckBox x:Name="ChkLedManual" Content="LED 디밍 수동 제어" FontSize="10"
Foreground="{StaticResource TextSecondaryBrush}" Margin="0,2,0,2"/>
<Separator Background="{StaticResource BorderBrush}" Margin="0,4,0,4"/>
<!-- 급기(SA) 디퓨저 -->
<Grid Margin="0,4,0,2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="급기 댐퍼(열림)" FontSize="11" VerticalAlignment="Center"
Foreground="{StaticResource TextPrimaryBrush}"/>
<ToggleButton x:Name="TglSA" Grid.Column="1" Style="{StaticResource ToggleSwitch}"/>
</Grid>
<Grid Margin="0,0,0,3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="52"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="TxtSALabel" Text="SA 각도" FontSize="10" VerticalAlignment="Center"
Foreground="{StaticResource TextSecondaryBrush}"/>
<TextBox x:Name="TbSAAngle" Grid.Column="1" Text="0" FontSize="11" Padding="4,2"
Background="{StaticResource CardBgBrush}" Foreground="{StaticResource TextPrimaryBrush}"
BorderBrush="{StaticResource BorderBrush}" BorderThickness="1"/>
</Grid>
<!-- SA2 (거실2 = ID2 0x00) — 거실 전용 -->
<Grid x:Name="GridSA2" Margin="0,0,0,3" Visibility="Collapsed">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="52"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="SA2 각도" FontSize="10" VerticalAlignment="Center"
Foreground="{StaticResource TextSecondaryBrush}"/>
<TextBox x:Name="TbSAAngle2" Grid.Column="1" Text="0" FontSize="11" Padding="4,2"
Background="{StaticResource CardBgBrush}" Foreground="{StaticResource TextPrimaryBrush}"
BorderBrush="{StaticResource BorderBrush}" BorderThickness="1"/>
</Grid>
<CheckBox x:Name="ChkCloseSA" Content="SA 수동 닫기" FontSize="10"
Foreground="{StaticResource TextSecondaryBrush}" Margin="0,2,0,2"/>
</StackPanel>
</ScrollViewer>
</Border>
</UserControl>