private void bgGrp1_DataChanged(object sender, DataChangeEventArgs e)
 {
     try
     {
         foreach (OPCItemState rslt in e.sts)
         {
             if (rslt.Quality == 0)
             {
                 continue;
             }
             if (rslt.HandleClient == 0)
             {
                 CMData cm = new CMData();
                 cm.machineCode = this.MachineCode;
                 cm.position    = int.Parse(rslt.DataValue.ToString());
                 this.OnPositionChanged(cm, new EventArgs());
             }
             else if (rslt.HandleClient == 1)
             {
                 pallet.Dispatcher.BeginInvoke(new InvokeDelegate(SetPalletPresentStatus), bool.Parse(rslt.DataValue.ToString()));
             }
         }
     }
     catch (NullReferenceException ex)
     {
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message);
     }
 }
Beispiel #2
0
        public CMData GetBlockedCMDetails(Int64 queueId)
        {
            CMData objCMData = null;

            try
            {
                using (OracleConnection con = new DBConnection().getDBConnection()) // DA.Connection().getDBConnection())
                {
                    // if (con.State == System.Data.ConnectionState.Closed) con.Open();
                    using (OracleCommand command = con.CreateCommand())
                    {
                        string sql = "SELECT LU_ID, LU_NAME,FLOOR,ACTUAL_AISLE_MIN,ACTUAL_AISLE_MAX,VIRTUAL_AISLE_MIN,VIRTUAL_AISLE_MAX,HOME_AISLE"
                                     + " ,MACHINE,MACHINE_CODE,IS_BLOCKED,CHANGED_HOME_AISLE,HOME_ROW,CHANGED_HOME_ROW,STATUS,FLOOR_CM_INDEX,CM_CHANNEL,REM_CODE"
                                     + " FROM L2_LCM_UCM_MASTER "
                                     + " where BLOCK_Q_ID=" + queueId + " and rownum=1";

                        command.CommandText = sql;
                        using (OracleDataReader reader = command.ExecuteReader())
                        {
                            if (reader.HasRows)
                            {
                                if (reader.Read())
                                {
                                    objCMData = new Model.CMData();

                                    objCMData.cmPkId         = Int32.Parse(reader["LU_ID"].ToString());
                                    objCMData.cmName         = reader["LU_NAME"].ToString();
                                    objCMData.floor          = Int32.Parse(reader["FLOOR"].ToString());
                                    objCMData.actualAisleMin = Int32.Parse(reader["ACTUAL_AISLE_MIN"].ToString());

                                    objCMData.actualAisleMax  = Int32.Parse(reader["ACTUAL_AISLE_MAX"].ToString());
                                    objCMData.virtualAisleMin = Int32.Parse(reader["VIRTUAL_AISLE_MIN"].ToString());
                                    objCMData.virtualAisleMax = Int32.Parse(reader["VIRTUAL_AISLE_MAX"].ToString());
                                    objCMData.homeAisle       = Int32.Parse(reader["HOME_AISLE"].ToString());

                                    objCMData.machine     = reader["MACHINE"].ToString();
                                    objCMData.cmChannel   = reader["CM_CHANNEL"].ToString();
                                    objCMData.machineCode = reader["MACHINE_CODE"].ToString();
                                    objCMData.isBlocked   = Int32.Parse(reader["IS_BLOCKED"].ToString()) == 1 ? true : false;

                                    objCMData.positionAisle = Convert.ToInt32(reader["CHANGED_HOME_AISLE"]);
                                    objCMData.homeRow       = Convert.ToInt32(reader["HOME_ROW"]);
                                    objCMData.positionRow   = Convert.ToInt32(reader["CHANGED_HOME_ROW"]);
                                    objCMData.status        = Convert.ToInt32(reader["STATUS"]);

                                    objCMData.floorCmIndex = Convert.ToInt32(reader["FLOOR_CM_INDEX"]);
                                    objCMData.remCode      = Convert.ToString(reader["REM_CODE"]);
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception errMsg)
            {
            }
            return(objCMData);
        }
Beispiel #3
0
        public void ucCM_OnPositionChanged(object sender, EventArgs e)
        {
            CMData cm = (CMData)sender;

            cmPanel.Dispatcher.BeginInvoke(new Action(() =>
            {
                SetCMPosition(cm.machineCode, cm.position);
            }));
        }
Beispiel #4
0
        public bool GetNearbyLCMlist(CMData objCMData, out CMData leftCMData, out CMData rightCMData)
        {
            bool bOk = false;

            leftCMData  = new CMData();
            rightCMData = new CMData();

            try
            {
                using (OracleConnection con = new DBConnection().getDBConnection())
                {
                    using (OracleCommand command = con.CreateCommand())
                    {
                        command.CommandType = CommandType.StoredProcedure;
                        command.CommandText = "config_package.get_nearest_lcms";
                        command.Parameters.Add("cur_lcm", OracleDbType.Varchar2, 20, objCMData.machineCode, ParameterDirection.Input);
                        command.Parameters.Add("left_lcm", OracleDbType.Varchar2, 20, leftCMData.machineCode, ParameterDirection.Output);
                        command.Parameters.Add("left_lcm_channel", OracleDbType.Varchar2, 20, leftCMData.cmChannel, ParameterDirection.Output);
                        command.Parameters.Add("right_lcm", OracleDbType.Varchar2, 20, rightCMData.machineCode, ParameterDirection.Output);
                        command.Parameters.Add("right_lcm_channel", OracleDbType.Varchar2, 20, rightCMData.cmChannel, ParameterDirection.Output);

                        command.ExecuteNonQuery();

                        leftCMData.cmChannel    = Convert.ToString(command.Parameters["left_lcm_channel"].Value);
                        leftCMData.machineCode  = Convert.ToString(command.Parameters["left_lcm"].Value);
                        rightCMData.cmChannel   = Convert.ToString(command.Parameters["right_lcm_channel"].Value);
                        rightCMData.machineCode = Convert.ToString(command.Parameters["right_lcm"].Value);

                        if (leftCMData.cmChannel == "null")
                        {
                            leftCMData.cmChannel = "";
                        }
                        if (leftCMData.machineCode == "null")
                        {
                            leftCMData.machineCode = "";
                        }

                        if (rightCMData.cmChannel == "null")
                        {
                            rightCMData.cmChannel = "";
                        }
                        if (rightCMData.machineCode == "null")
                        {
                            rightCMData.machineCode = "";
                        }

                        bOk = true;
                    }
                }
            }
            catch (Exception errMsg)
            {
                throw new Exception(errMsg.Message);
            }

            return(bOk);
        }
Beispiel #5
0
        public CMData NeedToPushNearestCM(CMData objCMData)
        {
            Logger.WriteLogger(GlobalValues.PARKING_LOG, "Queue Id:" + objCMData.queueId + ":--Entered 'NeedToPushNearestCM' ");
            CMData colCMData = null;

            try
            {
                colCMData = new CMData();

                using (OracleConnection con = new DBConnection().getDBConnection())
                {
                    using (OracleCommand command = con.CreateCommand())
                    {
                        command.CommandType = CommandType.StoredProcedure;
                        command.CommandText = "CONFIG_PACKAGE.need_to_push_nearest_cm ";
                        command.Parameters.Add("move_cm", OracleDbType.Varchar2, 30, objCMData.machineCode, ParameterDirection.Input);
                        command.Parameters.Add("dest_floor", OracleDbType.Int32, objCMData.destFloor, ParameterDirection.Input);
                        command.Parameters.Add("DEST_AISLE", OracleDbType.Int32, objCMData.destAisle, ParameterDirection.Input);
                        command.Parameters.Add("dest_row", OracleDbType.Int32, objCMData.destRow, ParameterDirection.Input);
                        command.Parameters.Add("COL_CM", OracleDbType.Varchar2, 30, colCMData.machineCode, ParameterDirection.Output);
                        command.Parameters.Add("col_cm_channel", OracleDbType.Varchar2, 30, colCMData.cmChannel, ParameterDirection.Output);
                        command.Parameters.Add("col_move_aisle", OracleDbType.Int32, colCMData.destAisle, ParameterDirection.Output);

                        command.Parameters.Add("col_move_row", OracleDbType.Int32, 30, colCMData.destRow, ParameterDirection.Output);
                        command.Parameters.Add("need_to_push", OracleDbType.Int32, objCMData.needToPush, ParameterDirection.Output);
                        command.Parameters.Add("is_wait", OracleDbType.Int32, 30, objCMData.isWait, ParameterDirection.Output);
                        command.Parameters.Add("col_cm_present", OracleDbType.Int32, objCMData.CMPresentOnSide, ParameterDirection.Output);
                        command.Parameters.Add("cm_move_side", OracleDbType.Int32, objCMData.moveSide, ParameterDirection.Output);

                        command.ExecuteNonQuery();

                        colCMData.cmChannel       = command.Parameters["col_cm_channel"].Value.ToString();
                        colCMData.machineCode     = command.Parameters["COL_CM"].Value.ToString();
                        colCMData.destFloor       = objCMData.destFloor;
                        colCMData.destAisle       = Convert.ToInt16(command.Parameters["col_move_aisle"].Value.ToString());
                        colCMData.destRow         = Convert.ToInt16(command.Parameters["col_move_row"].Value.ToString());
                        objCMData.needToPush      = Convert.ToInt16(command.Parameters["need_to_push"].Value.ToString()) == 1?true:false;
                        objCMData.isWait          = Convert.ToInt16(command.Parameters["is_wait"].Value.ToString()) == 1 ? true : false;
                        objCMData.CMPresentOnSide = Convert.ToInt16(command.Parameters["col_cm_present"].Value.ToString()) == 1 ? true : false;
                        objCMData.moveSide        = Convert.ToInt16(command.Parameters["cm_move_side"].Value.ToString());
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.WriteLogger(GlobalValues.PARKING_LOG, "Queue Id:" + objCMData.queueId + ": CM=" + objCMData.machineCode + " --need_to_push 'NeedToPushNearestCM':: " + ex.Message);
            }
            finally
            {
                Logger.WriteLogger(GlobalValues.PARKING_LOG, "Queue Id:" + objCMData.queueId + ", isWait=" + objCMData.isWait + ", need_to_push=" + objCMData.needToPush + ":--Exitting 'NeedToPushNearestCM' ");
            }
            return(colCMData);
        }
        private void bgGrp1_DataChanged(object sender, DataChangeEventArgs e)
        {
            try
            {
                foreach (OPCItemState rslt in e.sts)
                {
                    if (rslt.Quality == 0)
                    {
                        continue;
                    }
                    if (rslt.HandleClient == 0)
                    {
                        int resValue = int.Parse(rslt.DataValue.ToString());

                        if (resValue != 0)
                        {
                            CMData cm = new CMData();
                            cm.machineCode = this.MachineCode;
                            cm.position    = resValue;
                            this.OnPositionChanged(cm, new EventArgs());
                        }
                    }
                    else if (rslt.HandleClient == 1)
                    {
                        bool resValue = bool.Parse(rslt.DataValue.ToString());
                        pallet.Dispatcher.BeginInvoke(new InvokeDelegate(SetPalletPresentStatus), resValue);
                    }
                    else if (rslt.HandleClient == 3)
                    {
                        bool             resValue            = bool.Parse(rslt.DataValue.ToString());
                        NotificationData objNotificationData = new NotificationData();
                        objNotificationData.category    = NotificationData.errorCategory.ERROR;
                        objNotificationData.ErrorCode   = "TT";
                        objNotificationData.MachineCode = this.MachineCode;
                        objNotificationData.IsCleared   = !resValue;
                        this.OnLcmL2RotFalseAlarmTriggered(objNotificationData, new EventArgs());
                    }
                }
            }
            catch (NullReferenceException ex)
            {
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
Beispiel #7
0
    public override void Initialize()
    {
        base.Initialize();

        m_UpdateProperties = UpdatePropertyFlag.HalfTanFov
                             | UpdatePropertyFlag.Transform;

        m_MainCMBrain      = gameObject.GetComponent <CinemachineBrain>();
        m_PostProcessLayer = gameObject.GetComponent <PostProcessLayer>();
        m_HXVCamera        = gameObject.GetComponent <HxVolumetricCamera>();

        m_LastCMType = CMType.Notset;
        m_CMs        = new CMData[(int)CMType.Count];
        Transform cmRoot = transform.parent;

        for (int iCM = 0; iCM < m_CMs.Length; iCM++)
        {
            CMData cmData = new CMData(cmRoot.Find(CM_GAMEOBJECT_NAME_STARTWITHS + ((CMType)iCM).ToString())
                                       .GetComponent <CinemachineVirtualCameraBase>()
                                       , (CMType)iCM);
            m_CMs[iCM] = cmData;
        }

#if UNITY_EDITOR
        // 预览场景时,不需要读表里的相机参数,也不需要切换手柄鼠标
        if (!CameraManager._s_IsRoaming)
#endif
        {
            GamingConfig gamingConfig = ((CfgEternityProxy)GameFacade.Instance.RetrieveProxy(ProxyName.CfgEternityProxy)).GetGamingConfig(1).Value;
            m_CM_Character_AxisSetting = new CMAxisSetting(new CMAxisSetting.CM(new CMAxisSetting.Axis(gamingConfig.CmCharacter.Value.XaxisMaxSpeedMouse)
                                                                                , new CMAxisSetting.Axis(gamingConfig.CmCharacter.Value.YaxisMaxSpeedMouse))
                                                           , new CMAxisSetting.CM(new CMAxisSetting.Axis(gamingConfig.CmCharacter.Value.XaxisMaxSpeedGamepad)
                                                                                  , new CMAxisSetting.Axis(gamingConfig.CmCharacter.Value.YaxisMaxSpeedGamepad)));
            InputManager.Instance.OnInputDeviceChanged += OnInputDeviceChanged;
        }

        m_ChangingCMs = new Queue <CMType>();
        m_ChangingCMBlendReaminTime = 0;

        m_CameraRenderer = new CRenderer.MainCameraRenderer();
        m_CameraRenderer.Initialize(GetCameraName(), m_Camera, m_CameraRendererResource);

        _ForDebug.GUIEnable = new bool[(int)GUIType.Count];

        TrackCaptureManager.GetInstance().InitializeCapturer("Main Camera", this).StartCapture();
    }
Beispiel #8
0
    public void SetFarClipPlane(CMType cmType, float far)
    {
        CMData cm = m_CMs[(int)cmType];

        switch (cm.GetCMCameraType())
        {
        case CMCameraType.FreeLook:
            cm.GetCM_FreeLook().m_Lens.FarClipPlane = far;
            break;

        case CMCameraType.VirtualCamera:
            cm.GetCM_VirtualCamera().m_Lens.FarClipPlane = far;
            break;

        default:
            Leyoutech.Utility.DebugUtility.Assert(false, CameraManager.LOG_TAG, $"Not support CameraType({cm.GetCMCameraType()})");
            break;
        }
    }
Beispiel #9
0
        public bool GetValidAisleForMoving(CMData objCMData, out int moveAisle, out int moveRow)
        {
            bool bOk = false;

            moveAisle = objCMData.destAisle;
            moveRow   = objCMData.destRow;
            try
            {
                using (OracleConnection con = new DBConnection().getDBConnection())
                {
                    using (OracleCommand command = con.CreateCommand())
                    {
                        command.CommandType = CommandType.StoredProcedure;
                        command.CommandText = "CONFIG_PACKAGE.get_valid_aisle_for_moving";
                        command.Parameters.Add("floor", OracleDbType.Int32, objCMData.destFloor, ParameterDirection.Input);
                        command.Parameters.Add("floor_aisle", OracleDbType.Int32, moveAisle, ParameterDirection.InputOutput);
                        command.Parameters.Add("floor_row", OracleDbType.Int32, moveRow, ParameterDirection.InputOutput);
                        command.Parameters.Add("direction", OracleDbType.Int16, objCMData.moveSide, ParameterDirection.Input);

                        command.ExecuteNonQuery();

                        string tmpMoveAisle = "";
                        string tmpMoveRow   = "";
                        tmpMoveAisle = Convert.ToString(command.Parameters["floor_aisle"].Value);
                        Int32.TryParse(tmpMoveAisle, out moveAisle);

                        tmpMoveRow = Convert.ToString(command.Parameters["floor_row"].Value);
                        Int32.TryParse(tmpMoveRow, out moveRow);

                        bOk = true;
                    }
                }
            }
            catch (Exception errMsg)
            {
                throw new Exception(errMsg.Message);
            }

            return(bOk);
        }
Beispiel #10
0
        public CMData GetMovingSideCM(CMData objCMData)
        {
            CMData colCMData = null;

            try
            {
                colCMData = new CMData();

                using (OracleConnection con = new DBConnection().getDBConnection())
                {
                    using (OracleCommand command = con.CreateCommand())
                    {
                        command.CommandType = CommandType.StoredProcedure;
                        command.CommandText = "GET_MOVING_SIDE_CM ";
                        command.Parameters.Add("MOVE_MACHINE", OracleDbType.Varchar2, 30, objCMData.machineCode, ParameterDirection.Input);
                        command.Parameters.Add("dest_floor", OracleDbType.Int64, objCMData.destFloor, ParameterDirection.Input);
                        command.Parameters.Add("DEST_AISLE", OracleDbType.Int64, objCMData.destAisle, ParameterDirection.Input);
                        command.Parameters.Add("dest_row", OracleDbType.Int64, objCMData.destRow, ParameterDirection.Input);
                        command.Parameters.Add("COL_MACHINE", OracleDbType.Varchar2, 30, colCMData.machineCode, ParameterDirection.Output);
                        command.Parameters.Add("COL_MACHINE_CHANNEL", OracleDbType.Varchar2, 30, colCMData.cmChannel, ParameterDirection.Output);
                        command.Parameters.Add("col_side", OracleDbType.Int64, colCMData.moveSide, ParameterDirection.Output);

                        command.ExecuteNonQuery();

                        colCMData.cmChannel   = command.Parameters["col_machine_channel"].Value.ToString();
                        colCMData.machineCode = command.Parameters["COL_MACHINE"].Value.ToString();
                        colCMData.moveSide    = Convert.ToInt16(command.Parameters["col_side"].Value.ToString());
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
            return(colCMData);
        }
Beispiel #11
0
 public void SetDataSource(XsdDataBaseDesign nDataBase, CMData.Schemas.XsdDataBase.TBL_ConnectionRow nSelectedConnection, CMData.Schemas.XsdDataBase.TBL_ObjectRow nSelectedObject)
 {
     _dtsDataBase = nDataBase;
     _selectedConnection = nSelectedConnection;
     _selectedObject = nSelectedObject;
 }
        public void DoResumeEngine()
        {
            List <QueueData> processingQList = null;

            if (objQueueDaoService == null)
            {
                objQueueDaoService = new QueueDaoImp();
            }
            if (objCMControllerService == null)
            {
                objCMControllerService = new CMControllerImp();
            }
            if (objVLCControllerService == null)
            {
                objVLCControllerService = new VLCControllerImp();
            }
            if (objEESDaoService == null)
            {
                objEESDaoService = new EESDaoImp();
            }
            //get all request in status 0 or 2
            processingQList = objQueueDaoService.GetAllProcessingQId();

            //take one request
            foreach (QueueData objQueueData in processingQList)
            {
                string carMachine = null;

                //get queue id
                //get all cms blocked by this queue id
                CMData objCMData = objCMControllerService.GetBlockedCMDetails(objQueueData.queuePkId);

                //get all vlcs blocked by this queue id
                VLCData objVLCData = objVLCControllerService.GetVLCDetails(objQueueData.queuePkId);

                EESData objEESData = objEESDaoService.GetBlockedEESDetails(objQueueData.queuePkId);

                if (objCMData != null && objVLCData != null)
                {
                    //check pallet present of blocked machine
                    GlobalValues.palletStatus palletStatus = objCMControllerService.GetPalletOnCMStatus(objCMData);
                    if (palletStatus == GlobalValues.palletStatus.present)
                    {
                        carMachine = objCMData.machineCode;
                    }
                    else
                    {
                        carMachine = objVLCData.machineCode;
                    }
                }
                else if (objCMData != null)
                {
                    carMachine = objCMData.machineCode;
                }
                else if (objCMData != null)
                {
                    carMachine = objVLCData.machineCode;
                }
                else if (objEESData != null)
                {
                    carMachine = objEESData.machineCode;
                }

                //call SetReallocateData with pallet present machine
                if (!string.IsNullOrEmpty(carMachine))
                {
                    SetReallocateData(objQueueData.queuePkId, carMachine, 3);
                }
                else
                {
                    SetReallocateData(objQueueData.queuePkId, "SLOT", 3);// entry or exit which had no initial path
                }
                UpdateAbortedStatus(objQueueData.queuePkId);
            }
        }
 public static string getIdFromCMData(CMData data)
 {
     return(data.movie + " " + data.year);
 }
Beispiel #14
0
        public List <CMData> GetCMDetails(CMData objCMData)
        {
            List <CMData> lstCMData = null;

            try
            {
                using (OracleConnection con = new DBConnection().getDBConnection()) // DA.Connection().getDBConnection())
                {
                    // if (con.State == System.Data.ConnectionState.Closed) con.Open();
                    using (OracleCommand command = con.CreateCommand())
                    {
                        string sql = "SELECT CM_ID, CM_NAME,FLOOR,ACTUAL_AISLE_MIN,ACTUAL_AISLE_MAX,VIRTUAL_AISLE_MIN,VIRTUAL_AISLE_MAX,HOME_AISLE"
                                     + " ,MACHINE,MACHINE_CODE,IS_BLOCKED,POSITION_AISLE,HOME_ROW,POSITION_ROW,STATUS,FLOOR_CM_INDEX,CM_CHANNEL,REM_CODE"
                                     + " FROM L2_LCM_UCM_MASTER"
                                     + " where ";
                        if (!string.IsNullOrEmpty(objCMData.machineCode))
                        {
                            sql += " machine_code=" + objCMData.machineCode;
                        }
                        command.CommandText = sql;
                        using (OracleDataReader reader = command.ExecuteReader())
                        {
                            if (reader.HasRows)
                            {
                                lstCMData = new List <CMData>();

                                while (reader.Read())
                                {
                                    Model.CMData obj2CMData = new Model.CMData();

                                    obj2CMData.cmPkId         = Int32.Parse(reader["CM_ID"].ToString());
                                    obj2CMData.cmName         = reader["CM_NAME"].ToString();
                                    obj2CMData.floor          = Int32.Parse(reader["FLOOR"].ToString());
                                    obj2CMData.actualAisleMin = Int32.Parse(reader["ACTUAL_AISLE_MIN"].ToString());

                                    obj2CMData.actualAisleMax  = Int32.Parse(reader["ACTUAL_AISLE_MAX"].ToString());
                                    obj2CMData.virtualAisleMin = Int32.Parse(reader["VIRTUAL_AISLE_MIN"].ToString());
                                    obj2CMData.virtualAisleMax = Int32.Parse(reader["VIRTUAL_AISLE_MAX"].ToString());
                                    obj2CMData.homeAisle       = Int32.Parse(reader["HOME_AISLE"].ToString());

                                    obj2CMData.machine     = reader["MACHINE"].ToString();
                                    obj2CMData.cmChannel   = reader["CM_CHANNEL"].ToString();
                                    obj2CMData.machineCode = reader["MACHINE_CODE"].ToString();
                                    obj2CMData.isBlocked   = Int32.Parse(reader["IS_BLOCKED"].ToString()) == 1 ? true : false;

                                    obj2CMData.positionAisle = Convert.ToInt32(reader["POSITION_AISLE"]);
                                    obj2CMData.homeRow       = Convert.ToInt32(reader["HOME_ROW"]);
                                    obj2CMData.positionRow   = Convert.ToInt32(reader["POSITION_ROW"]);
                                    obj2CMData.status        = Convert.ToInt32(reader["STATUS"]);

                                    obj2CMData.floorCmIndex = Convert.ToInt32(reader["FLOOR_CM_INDEX"]);
                                    obj2CMData.remCode      = Convert.ToString(reader["REM_CODE"]);

                                    //objCMData.collapseMachine =
                                    //objCMData.triggerAisle =
                                    // objCMData.triggerRow =
                                    //objCMData.inDemoMode =

                                    // objCMData.defaultHomeAisle =
                                    //objCMData.isPalletPresent =


                                    lstCMData.Add(obj2CMData);
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception errMsg)
            {
            }
            return(lstCMData);
        }
        /// <summary>
        /// CM
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void ucCM_OnPositionChanged(object sender, EventArgs e)
        {
            CMData cm = (CMData)sender;

            garrageGrid.Dispatcher.BeginInvoke(new InvokeDelegate(SetCMPosition), cm.machineCode, cm.position);
        }