瀏覽代碼

添加cleanrecipe界面

# Conflicts:
#	Venus/Venus_RT/Modules/PMs/PMProcessRoutine.cs
lixiang 1 年之前
父節點
當前提交
7a6912dc9c

+ 5 - 0
Venus/Venus_MainPages/Unity/CommonFunction.cs

@@ -30,6 +30,11 @@ namespace Venus_MainPages.Unity
                 return default(T);
             }
         }
+        public static IEnumerable<string> GetFilesNames(string path)
+        {
+            return Directory.GetFiles(path, "*.rcp")?
+      .Select(Path.GetFileNameWithoutExtension);
+        }
 
     }
 }

+ 8 - 0
Venus/Venus_MainPages/Venus_MainPages.csproj

@@ -169,6 +169,7 @@
     <Compile Include="Unity\WaferStatusHandler.cs" />
     <Compile Include="Unity\WaferStatusImp.cs" />
     <Compile Include="ViewModels\ButterflyValveViewModel.cs" />
+    <Compile Include="ViewModels\CleanRecipeViewModel.cs" />
     <Compile Include="ViewModels\DataHistoryViewModel.cs" />
     <Compile Include="ViewModels\EfemViewModel.cs" />
     <Compile Include="ViewModels\EventViewModel.cs" />
@@ -203,6 +204,9 @@
     <Compile Include="Views\ButterflyValveView.xaml.cs">
       <DependentUpon>ButterflyValveView.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Views\CleanRecipeView.xaml.cs">
+      <DependentUpon>CleanRecipeView.xaml</DependentUpon>
+    </Compile>
     <Compile Include="Views\DataHistoryView.xaml.cs">
       <DependentUpon>DataHistoryView.xaml</DependentUpon>
     </Compile>
@@ -336,6 +340,10 @@
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
+    <Page Include="Views\CleanRecipeView.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="Views\DataHistoryView.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>

+ 256 - 0
Venus/Venus_MainPages/ViewModels/CleanRecipeViewModel.cs

