Browse Source

Added prototype DigitalKeyUnit app
Fixed Transport issue with LightBulb App

frankvandenbos 2 ngày trước cách đây
mục cha
commit
73f391dee9

+ 9 - 0
PRSDigitalKeyUnit/App.xaml

@@ -0,0 +1,9 @@
+<Application x:Class="PRSDigitalKeyUnit.App"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:local="clr-namespace:PRSDigitalKeyUnit"
+             StartupUri="MainWindow.xaml">
+    <Application.Resources>
+         
+    </Application.Resources>
+</Application>

+ 12 - 0
PRSDigitalKeyUnit/App.xaml.cs

@@ -0,0 +1,12 @@
+using System.Configuration;
+using System.Data;
+using System.Windows;
+
+namespace PRSDigitalKeyUnit;
+
+/// <summary>
+/// Interaction logic for App.xaml
+/// </summary>
+public partial class App : Application
+{
+}

+ 10 - 0
PRSDigitalKeyUnit/AssemblyInfo.cs

@@ -0,0 +1,10 @@
+using System.Windows;
+
+[assembly: ThemeInfo(
+    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+    //(used if a resource is not found in the page,
+    // or application resource dictionaries)
+    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+    //(used if a resource is not found in the page,
+    // app, or any theme specific resource dictionaries)
+)]

+ 750 - 0
PRSDigitalKeyUnit/MainWindow.xaml

