瀏覽代碼

Add SRD Flipper Animation;

niuyx 1 周之前
父節點
當前提交
72f614e1ff

+ 48 - 5
CyberX8_MainPages/ViewModels/SRDHomePageViewModel.cs

@@ -1,9 +1,5 @@
 using System;
 using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Windows.Data;
 using System.Windows.Input;
 using System.Windows.Threading;
 using MECF.Framework.Common.OperationCenter;
@@ -37,6 +33,8 @@ namespace CyberX8_MainPages.ViewModels
         private const double ARM_UI_HOME_POSITION = 25.682;
         private const double ARM_UI_CENTER_POSITION = -15;
         private const double ROTATION_UI_HOME_POSITION = 0;
+        private const double FLIPPER_IN_POSITION = 41;
+        private const double FLIPPER_OUT_POSITION = 0;
         #endregion
 
         #region 内部变量
@@ -203,6 +201,18 @@ namespace CyberX8_MainPages.ViewModels
         /// Arm UI位置比例
         /// </summary>
         private double _armUIRatio;
+        /// <summary>
+        /// Flipper200 UI位置
+        /// </summary>
+        private ObservableCollection<double> _flipper200UIPosition = new ObservableCollection<double>(new double[3]);
+        /// <summary>
+        /// Flipper150 UI位置
+        /// </summary>
+        private ObservableCollection<double> _flipper150UIPosition = new ObservableCollection<double>(new double[3]);
+        /// <summary>
+        /// Flipper100 UI位置
+        /// </summary>
+        private ObservableCollection<double> _flipper100UIPosition = new ObservableCollection<double>(new double[3]);
         #endregion
         #endregion
 
@@ -451,7 +461,30 @@ namespace CyberX8_MainPages.ViewModels
             get { return _srdRotationUIPosition; }
             set { SetProperty(ref _srdRotationUIPosition, value); }
         }
-        
+        /// <summary>
+        /// Flipper200 UI位置
+        /// </summary>
+        public ObservableCollection<double> Flipper200UIPosition
+        {
+            get { return _flipper200UIPosition; }
+            set { SetProperty(ref _flipper200UIPosition, value); }
+        }
+        /// <summary>
+        /// Flipper150 UI位置
+        /// </summary>
+        public ObservableCollection<double> Flipper150UIPosition
+        {
+            get { return _flipper150UIPosition; }
+            set { SetProperty(ref _flipper150UIPosition, value); }
+        }
+        /// <summary>
+        /// Flipper100 UI位置
+        /// </summary>
+        public ObservableCollection<double> Flipper100UIPosition
+        {
+            get { return _flipper100UIPosition; }
+            set { SetProperty(ref _flipper100UIPosition, value); }
+        }
         #endregion
 
         #endregion
@@ -613,6 +646,16 @@ namespace CyberX8_MainPages.ViewModels
                     {
                         TimeRemaining = 0;
                     }
+                    //Flipper Position
+                    Flipper200UIPosition[0] = SRDCommonData.Flipper1Out200Status ? FLIPPER_OUT_POSITION : FLIPPER_IN_POSITION;
+                    Flipper200UIPosition[1] = SRDCommonData.Flipper2Out200Status ? FLIPPER_OUT_POSITION : FLIPPER_IN_POSITION;
+                    Flipper200UIPosition[2] = SRDCommonData.Flipper3Out200Status ? FLIPPER_OUT_POSITION : FLIPPER_IN_POSITION;
+                    Flipper150UIPosition[0] = SRDCommonData.Flipper1Out150Status ? FLIPPER_OUT_POSITION : FLIPPER_IN_POSITION;
+                    Flipper150UIPosition[1] = SRDCommonData.Flipper2Out150Status ? FLIPPER_OUT_POSITION : FLIPPER_IN_POSITION;
+                    Flipper150UIPosition[2] = SRDCommonData.Flipper3Out150Status ? FLIPPER_OUT_POSITION : FLIPPER_IN_POSITION;
+                    //Flipper100UIPosition[0] = SRDCommonData.Flipper1Out100Status ? FLIPPER_OUT_POSITION : FLIPPER_IN_POSITION;
+                    //Flipper100UIPosition[1] = SRDCommonData.Flipper2Out100Status ? FLIPPER_OUT_POSITION : FLIPPER_IN_POSITION;
+                    //Flipper100UIPosition[2] = SRDCommonData.Flipper3Out100Status ? FLIPPER_OUT_POSITION : FLIPPER_IN_POSITION;
                 }
             }
         }

+ 4 - 2
CyberX8_MainPages/Views/SRDHomePageView.xaml

@@ -51,7 +51,7 @@
                             RecipeType="{Binding RecipeType}"
                             SelectedRecipeNode="{Binding SelectedRecipeNode,Mode=TwoWay}"
                             CurrentOperationMode="{Binding SRDPersistent.OperatingMode}"