@@ -0,0 +1,256 @@
+using MECF.Framework.Common.DataCenter;
+using MECF.Framework.Common.OperationCenter;
+using Prism.Commands;
+using Prism.Mvvm;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Windows.Threading;
+using Venus_Core;
+using Venus_MainPages.Unity;
+
+namespace Venus_MainPages.ViewModels
+{
+    public class CleanRecipeViewModel : BindableBase
+    {
+        #region 私有字段
+        private string m_ModuleName;
+        private PMState m_PMCurrentState;
+        private bool m_IsEnableCleanRecipe;
+        private int m_IdleDuringTimeCount;
+        private TimeSpan m_IdleDuringTime;
+        private List<string> m_CurrentModuleRecipes = new List<string>();
+        private string m_SelectedCleanRecipe;
+        private string m_CleanRecipeSetpoint;
+        private int m_IdleCleanTimeSetpoint;
+        private string m_IdleCleanModeSetpoint;
+        private int m_IdleCleanWaferCountSetpoint;
+        private string m_CleanRecipeFeedback;
+        private int m_IdleCleanTimeFeedback;
+        private int m_IdleCleanWaferCountFeedback;
+        private string m_IdleCleanModeFeedback;
+
+        private List<string> m_RtConfigKeys = new List<string>();
+        private Dictionary<string, object> m_RtConfigValues;
+        private List<string> m_IdleCleanModes = new List<string>();
+
+
+        #endregion
+
+        #region 属性
+        public string ModuleName
+        {
+            get { return m_ModuleName; }
+            set { m_ModuleName = value; }
+        }
+        public PMState PMCurrentState
+        {
+            get { return m_PMCurrentState; }
+            set
+            {
+
+                m_PMCurrentState = value;
+            }
+
+        }
+        public bool IsEnableCleanRecipe
+        {
+            get { return m_IsEnableCleanRecipe; }
+            set { SetProperty(ref m_IsEnableCleanRecipe, value); }
+        }
+        public TimeSpan IdleDuringTime
+        {
+            get { return m_IdleDuringTime; }
+            set { SetProperty(ref m_IdleDuringTime, value); }
+        }
+        public List<string> CurrentModuleRecipes
+        {
+            get { return m_CurrentModuleRecipes; }
+            set { SetProperty(ref m_CurrentModuleRecipes, value); }
+
+        }
+        public string SelectedCleanRecipe
+        {
+            get { return m_SelectedCleanRecipe; }
+            set { SetProperty(ref m_SelectedCleanRecipe, value); }
+        }
+        public string CleanRecipeSetpoint
+        {
+            get { return m_CleanRecipeSetpoint; }
+            set { SetProperty(ref m_CleanRecipeSetpoint, value); }
+        }
+        public int IdleCleanTimeSetpoint
+        {
+            get { return m_IdleCleanTimeSetpoint; }
+            set { SetProperty(ref m_IdleCleanTimeSetpoint, value); }
+        }
+        public int IdleCleanWaferCountSetpoint
+        {
+            get { return m_IdleCleanWaferCountSetpoint; }
+            set { SetProperty(ref m_IdleCleanWaferCountSetpoint, value); }
+        }
+        public string CleanRecipeFeedback
+        {
+            get { return m_CleanRecipeFeedback; }
+            set { SetProperty(ref m_CleanRecipeFeedback, value); }
+        }
+        public int IdleCleanTimeFeedback
+        {
+            get { return m_IdleCleanTimeFeedback; }
+            set { SetProperty(ref m_IdleCleanTimeFeedback, value); }
+        }
+        public int IdleCleanWaferCountFeedback
+        {
+            get { return m_IdleCleanWaferCountFeedback; }
+            set { SetProperty(ref m_IdleCleanWaferCountFeedback, value); }
+        }
+        public Dictionary<string, object> RtConfigValues
+        {
+            get { return m_RtConfigValues; }
+            set { SetProperty(ref m_RtConfigValues, value); }
+        }
+        public string IdleCleanModeSetpoint
+        {
+            get { return m_IdleCleanModeSetpoint; }
+            set { SetProperty(ref m_IdleCleanModeSetpoint, value); }
+        }
+        public string IdleCleanModeFeedback
+        {
+            get { return m_IdleCleanModeFeedback; }
+            set { SetProperty(ref m_IdleCleanModeFeedback, value); }
+        }
+        public List<string> IdleCleanModes
+        {
+            get { return m_IdleCleanModes; }
+            set { SetProperty(ref m_IdleCleanModes, value); }
+
+        }
+        #endregion
+
+        #region 命令
+        private DelegateCommand<object> _EnableCleanRecipeCommand;
+        public DelegateCommand<object> EnableCleanRecipeCommand =>
+            _EnableCleanRecipeCommand ?? (_EnableCleanRecipeCommand = new DelegateCommand<object>(OnEnableCleanRecipe));
+
+        private DelegateCommand _LoadRecipeCommand;
+        public DelegateCommand LoadRecipeCommand =>
+            _LoadRecipeCommand ?? (_LoadRecipeCommand = new DelegateCommand(OnLoadRecipe));
+
+        private DelegateCommand<object> _SetCommand;
+        public DelegateCommand<object> SetCommand =>
+            _SetCommand ?? (_SetCommand = new DelegateCommand<object>(OnSet));
+        #endregion
+
+        #region 构造函数
+        public CleanRecipeViewModel()
+        {
+            DispatcherTimer timer = new DispatcherTimer();
+            timer.Interval = TimeSpan.FromSeconds(0.5);
+            timer.Tick += Timer_Tick;
+            timer.Start();
+
+            IdleCleanModes.Add("Disable");
+            IdleCleanModes.Add("IdleTime");
+            IdleCleanModes.Add("WaferCount");
+        }
+
+
+        #endregion
+
+        #region 方法
+        private void Timer_Tick(object sender, EventArgs e)
+        {
+            var pmstate = QueryDataClient.Instance.Service.GetData($"{ModuleName}.FsmState");
+            PMCurrentState = (PMState)Enum.Parse(typeof(PMState), pmstate.ToString());
+            if (PMCurrentState != PMState.Idle)
+            {
+                m_IdleDuringTimeCount = 0;
+            }
+            else
+            {
+                m_IdleDuringTimeCount += 1;
+            }
+            IdleDuringTime = new System.TimeSpan(0, 0, m_IdleDuringTimeCount);
+            RtConfigValues = QueryDataClient.Instance.Service.PollConfig(m_RtConfigKeys);
+            CleanRecipeFeedback = CommonFunction.GetValue<string>(RtConfigValues, $"{ModuleName}.IdleClean.IdleCleanRecipe");
+            IdleCleanTimeFeedback = CommonFunction.GetValue<int>(RtConfigValues, $"{ModuleName}.IdleClean.IdleCleanTime");
+            IdleCleanWaferCountFeedback = CommonFunction.GetValue<int>(RtConfigValues, $"{ModuleName}.IdleClean.IdleCleanWaferCount");
+            
+            IdleCleanModeFeedback=ModeConver( CommonFunction.GetValue<string>(RtConfigValues, $"{ModuleName}.IdleClean.Option"));
+
+           
+
+        }
+        private void OnEnableCleanRecipe(object obj)
+        {
+            if (obj.ToString() == "true")
+            {
+
+            }
+            else if (obj.ToString() == "false")
+            {
+
+            }
+        }
+        private void OnLoadRecipe()
+        {
+            CurrentModuleRecipes = CommonFunction.GetFilesNames(Path.Combine(QueryDataClient.Instance.Service.GetData("GetRTPath").ToString(), "Recipes", ModuleName, "Clean")).ToList<string>();
+        }
+        public void addConfigKeys()
+        {
+            m_RtConfigKeys.Add($"{ModuleName}.IdleClean.IdleCleanRecipe");
+            m_RtConfigKeys.Add($"{ModuleName}.IdleClean.IdleCleanTime");
+            m_RtConfigKeys.Add($"{ModuleName}.IdleClean.IdleCleanWaferCount");
+            m_RtConfigKeys.Add($"{ModuleName}.IdleClean.Option");
+
+        }
+        private void OnSet(object obj)
+        {
+            switch (obj.ToString())
+            {
+                case "0":
+                    InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"{ModuleName}.IdleClean.IdleCleanRecipe", CleanRecipeSetpoint);
+                    break;
+                case "1":
+                    InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"{ModuleName}.IdleClean.IdleCleanTime", IdleCleanTimeSetpoint.ToString());
+                    break;
+                case "2":
+                    InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"{ModuleName}.IdleClean.IdleCleanWaferCount", IdleCleanWaferCountSetpoint.ToString());
+                    break;
+                case "3":
+                    if (IdleCleanModeSetpoint == "Disable")
+                    {
+                        InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"{ModuleName}.IdleClean.Option", "0");
+                    }
+                    else if (IdleCleanModeSetpoint == "IdleTime")
+                    {
+                        InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"{ModuleName}.IdleClean.Option", "1");
+                    }
+                    else if (IdleCleanModeSetpoint == "WaferCount")
+                    { 
+                        InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"{ModuleName}.IdleClean.Option", "2");
+                    }
+                    break;
+            }
+        }
+        private string ModeConver(string str)
+        {
+            if (str == "0")
+            {
+                return "Disable";
+            }
+            else if (str == "1")
+            {
+                return "IdleTime";
+            }
+            else if (str == "2")
+            {
+                return "WaferCount";
+            }
+            return "Error";
+        }
+
+        #endregion
+    }
+}