@@ -0,0 +1,750 @@
+<Window x:Class="PRSDigitalKeyUnit.MainWindow"
+        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+        xmlns:local="clr-namespace:PRSDigitalKeyUnit"
+        xmlns:wpf="clr-namespace:InABox.WPF;assembly=InABox.Wpf"
+        mc:Ignorable="d"
+        Title="MainWindow" Height="490" Width="800">
+        <Window.DataContext><local:MainWindowViewModel x:Name="ViewModel"/></Window.DataContext>
+        
+        <Window.Resources>
+                <wpf:BooleanToBrushConverter x:Key="BooleanToBrushConverter" TrueValue="#FF0000" FalseValue="#444444" />
+        </Window.Resources>
+        
+        <Grid>
+                <DockPanel>
+                        <DockPanel DockPanel.Dock="Left" Width="50" Background="DarkSlateGray">
+                                <Ellipse DockPanel.Dock="Top" Height="30" Width="30" Stroke="Black" StrokeThickness="7" Fill="#888888" Margin="10"/>
+                                <Ellipse DockPanel.Dock="Bottom" Height="30" Width="30" Stroke="Black" StrokeThickness="7" Fill="#888888" Margin="10"/>
+                                <Ellipse DockPanel.Dock="Left" Height="30" Width="30" Fill="DarkSlateGray"/>
+                        </DockPanel>
+                        <DockPanel DockPanel.Dock="Right" Width="50" Background="DarkSlateGray">
+                                <Ellipse DockPanel.Dock="Top" Height="30" Width="30" Stroke="Black" StrokeThickness="7" Fill="#888888" Margin="10"/>
+                                <Ellipse DockPanel.Dock="Bottom" Height="30" Width="30" Stroke="Black" StrokeThickness="7" Fill="#888888" Margin="10"/>
+                                <Rectangle DockPanel.Dock="Left" Width="30" Height="280" Fill="#3A3A3A" Margin="0,0,20,0"/>
+                        </DockPanel>
+                        <Grid DockPanel.Dock="Top" Height="50" Background="#333333">
+                                <Grid.ColumnDefinitions>
+                                        <ColumnDefinition Width="1.5*"/>
+                                        <ColumnDefinition Width="4*"/>
+                                        <ColumnDefinition Width="0.5*"/>
+                                        <ColumnDefinition Width="2.5*"/>
+                                        <ColumnDefinition Width="4*"/>
+                                        <ColumnDefinition Width="2*"/>
+                                        <ColumnDefinition Width="1.2*"/>
+                                        <ColumnDefinition Width="3*"/>
+                                        <ColumnDefinition Width="2*"/>
+                                        <ColumnDefinition Width="2*"/>
+                                </Grid.ColumnDefinitions>
+                                
+                                <Grid Grid.Column="1">
+                                        
+                                        <Grid.RowDefinitions>
+                                                <RowDefinition Height="*"/>
+                                                <RowDefinition Height="Auto"/>
+                                        </Grid.RowDefinitions>
+                                        
+                                        <Grid Background="#00AA66" Grid.Row="1" Margin="0, 0, 0, 5">
+                                                <Grid.ColumnDefinitions>
+                                                        <ColumnDefinition Width="*"/>
+                                                        <ColumnDefinition Width="*"/>
+                                                        <ColumnDefinition Width="*"/>
+                                                </Grid.ColumnDefinitions>
+                                                <Rectangle Grid.Column="0" Fill="#333333" Width="10" Height="15" Margin="0, 5, 0, 0"/>
+                                                <Rectangle Grid.Column="1" Fill="#333333" Width="10" Height="15" Margin="0, 5, 0, 0"/>
+                                                <Rectangle Grid.Column="2" Fill="#333333" Width="10" Height="15" Margin="0, 5, 0, 0"/>
+                                        </Grid>
+                                        <Grid Background="#10CC99" Grid.Row="0">
+                                                <Grid.ColumnDefinitions>
+                                                        <ColumnDefinition Width="*"/>
+                                                        <ColumnDefinition Width="*"/>
+                                                        <ColumnDefinition Width="*"/>
+                                                </Grid.ColumnDefinitions>
+                                                <Ellipse Grid.Column="0" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                                <Ellipse Grid.Column="1" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                                <Ellipse Grid.Column="2" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                        </Grid>
+                                                
+                                </Grid>
+                                <Grid Grid.Column="3">
+                                        
+                                        <Grid.RowDefinitions>
+                                                <RowDefinition Height="*"/>
+                                                <RowDefinition Height="Auto"/>
+                                        </Grid.RowDefinitions>
+                                        
+                                        <Grid Background="#00AA66" Grid.Row="1" Margin="0, 0, 0, 5">
+                                                <Grid.ColumnDefinitions>
+                                                        <ColumnDefinition Width="*"/>
+                                                        <ColumnDefinition Width="*"/>
+                                                </Grid.ColumnDefinitions>
+                                                <Rectangle Grid.Column="0" Fill="#333333" Width="10" Height="15" Margin="0, 5, 0, 0"/>
+                                                <Rectangle Grid.Column="1" Fill="#333333" Width="10" Height="15" Margin="0, 5, 0, 0"/>
+                                        </Grid>
+                                        <Grid Background="#10CC99" Grid.Row="0">
+                                                <Grid.ColumnDefinitions>
+                                                        <ColumnDefinition Width="*"/>
+                                                        <ColumnDefinition Width="*"/>
+                                                </Grid.ColumnDefinitions>
+                                                <Ellipse Grid.Column="0" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                                <Ellipse Grid.Column="1" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                        </Grid>
+                                                
+                                </Grid>
+                                <Grid Grid.Column="4">
+                                        <Grid.ColumnDefinitions>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                        </Grid.ColumnDefinitions>
+                                        <Grid.RowDefinitions>
+                                                <RowDefinition Height="*"/>
+                                                <RowDefinition Height="*"/>
+                                        </Grid.RowDefinitions>
+                                        
+                                        <Rectangle Stroke="White" Fill="Silver" Grid.Column="0" Grid.Row="0" Margin="10,3,5,3"/>
+                                        <Rectangle Stroke="White" Fill="Silver" Grid.Column="1" Grid.Row="0" Margin="10,3,5,3"/>
+                                        <Rectangle Stroke="White" Fill="Silver" Grid.Column="2" Grid.Row="0" Margin="10,3,5,3"/>
+                                        <Rectangle Stroke="Black" Fill="Silver" Grid.Column="3" Grid.Row="0" Margin="9,10,6,4"/>
+                                        
+                                        <TextBlock Text="TXD" Grid.Row="1" Grid.Column="0" FontSize="10" Foreground="White">
+                                                <TextBlock.RenderTransform>
+                                                        <TransformGroup>
+                                                                <RotateTransform Angle="90" />
+                                                                <TranslateTransform X="20" Y="2"/>
+                                                        </TransformGroup>
+                                                </TextBlock.RenderTransform>
+                                        </TextBlock>
+                                        <TextBlock Text="RXD" Grid.Row="1" Grid.Column="1" FontSize="10" Foreground="White">
+                                                <TextBlock.RenderTransform>
+                                                        <TransformGroup>
+                                                                <RotateTransform Angle="90" />
+                                                                <TranslateTransform X="20" Y="2"/>
+                                                        </TransformGroup>
+                                                </TextBlock.RenderTransform>
+                                        </TextBlock>
+                                        <TextBlock Text="PWR" Grid.Row="1" Grid.Column="2" FontSize="10" Foreground="White">
+                                                <TextBlock.RenderTransform>
+                                                        <TransformGroup>
+                                                                <RotateTransform Angle="90" />
+                                                                <TranslateTransform X="20" Y="2"/>
+                                                        </TransformGroup>
+                                                </TextBlock.RenderTransform>
+                                        </TextBlock>
+                                        <TextBlock Text="RGB" Grid.Row="1" Grid.Column="3" FontSize="10" Foreground="White">
+                                                <TextBlock.RenderTransform>
+                                                        <TransformGroup>
+                                                                <RotateTransform Angle="90" />
+                                                                <TranslateTransform X="20" Y="2"/>
+                                                        </TransformGroup>
+                                                </TextBlock.RenderTransform>
+                                        </TextBlock>
+                                </Grid>
+                                <Grid Grid.Column="5">
+                                        <Grid.RowDefinitions>
+                                                <RowDefinition Height="*"/>
+                                                <RowDefinition Height="Auto"/>
+                                        </Grid.RowDefinitions>
+                                        <Rectangle Fill="LightGray" Margin="9, 4, 9, 4"/>
+                                        <TextBlock Text="USB" Grid.Row="1" Grid.Column="0" FontSize="10" Foreground="White">
+                                                <TextBlock.RenderTransform>
+                                                        <TransformGroup>
+                                                                <RotateTransform Angle="180" />
+                                                                <TranslateTransform X="35" Y="12"/>
+                                                        </TransformGroup>
+                                                </TextBlock.RenderTransform>
+                                        </TextBlock>
+                                </Grid>
+                                <Grid Grid.Column="6" Background="LightGray" Margin="0,5,0,10">
+                                        <Polygon Fill="DarkSlateGray" Points="7,0 30,0 37,7 37,30 30,40 7,37 0,30 0, 7"/>
+                                </Grid>
+                                <Grid Grid.Column="7">
+                                <Grid.ColumnDefinitions>
+                                        <ColumnDefinition Width="*"/>
+                                        <ColumnDefinition Width="*"/>
+                                </Grid.ColumnDefinitions>
+                                <Grid.RowDefinitions>
+                                        <RowDefinition Height="*"/>
+                                        <RowDefinition Height="2*"/>
+                                        <RowDefinition Height="3*"/>
+                                </Grid.RowDefinitions>
+                                    
+                                <Rectangle Stroke="White" Fill="White" Grid.Column="0" Grid.Row="0" Margin="15,3,10,0"/>
+                                <Rectangle Stroke="White" Fill="White" Grid.Column="1" Grid.Row="0" Margin="15,3,10,0"/>
+
+                                
+                                <Rectangle Stroke="White" Fill="DarkSlateGray" Grid.Column="0" Grid.Row="1" Margin="10,0,5,3"/>
+                                <Rectangle Stroke="White" Fill="DarkSlateGray" Grid.Column="1" Grid.Row="1" Margin="10,0,5,3"/>
+                                
+                                <TextBlock Text="RESET" Grid.Row="2" Grid.Column="0" FontSize="10" Foreground="White">
+                                        <TextBlock.RenderTransform>
+                                                <TransformGroup>
+                                                        <RotateTransform Angle="180" />
+                                                        <TranslateTransform X="34" Y="10"/>
+                                                </TransformGroup>
+                                        </TextBlock.RenderTransform>
+                                </TextBlock>
+                                <TextBlock Text="BOOT" Grid.Row="2" Grid.Column="1" FontSize="10" Foreground="White">
+                                        <TextBlock.RenderTransform>
+                                                <TransformGroup>
+                                                        <RotateTransform Angle="180" />
+                                                        <TranslateTransform X="34" Y="10"/>
+                                                </TransformGroup>
+                                        </TextBlock.RenderTransform>
+                                </TextBlock>
+                            </Grid>
+                                <Rectangle Grid.Column="8" Fill="Goldenrod" Margin="10, 0, 20, 5"/>
+                        </Grid>
+                                
+                        <Grid DockPanel.Dock="Bottom" Height="50" Background="#333333">
+                                <Grid.ColumnDefinitions>
+                                        <ColumnDefinition Width="*"/>
+                                        <ColumnDefinition Width="3*"/>
+                                        <ColumnDefinition Width="3*"/>
+                                        <ColumnDefinition Width="3*"/>
+                                        <ColumnDefinition Width="3*"/>
+                                        <ColumnDefinition Width="3*"/>
+                                        <ColumnDefinition Width="3*"/>
+                                        <ColumnDefinition Width="*"/>
+                                </Grid.ColumnDefinitions>
+                                <Grid.RowDefinitions>
+                                        <RowDefinition Height="Auto"/>
+                                        <RowDefinition Height="*"/>
+                                </Grid.RowDefinitions>
+                                <Grid Grid.Column="1" Background="#00AA66" Margin="0, 5, 0, 0">
+                                        <Grid.ColumnDefinitions>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                        </Grid.ColumnDefinitions>
+                                        <Rectangle Grid.Column="0" Fill="#333333" Width="10" Height="15" Margin="0, 0, 0, 5"/>
+                                        <Rectangle Grid.Column="1" Fill="#333333" Width="10" Height="15" Margin="0, 0, 0, 5"/>
+                                        <Rectangle Grid.Column="2" Fill="#333333" Width="10" Height="15" Margin="0, 0, 0, 5"/>
+                                </Grid>
+                                <Grid Grid.Column="1" Background="#10CC99" Grid.Row="1">
+                                        <Grid.ColumnDefinitions>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                        </Grid.ColumnDefinitions>
+                                        <Ellipse Grid.Column="0" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                        <Ellipse Grid.Column="1" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                        <Ellipse Grid.Column="2" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                </Grid>
+                                <Grid Grid.Column="2" Background="#00AA66" Margin="0, 5, 0, 0">
+                                        <Grid.ColumnDefinitions>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                        </Grid.ColumnDefinitions>
+                                        <Rectangle Grid.Column="0" Fill="#333333" Width="10" Height="15" Margin="0, 0, 0, 5"/>
+                                        <Rectangle Grid.Column="1" Fill="#333333" Width="10" Height="15" Margin="0, 0, 0, 5"/>
+                                        <Rectangle Grid.Column="2" Fill="#333333" Width="10" Height="15" Margin="0, 0, 0, 5"/>
+                                </Grid>
+                                <Grid Grid.Column="2" Background="#10CC99" Grid.Row="1">
+                                        <Grid.ColumnDefinitions>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                        </Grid.ColumnDefinitions>
+                                        <Ellipse Grid.Column="0" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                        <Ellipse Grid.Column="1" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                        <Ellipse Grid.Column="2" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                </Grid>
+                                <Grid Grid.Column="3" Background="#00AA66" Margin="0, 5, 0, 0">
+                                        <Grid.ColumnDefinitions>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                        </Grid.ColumnDefinitions>
+                                        <Rectangle Grid.Column="0" Fill="#333333" Width="10" Height="15" Margin="0, 0, 0, 5"/>
+                                        <Rectangle Grid.Column="1" Fill="#333333" Width="10" Height="15" Margin="0, 0, 0, 5"/>
+                                        <Rectangle Grid.Column="2" Fill="#333333" Width="10" Height="15" Margin="0, 0, 0, 5"/>
+                                </Grid>
+                                <Grid Grid.Column="3" Background="#10CC99" Grid.Row="1">
+                                        <Grid.ColumnDefinitions>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                        </Grid.ColumnDefinitions>
+                                        <Ellipse Grid.Column="0" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                        <Ellipse Grid.Column="1" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                        <Ellipse Grid.Column="2" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                </Grid>
+                                <Grid Grid.Column="4" Background="#00AA66" Margin="0, 5, 0, 0">
+                                        <Grid.ColumnDefinitions>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                        </Grid.ColumnDefinitions>
+                                        <Rectangle Grid.Column="0" Fill="#333333" Width="10" Height="15" Margin="0, 0, 0, 5"/>
+                                        <Rectangle Grid.Column="1" Fill="#333333" Width="10" Height="15" Margin="0, 0, 0, 5"/>
+                                        <Rectangle Grid.Column="2" Fill="#333333" Width="10" Height="15" Margin="0, 0, 0, 5"/>
+                                </Grid>
+                                <Grid Grid.Column="4" Background="#10CC99" Grid.Row="1">
+                                        <Grid.ColumnDefinitions>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                        </Grid.ColumnDefinitions>
+                                        <Ellipse Grid.Column="0" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                        <Ellipse Grid.Column="1" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                        <Ellipse Grid.Column="2" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                </Grid>
+                                <Grid Grid.Column="5" Background="#00AA66" Margin="0, 5, 0, 0">
+                                        <Grid.ColumnDefinitions>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                        </Grid.ColumnDefinitions>
+                                        <Rectangle Grid.Column="0" Fill="#333333" Width="10" Height="15" Margin="0, 0, 0, 5"/>
+                                        <Rectangle Grid.Column="1" Fill="#333333" Width="10" Height="15" Margin="0, 0, 0, 5"/>
+                                        <Rectangle Grid.Column="2" Fill="#333333" Width="10" Height="15" Margin="0, 0, 0, 5"/>
+                                </Grid>
+                                <Grid Grid.Column="5" Background="#10CC99" Grid.Row="1">
+                                        <Grid.ColumnDefinitions>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                        </Grid.ColumnDefinitions>
+                                        <Ellipse Grid.Column="0" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                        <Ellipse Grid.Column="1" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                        <Ellipse Grid.Column="2" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                </Grid>
+                                <Grid Grid.Column="6" Background="#00AA66" Margin="0, 5, 0, 0">
+                                        <Grid.ColumnDefinitions>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                        </Grid.ColumnDefinitions>
+                                        <Rectangle Grid.Column="0" Fill="#333333" Width="10" Height="15" Margin="0, 0, 0, 5"/>
+                                        <Rectangle Grid.Column="1" Fill="#333333" Width="10" Height="15" Margin="0, 0, 0, 5"/>
+                                        <Rectangle Grid.Column="2" Fill="#333333" Width="10" Height="15" Margin="0, 0, 0, 5"/>
+                                </Grid>
+                                <Grid Grid.Column="6" Background="#10CC99" Grid.Row="1">
+                                        <Grid.ColumnDefinitions>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="*"/>
+                                        </Grid.ColumnDefinitions>
+                                        <Ellipse Grid.Column="0" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                        <Ellipse Grid.Column="1" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                        <Ellipse Grid.Column="2" Fill="#AAAAAA" Width="18" Margin="3"/>
+                                </Grid>
+                        </Grid>
+                        <DockPanel DockPanel.Dock="Left" Background="DarkSlateGray">
+                                <Grid DockPanel.Dock="Left" Width="620" Margin="0, 15, 50, 15" Background="#444444">
+                                        <Grid.RowDefinitions>
+                                                <RowDefinition Height="1.5*"/>
+                                                <RowDefinition Height="5*"/>
+                                                <RowDefinition Height="2.15*"/>
+                                        </Grid.RowDefinitions>
+                                        
+                                        <Grid Grid.Row="0">
+                                                <Grid.ColumnDefinitions>
+                                                        <ColumnDefinition Width="3*"/>
+                                                        <ColumnDefinition Width="2*"/>
+                                                        <ColumnDefinition Width="*"/>
+                                                        <ColumnDefinition Width="*"/>
+                                                        <ColumnDefinition Width="*"/>
+                                                        <ColumnDefinition Width="*"/>
+                                                        <ColumnDefinition Width="1.5*"/>
+                                                        <ColumnDefinition Width="2*"/>
+                                                        <ColumnDefinition Width="1.8*"/>
+                                                        <ColumnDefinition Width="1.8*"/>
+                                                        <ColumnDefinition Width="1.8*"/>
+                                                </Grid.ColumnDefinitions>
+                                                
+                                                <Grid Grid.Column="0" Margin="1,0,1,0" Background="#20CC33">
+                                                        <Grid.ColumnDefinitions>
+                                                                <ColumnDefinition Width="*"/>
+                                                                <ColumnDefinition Width="*"/>
+                                                                <ColumnDefinition Width="*"/>
+                                                        </Grid.ColumnDefinitions>
+                                                        <Grid.RowDefinitions>
+                                                                <RowDefinition Height="2*"/>
+                                                                <RowDefinition Height="*"/>
+                                                        </Grid.RowDefinitions>
+                                                        
+                                                        <TextBlock Text="RS485" Grid.Row="1" Grid.Column="0" FontSize="13" Foreground="White">
+                                                                <TextBlock.RenderTransform>
+                                                                        <TransformGroup>
+                                                                                <RotateTransform Angle="180" />
+                                                                                <TranslateTransform X="65" Y="15"/>
+                                                                        </TransformGroup>
+                                                                </TextBlock.RenderTransform>
+                                                        </TextBlock>
+                                                        <Ellipse Fill="Black" Height="20" Grid.Column="0" Margin="6,0,6,6"/>
+                                                        <Ellipse Fill="Black" Height="20" Grid.Column="1" Margin="6,0,6,6"/>
+                                                        <Ellipse Fill="Black" Height="20" Grid.Column="2" Margin="6,0,6,6"/>
+                                                </Grid>
+                                                <Grid Grid.Column="1" Margin="1,0,1,0" Background="#20CC33">
+                                                        <Grid.ColumnDefinitions>
+                                                                <ColumnDefinition Width="*"/>
+                                                                <ColumnDefinition Width="*"/>
+                                                        </Grid.ColumnDefinitions>
+                                                        <Grid.RowDefinitions>
+                                                                <RowDefinition Height="2*"/>
+                                                                <RowDefinition Height="*"/>
+                                                        </Grid.RowDefinitions>
+                                                        
+                                                        <Ellipse Fill="Black" Height="20" Grid.Column="0" Margin="6,0,6,8"/>
+                                                        <Ellipse Fill="Black" Height="20" Grid.Column="2" Margin="6,0,6,8"/>
+                                                        <TextBlock Text="DC 7±36V" Grid.Row="1" Grid.Column="0" FontSize="7" Foreground="White">
+                                                                <TextBlock.RenderTransform>
+                                                                        <TransformGroup>
+                                                                                <TranslateTransform X="-55" Y="-15"/>
+                                                                                <RotateTransform Angle="180" />
+                                                                        </TransformGroup>
+                                                                </TextBlock.RenderTransform>
+                                                        </TextBlock>
+                                                </Grid>
+                                                <Grid Grid.Column="2" Margin="1,0,1,0" Background="#20CC33">
+                                                        <Grid.ColumnDefinitions>
+                                                                <ColumnDefinition Width="*"/>
+                                                        </Grid.ColumnDefinitions>
+                                                        <Grid.RowDefinitions>
+                                                                <RowDefinition Height="2*"/>
+                                                                <RowDefinition Height="*"/>
+                                                        </Grid.RowDefinitions>
+                                                        
+                                                        <TextBlock Text="TXD" Grid.Row="1" Grid.Column="0" FontSize="13" Foreground="White">
+                                                                <TextBlock.RenderTransform>
+                                                                        <TransformGroup>
+                                                                                <RotateTransform Angle="180" />
+                                                                                <TranslateTransform X="30" Y="15"/>
+                                                                        </TransformGroup>
+                                                                </TextBlock.RenderTransform>
+                                                        </TextBlock>
+                                                        <Ellipse Fill="Black" Height="20" Grid.Column="0" Margin="6,0,6,8"/>
+                                                </Grid>
+                                                <Grid Grid.Column="3" Margin="1,0,1,0" Background="#20CC33">
+                                                        <Grid.ColumnDefinitions>
+                                                                <ColumnDefinition Width="*"/>
+                                                        </Grid.ColumnDefinitions>
+                                                        <Grid.RowDefinitions>
+                                                                <RowDefinition Height="2*"/>
+                                                                <RowDefinition Height="*"/>
+                                                        </Grid.RowDefinitions>
+                                                        
+                                                        <TextBlock Text="RXD" Grid.Row="1" Grid.Column="0" FontSize="13" Foreground="White">
+                                                                <TextBlock.RenderTransform>
+                                                                        <TransformGroup>
+                                                                                <RotateTransform Angle="180" />
+                                                                                <TranslateTransform X="30" Y="15"/>
+                                                                        </TransformGroup>
+                                                                </TextBlock.RenderTransform>
+                                                        </TextBlock>
+                                                        <Ellipse Fill="Black" Height="20" Grid.Column="0" Margin="6,0,6,8"/>
+                                                </Grid>
+                                                <Grid Grid.Column="4" Margin="1,0,1,0" Background="#20CC33">
+                                                        <Grid.ColumnDefinitions>
+                                                                <ColumnDefinition Width="*"/>
+                                                        </Grid.ColumnDefinitions>
+                                                        <Grid.RowDefinitions>
+                                                                <RowDefinition Height="2*"/>
+                                                                <RowDefinition Height="*"/>
+                                                        </Grid.RowDefinitions>
+                                                        
+                                                        <TextBlock Text="PWR" Grid.Row="1" Grid.Column="0" FontSize="13" Foreground="White">
+                                                                <TextBlock.RenderTransform>
+                                                                        <TransformGroup>
+                                                                                <RotateTransform Angle="180" />
+                                                                                <TranslateTransform X="30" Y="15"/>
+                                                                        </TransformGroup>
+                                                                </TextBlock.RenderTransform>
+                                                        </TextBlock>
+                                                        <Ellipse Fill="Black" Height="20" Grid.Column="0" Margin="6,0,6,8"/>
+                                                </Grid>
+                                                <Grid Grid.Column="5" Margin="1,0,1,0" Background="#20CC33">
+                                                        <Grid.ColumnDefinitions>
+                                                                <ColumnDefinition Width="*"/>
+                                                        </Grid.ColumnDefinitions>
+                                                        <Grid.RowDefinitions>
+                                                                <RowDefinition Height="2*"/>
+                                                                <RowDefinition Height="*"/>
+                                                        </Grid.RowDefinitions>
+                                                        
+                                                        <TextBlock Text="RGB" Grid.Row="1" Grid.Column="0" FontSize="13" Foreground="White">
+                                                                <TextBlock.RenderTransform>
+                                                                        <TransformGroup>
+                                                                                <RotateTransform Angle="180" />
+                                                                                <TranslateTransform X="30" Y="15"/>
+                                                                        </TransformGroup>
+                                                                </TextBlock.RenderTransform>
+                                                        </TextBlock>
+                                                        <Ellipse Fill="Black" Height="20" Grid.Column="0" Margin="6,0,6,8"/>
+                                                </Grid>
+                                                <Grid Grid.Column="6" Margin="1,0,1,0" Background="#20CC33">
+                                                        <Grid.ColumnDefinitions>
+                                                                <ColumnDefinition Width="*"/>
+                                                        </Grid.ColumnDefinitions>
+                                                        <Grid.RowDefinitions>
+                                                                <RowDefinition Height="2*"/>
+                                                                <RowDefinition Height="*"/>
+                                                        </Grid.RowDefinitions>
+                                                        
+                                                        <TextBlock Text="USB" Grid.Row="1" Grid.Column="0" FontSize="13" Foreground="White">
+                                                                <TextBlock.RenderTransform>
+                                                                        <TransformGroup>
+                                                                                <RotateTransform Angle="180" />
+                                                                                <TranslateTransform X="35" Y="15"/>
+                                                                        </TransformGroup>
+                                                                </TextBlock.RenderTransform>
+                                                        </TextBlock>
+                                                        <Rectangle Fill="Black" Height="20" Grid.Column="0" Margin="6,0,6,8" RadiusX="3" RadiusY="3"/>
+                                                </Grid>
+                                                <Grid Grid.Column="7" Margin="1,0,1,0" Background="#20CC33">
+                                                        <Grid.ColumnDefinitions>
+                                                                <ColumnDefinition Width="*"/>
+                                                        </Grid.ColumnDefinitions>
+                                                        <Grid.RowDefinitions>
+                                                                <RowDefinition Height="2*"/>
+                                                                <RowDefinition Height="*"/>
+                                                        </Grid.RowDefinitions>
+                                                        
+                                                        <TextBlock Text="BUZZER" Grid.Row="1" Grid.Column="0" FontSize="13" Foreground="White">
+                                                                <TextBlock.RenderTransform>
+                                                                        <TransformGroup>
+                                                                                <RotateTransform Angle="180" />
+                                                                                <TranslateTransform X="55" Y="15"/>
+                                                                        </TransformGroup>
+                                                                </TextBlock.RenderTransform>
+                                                        </TextBlock>
+                                                        <Rectangle Fill="Black" Height="20" Grid.Column="0" Margin="6,0,6,8" RadiusX="3" RadiusY="3"/>
+                                                </Grid>
+                                                <Grid Grid.Column="8" Margin="1,0,1,0" Background="#20CC33">
+                                                        <Grid.ColumnDefinitions>
+                                                                <ColumnDefinition Width="*"/>
+                                                        </Grid.ColumnDefinitions>
+                                                        <Grid.RowDefinitions>
+                                                                <RowDefinition Height="2*"/>
+                                                                <RowDefinition Height="*"/>
+                                                        </Grid.RowDefinitions>
+                                                        
+                                                        <TextBlock Text="RESET" Grid.Row="1" Grid.Column="0" FontSize="13" Foreground="White">
+                                                                <TextBlock.RenderTransform>
+                                                                        <TransformGroup>
+                                                                                <RotateTransform Angle="180" />
+                                                                                <TranslateTransform X="45" Y="15"/>
+                                                                        </TransformGroup>
+                                                                </TextBlock.RenderTransform>
+                                                        </TextBlock>
+                                                        <Rectangle Fill="Black" Width="25" Grid.Column="0" Margin="6,5,6,8" RadiusX="3" RadiusY="3"/>
+                                                </Grid>
+                                                <Grid Grid.Column="9" Margin="1,0,1,0" Background="#20CC33">
+                                                        <Grid.ColumnDefinitions>
+                                                                <ColumnDefinition Width="*"/>
+                                                        </Grid.ColumnDefinitions>
+                                                        <Grid.RowDefinitions>
+                                                                <RowDefinition Height="2*"/>
+                                                                <RowDefinition Height="*"/>
+                                                        </Grid.RowDefinitions>
+                                                        
+                                                        <TextBlock Text="BOOT" Grid.Row="1" Grid.Column="0" FontSize="13" Foreground="White">
+                                                                <TextBlock.RenderTransform>
+                                                                        <TransformGroup>
+                                                                                <RotateTransform Angle="180" />
+                                                                                <TranslateTransform X="45" Y="15"/>
+                                                                        </TransformGroup>
+                                                                </TextBlock.RenderTransform>
+                                                        </TextBlock>
+                                                        <Rectangle Fill="Black" Width="25" Grid.Column="0" Margin="6,5,6,8" RadiusX="3" RadiusY="3"/>
+                                                </Grid>
+                                                <Grid Grid.Column="10" Margin="1,0,1,0" Background="#20CC33">
+                                                        <Grid.ColumnDefinitions>
+                                                                <ColumnDefinition Width="*"/>
+                                                        </Grid.ColumnDefinitions>
+                                                        <Grid.RowDefinitions>
+                                                                <RowDefinition Height="2*"/>
+                                                                <RowDefinition Height="*"/>
+                                                        </Grid.RowDefinitions>
+                                                        
+                                                        <TextBlock Text="ANT" Grid.Row="1" Grid.Column="0" FontSize="13" Foreground="White">
+                                                                <TextBlock.RenderTransform>
+                                                                        <TransformGroup>
+                                                                                <RotateTransform Angle="180" />
+                                                                                <TranslateTransform X="40" Y="15"/>
+                                                                        </TransformGroup>
+                                                                </TextBlock.RenderTransform>
+                                                        </TextBlock>
+                                                        <Rectangle Fill="Black" Width="25" Grid.Column="0" Margin="6,5,6,8" RadiusX="3" RadiusY="3"/>
+                                                </Grid>
+                                        </Grid>
+                                        <Grid Grid.Row="1">
+                                                <Grid.RowDefinitions>
+                                                        <RowDefinition Height="3*"/>
+                                                        <RowDefinition Height="*"/>
+                                                        <RowDefinition Height="0.2*"/>
+                                                        <RowDefinition Height="0.2*"/>
+                                                        <RowDefinition Height="3*"/>
+                                                </Grid.RowDefinitions>
+                                                
+                                                <TextBlock Grid.Row="0" Text="WAVESHARE" Foreground="White" TextAlignment="Center" FontSize="30" Margin="0, 40, 0, 0"/>
+                                                <TextBlock Grid.Row="1" Text="share awesome hardware" Foreground="White" TextAlignment="Center" FontSize="15.5" Margin="0, 0, 0, 0"/>
+                                                <Rectangle Grid.Row="2" Fill="#20CC33" Margin="150, 0, 150 ,2"/>
+                                                <Rectangle Grid.Row="3" Fill="#20CC33" Margin="150, 0, 150 ,2"/>
+                                                <TextBlock Grid.Row="4" Text="ESP32-S3-Relay-6CH" Foreground="White" TextAlignment="Center" FontSize="35" FontStyle="Italic" FontWeight="SemiBold" Margin="0, 0, 0, 0"/>
+                                        </Grid>
+                                        <Grid Grid.Row="2">
+                                                <Grid.ColumnDefinitions>
+                                                        <ColumnDefinition Width="*"/>
+                                                        <ColumnDefinition Width="*"/>
+                                                        <ColumnDefinition Width="*"/>
+                                                        <ColumnDefinition Width="*"/>
+                                                        <ColumnDefinition Width="*"/>
+                                                        <ColumnDefinition Width="*"/>
+                                                </Grid.ColumnDefinitions>
+                                                
+                                                <Grid Grid.Column="0" Background="{Binding Ch6Active, Converter={StaticResource BooleanToBrushConverter}}">
+                                                        <Grid.ColumnDefinitions>
+                                                                <ColumnDefinition Width="*"/>
+                                                                <ColumnDefinition Width="*"/>
+                                                                <ColumnDefinition Width="*"/>
+                                                        </Grid.ColumnDefinitions>
+                                                        <Grid.RowDefinitions>
+                                                                <RowDefinition Height="40" />
+                                                                <RowDefinition Height="*" />
+                                                        </Grid.RowDefinitions>
+                                                        
+                                                        <TextBlock Grid.Row="0" Foreground="White"  Background="#444444" FontSize="20" Text="CH6" Grid.ColumnSpan="3" TextAlignment="Center"/>
+                                                        
+                                                        <Rectangle Grid.Row="1" Grid.Column="0"  Stroke="White" StrokeThickness="1.5"/>
+                                                        <Rectangle Grid.Row="1" Grid.Column="1"  Stroke="White" StrokeThickness="1.5"/>
+                                                        <Rectangle Grid.Row="1" Grid.Column="2"  Stroke="White" StrokeThickness="1.5"/>
+                                                        
+                                                        <Ellipse Grid.Row="1" Grid.Column="0" Stroke="White" Margin="10, 4, 10, 20" StrokeThickness="1.5"/>
+                                                        <Ellipse Grid.Row="1"  Grid.Column="1" Stroke="White" Margin="10, 4, 10, 20" StrokeThickness="1.5"/>
+                                                        <Ellipse Grid.Row="1" Grid.Column="2" Stroke="White" Margin="10, 4, 10, 20" StrokeThickness="1.5"/>
+                                                </Grid>
+                                                <Grid Grid.Column="1" Background="{Binding Ch5Active, Converter={StaticResource BooleanToBrushConverter}}">
+                                                        <Grid.ColumnDefinitions>
+                                                                <ColumnDefinition Width="*"/>
+                                                                <ColumnDefinition Width="*"/>
+                                                                <ColumnDefinition Width="*"/>
+                                                        </Grid.ColumnDefinitions>
+                                                        <Grid.RowDefinitions>
+                                                                <RowDefinition Height="40" />
+                                                                <RowDefinition Height="*" />
+                                                        </Grid.RowDefinitions>
+                                                        
+                                                        <TextBlock Grid.Row="0" Foreground="White"  Background="#444444" FontSize="20" Text="CH5" Grid.ColumnSpan="3" TextAlignment="Center"/>
+                                                        
+                                                        <Rectangle Grid.Row="1" Grid.Column="0"  Stroke="White" StrokeThickness="1.5"/>
+                                                        <Rectangle Grid.Row="1" Grid.Column="1"  Stroke="White" StrokeThickness="1.5"/>
+                                                        <Rectangle Grid.Row="1" Grid.Column="2"  Stroke="White" StrokeThickness="1.5"/>
+                                                        
+                                                        <Ellipse Grid.Row="1" Grid.Column="0" Stroke="White" Margin="10, 4, 10, 20" StrokeThickness="1.5"/>
+                                                        <Ellipse Grid.Row="1"  Grid.Column="1" Stroke="White" Margin="10, 4, 10, 20" StrokeThickness="1.5"/>
+                                                        <Ellipse Grid.Row="1" Grid.Column="2" Stroke="White" Margin="10, 4, 10, 20" StrokeThickness="1.5"/>
+                                                </Grid>
+                                                <Grid Grid.Column="2" Background="{Binding Ch4Active, Converter={StaticResource BooleanToBrushConverter}}">
+                                                        <Grid.ColumnDefinitions>
+                                                                <ColumnDefinition Width="*"/>
+                                                                <ColumnDefinition Width="*"/>
+                                                                <ColumnDefinition Width="*"/>
+                                                        </Grid.ColumnDefinitions>
+                                                        <Grid.RowDefinitions>
+                                                                <RowDefinition Height="40" />
+                                                                <RowDefinition Height="*" />
+                                                        </Grid.RowDefinitions>
+                                                        
+                                                        <TextBlock Grid.Row="0" Foreground="White"  Background="#444444" FontSize="20" Text="CH4" Grid.ColumnSpan="3" TextAlignment="Center"/>
+                                                        
+                                                        <Rectangle Grid.Row="1" Grid.Column="0"  Stroke="White" StrokeThickness="1.5"/>
+                                                        <Rectangle Grid.Row="1" Grid.Column="1"  Stroke="White" StrokeThickness="1.5"/>
+                                                        <Rectangle Grid.Row="1" Grid.Column="2"  Stroke="White" StrokeThickness="1.5"/>
+                                                        
+                                                        <Ellipse Grid.Row="1" Grid.Column="0" Stroke="White" Margin="10, 4, 10, 20" StrokeThickness="1.5"/>
+                                                        <Ellipse Grid.Row="1"  Grid.Column="1" Stroke="White" Margin="10, 4, 10, 20" StrokeThickness="1.5"/>
+                                                        <Ellipse Grid.Row="1" Grid.Column="2" Stroke="White" Margin="10, 4, 10, 20" StrokeThickness="1.5"/>
+                                                </Grid>
+                                               <Grid Grid.Column="3" Background="{Binding Ch3Active, Converter={StaticResource BooleanToBrushConverter}}">
+                                                        <Grid.ColumnDefinitions>
+                                                                <ColumnDefinition Width="*"/>
+                                                                <ColumnDefinition Width="*"/>
+                                                                <ColumnDefinition Width="*"/>
+                                                        </Grid.ColumnDefinitions>
+                                                        <Grid.RowDefinitions>
+                                                                <RowDefinition Height="40" />
+                                                                <RowDefinition Height="*" />
+                                                        </Grid.RowDefinitions>
+                                                        
+                                                        <TextBlock Grid.Row="0" Foreground="White"  Background="#444444" FontSize="20" Text="CH3" Grid.ColumnSpan="3" TextAlignment="Center"/>
+                                                        
+                                                        <Rectangle Grid.Row="1" Grid.Column="0"  Stroke="White" StrokeThickness="1.5"/>
+                                                        <Rectangle Grid.Row="1" Grid.Column="1"  Stroke="White" StrokeThickness="1.5"/>
+                                                        <Rectangle Grid.Row="1" Grid.Column="2"  Stroke="White" StrokeThickness="1.5"/>
+                                                        
+                                                        <Ellipse Grid.Row="1" Grid.Column="0" Stroke="White" Margin="10, 4, 10, 20" StrokeThickness="1.5"/>
+                                                        <Ellipse Grid.Row="1"  Grid.Column="1" Stroke="White" Margin="10, 4, 10, 20" StrokeThickness="1.5"/>
+                                                        <Ellipse Grid.Row="1" Grid.Column="2" Stroke="White" Margin="10, 4, 10, 20" StrokeThickness="1.5"/>
+                                                </Grid>
+                                                <Grid Grid.Column="4" Background="{Binding Ch2Active, Converter={StaticResource BooleanToBrushConverter}}">
+                                                        <Grid.ColumnDefinitions>
+                                                                <ColumnDefinition Width="*"/>
+                                                                <ColumnDefinition Width="*"/>
+                                                                <ColumnDefinition Width="*"/>
+                                                        </Grid.ColumnDefinitions>
+                                                        <Grid.RowDefinitions>
+                                                                <RowDefinition Height="40" />
+                                                                <RowDefinition Height="*" />
+                                                        </Grid.RowDefinitions>
+                                                        
+                                                        <TextBlock Grid.Row="0" Foreground="White"  Background="#444444" FontSize="20" Text="CH2" Grid.ColumnSpan="3" TextAlignment="Center"/>
+                                                        
+                                                        <Rectangle Grid.Row="1" Grid.Column="0"  Stroke="White" StrokeThickness="1.5"/>
+                                                        <Rectangle Grid.Row="1" Grid.Column="1"  Stroke="White" StrokeThickness="1.5"/>
+                                                        <Rectangle Grid.Row="1" Grid.Column="2"  Stroke="White" StrokeThickness="1.5"/>
+                                                        
+                                                        <Ellipse Grid.Row="1" Grid.Column="0" Stroke="White" Margin="10, 4, 10, 20" StrokeThickness="1.5"/>
+                                                        <Ellipse Grid.Row="1"  Grid.Column="1" Stroke="White" Margin="10, 4, 10, 20" StrokeThickness="1.5"/>
+                                                        <Ellipse Grid.Row="1" Grid.Column="2" Stroke="White" Margin="10, 4, 10, 20" StrokeThickness="1.5"/>
+                                                </Grid>
+                                                
+                                                <Grid Grid.Column="5" Background="{Binding Ch1Active, Converter={StaticResource BooleanToBrushConverter}}">
+                                                        <Grid.ColumnDefinitions>
+                                                                <ColumnDefinition Width="*"/>
+                                                                <ColumnDefinition Width="*"/>
+                                                                <ColumnDefinition Width="*"/>
+                                                        </Grid.ColumnDefinitions>
+                                                        <Grid.RowDefinitions>
+                                                                <RowDefinition Height="40" />
+                                                                <RowDefinition Height="*" />
+                                                        </Grid.RowDefinitions>
+                                                        
+                                                        <TextBlock Grid.Row="0" Foreground="White"  Background="#444444" FontSize="20" Text="CH1" Grid.ColumnSpan="3" TextAlignment="Center"/>
+                                                        
+                                                        <Rectangle Grid.Row="1" Grid.Column="0"  Stroke="White" StrokeThickness="1.5"/>
+                                                        <Rectangle Grid.Row="1" Grid.Column="1"  Stroke="White" StrokeThickness="1.5"/>
+                                                        <Rectangle Grid.Row="1" Grid.Column="2"  Stroke="White" StrokeThickness="1.5"/>
+                                                        
+                                                        <Ellipse Grid.Row="1" Grid.Column="0" Stroke="White" Margin="10, 4, 10, 20" StrokeThickness="1.5"/>
+                                                        <Ellipse Grid.Row="1"  Grid.Column="1" Stroke="White" Margin="10, 4, 10, 20" StrokeThickness="1.5"/>
+                                                        <Ellipse Grid.Row="1" Grid.Column="2" Stroke="White" Margin="10, 4, 10, 20" StrokeThickness="1.5"/>
+                                                </Grid>
+                                        </Grid>
+                                </Grid>
+                                <Rectangle DockPanel.Dock="Right" Width="30" Height="280" Fill="#3A3A3A"/>
+                        </DockPanel>
+                </DockPanel>
+                <Ellipse Width="300" Height="300" Visibility="{Binding LEDElementVisible}">
+                        <Ellipse.RenderTransform>
+                                <TranslateTransform X="25" Y="-230" />
+                        </Ellipse.RenderTransform>
+                        <Ellipse.Fill>
+                                <RadialGradientBrush 
+                                        GradientOrigin="0.5,0.5" 
+                                        Center="0.5,0.5" RadiusX="0.5" RadiusY="0.5">
+                                        <RadialGradientBrush.GradientStops>
+                                                <GradientStop Color="#5555FF" Offset="0" />
+                                                <GradientStop Offset="1" />
+                                        </RadialGradientBrush.GradientStops>
+                                </RadialGradientBrush>
+                        </Ellipse.Fill>
+                </Ellipse>
+        </Grid>
+</Window>