-                            AchievedCycleTimes="{Binding AchievedRunRecipeCycle}" Loaded="RecipeControl_Loaded"
+                            AchievedCycleTimes="{Binding AchievedRunRecipeCycle}" 
                             RecipeModeValue ="{Binding SRDPersistent.RecipeOperatingMode}"
                             />
         </Grid>
@@ -116,7 +116,9 @@
 
         <Grid Grid.Row="3" Grid.Column="1" Grid.RowSpan="2" Grid.ColumnSpan="2">
             <UserControls:SRDUIControl HorizontalAlignment="Left" ArmUIPosition="{Binding SRDArmUIPosition}" RotationUIPosition="{Binding SRDRotationUIPosition}" 
-                                       WaferInfo="{Binding WaferInfo}" CommonData="{Binding SRDCommonData}" IsEnabled="{Binding IsEnabled}"/>
+                                       WaferInfo="{Binding WaferInfo}" CommonData="{Binding SRDCommonData}" IsEnabled="{Binding IsEnabled}"
+                                       Flipper1UIPosition200="{Binding Flipper200UIPosition[0]}" Flipper2UIPosition200="{Binding Flipper200UIPosition[1]}" Flipper3UIPosition200="{Binding Flipper200UIPosition[2]}"
+                                       Flipper1UIPosition150="{Binding Flipper150UIPosition[0]}" Flipper2UIPosition150="{Binding Flipper150UIPosition[1]}" Flipper3UIPosition150="{Binding Flipper150UIPosition[2]}"/>
         </Grid>
 
         <Grid Grid.Row="4" Grid.Column="0">

+ 1 - 20
CyberX8_MainPages/Views/SRDHomePageView.xaml.cs

@@ -1,18 +1,4 @@
-using CyberX8_MainPages.ViewModels;
-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 System.Windows.Controls;
 
 namespace CyberX8_MainPages.Views
 {
@@ -25,10 +11,5 @@ namespace CyberX8_MainPages.Views
         {
             InitializeComponent();
         }
-
-        private void RecipeControl_Loaded(object sender, RoutedEventArgs e)
-        {
-
-        }
     }
 }

+ 1 - 5
CyberX8_RT/Devices/SRD/SrdCommonDevice.cs

@@ -851,11 +851,7 @@ namespace CyberX8_RT.Devices.SRD
                 {
                     LOG.WriteLog(eEvent.INFO_SRD, Module, "EnterError: Water Off is failed");
                 }
-            }
-            
-            //停电机
-            JetAxisBase _rotationAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Rotation");
-            if (_rotationAxis != null && _rotationAxis.IsRun) _rotationAxis.StopPositionOperation();
+            }           
 
         }
         #endregion

+ 14 - 14
CyberX8_RT/Modules/SRD/SRDLoaderRoutine.cs