+ 1 - 1
Venus/Venus_MainPages/ViewModels/OverKepler2200AViewModel.cs

@@ -1395,7 +1395,7 @@ namespace Venus_MainPages.ViewModels
             ClearData();
             var recipePath = Path.Combine(QueryDataClient.Instance.Service.GetData("GetRTPath").ToString(), "Recipes", ModuleName, "Process", recipeName + ".rcp");
             CurrentRecipe = Recipe.Load(File.ReadAllText(recipePath));
-            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.RunRecipe}",recipeName);
+            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.RunRecipe}",recipeName, ModuleManager.ModuleInfos[ModuleName].WaferManager.Wafers[0].WaferID, "Process");
         }
 
        

+ 1 - 1
Venus/Venus_MainPages/ViewModels/OverKepler2300ViewModel.cs

@@ -1367,7 +1367,7 @@ namespace Venus_MainPages.ViewModels
             ClearData();
             var recipePath = Path.Combine(QueryDataClient.Instance.Service.GetData("GetRTPath").ToString(), "Recipes", ModuleName, "Process", recipeName + ".rcp");
             CurrentRecipe = Recipe.Load(File.ReadAllText(recipePath));
-            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.RunRecipe}", recipeName);
+            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.RunRecipe}", recipeName, ModuleManager.ModuleInfos[ModuleName].WaferManager.Wafers[0].WaferID, "Process");
         }
 
         private void OnSetChillerTemp(object obj)