+ 14 - 0
PRSDigitalKeyUnit/MainWindow.xaml.cs

@@ -0,0 +1,14 @@
+using System.Windows;
+
+namespace PRSDigitalKeyUnit;
+
+/// <summary>
+/// Interaction logic for MainWindow.xaml
+/// </summary>
+public partial class MainWindow : Window
+{
+    public MainWindow()
+    {
+        InitializeComponent();
+    }
+}

+ 221 - 0
PRSDigitalKeyUnit/MainWindowViewModel.cs

@@ -0,0 +1,221 @@
+using System;
+using System.ComponentModel;
+using System.Runtime.CompilerServices;
+using System.Windows.Input;
+using DigitalKeyUnitCommands;
+using InABox.Rpc;
+using Microsoft.Xaml.Behaviors.Core;
+using InABox.Core;
+using System.Timers;
+using System.Windows.Media;
+using InABox.WPF;
+
+namespace PRSDigitalKeyUnit;
+
+
+public class MainWindowViewModel : INotifyPropertyChanged
+{
+    private bool _isConnected;
+
+    public bool Ch1Active { get; set; }
+    public bool Ch2Active { get; set; }
+    public bool Ch3Active { get; set; }
+    public bool Ch4Active { get; set; }
+    public bool Ch5Active { get; set; }
+    public bool Ch6Active { get; set; }
+
+    
+    public System.Timers.Timer Ch1Timer { get; set; }
+    public System.Timers.Timer Ch2Timer { get; set; }
+    public System.Timers.Timer Ch3Timer { get; set; }
+    public System.Timers.Timer Ch4Timer { get; set; }
+    public System.Timers.Timer Ch5Timer { get; set; }
+    public System.Timers.Timer Ch6Timer { get; set; }
+
+    public bool IsConnected
+    {
+        get => _isConnected;
+        set
+        {
+            _isConnected = value;
+            ToggleLEDElement();
+            OnPropertyChanged(nameof(LEDElementVisible));
+        }
+    }
+
+    public string LEDElementVisible { get; set; } = "Hidden";
+
+    
+    public string Name { get; set; }
+    public string Warning { get; set; }
+    public string Contact { get; set; }
+    public Guid ID { get; set; }
+    
+    private RpcServerPipeTransport Transport;
+
+    public MainWindowViewModel()
+    {
+        Transport = new RpcServerPipeTransport("uhhhh");
+        Transport.AddHandler<MainWindowViewModel, ActivateCommand, ActivateParameters, ActivateResult>(new ActivateHandler(this)); 
+        Transport.AddHandler<MainWindowViewModel, ConfigureCommand, ConfigureParameters, ConfigureResult>(new ConfigureHandler(this));
+        Transport.OnOpen += TransportOnOnOpen;
+        Transport.OnClose += TransportOnOnClose;
+        Transport.Start();
+    }
+
+    private void TransportOnOnClose(IRpcTransport transport, RpcTransportCloseArgs e)
+    {
+        IsConnected = false;
+    }
+
+    private void TransportOnOnOpen(IRpcTransport transport, RpcTransportOpenArgs e)
+    {
+        IsConnected = true;
+    }
+
+    public void ToggleLEDElement()
+    {
+        if (IsConnected) LEDElementVisible = "Visible";
+        else LEDElementVisible = "Hidden";
+    }
+    
+    public void Ch1TimerRanOut(Object source, ElapsedEventArgs e) { Ch1Active = false; }
+    public void Ch2TimerRanOut(Object source, ElapsedEventArgs e) { Ch2Active = false; }
+    public void Ch3TimerRanOut(Object source, ElapsedEventArgs e) { Ch3Active = false; }
+    public void Ch4TimerRanOut(Object source, ElapsedEventArgs e) { Ch4Active = false; }
+    public void Ch5TimerRanOut(Object source, ElapsedEventArgs e) { Ch5Active = false; }
+    public void Ch6TimerRanOut(Object source, ElapsedEventArgs e) { Ch6Active = false; }
+
+    
+    public event PropertyChangedEventHandler? PropertyChanged;
+
+    protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null)
+    {
+        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+    }
+
+    protected bool SetField<T>(ref T field, T value, [CallerMemberName] string? propertyName = null)
+    {
+        if (EqualityComparer<T>.Default.Equals(field, value)) return false;
+        field = value;
+        OnPropertyChanged(propertyName);
+        return true;
+    }
+}
+
+public class ActivateHandler : RpcCommandHandler<MainWindowViewModel, ActivateCommand, ActivateParameters, ActivateResult>
+{
+    public ActivateHandler(MainWindowViewModel sender) : base(sender)
+    {
+    }
+    
+    protected override ActivateResult Execute(IRpcSession session, ActivateParameters parameters, Logger logger)
+    {
+        long temp = parameters.Relay1;
+        if (temp < 0) Sender.Ch1Active = false;
+        else if (temp == 0)
+        {
+            Sender.Ch1Active = true;
+            Sender.Ch1Timer.Stop();
+        }
+        else
+        {
+            Sender.Ch1Timer = new System.Timers.Timer(temp);
+            Sender.Ch1Timer.Elapsed += Sender.Ch1TimerRanOut;
+        }
+        
+        temp = parameters.Relay2;
+        if (temp < 0) Sender.Ch2Active = false;
+        else if (temp == 0)
+        {
+            Sender.Ch2Active = true;
+            Sender.Ch2Timer.Stop();
+        }
+        else
+        {
+            Sender.Ch2Timer = new System.Timers.Timer(temp);
+            Sender.Ch2Timer.Elapsed += Sender.Ch2TimerRanOut;
+        }
+        
+        temp = parameters.Relay3;
+        if (temp < 0) Sender.Ch3Active = false;
+        else if (temp == 0)
+        {
+            Sender.Ch3Active = true;
+            Sender.Ch3Timer.Stop();
+        }
+        else
+        {
+            Sender.Ch3Timer = new System.Timers.Timer(temp);
+            Sender.Ch3Timer.Elapsed += Sender.Ch3TimerRanOut;
+        }
+        
+        temp = parameters.Relay4;
+        if (temp < 0) Sender.Ch4Active = false;
+        else if (temp == 0)
+        {
+            Sender.Ch4Active = true;
+            Sender.Ch4Timer.Stop();
+        }
+        else
+        {
+            Sender.Ch4Timer = new System.Timers.Timer(temp);
+            Sender.Ch4Timer.Elapsed += Sender.Ch4TimerRanOut;
+        }
+        
+        temp = parameters.Relay5;
+        if (temp < 0) Sender.Ch5Active = false;
+        else if (temp == 0)
+        {
+            Sender.Ch5Active = true;
+            Sender.Ch5Timer.Stop();
+        }
+        else
+        {
+            Sender.Ch5Timer = new System.Timers.Timer(temp);
+            Sender.Ch5Timer.Elapsed += Sender.Ch5TimerRanOut;
+        }
+        
+        temp = parameters.Relay6;
+        if (temp < 0) Sender.Ch6Active = false;
+        else if (temp == 0)
+        {
+            Sender.Ch6Active = true;
+            Sender.Ch6Timer.Stop();
+        }
+        else
+        {
+            Sender.Ch6Timer = new System.Timers.Timer(temp);
+            Sender.Ch6Timer.Elapsed += Sender.Ch6TimerRanOut;
+        }
+
+
+        var result = new ActivateResult();
+        result.Relay1 = parameters.Relay1;
+        result.Relay2 = parameters.Relay2;
+        result.Relay3 = parameters.Relay3;
+        result.Relay4 = parameters.Relay4;
+        result.Relay5 = parameters.Relay5;
+        result.Relay6 = parameters.Relay6;
+        return result;
+    }
+}
+
+public class ConfigureHandler : RpcCommandHandler<MainWindowViewModel, ConfigureCommand, ConfigureParameters, ConfigureResult>
+{
+    public ConfigureHandler(MainWindowViewModel sender) : base(sender)
+    {
+    }
+
+    protected override ConfigureResult Execute(IRpcSession session, ConfigureParameters parameters, Logger logger)
+    {
+        Sender.Name = parameters.Name;
+        Sender.Contact = parameters.Contact;
+        Sender.Warning = parameters.Warning;
+        Sender.ID = parameters.ID;
+        
+        var result = new ConfigureResult();
+        result.Name = parameters.Name;
+        return result;
+    }
+}

