瀏覽代碼

loadport详情界面优化

git-svn-id: http://10.4.3.168:50001/svn/Furnace@67 dbcde07d-dcf5-c148-8a84-ac3097b7778e
Jiangjinyuan 1 月之前
父節點
當前提交
3bb1398807

+ 1 - 0
FrameworkLocal/Common/Common.csproj

@@ -593,6 +593,7 @@
   </ItemGroup>
   <ItemGroup>
     <Content Include="Config\EventDefine.Core.xml" />
+    <Resource Include="Resources\LoadPort.png" />
     <Content Include="Resources\Logos\MyLogoNormal.ico" />
     <Content Include="Resources\Logos\MyLogoPurple.ico" />
     <Resource Include="Resources\Valve\valveOpenVerticalJet.png" />

二進制
FrameworkLocal/Common/Resources/LoadPort.png


+ 6 - 0
FrameworkLocal/UIClient/Converter/CheckPortStateConverter.cs

@@ -1,5 +1,6 @@
 using Aitex.Core.RT.Device.Unit;
 using DocumentFormat.OpenXml.Drawing.Diagrams;
+using SciChart.Core.Extensions;
 using System;
 using System.Collections.Generic;
 using System.Globalization;
@@ -17,6 +18,11 @@ namespace MECF.Framework.UI.Client.Ctrlib.Converter
 
         public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
         {
+            if (string.IsNullOrEmpty(value.ToString()))
+            {
+                recod = true;
+                return true;
+            }
             if (value.ToString() == LPTransferState.IN_SERVICE.ToString())
             {
                 recod = true;

+ 48 - 0
FrameworkLocal/UIClient/Themes/OceanBlue/Button.xaml

@@ -484,6 +484,54 @@
             </Setter.Value>
         </Setter>
     </Style>
+    <Style x:Key="BaseButton" TargetType="{x:Type Button}">
+        <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>
+        <Setter Property="Background" Value="{StaticResource Button_BG}"/>
+        <Setter Property="BorderBrush" Value="{StaticResource Button_BD}"/>
+        <Setter Property="BorderThickness" Value="1,1,0,0"/>
+        <Setter Property="FontFamily" Value="Arial"/>
+        <Setter Property="FontSize" Value="14"/>
+        <Setter Property="Stylus.IsPressAndHoldEnabled" Value="False"/>
+        <Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
+        <Setter Property="Stylus.IsTouchFeedbackEnabled" Value="False"/>
+        <Setter Property="Foreground" Value="{DynamicResource FG_Black}"/>
+        <Setter Property="HorizontalContentAlignment" Value="Center"/>
+        <Setter Property="VerticalContentAlignment" Value="Center"/>
+        <Setter Property="Padding" Value="6,3"/>
+        <Setter Property="MinWidth" Value="20"/>
+        <Setter Property="MinHeight" Value="20"/>
+        <Setter Property="SnapsToDevicePixels" Value="True"/>
+        <Setter Property="Border.CornerRadius" Value="4"/>
+        <Setter Property="Template">
+            <Setter.Value>
+                <ControlTemplate TargetType="{x:Type Button}">
+                    <Border x:Name="BG" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" CornerRadius="{TemplateBinding Border.CornerRadius}" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" Cursor="Hand">
+                        <Border x:Name="Inner_BD" BorderBrush="{StaticResource Button_BD_Shadow}" BorderThickness="0,0,1,1" CornerRadius="3" Padding="5,1">
+                            <ContentPresenter x:Name="contentpresenter" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Cursor="Hand">
+                            </ContentPresenter>
+                        </Border>
+                    </Border>
+                    <ControlTemplate.Triggers>
+                        <!--<Trigger Property="IsMouseOver" Value="True">
+                         <Setter TargetName="BG" Property="Background" Value="red"/>
+                     </Trigger>-->
+
+                        <Trigger Property="IsPressed" Value="True">
+                            <Setter TargetName="BG" Property="Background" Value="{StaticResource Button_BG_Press}"/>
+                            <Setter TargetName="BG" Property="Margin" Value="1"/>
+                            <Setter Property="FontSize" Value="13"/>
+                        </Trigger>
+                        <Trigger Property="IsEnabled" Value="False">
+                            <Setter TargetName="BG" Property="Background" Value="{StaticResource Button_BG_Unable}"/>
+                            <Setter TargetName="BG" Property="BorderBrush" Value="{StaticResource Button_BD_Unable}"/>
+                            <Setter TargetName="Inner_BD" Property="BorderBrush" Value="{StaticResource Button_BD_Shadow_Unable}"/>
+                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
+                        </Trigger>
+                    </ControlTemplate.Triggers>
+                </ControlTemplate>
+            </Setter.Value>
+        </Setter>
+    </Style>
 
     <Style x:Key="Color_Button" TargetType="{x:Type Button}">
         <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>

+ 9 - 1
FrameworkLocal/UIClient/Themes/OceanBlue/Label.xaml

@@ -8,7 +8,15 @@
     <SolidColorBrush x:Key="Label_BG" Color="Transparent"/>
     <SolidColorBrush x:Key="TitleLabel_BD" Color="White"/>
     <SolidColorBrush x:Key="TitleLabel_GreenTitle_BD" Color="White"/>
-
+    <Style x:Key="LableToTextBox" TargetType="{x:Type Label}">
+        <Setter Property="BorderBrush" Value="Black"/>
+        <Setter Property="BorderThickness" Value="1"/>
+        <Setter Property="Padding" Value="5"/>
+        <Setter Property="Background" Value="White"/>
+        <Setter Property="VerticalContentAlignment" Value="Center"/>
+        <Setter Property="HorizontalContentAlignment" Value="Center"/>
+    
+    </Style>
     <Style TargetType="{x:Type Label}">
         <Setter Property="SnapsToDevicePixels" Value="True"/>
         <Setter Property="FontFamily" Value="Segoe" />

+ 2 - 0
Furnace/FurnaceRT/Devices/IoLP.cs

@@ -121,6 +121,8 @@ namespace FurnaceRT.Devices
             _isSimulatorMode = SC.GetValue<bool>("System.IsSimulatorMode");
 
             DATA.Subscribe($"{Module}.{Name}.UIFoupSensor", () => GetUIFoupSensor(), SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Name}.DeviceStatus", () => Status.ToString());
+     
 
             var foupSensorID = Name == "LP1" ? "17" : "18";
             if (SC.GetStringValue("LoadPort.LoadPortPosition") == "Upper")

+ 8 - 0
Furnace/FurnaceUI/FurnaceUI.csproj

@@ -731,6 +731,10 @@
       <DependentUpon>StockerSensorView.xaml</DependentUpon>
     </Compile>
     <Compile Include="Views\Maintenances\StockerSensorViewModel.cs" />
+    <Compile Include="Views\Operations\TransferMain\LoadPortInfoView.xaml.cs">
+      <DependentUpon>LoadPortInfoView.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Views\Operations\TransferMain\LoadPortInfoViewModel.cs" />
     <Compile Include="Views\Operations\TransferMain\WaferRobotView.xaml.cs">
       <DependentUpon>WaferRobotView.xaml</DependentUpon>
     </Compile>
@@ -1662,6 +1666,10 @@
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
+    <Page Include="Views\Operations\TransferMain\LoadPortInfoView.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="Views\Operations\TransferMain\WaferRobotView.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>

+ 414 - 5
Furnace/FurnaceUI/Views/Maintenances/LPSensorView.xaml

@@ -9,7 +9,7 @@
              xmlns:deviceControl="clr-namespace:Aitex.Core.UI.DeviceControl;assembly=MECF.Framework.UI.Core"
              xmlns:local="clr-namespace:FurnaceUI.Views.Maintenances"
              mc:Ignorable="d" 
-             d:DesignHeight="600" d:DesignWidth="640" x:Name="self">
+             d:DesignHeight="600" d:DesignWidth="1024" x:Name="self">
     <UserControl.Resources>
         <DataTemplate  x:Key="IndexTemplate">
             <Label Content="{Binding Index}"  Width="30" Height="36" VerticalAlignment="Center" HorizontalAlignment="Left"></Label>
@@ -23,10 +23,419 @@
             <deviceControl:AITSensor LightOnValue="{Binding Value}" GreenColor="True"  Width="100" Height="36" VerticalAlignment="Center" HorizontalAlignment="Center">
             </deviceControl:AITSensor>
         </DataTemplate>
-
+        
+       
     </UserControl.Resources>
-    <Grid Margin="10,0,10,0">
-        <Grid.RowDefinitions>
+    <Grid  >
+        <Grid.ColumnDefinitions>
+            <ColumnDefinition></ColumnDefinition>
+            <ColumnDefinition ></ColumnDefinition>
+        </Grid.ColumnDefinitions>
+        <Border Visibility="{Binding LP1BorderVisibility,UpdateSourceTrigger=PropertyChanged,Converter={StaticResource bool2VisibilityConverter}}" Padding="4">
+            <Grid>
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="auto"></RowDefinition>
+                    <RowDefinition ></RowDefinition>
+                    <RowDefinition></RowDefinition>
+                    <RowDefinition></RowDefinition>
+                </Grid.RowDefinitions>
+                <TextBlock Text="LoadPort1" Height="30"  FontSize="18" Style="{StaticResource TextBlock_GridTitle}"></TextBlock>
+                <Border Grid.Row="1">
+                    <Image  Source="pack://application:,,,/MECF.Framework.Common;component/Resources/LoadPort.png" />
+                </Border>
+                <Border  Height="110" Grid.Row="2"  Background="#eaeaea">
+                    <StackPanel>
+                        <TextBlock Text="Carrier" Style="{StaticResource TextBlock_Title}" FontSize="20" ></TextBlock>
+                        <Grid Margin="20,10,0,0">
+                            <Grid.ColumnDefinitions>
+                                <ColumnDefinition Width="76"></ColumnDefinition>
+                                <ColumnDefinition Width="150"></ColumnDefinition>
+                                <ColumnDefinition  Width="auto"></ColumnDefinition>
+                            </Grid.ColumnDefinitions>
+                            <Grid.RowDefinitions>
+                                <RowDefinition></RowDefinition>
+                                <RowDefinition></RowDefinition>
+                            </Grid.RowDefinitions>
+                            <TextBlock Grid.Row="0" Grid.Column="0" Text="Type"  FontSize="16"></TextBlock>
+                            <Label Style="{StaticResource LableToTextBox}"  Content="{Binding LP1CarrierInfo.CarrierType}" Grid.Row="1" Grid.Column="0"  Height="40">
+                              
+                            </Label>
+                            <TextBlock Margin="10,0,10,0"  Grid.Row="0" Grid.Column="1" Text="No."  FontSize="16"></TextBlock>
+                            <Label  Style="{StaticResource LableToTextBox}"   Content="{Binding LP1CarrierInfo.InternalModuleName}"  Margin="10,0,10,0"  Grid.Row="1" Grid.Column="1"  Height="40"></Label>
+                            <TextBlock  Grid.Row="0" Grid.Column="2" Text="ID"  FontSize="16"></TextBlock>
+                            <Border BorderBrush="Black" BorderThickness="1"  Grid.Row="2" Grid.Column="2"  >
+                                <StackPanel  Orientation="Horizontal">
+                                    <Label BorderThickness="0"  Style="{StaticResource LableToTextBox}" Width="130" Content="{Binding  LP1CarrierInfo.CarrierId,UpdateSourceTrigger=PropertyChanged}"   Height="40"></Label>
+                                    <Button  Content="Read ID" Width="85" Height="40" FontSize="13" IsEnabled="{Binding IsEnableManualOperation}" >
+                                        <i:Interaction.Triggers>
+                                            <i:EventTrigger EventName="Click">
+                                                <cal:ActionMessage MethodName="ReadCarrierId">
+                                                    <cal:Parameter Value="LP1"/>
+                                                </cal:ActionMessage>
+                                            </i:EventTrigger>
+                                        </i:Interaction.Triggers>
+                                    </Button>
+                                </StackPanel>
+
+                            </Border>
+                        </Grid>
+                    </StackPanel>
+                </Border>
+                <Border  Height="200" Grid.Row="3" Margin="0,2,0,0"  Background="#eaeaea">
+                    <StackPanel>
+                        <TextBlock Text="LoadPort" Style="{StaticResource TextBlock_Title}" FontSize="20" ></TextBlock>
+                        <Grid Margin="20,10,0,0">
+                            <Grid.ColumnDefinitions>
+                                <ColumnDefinition></ColumnDefinition>
+                                <ColumnDefinition ></ColumnDefinition>
+                            </Grid.ColumnDefinitions>
+                            <Grid.RowDefinitions>
+                                <RowDefinition></RowDefinition>
+                                <RowDefinition></RowDefinition>
+                                <RowDefinition></RowDefinition>
+                                <RowDefinition></RowDefinition>
+                            </Grid.RowDefinitions>
+                            <TextBlock Grid.Row="0" Grid.Column="0" Text="Status"  FontSize="16"></TextBlock>
+                            <Border BorderBrush="Black" BorderThickness="1"  Grid.Row="1" Grid.Column="0"> 
+                                <StackPanel  Orientation="Horizontal">
+                                    <Label BorderThickness="0"  Style="{StaticResource LableToTextBox}" Width="130" Content="{Binding LP1State,UpdateSourceTrigger=PropertyChanged}"   Height="40"></Label>
+                                    <Button   Content="Init" Width="85" Height="40" FontSize="13" IsEnabled="{Binding IsEnableManualOperation}" >
+                                        <i:Interaction.Triggers>
+                                            <i:EventTrigger EventName="Click">
+                                                <cal:ActionMessage MethodName="Home">
+                                                    <cal:Parameter Value="LP1"/>
+                                                </cal:ActionMessage>
+                                            </i:EventTrigger>
+                                        </i:Interaction.Triggers>
+                                    </Button>
+                                </StackPanel>
+
+                            </Border>
+                       
+                            <TextBlock Margin="10,0,10,0"  Grid.Row="0" Grid.Column="1" Text="Clamp"  FontSize="16"></TextBlock>
+
+                            <Border BorderBrush="Black" BorderThickness="1" Margin="10,0,10,0"  Grid.Row="1" Grid.Column="1" >
+                                <StackPanel  Orientation="Horizontal">
+                                    <Label BorderThickness="0"  Style="{StaticResource LableToTextBox}" Width="130" Content="{Binding LP1DeviceStatus,UpdateSourceTrigger=PropertyChanged}"  Height="40"></Label>
+                                    <Button Content="Clamp"  Width="85" Height="40"  Margin="0" FontSize="13" IsEnabled="{Binding IsEnableManualOperation}" >
+                                        <i:Interaction.Triggers>
+                                            <i:EventTrigger EventName="Click">
+                                                <cal:ActionMessage MethodName="SetClamp">
+                                                    <cal:Parameter Value="LP1"/>
+                                                </cal:ActionMessage>
+                                            </i:EventTrigger>
+                                        </i:Interaction.Triggers>
+                                        <Button.Style>
+                                            <Style  BasedOn="{StaticResource BaseButton}"  TargetType="{x:Type Button}">
+                                              
+                                                <Setter Property="Visibility" Value="Visible"/>
+                                                <Style.Triggers>
+                                                    <DataTrigger Binding="{Binding LP1DeviceStatus, UpdateSourceTrigger=PropertyChanged}" Value="Clamp">
+                                                        <Setter Property="Visibility" Value="Collapsed"/>
+                                                    </DataTrigger>
+                                                    <DataTrigger Binding="{Binding LP1DeviceStatus, UpdateSourceTrigger=PropertyChanged}" Value="Release">
+                                                        <Setter Property="Visibility" Value="Visible"/>
+                                                    </DataTrigger>
+                                                </Style.Triggers>
+                                            </Style>
+                                        </Button.Style>
+                                    </Button>
+                                    <Button Content="Release"  Width="85" Height="40"  Margin="0" FontSize="13" IsEnabled="{Binding IsEnableManualOperation}" >
+                                        <i:Interaction.Triggers>
+                                            <i:EventTrigger EventName="Click">
+                                                <cal:ActionMessage MethodName="SetRelease">
+                                                    <cal:Parameter Value="LP1"/>
+                                                </cal:ActionMessage>
+                                            </i:EventTrigger>
+                                        </i:Interaction.Triggers>
+                                        <Button.Style>
+                                            <Style BasedOn="{StaticResource BaseButton}" TargetType="{x:Type Button}">
+                                               
+                                                <Setter Property="Visibility" Value="Collapsed"/>
+                                                <Style.Triggers>
+                                                    <DataTrigger Binding="{Binding LP1DeviceStatus, UpdateSourceTrigger=PropertyChanged}" Value="Clamp">
+                                                        <Setter Property="Visibility" Value="Visible"/>
+                                                    </DataTrigger>
+                                                    <DataTrigger Binding="{Binding LP1DeviceStatus, UpdateSourceTrigger=PropertyChanged}" Value="Release">
+                                                        <Setter Property="Visibility" Value="Collapsed"/>
+                                                    </DataTrigger>
+                                                </Style.Triggers>
+                                            </Style>
+                                        </Button.Style>
+                                    </Button>
+                                </StackPanel>
+
+                            </Border>
+
+                           
+                            <TextBlock Grid.Row="2" Grid.Column="0" Text="AccessMode"  FontSize="16"></TextBlock>
+
+                            <Border BorderBrush="Black" BorderThickness="1" Grid.Row="3" Grid.Column="0" >
+                                <StackPanel  Orientation="Horizontal">
+                                    <Label BorderThickness="0"  Style="{StaticResource LableToTextBox}" Width="130" Content="{Binding LP1AccessMode,UpdateSourceTrigger=PropertyChanged}"  Height="40"></Label>
+                                    <Button Content="Manual"  Width="85" Height="40"  Margin="0" FontSize="13" IsEnabled="{Binding IsEnableManualOperation}" >
+                                        <i:Interaction.Triggers>
+                                            <i:EventTrigger EventName="Click">
+                                                <cal:ActionMessage MethodName="DoLoadPortCmd">
+                                                    <cal:Parameter Value="LP1"/>
+                                                    <cal:Parameter Value="SetManual"/>
+                                                </cal:ActionMessage>
+                                            </i:EventTrigger>
+                                        </i:Interaction.Triggers>
+                                        <Button.Style>
+                                            <Style  BasedOn="{StaticResource BaseButton}"  TargetType="{x:Type Button}">
+
+                                                <Setter Property="Visibility" Value="Visible"/>
+                                                <Style.Triggers>
+                                                    <DataTrigger Binding="{Binding LP1AccessMode, UpdateSourceTrigger=PropertyChanged}" Value="Manual">
+                                                        <Setter Property="Visibility" Value="Collapsed"/>
+                                                    </DataTrigger>
+                                                    <DataTrigger Binding="{Binding LP1AccessMode, UpdateSourceTrigger=PropertyChanged}" Value="Auto">
+                                                        <Setter Property="Visibility" Value="Visible"/>
+                                                    </DataTrigger>
+                                                </Style.Triggers>
+                                            </Style>
+                                        </Button.Style>
+                                    </Button>
+                                    <Button Content="Auto"  Width="85" Height="40"  Margin="0" FontSize="13" IsEnabled="{Binding IsEnableManualOperation}" >
+                                        <i:Interaction.Triggers>
+                                            <i:EventTrigger EventName="Click">
+                                                <cal:ActionMessage MethodName="DoLoadPortCmd">
+                                                    <cal:Parameter Value="LP1"/>
+                                                    <cal:Parameter Value="SetAMHS"/>
+                                                </cal:ActionMessage>
+                                            </i:EventTrigger>
+                                        </i:Interaction.Triggers>
+                                        <Button.Style>
+                                            <Style BasedOn="{StaticResource BaseButton}" TargetType="{x:Type Button}">
+                                                <Setter Property="Visibility" Value="Collapsed"/>
+                                                <Style.Triggers>
+                                                    <DataTrigger Binding="{Binding LP1AccessMode, UpdateSourceTrigger=PropertyChanged}" Value="Auto">
+                                                        <Setter Property="Visibility" Value="Collapsed"/>
+                                                    </DataTrigger>
+                                                    <DataTrigger Binding="{Binding LP1AccessMode, UpdateSourceTrigger=PropertyChanged}" Value="Manual">
+                                                        <Setter Property="Visibility" Value="Visible"/>
+                                                    </DataTrigger>
+                                                </Style.Triggers>
+                                            </Style>
+                                        </Button.Style>
+                                    </Button>
+                                </StackPanel>
+
+                            </Border>
+
+                            <TextBlock Margin="10,0,10,0"  Grid.Row="2" Grid.Column="1" Text="Reservation"  FontSize="16"></TextBlock>
+                            <Label  Style="{StaticResource LableToTextBox}" Margin="10,0,10,0"   Grid.Row="3" Grid.Column="1"  Height="40"></Label>
+                            
+                            
+                        </Grid>
+                    </StackPanel>
+                </Border>
+            </Grid>
+        </Border>
+        <Border Visibility="{Binding LP2BorderVisibility,UpdateSourceTrigger=PropertyChanged,Converter={StaticResource bool2VisibilityConverter}}"  Grid.Column="1" Padding="4" BorderThickness="1,0,0,0" BorderBrush="#ccc">
+            <Grid>
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="auto"></RowDefinition>
+                    <RowDefinition ></RowDefinition>
+                    <RowDefinition></RowDefinition>
+                    <RowDefinition></RowDefinition>
+                </Grid.RowDefinitions>
+                <TextBlock Text="LoadPort2" Height="30"  FontSize="18" Style="{StaticResource TextBlock_GridTitle}"></TextBlock>
+                <Border Grid.Row="1">
+                    <Image  Source="pack://application:,,,/MECF.Framework.Common;component/Resources/LoadPort.png" />
+                </Border>
+                <Border  Height="110" Grid.Row="2"  Background="#eaeaea">
+                    <StackPanel>
+                        <TextBlock Text="Carrier" Style="{StaticResource TextBlock_Title}" FontSize="20" ></TextBlock>
+                        <Grid Margin="20,10,0,0">
+                            <Grid.ColumnDefinitions>
+                                <ColumnDefinition Width="76"></ColumnDefinition>
+                                <ColumnDefinition Width="150"></ColumnDefinition>
+                                <ColumnDefinition  Width="auto"></ColumnDefinition>
+                            </Grid.ColumnDefinitions>
+                            <Grid.RowDefinitions>
+                                <RowDefinition></RowDefinition>
+                                <RowDefinition></RowDefinition>
+                            </Grid.RowDefinitions>
+                            <TextBlock Grid.Row="0" Grid.Column="0" Text="Type"  FontSize="16"></TextBlock>
+                            <Label Style="{StaticResource LableToTextBox}"  Content="{Binding LP2CarrierInfo.CarrierType}" Grid.Row="1" Grid.Column="0"  Height="40"></Label>
+                            <TextBlock Margin="10,0,10,0"  Grid.Row="0" Grid.Column="1" Text="No."  FontSize="16"></TextBlock>
+                            <Label  Style="{StaticResource LableToTextBox}"   Content="{Binding LP2CarrierInfo.InternalModuleName}"  Margin="10,0,10,0"  Grid.Row="1" Grid.Column="1"  Height="40"></Label>
+                            <TextBlock  Grid.Row="0" Grid.Column="2" Text="ID"  FontSize="16"></TextBlock>
+                            <Border BorderBrush="Black" BorderThickness="1"  Grid.Row="2" Grid.Column="2"  >
+                                <StackPanel  Orientation="Horizontal">
+                                    <Label BorderThickness="0"  Style="{StaticResource LableToTextBox}" Width="130" Content="{Binding  LP2CarrierInfo.CarrierId,UpdateSourceTrigger=PropertyChanged}"   Height="40"></Label>
+                                    <Button  Content="Read ID" Width="85" Height="40" FontSize="13" IsEnabled="{Binding IsEnableManualOperation}" >
+                                        <i:Interaction.Triggers>
+                                            <i:EventTrigger EventName="Click">
+                                                <cal:ActionMessage MethodName="ReadCarrierId">
+                                                    <cal:Parameter Value="LP2"/>
+                                                </cal:ActionMessage>
+                                            </i:EventTrigger>
+                                        </i:Interaction.Triggers>
+                                    </Button>
+                                </StackPanel>
+
+                            </Border>
+                        </Grid>
+                    </StackPanel>
+                </Border>
+                <Border  Height="200" Grid.Row="3" Margin="0,2,0,0"  Background="#eaeaea">
+                    <StackPanel>
+                        <TextBlock Text="LoadPort" Style="{StaticResource TextBlock_Title}" FontSize="20" ></TextBlock>
+                        <Grid Margin="20,10,0,0">
+                            <Grid.ColumnDefinitions>
+                                <ColumnDefinition></ColumnDefinition>
+                                <ColumnDefinition ></ColumnDefinition>
+                            </Grid.ColumnDefinitions>
+                            <Grid.RowDefinitions>
+                                <RowDefinition></RowDefinition>
+                                <RowDefinition></RowDefinition>
+                                <RowDefinition></RowDefinition>
+                                <RowDefinition></RowDefinition>
+                            </Grid.RowDefinitions>
+                            <TextBlock Grid.Row="0" Grid.Column="0" Text="Status"  FontSize="16"></TextBlock>
+                            <Border BorderBrush="Black" BorderThickness="1"  Grid.Row="1" Grid.Column="0">
+                                <StackPanel  Orientation="Horizontal">
+                                    <Label BorderThickness="0"  Style="{StaticResource LableToTextBox}" Width="130" Content="{Binding LP2State,UpdateSourceTrigger=PropertyChanged}"   Height="40"></Label>
+                                    <Button   Content="Init" Width="85" Height="40" FontSize="13" IsEnabled="{Binding IsEnableManualOperation}" >
+                                        <i:Interaction.Triggers>
+                                            <i:EventTrigger EventName="Click">
+                                                <cal:ActionMessage MethodName="Home">
+                                                    <cal:Parameter Value="LP2"/>
+                                                </cal:ActionMessage>
+                                            </i:EventTrigger>
+                                        </i:Interaction.Triggers>
+                                    </Button>
+                                </StackPanel>
+
+                            </Border>
+
+                            <TextBlock Margin="10,0,10,0"  Grid.Row="0" Grid.Column="1" Text="Clamp"  FontSize="16"></TextBlock>
+
+                            <Border BorderBrush="Black" BorderThickness="1" Margin="10,0,10,0"  Grid.Row="1" Grid.Column="1" >
+                                <StackPanel  Orientation="Horizontal">
+                                    <Label BorderThickness="0"  Style="{StaticResource LableToTextBox}" Width="130" Content="{Binding LP2DeviceStatus,UpdateSourceTrigger=PropertyChanged}"  Height="40"></Label>
+                                    <Button Content="Clamp"  Width="85" Height="40"  Margin="0" FontSize="13" IsEnabled="{Binding IsEnableManualOperation}" >
+                                        <i:Interaction.Triggers>
+                                            <i:EventTrigger EventName="Click">
+                                                <cal:ActionMessage MethodName="SetClamp">
+                                                    <cal:Parameter Value="LP2"/>
+                                                </cal:ActionMessage>
+                                            </i:EventTrigger>
+                                        </i:Interaction.Triggers>
+                                        <Button.Style>
+                                            <Style  BasedOn="{StaticResource BaseButton}"  TargetType="{x:Type Button}">
+
+                                                <Setter Property="Visibility" Value="Visible"/>
+                                                <Style.Triggers>
+                                                    <DataTrigger Binding="{Binding LP2DeviceStatus, UpdateSourceTrigger=PropertyChanged}" Value="Clamp">
+                                                        <Setter Property="Visibility" Value="Collapsed"/>
+                                                    </DataTrigger>
+                                                    <DataTrigger Binding="{Binding LP2DeviceStatus, UpdateSourceTrigger=PropertyChanged}" Value="Release">
+                                                        <Setter Property="Visibility" Value="Visible"/>
+                                                    </DataTrigger>
+                                                </Style.Triggers>
+                                            </Style>
+                                        </Button.Style>
+                                    </Button>
+                                    <Button Content="Release"  Width="85" Height="40"  Margin="0" FontSize="13" IsEnabled="{Binding IsEnableManualOperation}" >
+                                        <i:Interaction.Triggers>
+                                            <i:EventTrigger EventName="Click">
+                                                <cal:ActionMessage MethodName="SetRelease">
+                                                    <cal:Parameter Value="LP2"/>
+                                                </cal:ActionMessage>
+                                            </i:EventTrigger>
+                                        </i:Interaction.Triggers>
+                                        <Button.Style>
+                                            <Style BasedOn="{StaticResource BaseButton}" TargetType="{x:Type Button}">
+
+                                                <Setter Property="Visibility" Value="Collapsed"/>
+                                                <Style.Triggers>
+                                                    <DataTrigger Binding="{Binding LP2DeviceStatus, UpdateSourceTrigger=PropertyChanged}" Value="Clamp">
+                                                        <Setter Property="Visibility" Value="Visible"/>
+                                                    </DataTrigger>
+                                                    <DataTrigger Binding="{Binding LP2DeviceStatus, UpdateSourceTrigger=PropertyChanged}" Value="Release">
+                                                        <Setter Property="Visibility" Value="Collapsed"/>
+                                                    </DataTrigger>
+                                                </Style.Triggers>
+                                            </Style>
+                                        </Button.Style>
+                                    </Button>
+                                </StackPanel>
+
+                            </Border>
+
+
+                            <TextBlock Grid.Row="2" Grid.Column="0" Text="AccessMode"  FontSize="16"></TextBlock>
+
+                            <Border BorderBrush="Black" BorderThickness="1" Grid.Row="3" Grid.Column="0" >
+                                <StackPanel  Orientation="Horizontal">
+                                    <Label BorderThickness="0"  Style="{StaticResource LableToTextBox}" Width="130" Content="{Binding LP2AccessMode,UpdateSourceTrigger=PropertyChanged}"  Height="40"></Label>
+                                    <Button Content="Manual"  Width="85" Height="40"  Margin="0" FontSize="13" IsEnabled="{Binding IsEnableManualOperation}" >
+                                        <i:Interaction.Triggers>
+                                            <i:EventTrigger EventName="Click">
+                                                <cal:ActionMessage MethodName="DoLoadPortCmd">
+                                                    <cal:Parameter Value="LP2"/>
+                                                    <cal:Parameter Value="SetManual"/>
+                                                </cal:ActionMessage>
+                                            </i:EventTrigger>
+                                        </i:Interaction.Triggers>
+                                        <Button.Style>
+                                            <Style  BasedOn="{StaticResource BaseButton}"  TargetType="{x:Type Button}">
+
+                                                <Setter Property="Visibility" Value="Visible"/>
+                                                <Style.Triggers>
+                                                    <DataTrigger Binding="{Binding LP2AccessMode, UpdateSourceTrigger=PropertyChanged}" Value="Manual">
+                                                        <Setter Property="Visibility" Value="Collapsed"/>
+                                                    </DataTrigger>
+                                                    <DataTrigger Binding="{Binding LP2AccessMode, UpdateSourceTrigger=PropertyChanged}" Value="Auto">
+                                                        <Setter Property="Visibility" Value="Visible"/>
+                                                    </DataTrigger>
+                                                </Style.Triggers>
+                                            </Style>
+                                        </Button.Style>
+                                    </Button>
+                                    <Button Content="Auto"  Width="85" Height="40"  Margin="0" FontSize="13" IsEnabled="{Binding IsEnableManualOperation}" >
+                                        <i:Interaction.Triggers>
+                                            <i:EventTrigger EventName="Click">
+                                                <cal:ActionMessage MethodName="DoLoadPortCmd">
+                                                    <cal:Parameter Value="LP2"/>
+                                                    <cal:Parameter Value="SetAMHS"/>
+                                                </cal:ActionMessage>
+                                            </i:EventTrigger>
+                                        </i:Interaction.Triggers>
+                                        <Button.Style>
+                                            <Style BasedOn="{StaticResource BaseButton}" TargetType="{x:Type Button}">
+                                                <Setter Property="Visibility" Value="Collapsed"/>
+                                                <Style.Triggers>
+                                                    <DataTrigger Binding="{Binding LP2AccessMode, UpdateSourceTrigger=PropertyChanged}" Value="Auto">
+                                                        <Setter Property="Visibility" Value="Collapsed"/>
+                                                    </DataTrigger>
+                                                    <DataTrigger Binding="{Binding LP2AccessMode, UpdateSourceTrigger=PropertyChanged}" Value="Manual">
+                                                        <Setter Property="Visibility" Value="Visible"/>
+                                                    </DataTrigger>
+                                                </Style.Triggers>
+                                            </Style>
+                                        </Button.Style>
+                                    </Button>
+                                </StackPanel>
+
+                            </Border>
+
+                            <TextBlock Margin="10,0,10,0"  Grid.Row="2" Grid.Column="1" Text="Reservation"  FontSize="16"></TextBlock>
+                            <Label  Style="{StaticResource LableToTextBox}" Margin="10,0,10,0"   Grid.Row="3" Grid.Column="1"  Height="40"></Label>
+
+
+                        </Grid>
+                    </StackPanel>
+                </Border>
+            </Grid>
+        </Border>
+    
+    
+        <!--<Grid.RowDefinitions>
             <RowDefinition Height="Auto"/>
             <RowDefinition Height="Auto"/>
             <RowDefinition Height="Auto"/>
@@ -223,6 +632,6 @@
                     </i:Interaction.Triggers>
                 </Button>
             </Border>
-        </DockPanel>
+        </DockPanel>-->
     </Grid>
 </UserControl>

+ 131 - 78
Furnace/FurnaceUI/Views/Maintenances/LPSensorViewModel.cs

@@ -16,10 +16,13 @@ using Aitex.Core.RT.Log;
 using System.Linq;
 using System.Windows;
 using Aitex.Core.RT.SCCore;
+using MECF.Framework.Common.SubstrateTrackings;
+using OpenSEMI.ClientBase;
+using DocumentFormat.OpenXml.Office.Word;
 
 namespace FurnaceUI.Views.Maintenances
 {
-    public class LPSensorViewModel : FurnaceUIViewModelBase
+    public class LPSensorViewModel : FurnaceModuleUIViewModelBase
     {
         public bool IsManagerPermission { get => this.Permission == 3; }
         [Subscription("Rt.Status")]
@@ -29,102 +32,152 @@ namespace FurnaceUI.Views.Maintenances
         public bool IsSystemStaus => (RtStatus != "AutoRunning");
         #region stage sensors
 
-        [Subscription("System.SensorStation17Presence.DeviceData")]
-        public AITSensorData SensorStation17Presence { get; set; }
-        [Subscription("System.SensorStation18Presence.DeviceData")]
-        public AITSensorData SensorStation18Presence { get; set; }
-        [Subscription("System.SensorStation17APresence.DeviceData")]
-        public AITSensorData SensorStation17APresence { get; set; }
-        [Subscription("System.SensorStation18APresence.DeviceData")]
-        public AITSensorData SensorStation18APresence { get; set; }
-        [Subscription("System.Valve1EX.DeviceData")]
-        public AITSensorData Valve1EX { get; set; }
-        [Subscription("System.Valve1RE.DeviceData")]
-        public AITSensorData Valve1RE { get; set; }
-        [Subscription("System.Valve2EX.DeviceData")]
-        public AITSensorData Valve2EX { get; set; }
-        [Subscription("System.Valve2RE.DeviceData")]
-        public AITSensorData Valve2RE { get; set; }
-       
+        //[Subscription("System.SensorStation17Presence.DeviceData")]
+        //public AITSensorData SensorStation17Presence { get; set; }
+        //[Subscription("System.SensorStation18Presence.DeviceData")]
+        //public AITSensorData SensorStation18Presence { get; set; }
+        //[Subscription("System.SensorStation17APresence.DeviceData")]
+        //public AITSensorData SensorStation17APresence { get; set; }
+        //[Subscription("System.SensorStation18APresence.DeviceData")]
+        //public AITSensorData SensorStation18APresence { get; set; }
+        //[Subscription("System.Valve1EX.DeviceData")]
+        //public AITSensorData Valve1EX { get; set; }
+        //[Subscription("System.Valve1RE.DeviceData")]
+        //public AITSensorData Valve1RE { get; set; }
+        //[Subscription("System.Valve2EX.DeviceData")]
+        //public AITSensorData Valve2EX { get; set; }
+        //[Subscription("System.Valve2RE.DeviceData")]
+        //public AITSensorData Valve2RE { get; set; }
 
-        [Subscription("LP1.LoadportState")]
+        [Subscription("LP1.Status")]
         public string LP1State { get; set; }
-        [Subscription("LP2.LoadportState")]
+        [Subscription("LP2.Status")]
         public string LP2State { get; set; }
-        [Subscription("LP3.LoadportState")]
-        public string LP3State { get; set; }
-        [Subscription("LP4.LoadportState")]
-        public string LP4State { get; set; }
-        [Subscription("LP1.CarrierId")]
-        public string LP1CarrierId { get; set; }
-        [Subscription("LP2.CarrierId")]
-        public string LP2CarrierId { get; set; }
-        [Subscription("LP3.CarrierId")]
-        public string LP3CarrierId { get; set; }
-        [Subscription("LP4.CarrierId")]
-        public string LP4CarrierId { get; set; }
+        //[Subscription("LP2.LoadportState")]
+        //public string LP2State { get; set; }
+        //[Subscription("LP3.LoadportState")]
+        //public string LP3State { get; set; }
+        //[Subscription("LP4.LoadportState")]
+        //public string LP4State { get; set; }
+        //[Subscription("LP1.CarrierId")]
+        //public string LP1CarrierId { get; set; }
+        //[Subscription("LP2.CarrierId")]
+        //public string LP2CarrierId { get; set; }
+        //[Subscription("LP3.CarrierId")]
+        //public string LP3CarrierId { get; set; }
+        //[Subscription("LP4.CarrierId")]
+        //public string LP4CarrierId { get; set; }
+        [Subscription("LP1.AccessMode")]
+        public string LP1AccessMode { get; set; }
+        [Subscription("LP2.AccessMode")]
+        public string LP2AccessMode { get; set; }
+        [Subscription("LP1.DeviceStatus")]
+        public string LP1DeviceStatus { get; set; }
+        [Subscription("LP2.DeviceStatus")]
+        public string LP2DeviceStatus { get; set; }
+        [Subscription("LP1.Carrier")]
+        public CarrierInfo LP1CarrierInfo { get; set; }
+        [Subscription("LP2.Carrier")]
+        public CarrierInfo LP2CarrierInfo { get; set; }
         #endregion
-
-        public ObservableCollection<SensorViewItem> LPSensors { get; set; } = new ObservableCollection<SensorViewItem>();
+        private bool _lP2BorderVisibility = true;
+        public bool LP2BorderVisibility
+        {
+            get => _lP2BorderVisibility;
+            set
+            {
+                _lP2BorderVisibility = value;
+                NotifyOfPropertyChange(nameof(LP2BorderVisibility));
+            }
+        }
+        private bool _lP1BorderVisibility = true;
+        public bool LP1BorderVisibility
+        {
+            get => _lP1BorderVisibility;
+            set
+            {
+                _lP1BorderVisibility = value;
+                NotifyOfPropertyChange(nameof(LP1BorderVisibility));
+            }
+        }
+        //     public ObservableCollection<SensorViewItem> LPSensors { get; set; } = new ObservableCollection<SensorViewItem>();
 
         public LPSensorViewModel()
         {
 
         }
-
-        protected override void InvokeBeforeUpdateProperty(Dictionary<string, object> data)
+        protected override void InvokeAfterUpdateProperty(Dictionary<string, object> data)
         {
-            base.InvokeBeforeUpdateProperty(data);
+            base.InvokeAfterUpdateProperty(data);
         }
 
-        public override void UpdateSubscribe(Dictionary<string, object> data, object target, string module = null)
-        {
-            Parallel.ForEach(target.GetType().GetProperties().Where(_hasSubscriptionAttribute),
-                 property =>
-                 {
-                     PropertyInfo pi = (PropertyInfo)property;
-                     SubscriptionAttribute subscription = property.GetCustomAttributes(false).First(_isSubscriptionAttribute) as SubscriptionAttribute;
-                     string key = subscription.ModuleKey;
-                     key = module == null ? key : string.Format("{0}.{1}", module, key);
+        //protected override void InvokeBeforeUpdateProperty(Dictionary<string, object> data)
+        //{
+        //    base.InvokeBeforeUpdateProperty(data);
+        //}
 
-                     if (_subscribedKeys.Contains(key) && data.ContainsKey(key))
-                     {
-                         try
-                         {
-                             var convertedValue = Convert.ChangeType(data[key], pi.PropertyType);
-                             var originValue = Convert.ChangeType(pi.GetValue(target, null), pi.PropertyType);
-                             if ((convertedValue as AITSensorData) != null && originValue != convertedValue)
-                             {
-                                 pi.SetValue(target, convertedValue, null);
-                                 //if ((convertedValue as AITSensorData).DeviceName.ToLower().Contains(_para))
-                                 //{
-                                 Update(LPSensors, convertedValue as AITSensorData);
-                                 //}
+        //public override void UpdateSubscribe(Dictionary<string, object> data, object target, string module = null)
+        //{
+        //    Parallel.ForEach(target.GetType().GetProperties().Where(_hasSubscriptionAttribute),
+        //         property =>
+        //         {
+        //             PropertyInfo pi = (PropertyInfo)property;
+        //             SubscriptionAttribute subscription = property.GetCustomAttributes(false).First(_isSubscriptionAttribute) as SubscriptionAttribute;
+        //             string key = subscription.ModuleKey;
+        //             key = module == null ? key : string.Format("{0}.{1}", module, key);
 
-                             }
-                         }
-                         catch (Exception ex)
-                         {
-                             LOG.Error("由RT返回的数据更新失败" + key, ex);
-                         }
-                     }
-                 });
-            base.UpdateSubscribe(data, target, module);
-        }
+        //             if (_subscribedKeys.Contains(key) && data.ContainsKey(key))
+        //             {
+        //                 try
+        //                 {
+        //                     var convertedValue = Convert.ChangeType(data[key], pi.PropertyType);
+        //                     var originValue = Convert.ChangeType(pi.GetValue(target, null), pi.PropertyType);
+        //                     if ((convertedValue as AITSensorData) != null && originValue != convertedValue)
+        //                     {
+        //                         pi.SetValue(target, convertedValue, null);
+        //                         //if ((convertedValue as AITSensorData).DeviceName.ToLower().Contains(_para))
+        //                         //{
+        //                         Update(LPSensors, convertedValue as AITSensorData);
+        //                         //}
+
+        //                     }
+        //                 }
+        //                 catch (Exception ex)
+        //                 {
+        //                     LOG.Error("由RT返回的数据更新失败" + key, ex);
+        //                 }
+        //             }
+        //         });
+        //    base.UpdateSubscribe(data, target, module);
+        //}
 
-        private void Update(ObservableCollection<SensorViewItem> sensors, object obj)
+        //private void Update(ObservableCollection<SensorViewItem> sensors, object obj)
+        //{
+        //    AITSensorData data = obj as AITSensorData;
+        //    if (data != null && sensors.Count > 0)
+        //    {
+        //        var item = sensors.SingleOrDefault(x => x.Name == data.DeviceName);
+        //        if (item != null)
+        //        {
+        //            item.Value = data.Value;
+        //        }
+        //    }
+        //}
+        public void DoLoadPortCmd(string deviceName, string cmd)
         {
-            AITSensorData data = obj as AITSensorData;
-            if (data != null && sensors.Count > 0)
+
+            if (cmd == "SetAMHS" && deviceName == "LP1" && !LP1CarrierInfo.IsEmpty)
+            {
+                DialogBox.ShowWarning($"{deviceName} change to auto failed, for FOUP present");
+                return;
+            }
+            if (cmd == "SetAMHS" && deviceName == "LP2" && !LP2CarrierInfo.IsEmpty)
             {
-                var item = sensors.SingleOrDefault(x => x.Name == data.DeviceName);
-                if (item != null)
-                {
-                    item.Value = data.Value;
-                }
+                DialogBox.ShowWarning($"{deviceName} change to auto failed, for FOUP present");
+                return;
             }
+            InvokeClient.Instance.Service.DoOperation($"{deviceName}.{cmd}");
         }
-
         public void Home(object para)
         {
             InvokeClient.Instance.Service.DoOperation($"{para}.Home", "");

+ 12 - 0
Furnace/FurnaceUI/Views/Operations/TransferMain/LoadPortInfoView.xaml

@@ -0,0 +1,12 @@
+<UserControl x:Class="FurnaceUI.Views.Operations.TransferMain.LoadPortInfoView"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:FurnaceUI.Views.Operations.TransferMain"
+             mc:Ignorable="d" 
+             d:DesignHeight="450" d:DesignWidth="800">
+    <Grid>
+            
+    </Grid>
+</UserControl>

+ 28 - 0
Furnace/FurnaceUI/Views/Operations/TransferMain/LoadPortInfoView.xaml.cs

@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace FurnaceUI.Views.Operations.TransferMain
+{
+    /// <summary>
+    /// LoadPortInfoView.xaml 的交互逻辑
+    /// </summary>
+    public partial class LoadPortInfoView : UserControl
+    {
+        public LoadPortInfoView()
+        {
+            InitializeComponent();
+        }
+    }
+}

+ 12 - 0
Furnace/FurnaceUI/Views/Operations/TransferMain/LoadPortInfoViewModel.cs

@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FurnaceUI.Views.Operations.TransferMain
+{
+    public class LoadPortInfoViewModel
+    {
+    }
+}

+ 109 - 12
Furnace/FurnaceUI/Views/Operations/TransferMain/SelfCheckView.xaml

@@ -139,25 +139,57 @@
                     Canvas.Top="45"
                     Width="81"
                     Source="/FurnaceUI;component/Resources/Images/Controls3/bt1.png"
-                    Visibility="{Binding LP3Installed, Converter={StaticResource bool2VisibilityConverter}}"/>
+                    Visibility="{Binding LP3Installed, Converter={StaticResource bool2VisibilityConverter}}">
+                    <i:Interaction.Triggers>
+                        <i:EventTrigger EventName="MouseLeftButtonDown">
+                            <cal:ActionMessage MethodName="ManualOperation">
+                                <cal:Parameter Value="LP3"/>
+                            </cal:ActionMessage>
+                        </i:EventTrigger>
+                    </i:Interaction.Triggers>
+                </Image>
                 <Image
                     Canvas.Left="139"
                     Canvas.Top="45"
                     Width="81"
                     Source="/FurnaceUI;component/Resources/Images/Controls3/bt1.png"
-                    Visibility="{Binding LP4Installed, Converter={StaticResource bool2VisibilityConverter}}"/>
+                    Visibility="{Binding LP4Installed, Converter={StaticResource bool2VisibilityConverter}}">
+                    <i:Interaction.Triggers>
+                        <i:EventTrigger EventName="MouseLeftButtonDown">
+                            <cal:ActionMessage MethodName="ManualOperation">
+                                <cal:Parameter Value="LP4"/>
+                            </cal:ActionMessage>
+                        </i:EventTrigger>
+                    </i:Interaction.Triggers>
+                </Image>
                 <Image
                     Canvas.Left="19"
                     Canvas.Top="295"
                     Width="81"
                     Source="/FurnaceUI;component/Resources/Images/Controls3/bt1.png"
-                    Visibility="{Binding LP1Installed, Converter={StaticResource bool2VisibilityConverter}}"/>
+                    Visibility="{Binding LP1Installed, Converter={StaticResource bool2VisibilityConverter}}">
+                    <i:Interaction.Triggers>
+                        <i:EventTrigger EventName="MouseLeftButtonDown">
+                            <cal:ActionMessage MethodName="ManualOperation">
+                                <cal:Parameter Value="LP1"/>
+                            </cal:ActionMessage>
+                        </i:EventTrigger>
+                    </i:Interaction.Triggers>
+                </Image>
                 <Image
                     Canvas.Left="139"
                     Canvas.Top="295"
                     Width="81"
                     Source="/FurnaceUI;component/Resources/Images/Controls3/bt1.png"
-                    Visibility="{Binding LP2Installed, Converter={StaticResource bool2VisibilityConverter}}"/>
+                    Visibility="{Binding LP2Installed, Converter={StaticResource bool2VisibilityConverter}}">
+                    <i:Interaction.Triggers>
+                        <i:EventTrigger EventName="MouseLeftButtonDown">
+                            <cal:ActionMessage MethodName="ManualOperation">
+                                <cal:Parameter Value="LP2"/>
+                            </cal:ActionMessage>
+                        </i:EventTrigger>
+                    </i:Interaction.Triggers>
+                </Image>
                 <!--<Image Source="/FurnaceUI;component/Resources/Images/Controls3/bt1.png"  Canvas.Left="19" Canvas.Top="412" Width="81" Visibility="{Binding IsStockerVisibility}"/>
                 <Image Source="/FurnaceUI;component/Resources/Images/Controls3/bt1.png"  Canvas.Left="139" Canvas.Top="412" Width="81" Visibility="{Binding IsStockerVisibility}"/>-->
                 <!--<Image Source="/FurnaceUI;component/Resources/Images/Controls3/hg1.png"  Canvas.Left="295" Canvas.Top="95"/>-->
@@ -193,13 +225,30 @@
                     Canvas.Top="410"
                     Width="81"
                     Source="/FurnaceUI;component/Resources/Images/Controls3/bt1.png"
-                    Visibility="{Binding FIMS2Installed, Converter={StaticResource bool2VisibilityConverter}}"/>
+                    Visibility="{Binding FIMS2Installed, Converter={StaticResource bool2VisibilityConverter}}">
+                    <i:Interaction.Triggers>
+                        <i:EventTrigger EventName="MouseLeftButtonDown">
+                            <cal:ActionMessage MethodName="ManualOperation">
+                                <cal:Parameter Value="FIMS2"/>
+                            </cal:ActionMessage>
+                        </i:EventTrigger>
+                    </i:Interaction.Triggers>
+                </Image>
                 <Image
                     Canvas.Left="609"
                     Canvas.Top="550"
                     Width="81"
                     Source="/FurnaceUI;component/Resources/Images/Controls3/bt1.png"
-                    Visibility="{Binding FIMS1Installed, Converter={StaticResource bool2VisibilityConverter}}"/>
+                    Visibility="{Binding FIMS1Installed, Converter={StaticResource bool2VisibilityConverter}}">
+                    <i:Interaction.Triggers>
+                        <i:EventTrigger EventName="MouseLeftButtonDown">
+                            <cal:ActionMessage MethodName="ManualOperation">
+                                <cal:Parameter Value="FIMS1"/>
+                            </cal:ActionMessage>
+                        </i:EventTrigger>
+                    </i:Interaction.Triggers>
+                </Image>
+
                 <!--<Image Source="/FurnaceUI;component/Resources/Images/Controls3/listbg.png" Canvas.Left="33" Canvas.Top="352"/>
                 <Image Source="/FurnaceUI;component/Resources/Images/Controls3/bt2.png" Canvas.Left="33" Canvas.Top="428"/>
                 <Image Source="/FurnaceUI;component/Resources/Images/Controls3/bt2.png" Canvas.Left="33" Canvas.Top="506"/>
@@ -211,28 +260,60 @@
                     FontFamily="Arial"
                     FontSize="13"
                     Text="LP 3"
-                    Visibility="{Binding LP3Installed, Converter={StaticResource bool2VisibilityConverter}}"/>
+                    Visibility="{Binding LP3Installed, Converter={StaticResource bool2VisibilityConverter}}">
+                    <i:Interaction.Triggers>
+                        <i:EventTrigger EventName="MouseLeftButtonDown">
+                            <cal:ActionMessage MethodName="ManualOperation">
+                                 <cal:Parameter Value="LP3"/>
+                            </cal:ActionMessage>
+                        </i:EventTrigger>
+                    </i:Interaction.Triggers>
+                </TextBlock>
                 <TextBlock
                     Canvas.Left="166"
                     Canvas.Top="65"
                     FontFamily="Arial"
                     FontSize="13"
                     Text="LP 4"
-                    Visibility="{Binding LP4Installed, Converter={StaticResource bool2VisibilityConverter}}"/>
+                    Visibility="{Binding LP4Installed, Converter={StaticResource bool2VisibilityConverter}}">
+                        <i:Interaction.Triggers>
+                            <i:EventTrigger EventName="MouseLeftButtonDown">
+                                <cal:ActionMessage MethodName="ManualOperation">
+                                     <cal:Parameter Value="LP4"/>
+                                </cal:ActionMessage>
+                            </i:EventTrigger>
+                        </i:Interaction.Triggers>
+                </TextBlock>
                 <TextBlock
                     Canvas.Left="45"
                     Canvas.Top="315"
                     FontFamily="Arial"
                     FontSize="13"
                     Text="LP 1"
-                    Visibility="{Binding LP1Installed, Converter={StaticResource bool2VisibilityConverter}}"/>
+                    Visibility="{Binding LP1Installed, Converter={StaticResource bool2VisibilityConverter}}">
+                     <i:Interaction.Triggers>
+                       <i:EventTrigger EventName="MouseLeftButtonDown">
+                           <cal:ActionMessage MethodName="ManualOperation">
+                                <cal:Parameter Value="LP1"/>
+                           </cal:ActionMessage>
+                       </i:EventTrigger>
+                   </i:Interaction.Triggers>
+                </TextBlock>
                 <TextBlock
                     Canvas.Left="166"
                     Canvas.Top="315"
                     FontFamily="Arial"
                     FontSize="13"
                     Text="LP 2"
-                    Visibility="{Binding LP2Installed, Converter={StaticResource bool2VisibilityConverter}}"/>
+                    Visibility="{Binding LP2Installed, Converter={StaticResource bool2VisibilityConverter}}">
+                      <i:Interaction.Triggers>
+                        <i:EventTrigger EventName="MouseLeftButtonDown">
+                            <cal:ActionMessage MethodName="ManualOperation">
+                                 <cal:Parameter Value="LP2"/>
+                            </cal:ActionMessage>
+                        </i:EventTrigger>
+                    </i:Interaction.Triggers>
+                </TextBlock>
                 <!--<TextBlock Text="LP 2" FontSize="13" FontFamily="Arial" Canvas.Left="166" Canvas.Top="431" Visibility="{Binding IsStockerVisibility}"/>
                 <TextBlock Text="LP 1" FontSize="13" FontFamily="Arial" Canvas.Left="45" Canvas.Top="431" Visibility="{Binding IsStockerVisibility}"/>-->
                 <TextBlock
@@ -241,14 +322,30 @@
                     FontFamily="Arial"
                     FontSize="13"
                     Text="FIMS 2"
-                    Visibility="{Binding FIMS2Installed, Converter={StaticResource bool2VisibilityConverter}}"/>
+                    Visibility="{Binding FIMS2Installed, Converter={StaticResource bool2VisibilityConverter}}">
+                                          <i:Interaction.Triggers>
+                                            <i:EventTrigger EventName="MouseLeftButtonDown">
+                                                <cal:ActionMessage MethodName="ManualOperation">
+                                                     <cal:Parameter Value="FIMS2"/>
+                                                </cal:ActionMessage>
+                                            </i:EventTrigger>
+                                        </i:Interaction.Triggers>
+                </TextBlock>
                 <TextBlock
                     Canvas.Left="629"
                     Canvas.Top="570"
                     FontFamily="Arial"
                     FontSize="13"
                     Text="FIMS 1"
-                    Visibility="{Binding FIMS1Installed, Converter={StaticResource bool2VisibilityConverter}}"/>
+                    Visibility="{Binding FIMS1Installed, Converter={StaticResource bool2VisibilityConverter}}">
+                       <i:Interaction.Triggers>
+                           <i:EventTrigger EventName="MouseLeftButtonDown">
+                               <cal:ActionMessage MethodName="ManualOperation">
+                                    <cal:Parameter Value="FIMS1"/>
+                               </cal:ActionMessage>
+                           </i:EventTrigger>
+                       </i:Interaction.Triggers>
+                </TextBlock>
                 <TextBlock
                     Canvas.Left="-4"
                     Canvas.Top="154"

+ 72 - 39
Furnace/FurnaceUI/Views/Operations/TransferMain/SelfCheckViewModel.cs

@@ -16,6 +16,7 @@ using FurnaceUI.Controls.Common;
 using FurnaceUI.Client;
 using Caliburn.Micro;
 using Caliburn.Micro.Core;
+using FurnaceUI.Views.Maintenances;
 
 namespace FurnaceUI.Views.Operations
 {
@@ -606,7 +607,7 @@ namespace FurnaceUI.Views.Operations
                 if (CarrierRobotStatus == "Swaping")
                 {
                     return $"{SwapCycledCount + 1}/{_cycleNumber}";
-                } 
+                }
                 if (CarrierRobotStatus == "CycleSwaping")
                 {
                     return $"{CycleSwapCycledCount}/{_cycleSwapNumber}";
@@ -1371,46 +1372,78 @@ namespace FurnaceUI.Views.Operations
             InvokeClient.Instance.Service.DoOperation("System.Reset");
         }
 
+        public void ManualOperation(string deviceName)
+        {
+
+            var windowManager = IoC.Get<IWindowManager>();
+            switch (deviceName)
+            {
+                case "LP1":
+                    {
+                        LPSensorViewModel lpViewModel = new LPSensorViewModel();
+                        lpViewModel.LP2BorderVisibility = false;
+                        (windowManager as WindowManager)?.ShowDialogWithTitle(lpViewModel, null, "LP1 Manual");
+                    }
+                    break;
+                case "LP2":
+                    {
+                        LPSensorViewModel lpViewModel = new LPSensorViewModel();
+                        lpViewModel.LP1BorderVisibility = false;
+                        (windowManager as WindowManager)?.ShowDialogWithTitle(lpViewModel, null, "LP2 Manual");
+                    }
+                    break;
+                case "FIMS1":
+                case "FIMS2":
+                    {
+                        FIMSSensorViewModel fimsSensorViewModel = new FIMSSensorViewModel();
+                        (windowManager as WindowManager)?.ShowDialogWithTitle(fimsSensorViewModel, null, "FIMS Manual");
+                    }
+                    break;
+                
+                default:
+                    break;
+            }
+        }
         public void PopupPage(string page)
         {
-            //var windowManager = IoC.Get<IWindowManager>();
-            //switch (page)
-            //{
-            //    case "SMIFA":
-            //        {
-            //            SMIFViewModel smifViewModel = new SMIFViewModel();
-            //            (windowManager as WindowManager)?.ShowDialogWithTitle(smifViewModel, null, "SMIF Status");
-            //        }
-            //        break;
-            //    case "SMIFB":
-            //        {
-            //            SMIFViewModel smifViewModel = new SMIFViewModel();
-            //            (windowManager as WindowManager)?.ShowDialogWithTitle(smifViewModel, null, "SMIF Status");
-            //        }
-            //        break;
-            //    case "CassetteRobot":
-            //        CassetteRobotViewModel cassetteRobotViewModel = new CassetteRobotViewModel();
-            //        (windowManager as WindowManager)?.ShowDialogWithTitle(cassetteRobotViewModel, null, "CassetteRobot Status");
-            //        break;
-            //    case "WaferRobot":
-            //        WaferRobotViewModel waferRobotViewModel = new WaferRobotViewModel();
-            //        (windowManager as WindowManager)?.ShowDialogWithTitle(waferRobotViewModel, null, "WaferRobot Status");
-            //        break;
-            //    case "Stage":
-            //        StageSensorViewModel stageSensorViewModel = new StageSensorViewModel();
-            //        (windowManager as WindowManager)?.ShowDialogWithTitle(stageSensorViewModel, null, "Stage Status");
-            //        break;
-            //    case "Stocker":
-            //        StockerSensorViewModel stockerSensorViewModel = new StockerSensorViewModel();
-            //        (windowManager as WindowManager)?.ShowDialogWithTitle(stockerSensorViewModel, null, "Stocker Status");
-            //        break;
-            //    case "Boat":
-            //        BoatSensorViewModel boatSensorViewModel = new BoatSensorViewModel();
-            //        (windowManager as WindowManager)?.ShowDialogWithTitle(boatSensorViewModel, null, "Boat Status");
-            //        break;
-            //    default:
-            //        break;
-            //}
+            var windowManager = IoC.Get<IWindowManager>();
+            switch (page)
+            {
+                case "SMIFA":
+                    {
+                        SMIFViewModel smifViewModel = new SMIFViewModel();
+                        (windowManager as WindowManager)?.ShowDialogWithTitle(smifViewModel, null, "SMIF Status");
+                    }
+                    break;
+                case "SMIFB":
+                    {
+                        SMIFViewModel smifViewModel = new SMIFViewModel();
+                        (windowManager as WindowManager)?.ShowDialogWithTitle(smifViewModel, null, "SMIF Status");
+                    }
+                    break;
+                case "CassetteRobot":
+                    CassetteRobotViewModel cassetteRobotViewModel = new CassetteRobotViewModel();
+                    (windowManager as WindowManager)?.ShowDialogWithTitle(cassetteRobotViewModel, null, "CassetteRobot Status");
+                    break;
+                case "WaferRobot":
+                    WaferRobotViewModel waferRobotViewModel = new WaferRobotViewModel();
+                    (windowManager as WindowManager)?.ShowDialogWithTitle(waferRobotViewModel, null, "WaferRobot Status");
+                    break;
+                case "Stage":
+                    StageSensorViewModel stageSensorViewModel = new StageSensorViewModel();
+                    (windowManager as WindowManager)?.ShowDialogWithTitle(stageSensorViewModel, null, "Stage Status");
+                    break;
+                case "Stocker":
+                    StockerSensorViewModel stockerSensorViewModel = new StockerSensorViewModel();
+                    (windowManager as WindowManager)?.ShowDialogWithTitle(stockerSensorViewModel, null, "Stocker Status");
+                    break;
+                case "Boat":
+                    BoatSensorViewModel boatSensorViewModel = new BoatSensorViewModel();
+                    (windowManager as WindowManager)?.ShowDialogWithTitle(boatSensorViewModel, null, "Boat Status");
+                    break;
+                default:
+                    break;
+            }
         }
 
         public void CanvasMouseLeftButtonDown(object sender)