+ 1 - 1
Venus/Venus_MainPages/ViewModels/OverVenusViewModel.cs

@@ -1397,7 +1397,7 @@ namespace Venus_MainPages.ViewModels
             ClearData();
             var recipePath = Path.Combine(QueryDataClient.Instance.Service.GetData("GetRTPath").ToString(), "Recipes", ModuleName,"Process", recipeName + ".rcp");
             CurrentRecipe = Recipe.Load(File.ReadAllText(recipePath));
-            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.RunRecipe}", recipeName,true, ModuleManager.ModuleInfos[ModuleName].WaferManager.Wafers[0].WaferID);
+            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.RunRecipe}", recipeName, ModuleManager.ModuleInfos[ModuleName].WaferManager.Wafers[0].WaferID, "Process");
         }
 
         private void OnSetChillerTemp()

+ 91 - 0
Venus/Venus_MainPages/Views/CleanRecipeView.xaml

@@ -0,0 +1,91 @@
+<UserControl x:Class="Venus_MainPages.Views.CleanRecipeView"
+             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:Venus_MainPages.Views"
+             xmlns:prism="http://prismlibrary.com/"
+             xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
+             prism:ViewModelLocator.AutoWireViewModel="True"
+             xmlns:unity="clr-namespace:Venus_MainPages.Unity"
+             xmlns:customControls="clr-namespace:Venus_Themes.CustomControls;assembly=Venus_Themes"
+             mc:Ignorable="d" 
+             d:DesignHeight="450" d:DesignWidth="800">
+    <Canvas>
+        <RadioButton Content="Manual"   FontSize="15"   Width="150" Height="33" Canvas.Left="500" Canvas.Top="200"  Style="{StaticResource Button_RadioButton}"  IsChecked="{Binding IsEnableCleanRecipe,Converter={StaticResource BoolToBool},Mode=TwoWay}" Command="{Binding EnableCleanRecipeCommand}" CommandParameter="true"/>
+        <RadioButton Content="Auto"    FontSize="15"   Width="150" Height="33" Canvas.Left="700" Canvas.Top="200"  Style="{StaticResource Button_RadioButton}"   IsChecked="{Binding  IsEnableCleanRecipe,Mode=TwoWay}"                                       Command="{Binding EnableCleanRecipeCommand}" CommandParameter="false"/>
+
+        <TextBox  Width="140" Height="30" Text="Clean Recipe:"  Canvas.Left="500" Canvas.Top="260" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="15" IsReadOnly="True" Background="Transparent"/>
+        <Border Width="210" Height="28"  Canvas.Left="640" Canvas.Top="261" BorderBrush="Black" BorderThickness=".7">
+            <ComboBox  ItemsSource="{Binding CurrentModuleRecipes}" SelectedItem="{Binding SelectedRecipe}" IsEnabled="{Binding IsAutoMode}" Style="{StaticResource customeComboBoxStyle}" BorderBrush="White" FontSize="15">
+                <i:Interaction.Triggers>
+                    <i:EventTrigger EventName="DropDownOpened">
+                        <i:InvokeCommandAction Command="{Binding LoadRecipeCommand}"/>
+                    </i:EventTrigger>
+                </i:Interaction.Triggers>
+            </ComboBox>
+        </Border>
+        <customControls:PathButton Width="120" Height="30" Content="Start"  Canvas.Left="880" Canvas.Top="261" IsEnabled="{Binding IsEnableCleanRecipe,Converter={StaticResource BoolToBool}}" Command="{Binding RunRecipeCommand}"/>
+        <StackPanel Canvas.Left="500" Canvas.Top="310" Orientation="Horizontal">
+            <TextBlock Text="PM Idle  During Time:" FontSize="18"/>
+            <TextBlock Grid.Row="4" Grid.Column="1" Text="{Binding IdleDuringTime, StringFormat=hh\\:mm\\:ss}"  FontSize="18" Padding="10,0,0,0"/>
+        </StackPanel>
+        <StackPanel Canvas.Left="500" Canvas.Top="360" Orientation="Horizontal">
+            <TextBlock Text="Runned Wafer Count:" FontSize="18"/>
+            <TextBlock Grid.Row="4" Grid.Column="1" Text="0"  FontSize="18" Padding="10,0,0,0"/>
+        </StackPanel>
+        <Grid Canvas.Left="500" Canvas.Top="410" Width="540" Height="175" unity:GridOptions.ShowBorder="True" unity:GridOptions.LineBrush="#afb4db"  unity:GridOptions.LineThickness="2">
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="2*"/>
+                <ColumnDefinition />
+                <ColumnDefinition />
+                <ColumnDefinition />
+            </Grid.ColumnDefinitions>
+            <Grid.RowDefinitions>
+                <RowDefinition/>
+                <RowDefinition/>
+                <RowDefinition/>
+                <RowDefinition/>
+                <RowDefinition/>
+
+
+            </Grid.RowDefinitions>
+            <TextBlock Grid.Column="1" Text="Current Value" FontSize="15" Padding="8,8,0,0"/>
+            <TextBlock Grid.Column="2" Text="New Value" FontSize="15" Padding="20,8,0,0"/>
+            <TextBlock Grid.Column="3" Text="Set" FontSize="15" Padding="40,8,0,0"/>
+
+            <TextBlock Grid.Row="1" Grid.Column="0" Text="Idle Clean Recipe" FontSize="15" Padding="5,8,0,0"/>
+            <TextBlock Grid.Row="2" Grid.Column="0" Text="Idle Clean Time" FontSize="15" Padding="5,8,0,0"/>
+            <TextBlock Grid.Row="3" Grid.Column="0" Text="Idle Clean Wafer Count" FontSize="15" Padding="5,8,0,0"/>
+            <TextBlock Grid.Row="4" Grid.Column="0" Text="Mode"                   FontSize="15" Padding="5,8,0,0"/>
+
+
+
+            <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding CleanRecipeFeedback}"        FontSize="15" Padding="5,8,0,0"/>
+            <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding IdleCleanTimeFeedback}"       FontSize="15" Padding="5,8,0,0"/>
+            <TextBlock Grid.Row="3" Grid.Column="1" Text="{Binding IdleCleanWaferCountFeedback}" FontSize="15" Padding="5,8,0,0"/>
+            <TextBlock Grid.Row="4" Grid.Column="1" Text="{Binding IdleCleanModeFeedback}" FontSize="15" Padding="5,8,0,0"/>
+
+
+            <ComboBox  Grid.Row="1" Grid.Column="2" ItemsSource="{Binding CurrentModuleRecipes}" SelectedItem="{Binding CleanRecipeSetpoint}"  Style="{StaticResource customeComboBoxStyle}" BorderBrush="White" FontSize="15">
+                <i:Interaction.Triggers>
+                    <i:EventTrigger EventName="DropDownOpened">
+                        <i:InvokeCommandAction Command="{Binding LoadRecipeCommand}"/>
+                    </i:EventTrigger>
+                </i:Interaction.Triggers>
+            </ComboBox>
+            <TextBox   Grid.Row="2" Grid.Column="2" Text="{Binding IdleCleanTimeSetpoint,UpdateSourceTrigger=PropertyChanged}"       HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
+            <TextBox   Grid.Row="3" Grid.Column="2" Text="{Binding IdleCleanWaferCountSetpoint,UpdateSourceTrigger=PropertyChanged}" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
+            <ComboBox  Grid.Row="4" Grid.Column="2" ItemsSource="{Binding IdleCleanModes}" SelectedItem="{Binding IdleCleanModeSetpoint,UpdateSourceTrigger=PropertyChanged}"  Style="{StaticResource customeComboBoxStyle}" BorderBrush="White" FontSize="15">
+       
+            </ComboBox>
+
+
+            <Button Grid.Row="1" Grid.Column="3" Content="Set" Margin="1" Command="{Binding SetCommand}" CommandParameter="0"/>
+            <Button Grid.Row="2" Grid.Column="3" Content="Set" Margin="1" Command="{Binding SetCommand}" CommandParameter="1"/>
+            <Button Grid.Row="3" Grid.Column="3" Content="Set" Margin="1" Command="{Binding SetCommand}" CommandParameter="2"/>
+            <Button Grid.Row="4" Grid.Column="3" Content="Set" Margin="1" Command="{Binding SetCommand}" CommandParameter="3"/>
+
+        </Grid>
+    </Canvas>
+</UserControl>