+ 21 - 0
PRSDigitalKeyUnit/PRSDigitalKeyUnit.csproj

@@ -0,0 +1,21 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+    <PropertyGroup>
+        <OutputType>WinExe</OutputType>
+        <TargetFramework>net9.0-windows</TargetFramework>
+        <Nullable>enable</Nullable>
+        <ImplicitUsings>enable</ImplicitUsings>
+        <UseWPF>true</UseWPF>
+    </PropertyGroup>
+
+    <ItemGroup>
+      <PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.135" />
+    </ItemGroup>
+
+    <ItemGroup>
+      <ProjectReference Include="..\..\DigitalKeyUnitCommands\DigitalKeyUnitCommands.csproj" />
+      <ProjectReference Include="..\..\inabox\InABox.Server\InABox.Server.csproj" />
+      <ProjectReference Include="..\..\inabox\inabox.wpf\InABox.Wpf.csproj" />
+    </ItemGroup>
+
+</Project>

+ 35 - 5
testing/DataLogistics/Command/Colour.cs

@@ -1,21 +1,51 @@
-namespace Command;
+using InABox.Core;
+using InABox.Rpc;
 
-public class ColourCommand
+
+namespace Command;
+
+public class ColourCommand : IRpcCommand<ColourParameters, ColourResult>
 {
     
 }
 