@@ -16,13 +16,13 @@ namespace CyberX8_RT.Modules.SRD
     {
         private enum SRDLoaderStep 
         {
-            Loader_LiftUpOff,
-            Loader_FlippersIn,
-            Loader_N2On,
-            Loader_Delay,
-            Loader_N2Off,
-            Loader_ChuckVacuumOn,
-            Loader_FlippersOut,
+            Load_LiftUpOff,
+            Load_FlippersIn,
+            Load_N2On,
+            Load_Delay,
+            Load_N2Off,
+            Load_ChuckVacuumOn,
+            Load_FlippersOut,
             End
         }
         #region 常量 
@@ -74,13 +74,13 @@ namespace CyberX8_RT.Modules.SRD
         /// <returns></returns>
         public RState Monitor()
         {
-            Runner.Run(SRDLoaderStep.Loader_LiftUpOff, LiftUpOff, CheckLiftUpOffEndStatus, CheckLiftUpOffStopStatus)
-                .Run(SRDLoaderStep.Loader_FlippersIn, FlippersIn, CheckFlippersInEndStatus, CheckFlippersInStopStatus)
-                .Run(SRDLoaderStep.Loader_N2On, N2On, _delay_1ms)
-                .Delay(SRDLoaderStep.Loader_Delay, 500)
-                .Run(SRDLoaderStep.Loader_N2Off, N2Off, _delay_1ms)
-                .Run(SRDLoaderStep.Loader_ChuckVacuumOn, ChuckVacuumOn, CheckChuckVacuumOnEndStatus, CheckChuckVacuumOnStopStatus)
-                .Run(SRDLoaderStep.Loader_FlippersOut, FlippersOut, CheckFlippersOutEndStatus, CheckFlippersOutStopStatus)
+            Runner.Run(SRDLoaderStep.Load_LiftUpOff, LiftUpOff, CheckLiftUpOffEndStatus, CheckLiftUpOffStopStatus)
+                .Run(SRDLoaderStep.Load_FlippersIn, FlippersIn, CheckFlippersInEndStatus, CheckFlippersInStopStatus)
+                .Run(SRDLoaderStep.Load_N2On, N2On, _delay_1ms)
+                .Delay(SRDLoaderStep.Load_Delay, 500)
+                .Run(SRDLoaderStep.Load_N2Off, N2Off, _delay_1ms)
+                .Run(SRDLoaderStep.Load_ChuckVacuumOn, ChuckVacuumOn, CheckChuckVacuumOnEndStatus, CheckChuckVacuumOnStopStatus)
+                .Run(SRDLoaderStep.Load_FlippersOut, FlippersOut, CheckFlippersOutEndStatus, CheckFlippersOutStopStatus)
                 .End(SRDLoaderStep.End, NullFun, _delay_1ms);
             return Runner.Status;
         }

+ 23 - 23
CyberX8_RT/Modules/SRD/SRDProcessRecipeRoutine.cs

@@ -14,8 +14,6 @@ using Aitex.Core.RT.SCCore;
 using Aitex.Core.RT.Device;
 using CyberX8_RT.Devices.Facilities;
 using Aitex.Core.Util;
-using CyberX8_RT.Modules.Transporter;
-using MECF.Framework.Common.WaferHolder;
 using MECF.Framework.Common.Persistent.SRD;
 
 namespace CyberX8_RT.Modules.SRD
@@ -29,11 +27,11 @@ namespace CyberX8_RT.Modules.SRD
         private enum SRDProcessState
         {
             Ready,    
-            StartLoader,
+            StartLoad,
             Loading,
             StartRunRecipe,
             RunReciping,
-            StartUnloader,
+            StartUnload,
             Unloading,
             CycleEnd,
             End
@@ -51,7 +49,7 @@ namespace CyberX8_RT.Modules.SRD
         /// <summary>
         /// Arm Axis
         /// </summary>
-        private JetAxisBase _armAxis;
+        //private JetAxisBase _armAxis;
         /// <summary>
         /// SRD Recipe
         /// </summary>
@@ -127,7 +125,7 @@ namespace CyberX8_RT.Modules.SRD
         public SRDProcessRecipeRoutine(string module, JetAxisBase rotationAxis, JetAxisBase armAxis, SrdCommonDevice srdCommon) : base(module)
         {
             _rotationAxis = rotationAxis;
-            _armAxis = armAxis;
+            //_armAxis = armAxis;
             _srdCommonDevice = srdCommon;
             _runRecipeRoutine = new SRDRunRecipeRoutine(module);
             _unloaderRoutine= new SRDUnloaderRoutine(module);
@@ -155,6 +153,8 @@ namespace CyberX8_RT.Modules.SRD
             {
                 _srdCommonDevice.EnterErrorOperation();
             }
+            //停电机
+            if (_rotationAxis != null && _rotationAxis.IsRun) _rotationAxis.StopPositionOperation();
         }
         /// <summary>
         /// 监控
@@ -166,13 +166,13 @@ namespace CyberX8_RT.Modules.SRD
             LottrackRecord();
             Runner.LoopStart(SRDProcessState.Ready, "Process Recipe Start", _cycleCount, NullFun, _delay_1ms)
 
-                .LoopRunIf(SRDProcessState.StartLoader, !_isManual,() => { return StartLoader(); }, _delay_1ms)
+                .LoopRunIf(SRDProcessState.StartLoad, !_isManual,() => { return StartLoad(); }, _delay_1ms)
                 .LoopRunIfWithStopStatus(SRDProcessState.Loading, !_isManual, CheckLoaderEndStatus, CheckLoaderErrorStatus)
 
                 .LoopRun(SRDProcessState.StartRunRecipe, () => { return StartRunRecipe(); }, _delay_1ms)
                 .LoopRunWithStopStatus(SRDProcessState.RunReciping, CheckRunRecipeEndStatus, CheckRunRecipeErrorStatus)
 
-                .LoopRunIf(SRDProcessState.StartUnloader, !_isManual, () => { return StartUnloader(); }, _delay_1ms)
+                .LoopRunIf(SRDProcessState.StartUnload, !_isManual, () => { return StartUnload(); }, _delay_1ms)
                 .LoopRunIfWithStopStatus(SRDProcessState.Unloading, !_isManual, CheckUnloaderEndStatus, CheckUnloaderErrorStatus)
 
                 .LoopEnd(SRDProcessState.CycleEnd, NullFun, _delay_1ms)             
@@ -230,7 +230,7 @@ namespace CyberX8_RT.Modules.SRD
         /// </summary>
         /// <param name="recipe"></param>
         /// <returns></returns>
-        private bool StartLoader()
+        private bool StartLoad()
         {
             bool result = _loaderRoutine.Start() == RState.Running;
             if (!result)
@@ -322,7 +322,7 @@ namespace CyberX8_RT.Modules.SRD
         /// </summary>
         /// <param name="recipe"></param>
         /// <returns></returns>
-        private bool StartUnloader()
+        private bool StartUnload()
         {
             bool result= _unloaderRoutine.Start(false) == RState.Running;
             if (!result)
@@ -362,9 +362,9 @@ namespace CyberX8_RT.Modules.SRD
         private string GetCurrentStateMachine()
         {
             string result;
-            if(Runner.CurrentStep.ToString() == "Ready")
+            if (Runner.CurrentStep.ToString().Contains("Loading"))
             {
-                result = "Ready";
+                result = _loaderRoutine.CurrentStep;
             }
             else if(Runner.CurrentStep.ToString().Contains("RunReciping"))
             {
@@ -376,7 +376,7 @@ namespace CyberX8_RT.Modules.SRD
             }
             else
             {
-                result = "End";
+                result = Runner.CurrentStep.ToString();
             }
             return result;
         }
@@ -429,16 +429,16 @@ namespace CyberX8_RT.Modules.SRD
         /// <returns></returns>
         public bool CheckCompleteCondition(int index)
         {
-            if (_armAxis.IsRun)
-            {
-                NotifyError(eEvent.ERR_SRD, "Arm axis is run", 0);
-                return false;
-            }
-            if (!_armAxis.IsHomed)
-            {
-                NotifyError(eEvent.ERR_SRD, "Arm axis is not homed", 0);
-                return false;
-            }
+            //if (_armAxis.IsRun)
+            //{
+            //    NotifyError(eEvent.ERR_SRD, "Arm axis is run", 0);
+            //    return false;
+            //}
+            //if (!_armAxis.IsHomed)
+            //{
+            //    NotifyError(eEvent.ERR_SRD, "Arm axis is not homed", 0);
+            //    return false;
+            //}
             if (_rotationAxis.IsRun)
             {
                 NotifyError(eEvent.ERR_SRD, "Rotation axis is run", 0);

+ 14 - 17
CyberX8_RT/Modules/SRD/SRDUnloaderRoutine.cs

@@ -8,11 +8,8 @@ using CyberX8_RT.Devices.AXIS;
 using CyberX8_RT.Devices.Facilities;
 using CyberX8_RT.Devices.SRD;
 using MECF.Framework.Common.Equipment;
-using MECF.Framework.Common.RecipeCenter;
 using MECF.Framework.Common.Routine;
 using MECF.Framework.Common.SubstrateTrackings;
-using System;
-using System.Windows.Input;
 
 namespace CyberX8_RT.Modules.SRD
 {
@@ -20,13 +17,13 @@ namespace CyberX8_RT.Modules.SRD
     {         
         private enum SRDUnloaderStep
         {
-            Unloader_FlippersOut,
-            Unloader_ChuckVacuumOff,
-            Unloader_ChuckATMOn,
-            Unloader_CheckVacuum,
-            Unloader_LiftUpOn,
-            Unloader_CheckWaferPresent,
-            Unloader_OpenDoor,
+            Unload_FlippersOut,
+            Unload_ChuckVacuumOff,
+            Unload_ChuckATMOn,
+            Unload_CheckVacuum,
+            Unload_LiftUpOn,
+            Unload_CheckWaferPresent,
+            Unload_OpenDoor,
             End
         }
         #region 常量 
@@ -91,13 +88,13 @@ namespace CyberX8_RT.Modules.SRD
         /// <returns></returns>
         public RState Monitor()
         {
-            Runner.RunIf(SRDUnloaderStep.Unloader_FlippersOut, _isProcessError, FlippersOut, CheckFlippersOutEndStatus, CheckFlippersOutStopStatus)
-                .Run(SRDUnloaderStep.Unloader_ChuckVacuumOff, ChuckVacuumOff, CheckChuckVacuumOffEndStatus, CheckChuckVacuumOffStopStatus)
-                .Run(SRDUnloaderStep.Unloader_ChuckATMOn, ChuckATMOn, CheckChuckATMEndStatus, CheckChuckATMStopStatus)
-                .WaitWithStopCondition(SRDUnloaderStep.Unloader_CheckVacuum, CheckVacuumEndStatus, CheckVacuumStopStatus)
-                .Run(SRDUnloaderStep.Unloader_LiftUpOn, LiftUpOn, CheckLiftUpOnEndStatus, CheckLiftUpOnStopStatus)
-                .Run(SRDUnloaderStep.Unloader_CheckWaferPresent, CheckWaferPresent, _delay_1ms)
-                .Run(SRDUnloaderStep.Unloader_OpenDoor, OpenDoor, CheckDoorOpenedEndStatus, CheckDoorOpenedStopStatus)
+            Runner.RunIf(SRDUnloaderStep.Unload_FlippersOut, _isProcessError, FlippersOut, CheckFlippersOutEndStatus, CheckFlippersOutStopStatus)
+                .Run(SRDUnloaderStep.Unload_ChuckVacuumOff, ChuckVacuumOff, CheckChuckVacuumOffEndStatus, CheckChuckVacuumOffStopStatus)
+                .Run(SRDUnloaderStep.Unload_ChuckATMOn, ChuckATMOn, CheckChuckATMEndStatus, CheckChuckATMStopStatus)
+                .WaitWithStopCondition(SRDUnloaderStep.Unload_CheckVacuum, CheckVacuumEndStatus, CheckVacuumStopStatus)
+                .Run(SRDUnloaderStep.Unload_LiftUpOn, LiftUpOn, CheckLiftUpOnEndStatus, CheckLiftUpOnStopStatus)
+                .Run(SRDUnloaderStep.Unload_CheckWaferPresent, CheckWaferPresent, _delay_1ms)
+                .Run(SRDUnloaderStep.Unload_OpenDoor, OpenDoor, CheckDoorOpenedEndStatus, CheckDoorOpenedStopStatus)
                 .End(SRDUnloaderStep.End, NullFun, _delay_1ms);
             return Runner.Status;
         }

+ 1 - 0
CyberX8_Themes/CyberX8_Themes.csproj

@@ -1232,6 +1232,7 @@
     <Content Include="Themes\Images\parts\doorunknown.png" />
     <Content Include="Themes\Images\parts\efem.png" />
     <Content Include="Themes\Images\parts\efemtrack.png" />
+    <Resource Include="Themes\Images\parts\Flipper.png" />
     <Content Include="Themes\Images\parts\loadlock.png" />
     <Content Include="Themes\Images\parts\loadport.png" />
     <Resource Include="Themes\Images\parts\serobot\SERobot1.png" />

二進制
CyberX8_Themes/Themes/Images/parts/Flipper.png


+ 160 - 2
CyberX8_Themes/UserControls/SRDUIControl.xaml

@@ -34,7 +34,7 @@
     <Viewbox>
         <Canvas Width="480" Height="450" RenderTransformOrigin="0.5,0.533">
             <!--Exhaust-->
-            <local:Blower IsPowerOn="{Binding ElementName=self,Path=CommonData.ExhaustOn}" HorizontalAlignment="Center" Canvas.Left="165" VerticalAlignment="Top" RenderTransformOrigin="0.5,0.5" Height="94" Canvas.Top="-50" >
+            <local:Blower IsPowerOn="{Binding ElementName=self,Path=CommonData.N2On}" HorizontalAlignment="Center" Canvas.Left="165" VerticalAlignment="Top" RenderTransformOrigin="0.5,0.5" Height="94" Canvas.Top="-50" >
                 <local:Blower.RenderTransform>
                     <TransformGroup>
                         <ScaleTransform/>
@@ -62,7 +62,7 @@
                 </Canvas.RenderTransform>
 
                 <Image Source="pack://application:,,,/CyberX8_Themes;component/Themes/Images/parts/SRDChuck.png" HorizontalAlignment="Center" VerticalAlignment="Center" Canvas.Left="68.7" Canvas.Top="68.1" />
-                <Viewbox Width="156" Height="156"  Canvas.Left="27" Canvas.Top="26.5" HorizontalAlignment="Left" VerticalAlignment="Top" >
+                <Viewbox Width="140" Height="140"  Canvas.Left="35.5" Canvas.Top="35" HorizontalAlignment="Left" VerticalAlignment="Top" >
                     <local:WaferCtrl WaferData="{Binding ElementName=self, Path=WaferInfo}"/>
                 </Viewbox>
             </Canvas>
@@ -136,6 +136,164 @@
                     </LinearGradientBrush>
                 </Rectangle.Fill>
             </Rectangle>
+            <!--Flipper 动画-->
+            <!--Flipper1_200-->
+            <Canvas Canvas.Left="177" Canvas.Top="278" RenderTransformOrigin="1.133,1.083" Height="55" Width="20">
+                <Canvas.RenderTransform>
+                    <TransformGroup>
+                        <ScaleTransform/>
+                        <SkewTransform/>
+                        <RotateTransform Angle="{Binding ElementName=self,Path=Flipper1UIPosition200}"/>
+                        <TranslateTransform/>
+                    </TransformGroup>
+                </Canvas.RenderTransform>
+                <Image Source="pack://application:,,,/CyberX8_Themes;component/Themes/Images/parts/Flipper.png" HorizontalAlignment="Left" VerticalAlignment="Top" Height="63" Width="30" RenderTransformOrigin="0.266,0.719" Canvas.Left="15" Canvas.Top="15">
+                    <Image.RenderTransform>
+                        <RotateTransform Angle="-50"/>
+                    </Image.RenderTransform>
+                </Image>
+                <Label Content="200" FontSize="7" FontWeight="Normal" HorizontalAlignment="Left" Height="20" VerticalAlignment="Top" Width="25" RenderTransformOrigin="0.56,0.738" Canvas.Top="-22" Canvas.Left="58">
+                    <Label.RenderTransform>
+                        <TransformGroup>
+                            <ScaleTransform/>
+                            <SkewTransform/>
+                            <RotateTransform Angle="-145.026"/>
+                            <TranslateTransform X="-61.999" Y="52.237"/>
+                        </TransformGroup>
+                    </Label.RenderTransform>
+                </Label>
+            </Canvas>
+            <!--Flipper2_200-->
+            <Canvas Canvas.Left="167" Canvas.Top="190" RenderTransformOrigin="0.123,-0.241" Height="56" Width="20" HorizontalAlignment="Left" VerticalAlignment="Center">
+                <Canvas.RenderTransform>
+                    <TransformGroup>
+                        <ScaleTransform/>
+                        <SkewTransform/>
+                        <RotateTransform Angle="{Binding ElementName=self,Path=Flipper2UIPosition200}"/>
+                        <TranslateTransform/>
+                    </TransformGroup>
+                </Canvas.RenderTransform>
+                <Image Source="pack://application:,,,/CyberX8_Themes;component/Themes/Images/parts/Flipper.png" HorizontalAlignment="Left" VerticalAlignment="Center" Height="63" Width="30" RenderTransformOrigin="0.266,0.719" Canvas.Top="-60" Canvas.Left="-5">
+                    <Image.RenderTransform>
+                        <RotateTransform Angle="60"/>
+                    </Image.RenderTransform>
+                </Image>
+                <Label Content="200" FontSize="7" FontWeight="Normal" HorizontalAlignment="Center" Height="20" VerticalAlignment="Center" Width="25" RenderTransformOrigin="0.5,0.5" Canvas.Top="-33" Canvas.Left="3">
+                    <Label.RenderTransform>
+                        <TransformGroup>
+                            <ScaleTransform/>
+                            <SkewTransform/>
+                            <RotateTransform Angle="-34.79"/>
+                            <TranslateTransform/>
+                        </TransformGroup>
+                    </Label.RenderTransform>
+                </Label>
+            </Canvas>
+            <!--Flipper3_200-->
+            <Canvas Canvas.Left="303" Canvas.Top="270" RenderTransformOrigin="1.661,-0.902" Height="55" Width="20" HorizontalAlignment="Left" VerticalAlignment="Center">
+                <Canvas.RenderTransform>
+                    <TransformGroup>
+                        <ScaleTransform/>
+                        <SkewTransform/>
+                        <RotateTransform Angle="{Binding ElementName=self,Path=Flipper3UIPosition200}"/>
+                        <TranslateTransform/>
+                    </TransformGroup>
+                </Canvas.RenderTransform>
+                <Image Source="pack://application:,,,/CyberX8_Themes;component/Themes/Images/parts/Flipper.png" HorizontalAlignment="Center" VerticalAlignment="Center" Height="63" Width="30" RenderTransformOrigin="0.266,0.719" Canvas.Left="25" Canvas.Top="-95">
+                    <Image.RenderTransform>
+                        <RotateTransform Angle="-179"/>
+                    </Image.RenderTransform>
+                </Image>
+                <Label Content="200" FontSize="7" FontWeight="Normal" HorizontalAlignment="Left" Height="20" VerticalAlignment="Center" Width="25" RenderTransformOrigin="0.5,0.5" Canvas.Top="-42" Canvas.Left="22">
+                    <Label.RenderTransform>
+                        <TransformGroup>
+                            <ScaleTransform/>
+                            <SkewTransform/>
+                            <RotateTransform Angle="86.257"/>
+                            <TranslateTransform/>
+                        </TransformGroup>
+                    </Label.RenderTransform>
+                </Label>
+            </Canvas>
+            <!--Flipper1_150-->
+            <Canvas Canvas.Left="300" Canvas.Top="246" RenderTransformOrigin="1.048,1.101" Height="54" Width="20" HorizontalAlignment="Center" VerticalAlignment="Top">
+                <Canvas.RenderTransform>
+                    <TransformGroup>
+                        <ScaleTransform/>
+                        <SkewTransform/>
+                        <RotateTransform Angle="{Binding ElementName=self,Path=Flipper1UIPosition150}"/>
+                        <TranslateTransform/>
+                    </TransformGroup>
+                </Canvas.RenderTransform>
+                <Image Source="pack://application:,,,/CyberX8_Themes;component/Themes/Images/parts/Flipper.png" HorizontalAlignment="Left" VerticalAlignment="Top" Height="63" Width="30" RenderTransformOrigin="0.266,0.719" Canvas.Left="15" Canvas.Top="15">
+                    <Image.RenderTransform>
+                        <RotateTransform Angle="-130"/>
+                    </Image.RenderTransform>
+                </Image>
+                <Label Content="150" FontSize="7" FontWeight="Normal" HorizontalAlignment="Left" Height="20" VerticalAlignment="Top" Width="25" RenderTransformOrigin="0.56,0.738" Canvas.Top="2" Canvas.Left="53">
+                    <Label.RenderTransform>
+                        <TransformGroup>
+                            <ScaleTransform/>
+                            <SkewTransform/>
+                            <RotateTransform Angle="-225.213"/>
+                            <TranslateTransform X="-61.999" Y="52.237"/>
+                        </TransformGroup>
+                    </Label.RenderTransform>
+                </Label>
+            </Canvas>
+            <!--Flipper2_150-->
+            <Canvas Canvas.Left="139" Canvas.Top="273" RenderTransformOrigin="0.147,-0.262" Height="55" Width="20">
+                <Canvas.RenderTransform>
+                    <TransformGroup>
+                        <ScaleTransform/>
+                        <SkewTransform/>
+                        <RotateTransform Angle="{Binding ElementName=self,Path=Flipper2UIPosition150}"/>
+                        <TranslateTransform/>
+                    </TransformGroup>
+                </Canvas.RenderTransform>
+                <Image Source="pack://application:,,,/CyberX8_Themes;component/Themes/Images/parts/Flipper.png" HorizontalAlignment="Left" VerticalAlignment="Center" Height="63" Width="30" RenderTransformOrigin="0.266,0.719" Canvas.Top="-60" Canvas.Left="-5">
+                    <Image.RenderTransform>
+                        <RotateTransform Angle="8"/>
+                    </Image.RenderTransform>
+                </Image>
+                <Label Content="150" FontSize="7" FontWeight="Normal" HorizontalAlignment="Left" Height="20" VerticalAlignment="Center" Width="25" RenderTransformOrigin="0.5,0.5" Canvas.Top="-42" Canvas.Left="-9">
+                    <Label.RenderTransform>
+                        <TransformGroup>
+                            <ScaleTransform/>
+                            <SkewTransform/>
+                            <RotateTransform Angle="-88.507"/>
+                            <TranslateTransform/>
+                        </TransformGroup>
+                    </Label.RenderTransform>
+                </Label>
+            </Canvas>
+            <!--Flipper3_150-->
+            <Canvas Canvas.Left="253" Canvas.Top="208" RenderTransformOrigin="1.661,-0.902" Height="55" Width="20" HorizontalAlignment="Center" VerticalAlignment="Center">
+                <Canvas.RenderTransform>
+                    <TransformGroup>
+                        <ScaleTransform/>
+                        <SkewTransform/>
+                        <RotateTransform Angle="{Binding ElementName=self,Path=Flipper3UIPosition150}"/>
+                        <TranslateTransform/>
+                    </TransformGroup>
+                </Canvas.RenderTransform>
+                <Image Source="pack://application:,,,/CyberX8_Themes;component/Themes/Images/parts/Flipper.png" HorizontalAlignment="Center" VerticalAlignment="Center" Height="63" Width="30" RenderTransformOrigin="0.266,0.719" Canvas.Left="25" Canvas.Top="-95">
+                    <Image.RenderTransform>
+                        <RotateTransform Angle="132"/>
+                    </Image.RenderTransform>
+                </Image>
+                <Label Content="150" FontSize="7" FontWeight="Normal" HorizontalAlignment="Center" Height="20" VerticalAlignment="Top" Width="25" RenderTransformOrigin="0.5,0.5" Canvas.Top="-49" Canvas.Left="35">
+                    <Label.RenderTransform>
+                        <TransformGroup>
+                            <ScaleTransform/>
+                            <SkewTransform/>
+                            <RotateTransform Angle="38.728"/>
+                            <TranslateTransform/>
+                        </TransformGroup>
+                    </Label.RenderTransform>
+                </Label>
+            </Canvas>
+            <!--<Ellipse Width="200" Height="200" Canvas.Left="140" Canvas.Top="146" HorizontalAlignment="Left" VerticalAlignment="Top" Stroke="Black"/>-->
         </Canvas>
     </Viewbox>
 </UserControl>

+ 144 - 9
CyberX8_Themes/UserControls/SRDUIControl.xaml.cs

@@ -3,17 +3,8 @@ using OpenSEMI.ClientBase;
 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 CyberX8_Themes.UserControls
 {
@@ -59,6 +50,150 @@ namespace CyberX8_Themes.UserControls
                 this.SetValue(RotationUIPositionProperty, value);
             }
         }
+        public static readonly DependencyProperty Flipper1UIPosition200Property = DependencyProperty.Register(
+        "Flipper1UIPosition200", typeof(double), typeof(SRDUIControl), new FrameworkPropertyMetadata((double)0, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// Flipper1UIPosition200 (degree)
+        /// </summary>
+        public double Flipper1UIPosition200
+        {
+            get
+            {
+                return (double)this.GetValue(Flipper1UIPosition200Property);
+            }
+            set
+            {
+                this.SetValue(Flipper1UIPosition200Property, value);
+            }
+        }
+        public static readonly DependencyProperty Flipper2UIPosition200Property = DependencyProperty.Register(
+        "Flipper2UIPosition200", typeof(double), typeof(SRDUIControl), new FrameworkPropertyMetadata((double)0, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// Flipper2UIPosition200 (degree)
+        /// </summary>
+        public double Flipper2UIPosition200
+        {
+            get
+            {
+                return (double)this.GetValue(Flipper2UIPosition200Property);
+            }
+            set
+            {
+                this.SetValue(Flipper2UIPosition200Property, value);
+            }
+        }
+        public static readonly DependencyProperty Flipper3UIPosition200Property = DependencyProperty.Register(
+        "Flipper3UIPosition200", typeof(double), typeof(SRDUIControl), new FrameworkPropertyMetadata((double)0, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// Flipper3UIPosition200 (degree)
+        /// </summary>
+        public double Flipper3UIPosition200
+        {
+            get
+            {
+                return (double)this.GetValue(Flipper3UIPosition200Property);
+            }
+            set
+            {
+                this.SetValue(Flipper3UIPosition200Property, value);
+            }
+        }
+        public static readonly DependencyProperty Flipper1UIPosition150Property = DependencyProperty.Register(
+        "Flipper1UIPosition150", typeof(double), typeof(SRDUIControl), new FrameworkPropertyMetadata((double)0, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// Flipper1UIPosition150 (degree)
+        /// </summary>
+        public double Flipper1UIPosition150
+        {
+            get
+            {
+                return (double)this.GetValue(Flipper1UIPosition150Property);
+            }
+            set
+            {
+                this.SetValue(Flipper1UIPosition150Property, value);
+            }
+        }
+        public static readonly DependencyProperty Flipper2UIPosition150Property = DependencyProperty.Register(
+        "Flipper2UIPosition150", typeof(double), typeof(SRDUIControl), new FrameworkPropertyMetadata((double)0, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// Flipper2UIPosition150 (degree)
+        /// </summary>
+        public double Flipper2UIPosition150
+        {
+            get
+            {
+                return (double)this.GetValue(Flipper2UIPosition150Property);
+            }
+            set
+            {
+                this.SetValue(Flipper2UIPosition150Property, value);
+            }
+        }
+        public static readonly DependencyProperty Flipper3UIPosition150Property = DependencyProperty.Register(
+        "Flipper3UIPosition150", typeof(double), typeof(SRDUIControl), new FrameworkPropertyMetadata((double)0, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// Flipper3UIPosition150 (degree)
+        /// </summary>
+        public double Flipper3UIPosition150
+        {
+            get
+            {
+                return (double)this.GetValue(Flipper3UIPosition150Property);
+            }
+            set
+            {
+                this.SetValue(Flipper3UIPosition150Property, value);
+            }
+        }
+        public static readonly DependencyProperty Flipper1UIPosition100Property = DependencyProperty.Register(
+        "Flipper1UIPosition100", typeof(double), typeof(SRDUIControl), new FrameworkPropertyMetadata((double)0, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// Flipper1UIPosition100 (degree)
+        /// </summary>
+        public double Flipper1UIPosition100
+        {
+            get
+            {
+                return (double)this.GetValue(Flipper1UIPosition100Property);
+            }
+            set
+            {
+                this.SetValue(Flipper1UIPosition100Property, value);
+            }
+        }
+        public static readonly DependencyProperty Flipper2UIPosition100Property = DependencyProperty.Register(
+        "Flipper2UIPosition100", typeof(double), typeof(SRDUIControl), new FrameworkPropertyMetadata((double)0, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// Flipper2UIPosition100 (degree)
+        /// </summary>
+        public double Flipper2UIPosition100
+        {
+            get
+            {
+                return (double)this.GetValue(Flipper2UIPosition100Property);
+            }
+            set
+            {
+                this.SetValue(Flipper2UIPosition100Property, value);
+            }
+        }
+        public static readonly DependencyProperty Flipper3UIPosition100Property = DependencyProperty.Register(
+        "Flipper3UIPosition100", typeof(double), typeof(SRDUIControl), new FrameworkPropertyMetadata((double)0, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// Flipper3UIPosition100 (degree)
+        /// </summary>
+        public double Flipper3UIPosition100
+        {
+            get
+            {
+                return (double)this.GetValue(Flipper3UIPosition100Property);
+            }
+            set
+            {
+                this.SetValue(Flipper3UIPosition100Property, value);
+            }
+        }
         public static readonly DependencyProperty WaferInfoProperty = DependencyProperty.Register(
         "WaferInfo", typeof(WaferInfo), typeof(SRDUIControl));
         /// <summary>