+ 34 - 0
Venus/Venus_MainPages/Views/CleanRecipeView.xaml.cs

@@ -0,0 +1,34 @@
+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;
+using Venus_MainPages.ViewModels;
+
+namespace Venus_MainPages.Views
+{
+    /// <summary>
+    /// CleanRecipeView.xaml 的交互逻辑
+    /// </summary>
+    public partial class CleanRecipeView : UserControl
+    {
+        public CleanRecipeView()
+        {
+            InitializeComponent();
+        }
+        public void Init(string systemName)
+        {
+            (this.DataContext as CleanRecipeViewModel).ModuleName = systemName;
+            (this.DataContext as CleanRecipeViewModel).addConfigKeys();
+        }
+    }
+}

+ 4 - 4
Venus/Venus_RT/Config/System.sccfg

@@ -737,7 +737,7 @@
 
 		<!--Clean-->
 		<configs name="IdleClean" nameView="Idle Clean" visible="false">
-			<config default="0" name="Option" nameView="Idle Clean Option" description="0, disable; 1, By Idle Time; 2, By Wafer Count" max="0" min="2" paramter="" tag="" unit="" type="Integer" />
+			<config default="0" name="Option" nameView="Idle Clean Option" description="0, disable; 1, By Idle Time; 2, By Wafer Count" max="2" min="0" paramter="" tag="" unit="" type="Integer" />
 			<config default="" name="IdleCleanRecipe" nameView="Idle Clean Recipe" description="Idle Clean recipe name" max="" min="" paramter="" tag="" unit="" type="String" />
 			<config default="10" name="IdleCleanTime" nameView="Idle Clean Time(Hours)" description="Chamber Idle Time(hours) which trigger Idle Clean" max="720" min="1" paramter="" tag="" unit="h" type="Integer" />
 			<config default="100" name="IdleCleanWaferCount" nameView="Idle Clean Wafer Count" description="Wafer Count which trigger Idle Clean" max="100000" min="1" paramter="" tag="" unit="pcs" type="Integer" />