-public class ColourParameters
+public class ColourParameters : IRpcCommandParameters
 {
     public string Hex {get; set;}
+    
+    public void SerializeBinary(CoreBinaryWriter writer)
+    {
+        writer.WriteBinaryValue(Hex);
+    }
+
+    public void DeserializeBinary(CoreBinaryReader reader)
+    {
+        Hex = reader.ReadBinaryValue<string>();
+    }
+
+    public string? FullDescription() => "SwitchParameters";
+
+    public string? ShortDescription() => "SwitchParameters";
 }
 
-public class ColourResult
+public class ColourResult : IRpcCommandResult
 {
     public string HexValue { get; set; }
 
-    ColourResult()
+    public ColourResult()
     {
         HexValue = "#CCEE00";
     }
+
+    public void SerializeBinary(CoreBinaryWriter writer)
+    {
+        writer.WriteBinaryValue(HexValue);
+    }
+
+    public void DeserializeBinary(CoreBinaryReader reader)
+    {
+        HexValue = reader.ReadBinaryValue<string>();
+    }
+
+    public string? FullDescription() => "SwitchResult";
 }

+ 2 - 2
testing/DataLogistics/Light Bulb/MainWindow.xaml

@@ -8,7 +8,7 @@
         Title="MainWindow" Height="450" Width="800">
     <Window.DataContext><local:MainWindowViewModel x:Name="ViewModel"/></Window.DataContext>
     <Grid>
