public static void JMDM_BasicRide_Run(out JMDM_CylinderPortControlUpdated CylinderControl, string Port, byte CylinderCount, string JMMovFilePath, int StartWait = 2000, int EndWait = 2000, Action ExtraAction = null)
        {
            PositionAndTimingDataModel PositionAndTiming = PositionAndTimingDataModel.DataLoadFromFile(JMMovFilePath);

            CylinderControl = new JMDM_CylinderPortControlUpdated(Port, CylinderCount);

            if (CylinderCount > 6)
            {
                CylinderCount = 6;
            }

            CylinderControl.Open_Port();

            CylinderControl.ZeroAllCylinders();

            Thread.Sleep(StartWait);

            ExtraAction?.Invoke();

            foreach (MomentaryPositionAndTimingFrameDataModel Frame in PositionAndTiming)
            {
                for (byte i = 0; i < CylinderCount; i++)
                {
                    CylinderControl.SetCylinderHeight(i, Frame.GetCylinder(i));
                }
                Thread.Sleep((int)Frame.time);
            }

            CylinderControl.ZeroAllCylinders();

            Thread.Sleep(EndWait);
        }
        internal BaseMotionPlayer(TaPa_XYCyl Owner, string MotionDataPath, string GamePath, string StartOptionsRunArgs, string RuntimeProcess, string StartOptionsInput, AvalibleProtocols MotionDeviceProtocol, string ConnectonString)
        {
            this.Owner = Owner;
            FrameData  = PositionAndTimingDataModel.DataLoadFromFile(MotionDataPath);
            this.MotionDeviceProtocol = MotionDeviceProtocol;
            switch (MotionDeviceProtocol)
            {
            case AvalibleProtocols.ComPort:
                if (MotionHardwareInterface != null)
                {
                    MotionHardwareInterface.Dispose();
                }
                MotionHardwareInterface = JMDM_CylinderPortControlUpdated.ConnectionFactory(ConnectonString);
                break;

            default:
                Owner.PlayBacksEnd.Invoke();
                throw new Exception("Error: not a valid Protocol.");
            }
            this.GamePath            = GamePath;
            this.StartOptionsRunArgs = StartOptionsRunArgs;
            this.StartOptionsInput   = StartOptionsInput;
            this.RuntimeProcess      = RuntimeProcess;
            Start();
        }