@@ -1243,7 +1243,7 @@
 
 		<!--Clean-->
 		<configs name="IdleClean" nameView="Idle Clean" visible="false">
-			<config default="0" name="Option" nameView="Idle Clean Option" description="0, disable; 1, By Idle Time; 2, By Wafer Count" max="0" min="2" paramter="" tag="" unit="" type="Integer" />
+			<config default="0" name="Option" nameView="Idle Clean Option" description="0, disable; 1, By Idle Time; 2, By Wafer Count" max="2" min="0" paramter="" tag="" unit="" type="Integer" />
 			<config default="" name="IdleCleanRecipe" nameView="Idle Clean Recipe" description="Idle Clean recipe name" max="" min="" paramter="" tag="" unit="" type="String" />
 			<config default="10" name="IdleCleanTime" nameView="Idle Clean Time(Hours)" description="Chamber Idle Time(hours) which trigger Idle Clean" max="720" min="1" paramter="" tag="" unit="h" type="Integer" />
 			<config default="100" name="IdleCleanWaferCount" nameView="Idle Clean Wafer Count" description="Wafer Count which trigger Idle Clean" max="100000" min="1" paramter="" tag="" unit="pcs" type="Integer" />
@@ -1749,7 +1749,7 @@
 
 		<!--Clean-->
 		<configs name="IdleClean" nameView="Idle Clean" visible="false">