-        
-        <TextBox Background="{Binding LightHex}" Visibility="Visible"/>
+        <TextBox Background="Black"/>
+        <TextBox Background="{Binding LightHex}" Visibility="{Binding LightVisibility}"/>
     </Grid>
 </Window>

+ 54 - 25
testing/DataLogistics/Light Bulb/MainWindowViewModel.cs

@@ -1,29 +1,48 @@
 
+using System.ComponentModel;
+using System.Runtime.CompilerServices;
 using Command;
 using InABox.Core;
 using InABox.Rpc;
 
 namespace Receiver;
 
-public class MainWindowViewModel
+public class MainWindowViewModel : INotifyPropertyChanged
 {
-    public bool LightOn { get; set; }
-    
+    private bool _lightOn;
+    private string _lightHex;
+
+    public bool LightOn
+    {
+        get => _lightOn;
+        set
+        {
+            _lightOn = value;
+            if (LightOn == false) LightVisibility = "Hidden";
+            else LightVisibility = "Visible";
+            OnPropertyChanged(nameof(LightVisibility));
+        }
+    }
+
     public string LightVisibility { get; set; }
-    
-    public string LightHex { get; set; }
-    
+
+    public string LightHex
+    {
+        get => _lightHex;
+        set 
+        {
+            _lightHex = value;
+            OnPropertyChanged(nameof(LightHex));
+        }
+    }
+
     RpcServerPipeTransport Transport { get; set; }
 
     public MainWindowViewModel()
     {
         Transport = new RpcServerPipeTransport("SwitchTransport");
         Transport.AddHandler<MainWindowViewModel, SwitchCommand, SwitchParameters, SwitchResult>(new SwitchHandler(this));
-        Transport.OnOpen += TransportOpen;
-        Transport.OnClose += TransportClose;
-        Transport.OnException += TransportException;
-        Transport.BeforeMessage += TransportBeforeMessage;
-        Transport.AfterMessage += TransportAfterMessage;
+        Transport.AddHandler<MainWindowViewModel, ColourCommand, ColourParameters, ColourResult>(new ColourHandler(this));
         Transport.Start();
         
         LightOn = true;
@@ -34,25 +53,19 @@ public class MainWindowViewModel
         else LightVisibility = "Visible";
     }
 
-    private void TransportAfterMessage(IRpcTransport transport, RpcTransportMessageArgs e)
-    {
-    }
+    public event PropertyChangedEventHandler? PropertyChanged;
 
-    private void TransportBeforeMessage(IRpcTransport transport, RpcTransportMessageArgs e)
+    protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null)
     {
+        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
     }
 