-			<config default="0" name="Option" nameView="Idle Clean Option" description="0, disable; 1, By Idle Time; 2, By Wafer Count" max="0" min="2" paramter="" tag="" unit="" type="Integer" />
+			<config default="0" name="Option" nameView="Idle Clean Option" description="0, disable; 1, By Idle Time; 2, By Wafer Count" max="2" min="0" paramter="" tag="" unit="" type="Integer" />
 			<config default="" name="IdleCleanRecipe" nameView="Idle Clean Recipe" description="Idle Clean recipe name" max="" min="" paramter="" tag="" unit="" type="String" />
 			<config default="10" name="IdleCleanTime" nameView="Idle Clean Time(Hours)" description="Chamber Idle Time(hours) which trigger Idle Clean" max="720" min="1" paramter="" tag="" unit="h" type="Integer" />
 			<config default="100" name="IdleCleanWaferCount" nameView="Idle Clean Wafer Count" description="Wafer Count which trigger Idle Clean" max="100000" min="1" paramter="" tag="" unit="pcs" type="Integer" />
@@ -2255,7 +2255,7 @@
 
 	<!--Clean-->
 	<configs name="IdleClean" nameView="Idle Clean" visible="false">
-		<config default="0" name="Option" nameView="Idle Clean Option" description="0, disable; 1, By Idle Time; 2, By Wafer Count" max="0" min="2" paramter="" tag="" unit="" type="Integer" />
+		<config default="0" name="Option" nameView="Idle Clean Option" description="0, disable; 1, By Idle Time; 2, By Wafer Count" max="2" min="0" paramter="" tag="" unit="" type="Integer" />
 		<config default="" name="IdleCleanRecipe" nameView="Idle Clean Recipe" description="Idle Clean recipe name" max="" min="" paramter="" tag="" unit="" type="String" />
 		<config default="10" name="IdleCleanTime" nameView="Idle Clean Time(Hours)" description="Chamber Idle Time(hours) which trigger Idle Clean" max="720" min="1" paramter="" tag="" unit="h" type="Integer" />
 		<config default="100" name="IdleCleanWaferCount" nameView="Idle Clean Wafer Count" description="Wafer Count which trigger Idle Clean" max="100000" min="1" paramter="" tag="" unit="pcs" type="Integer" />

+ 8 - 9
Venus/Venus_Themes/Styles/ToggleButton.xaml

@@ -28,16 +28,16 @@
                     <ControlTemplate.Resources>
                         <Storyboard x:Key="OnChecked1">
                             <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Margin)" Storyboard.TargetName="path">
-                                <EasingThicknessKeyFrame KeyTime="0:0:0.2" Value="60,0,0,0"/>
+                                <EasingThicknessKeyFrame KeyTime="0:0:0.2" Value="110,0,0,0"/>
                             </ThicknessAnimationUsingKeyFrames>
                             <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Margin)" Storyboard.TargetName="path1">
-                                <EasingThicknessKeyFrame KeyTime="0:0:0.2" Value="60,0,0,0"/>
+                                <EasingThicknessKeyFrame KeyTime="0:0:0.2" Value="110,0,0,0"/>
                             </ThicknessAnimationUsingKeyFrames>
                             <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Margin)" Storyboard.TargetName="path2">
-                                <EasingThicknessKeyFrame KeyTime="0:0:0.2" Value="60,0,0,0"/>
+                                <EasingThicknessKeyFrame KeyTime="0:0:0.2" Value="110,0,0,0"/>
                             </ThicknessAnimationUsingKeyFrames>
                             <StringAnimationUsingKeyFrames Storyboard.TargetProperty="(TextBlock.Text)" Storyboard.TargetName="displayText">
-                                <DiscreteStringKeyFrame KeyTime="0" Value="EN"/>
+                                <DiscreteStringKeyFrame KeyTime="0" Value="Enable"/>
                             </StringAnimationUsingKeyFrames>
                         </Storyboard>
                         <Storyboard x:Key="OnUnchecked1">
@@ -54,17 +54,17 @@
                                 <EasingThicknessKeyFrame KeyTime="0:0:0.2" Value="0"/>
                             </ThicknessAnimationUsingKeyFrames>
                             <StringAnimationUsingKeyFrames Storyboard.TargetProperty="(TextBlock.Text)" Storyboard.TargetName="displayText">
-                                <DiscreteStringKeyFrame KeyTime="0" Value="CHS"/>
+                                <DiscreteStringKeyFrame KeyTime="0" Value="Disable"/>
                             </StringAnimationUsingKeyFrames>
                         </Storyboard>
                     </ControlTemplate.Resources>
-                    <Border CornerRadius="20" Background="Transparent"  Width="100" Height="40">
+                    <Border CornerRadius="20" Background="Green"  Width="{TemplateBinding Width}" Height="40">
                         <Grid>
-                            <TextBlock x:Name="displayText" Text="CHS"  Foreground="Black"  FontSize="20" VerticalAlignment="Center">
+                            <TextBlock x:Name="displayText" Text="Disable"  Foreground="Black"  FontSize="20" VerticalAlignment="Center">
                                 <TextBlock.Style>
                                     <Style TargetType="TextBlock">
                                         <Style.Triggers>
-                                            <Trigger Property="Text" Value="CHS">
+                                            <Trigger Property="Text" Value="Disable">
                                                 <Setter Property="HorizontalAlignment"  Value="Right"/>
                                                 <Setter Property="Padding"  Value="0,0,15,0"/>
                                             </Trigger>
@@ -114,7 +114,6 @@
                     <ControlTemplate.Triggers>
                         <EventTrigger RoutedEvent="ToggleButton.Checked">
                             <BeginStoryboard Storyboard="{StaticResource OnChecked1}"/>
-
                         </EventTrigger>
                         <EventTrigger RoutedEvent="ToggleButton.Unchecked">
                             <BeginStoryboard x:Name="OnUnchecked1_BeginStoryboard" Storyboard="{StaticResource OnUnchecked1}"/>

+ 42 - 0
Venus/Venus_UI/Config/UIMenu.json

@@ -89,6 +89,12 @@
         "Name": "RF Calibration",
         "View": "RFCalibrationView",
         "IsShow": "false"
+      },
+      {
+        "Id": "CleanRecipe",
+        "Name": "Clean",
+        "View": "CleanRecipeView",
+        "IsShow": "true"
       }
 
     ]
@@ -145,6 +151,18 @@
         "Name": "VAT Performance",
         "View": "VATPerformanceView",
         "IsShow": "true"
+      },
+      {
+        "Id": "RFCalibration",
+        "Name": "RF Calibration",
+        "View": "RFCalibrationView",
+        "IsShow": "false"
+      },
+      {
+        "Id": "CleanRecipe",
+        "Name": "Clean",
+        "View": "CleanRecipeView",
+        "IsShow": "true"
       }
 
     ]
@@ -195,6 +213,18 @@
         "Name": "VAT Performance",
         "View": "VATPerformanceView",
         "IsShow": "true"
+      },
+      {
+        "Id": "RFCalibration",
+        "Name": "RF Calibration",
+        "View": "RFCalibrationView",
+        "IsShow": "false"
+      },
+      {
+        "Id": "CleanRecipe",
+        "Name": "Clean",
+        "View": "CleanRecipeView",
+        "IsShow": "true"
       }
 
     ]
@@ -247,6 +277,18 @@
         "Name": "VAT Performance",
         "View": "VATPerformanceView",
         "IsShow": "true"
+      },
+      {
+        "Id": "RFCalibration",
+        "Name": "RF Calibration",
+        "View": "RFCalibrationView",
+        "IsShow": "false"
+      },
+      {
+        "Id": "CleanRecipe",
+        "Name": "Clean",
+        "View": "CleanRecipeView",
+        "IsShow": "true"
       }
 
     ]