-    private void TransportException(IRpcTransport transport, RpcTransportExceptionArgs e)
+    protected bool SetField<T>(ref T field, T value, [CallerMemberName] string? propertyName = null)
     {
-    }
-
-    private void TransportClose(IRpcTransport transport, RpcTransportCloseArgs e)
-    {
-    }
-
-    private void TransportOpen(IRpcTransport transport, RpcTransportOpenArgs e)
-    {
-        
+        if (EqualityComparer<T>.Default.Equals(field, value)) return false;
+        field = value;
+        OnPropertyChanged(propertyName);
+        return true;
     }
 }
 
@@ -70,4 +83,20 @@ public class SwitchHandler : RpcCommandHandler<MainWindowViewModel, SwitchComman
         result.LightOn = parameters.Active;
         return result;
     }
+}
+
+public class ColourHandler : RpcCommandHandler<MainWindowViewModel, ColourCommand, ColourParameters, ColourResult>
+{
+    public ColourHandler(MainWindowViewModel sender) : base(sender)
+    {
+    }
+
+    protected override ColourResult Execute(IRpcSession session, ColourParameters parameters, Logger logger)
+    {
+        Sender.LightHex = parameters.Hex;
+
+        var result = new ColourResult();
+        result.HexValue = parameters.Hex;
+        return result;
+    }
 }

+ 11 - 24
testing/DataLogistics/LightSwitch/MainWindowViewModel.cs

@@ -71,6 +71,9 @@ public class MainWindowViewModel : INotifyPropertyChanged
 
     public MainWindowViewModel()
     {
+        Transport = new RpcClientPipeTransport("SwitchTransport");
+        Transport.Connect();
+        
         OnOffCommand = new ActionCommand(OnOffSwitch);
         
         DimmerValue = 100;
@@ -80,29 +83,6 @@ public class MainWindowViewModel : INotifyPropertyChanged
         BlueValue = 180;
         
         HexValue = ComputeHex(DimmerValue, RedValue, GreenValue, BlueValue);
-        
-        Transport = new RpcClientPipeTransport("SwitchTransport");
-        Transport.OnOpen += TransportOpen;
-        Transport.OnClose += TransportClose;
-        Transport.OnException += TransportException;
-        Transport.OnMessage += TransportMessage;
-        Transport.Connect();
-    }
-
-    private void TransportMessage(IRpcTransport transport, RpcTransportMessageArgs e)
-    {
-    }
-
-    private void TransportException(IRpcTransport transport, RpcTransportExceptionArgs e)
-    {
-    }
-
-    private void TransportClose(IRpcTransport transport, RpcTransportCloseArgs e)
-    {
-    }
-
-    private void TransportOpen(IRpcTransport transport, RpcTransportOpenArgs e)
-    {
     }
 
     public void OnOffSwitch()
@@ -134,7 +114,14 @@ public class MainWindowViewModel : INotifyPropertyChanged
         if (GreenHexFinal.Length == 1) GreenHexFinal = "0" + GreenHexFinal;
         if (BlueHexFinal.Length == 1) BlueHexFinal = "0" + BlueHexFinal;
         
-        return "#" +  RedHexFinal + GreenHexFinal + BlueHexFinal;
+        string FinalHex = "#" + RedHexFinal + GreenHexFinal + BlueHexFinal;
+        
+        var p = new ColourParameters();
+        p.Hex = FinalHex;
+        var result = Transport.Send<ColourCommand, ColourParameters, ColourResult>(p);
+        FinalHex = result.HexValue;
+
+        return FinalHex;
     }
 
     public event PropertyChangedEventHandler? PropertyChanged;