Пример #1
0
        public void RefreshActiveSerialNexstarDevices()
        {
            _logger.LogInformation("Clearing old devices.");
            ActiveNexStarDevicePortNames.Clear();

            _logger.LogInformation("Starting probe for NexStar devices.");

            string[] portNames = SerialPort.GetPortNames();
            foreach (string portName in portNames)
            {
                SerialPortController testController        = new SerialPortController(portName);
                VersionCommand       versionCommandCommand = new VersionCommand();
                try
                {
                    testController.RunCommand(versionCommandCommand);

                    if (versionCommandCommand.RawResultBytes != null)
                    {
                        ActiveNexStarDevicePortNames.Add(portName);
                        _logger.LogInformation($"NexStar device found on port '{portName}'.");
                    }
                }
                catch (TimeoutException)
                {
                    _logger.LogInformation($"Probe timeout for port '{portName}'.");
                    //ignore timeouts here, we are expecting some devices to not respond.
                }
                finally
                {
                    testController.CloseSerialConnection();
                }
            }

            _logger.LogInformation($"Probe finished found {ActiveNexStarDevicePortNames.Count} devices.");
        }
Пример #2
0
        public void Excute()
        {
            OnPreExecute();                                                                  //会调用重写的方法
            SerialPortController mSerialPortController = SerialPortController.GetInstance(); //这个类只会new一次

            mSerialPortController.PortName = Param.PortName;
            mSerialPortController.BaudRate = Param.BaudRate;
            mSerialPortController.Initialization((object sender, EventArgs e) =>
            {
                SerialPortEventArgs mSerialPortEventArgs = e as SerialPortEventArgs;
                //通知异常
                OnPostExecute(default(T), new Exception(mSerialPortEventArgs.ErrorMessage));
            }, (object sender, EventArgs e) =>
            {
                SerialPortEventArgs mSerialPortEventArgs = e as SerialPortEventArgs;
                recvByteArray = mSerialPortEventArgs.Data;
                if (null != MyProtocol && null != mSerialPortEventArgs)
                {
                    //会调用重写的方法
                    OnPostExecute(MyProtocol.Decode(mSerialPortEventArgs.Data) as T, null);
                }
                else
                {
                    //通知异常
                    OnPostExecute(default(T), new Exception("返回数据为空"));
                }
            }, MyProtocol);

            if (RequestProtocol != null && RequestProtocol.GetCommand() != SerialPortConst.COMMAND_EMPTY_VIRTUAL)
            {
                mSerialPortController.SendCommand(RequestProtocol.Encode());
                Console.WriteLine("-----------------send value-----------------\n" + Util.ToHexString(RequestProtocol.Encode()));
            }
        }
        /// <summary>
        /// Перехватывает событие SerialPortDetectorThreadWrapper.onCompleted
        /// Это событие как определяет порт нужного устройства, так и фиксирует порты других устройств
        /// </summary>
        private void OnDetectionCompleted(object sender, LowLevelUtils.SerialPortDetectorEventArgs args)
        {
            if (args.Result)
            {
                Debug.Log($"Found! {args.Controller}");

                _serialPortController = args.Controller;
                _serialPortController.onMessageReceived += OnMessageReceived;
                foreach (var wrapper in _threadWrappers.Where(wr => !wr.RequestCanceled))
                {
                    wrapper.CancelRequest();
                }

                foreach (var cameraBaseController in CameraBaseControllers)
                {
                    cameraBaseController.Initialize();
                }
            }

            ((LowLevelUtils.SerialPortDetectorThreadWrapper)sender).onCompleted -= OnDetectionCompleted;

            if (++_wrappersInvokedCount == _threadWrappers.Count)
            {
                foreach (var wrapper in _threadWrappers)
                {
                    wrapper.Dispose();
                }

                _threadWrappers.Clear();
            }
        }
    public void moveForward(SerialPortController sp, Master ms, int rpm)
    {
        if (Config.num_of_thrusters != 5 && Config.num_of_thrusters != 3)
        {
            return;
        }

        int[] idx = new int[2];
        if (Config.num_of_thrusters == 5) // select motors to run: lowerleft, lowerright -> motorIdex[3,4]
        {
            idx[0] = Config.motorIdx[3];
            idx[1] = Config.motorIdx[4];
        }
        else if (Config.num_of_thrusters == 3)
        {
            idx[0] = Config.motorIdx[1];
            idx[1] = Config.motorIdx[2];
        }
        int[] rpmToSet = new int[Config.max_num_of_thrusters];
        for (int i = 0; i < Config.max_num_of_thrusters; ++i)
        {
            if (i == idx[0] || i == idx[1])
            {
                rpmToSet[i] = rpm;
            }
            else
            {
                rpmToSet[i] = 0;
            }
        }
        sp.sendDownstreamPacket(ms.setAllRPM(rpmToSet[0], rpmToSet[1], rpmToSet[2], rpmToSet[3], rpmToSet[4], rpmToSet[5]));
        curStatus = OPS.FORWARD;
    }
 public void OnRight(SerialPortController sp, Master ms)
 {
     if (Config.num_of_thrusters == 5)
     {
         curRPM = Config.max_rpm / 10;
         Debug.LogFormat("current RPM: %d\n", curRPM);
         moveRight(sp, ms, curRPM);
     }
 }
Пример #6
0
    public int MachineRot = 0; //기계에서 받아오는 핸들 회전 값 임시 변수

    //public CharacterController Bike;

    void Awake()
    {
        spController = gameObject.GetComponent <SerialPortController>();

        if (spController == null)
        {
            spController = new SerialPortController();
        }
        //DontDestroyOnLoad(this.gameObject);
    }
Пример #7
0
    // Use this for initialization
    void Start()
    {
        min_index = (int)roller_slider.minValue;
        max_index = (int)roller_slider.maxValue;

        current_index       = 3;
        roller_slider.value = current_index;

        spController = player.GetComponent <SerialPortController> ();
    }
 // Change the serial port name
 private void lstSerialPorts_SelectionChanged(object sender, SelectionChangedEventArgs e)
 {
     try
     {
         SerialPortController.PortName = (string)lstSerialPorts.SelectedItem;
     }
     catch (ArgumentNullException)
     {
         SerialPortController.StopReceivingData();
     }
 }
Пример #9
0
 /// <summary>
 /// The driver class for the main form and its event handelers.
 /// </summary>
 public MainForm()
 {
     /* Initialize UI */
     InitializeComponent(); // VS Studio Autogen code
     this.panelDashboard.Visible = true;
     this.panelScanMain.Visible  = false;
     this.panelExport.Visible    = false;
     /* Initialize models and controllers */
     this.databaseModel        = new DatabaseModel(this);
     this.exportModel          = new ExportModel();
     this.serialPortController = new SerialPortController(this, databaseModel);
     this.networkController    = new NetworkController(this, databaseModel);
 }
        // Send a string with new line to the serial port device
        private void btnSendLine_Click(object sender, RoutedEventArgs e)
        {
            // Set the timeout
            SerialPortController.WriteTimeout = 1000;

            // Send the string
            try
            {
                SerialPortController.Write(txtSendLine.Text, (MessageEnding)cbMessageEnding.SelectedItem);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("Failed in sending string:\n" + ex.Message);
            }
        }
 /// <summary>
 /// 串行端口控制器配置变更事件处理器。
 /// </summary>
 /// <param name="sender">触发该事件的对象。</param>
 /// <param name="e">事件参数。</param>
 protected void _ctrlConfigChangedHandler()
 {
     // Check if the serial port is ready
     if (SerialPortController.IsReady)
     {
         // Serial port ready
         // Start receiving data
         SerialPortController.StartReceivingData();
     }
     else
     {
         // Serial port not ready
         // Stop receiving data
         SerialPortController.StopReceivingData();
     }
 }
 public void goDown(SerialPortController sp, Master ms, int rpm)
 {
     int[] rpmToSet = new int[Config.max_num_of_thrusters];
     for (int i = 0; i < Config.max_num_of_thrusters; ++i)
     {
         if (i == Config.motorIdx[0])
         {
             rpmToSet[i] = rpm;
         }
         else
         {
             rpmToSet[i] = 0;
         }
     }
     sp.sendDownstreamPacket(ms.setAllRPM(rpmToSet[0], rpmToSet[1], rpmToSet[2], rpmToSet[3], rpmToSet[4], rpmToSet[5]));
     curStatus = OPS.DOWN;
 }
    public void changeSpeed(OPS status, SerialPortController sp, Master ms)
    {
        switch (status)
        {
        case OPS.UP:
            goUp(sp, ms, curRPM);
            break;

        case OPS.DOWN:
            goDown(sp, ms, curRPM);
            break;

        case OPS.FORWARD:
            moveForward(sp, ms, curRPM);
            break;

        case OPS.BACKWARD:
            moveBackward(sp, ms, curRPM);
            break;

        case OPS.LEFT_TURN:
            turnLeft(sp, ms, curRPM);
            break;

        case OPS.RIGHT_TURN:
            turnRight(sp, ms, curRPM);
            break;

        case OPS.LEFT:
            if (Config.num_of_thrusters == 5)
            {
                moveLeft(sp, ms, curRPM);
            }
            break;

        case OPS.RIGHT:
            if (Config.num_of_thrusters == 5)
            {
                moveRight(sp, ms, curRPM);
            }
            break;

        default:
            break;
        }
    }
    public void OnRealMonsterMode(SerialPortController sp, Master ms)
    {
        int randRPM = UnityEngine.Random.Range(0, 1000);

        for (int i = 0; i < 10; ++i)
        {
            randRPM = UnityEngine.Random.Range(0, 1000) % 11384 + 5000;
            if (UnityEngine.Random.Range(0, 1000) % 2 == 0)
            {
                sp.sendDownstreamPacket(ms.setAllRPM(randRPM, randRPM, randRPM, randRPM, randRPM, 0));
            }
            else
            {
                randRPM = -randRPM;
                sp.sendDownstreamPacket(ms.setAllRPM(randRPM, randRPM, randRPM, randRPM, randRPM, 0));
            }
            Debug.LogFormat("rpm: %d\n", randRPM);
        }
    }
Пример #15
0
        /// <summary>
        /// 设置四个螺旋桨的油门输出。(上位机模式)
        /// </summary>
        /// <param name="throttle1">第1号螺旋桨的油门输出。</param>
        /// <param name="throttle2">第2号螺旋桨的油门输出。</param>
        /// <param name="throttle3">第3号螺旋桨的油门输出。</param>
        /// <param name="throttle4">第4号螺旋桨的油门输出。</param>
        /// <returns>返回一个 bool 值表示指令是否成功送出。</returns>
        /// <exception cref="System.ArgumentOutOfRangeException">当油门输出不在 0 至 255 范围内时抛出该异常。</exception>
        public static bool SetThrottleOutputs_PC(int throttle1, int throttle2, int throttle3, int throttle4)
        {
            // =================== [ Sent Data Structure ] =================== //
            //                                                                 //
            //    '@', '0x04', [Throttle: 4*uint16_t (1,2,3,4)], '\r', '\n'    //
            //                                                                 //
            // =============================================================== //

            // Check the ranges of the throttles
            if (throttle1 < 0 || throttle1 > 255 ||
                throttle2 < 0 || throttle2 > 255 ||
                throttle3 < 0 || throttle3 > 255 ||
                throttle4 < 0 || throttle4 > 255)
            {
                throw new ArgumentOutOfRangeException("Miniquad_Controller.Miniquad.Communication.SetThrottleOutputs_PC: The value of throttle must be between 0 and 255.");
            }

            // Construct the message head bytes
            _sentDataInPrincipalComputerMode[0] = BitConverter.GetBytes('@')[0];
            _sentDataInPrincipalComputerMode[1] = BitConverter.GetBytes(4)[0];

            // Construct the message content bytes
            BitConverter.GetBytes((UInt16)throttle1).CopyTo(_sentDataInPrincipalComputerMode, 2);
            BitConverter.GetBytes((UInt16)throttle2).CopyTo(_sentDataInPrincipalComputerMode, 4);
            BitConverter.GetBytes((UInt16)throttle3).CopyTo(_sentDataInPrincipalComputerMode, 6);
            BitConverter.GetBytes((UInt16)throttle4).CopyTo(_sentDataInPrincipalComputerMode, 8);

            // Construct the message ending bytes
            _sentDataInPrincipalComputerMode[10] = BitConverter.GetBytes('\r')[0];
            _sentDataInPrincipalComputerMode[11] = BitConverter.GetBytes('\n')[0];

            // Send the message
            try
            {
                SerialPortController.Write(_sentDataInPrincipalComputerMode, 0, 12);
                return(true);
            }
            catch (System.Exception)
            {
                return(false);
            }
        }
Пример #16
0
 protected virtual void Dispose(bool disposing)
 {
     if (!_isDisposed)
     {
         if (disposing)
         {
             onCompleted = null;
             _serialPortController.onDetected -= Detect;
             if (_result)
             {
                 _serialPortController = null;
             }
             else
             {
                 _serialPortController.Dispose();
             }
         }
         _isDisposed = true;
     }
 }
 public void moveRight(SerialPortController sp, Master ms, int rpm)
 {
     if (Config.num_of_thrusters != 5)
     {
         return;
     }
     // select motors to run: upperleft, lowerleft -> motorIdex[1,3]
     int[] idx      = { Config.motorIdx[1], Config.motorIdx[3] };
     int[] rpmToSet = new int[Config.max_num_of_thrusters];
     for (int i = 0; i < Config.max_num_of_thrusters; ++i)
     {
         if (i == idx[0] || i == idx[1])
         {
             rpmToSet[i] = rpm;
         }
         else
         {
             rpmToSet[i] = 0;
         }
     }
     sp.sendDownstreamPacket(ms.setAllRPM(rpmToSet[0], rpmToSet[1], rpmToSet[2], rpmToSet[3], rpmToSet[4], rpmToSet[5]));
     curStatus = OPS.RIGHT;
 }
Пример #18
0
 public void ExitTask()
 {
     SerialPortController.GetInstance().ClosePort();
 }
 void Awake()
 {
     instance = this;
 }
 public UserControls()
 {
     InitializeComponent();
     // pass ImageViewModel from the UserControl's DataContext
     ctrl = new SerialPortController(DataContext as ImageViewModel);
 }
 public void OngetAllCurrent(SerialPortController sp, Master ms)
 {
     sp.sendDownstreamPacket(ms.getAllCurrent());
 }
 public void OngetBatteryVolts(SerialPortController sp, Master ms)
 {
     sp.sendDownstreamPacket(ms.getBatteryVolts());
 }
 public void StopscanPeriodically(SerialPortController sp, Master ms)
 {
     sp.sendDownstreamPacket(ms.scanPeriodically(0x16, 0x0c, 0));
     sp.sendDownstreamPacket(ms.scanPeriodically(0x17, 0x0c, 0));
 }
        /// <summary>
        /// 接收并显示飞行器的当前状态。
        /// </summary>
        protected void _receiveRobotStatus()
        {
            // Get the latest Miniquad status
            if (Miniquad.Miniquad.RefreshStatus(SerialPortController.ReceivedDataBuffer))
            {
                // Get the status
                MiniquadStatus status = Miniquad.Miniquad.Status;

                // Get the throttle outputs (PC mode)
                int[] throttles = Miniquad.Miniquad.GetAdjustedThrottleOutputs_PC();

                // Check the existence of the status
                if (status != null)
                {
                    // Clear the buffer
                    SerialPortController.ClearReceivedDataBuffer();

                    // Quaternion
                    lblQuaternion.Dispatcher.Invoke(new Action(() =>
                    {
                        lblQuaternion.Content =
                            status.Quaternion.W.ToString("0.00") + ", " +
                            status.Quaternion.X.ToString("0.00") + ", " +
                            status.Quaternion.Y.ToString("0.00") + ", " +
                            status.Quaternion.Z.ToString("0.00");
                    }));

                    // Euler Angle
                    lblEulerAngle.Dispatcher.Invoke(new Action(() =>
                    {
                        lblEulerAngle.Content =
                            status.EulerAngle.Psi.ToString("0.00") + ", " +
                            status.EulerAngle.Theta.ToString("0.00") + ", " +
                            status.EulerAngle.Phi.ToString("0.00");
                    }));

                    // Rotation
                    lblRotation.Dispatcher.Invoke(new Action(() =>
                    {
                        lblRotation.Content =
                            status.Rotation.X.ToString("0.00") + ", " +
                            status.Rotation.Y.ToString("0.00") + ", " +
                            status.Rotation.Z.ToString("0.00");
                    }));

                    // Acceleration
                    lblAcceleration.Dispatcher.Invoke(new Action(() =>
                    {
                        lblAcceleration.Content =
                            status.Acceleration.X.ToString("0.00") + ", " +
                            status.Acceleration.Y.ToString("0.00") + ", " +
                            status.Acceleration.Z.ToString("0.00");
                    }));

                    // Gravity
                    lblGravity.Dispatcher.Invoke(new Action(() =>
                    {
                        lblGravity.Content =
                            status.Gravity.X.ToString("0.00") + ", " +
                            status.Gravity.Y.ToString("0.00") + ", " +
                            status.Gravity.Z.ToString("0.00");
                    }));

                    // Yaw Pitch Roll
                    lblYawPitchRoll.Dispatcher.Invoke(new Action(() =>
                    {
                        lblYawPitchRoll.Content =
                            status.YawPitchRoll.Yaw.ToString("0.00") + ", " +
                            status.YawPitchRoll.Pitch.ToString("0.00") + ", " +
                            status.YawPitchRoll.Roll.ToString("0.00");
                    }));

                    // Temperature
                    //lblTemperature.Content = "null";

                    // Throttles
                    lblThrottles.Dispatcher.Invoke(new Action(() =>
                    {
                        lblThrottles.Content =
                            status.Propeller1.Throttle.ToString() + ", " +
                            status.Propeller2.Throttle.ToString() + ", " +
                            status.Propeller3.Throttle.ToString() + ", " +
                            status.Propeller4.Throttle.ToString();

                        //lblThrottles.Content =
                        //    throttles[0].ToString() + ", " +
                        //    throttles[1].ToString() + ", " +
                        //    throttles[2].ToString() + ", " +
                        //    throttles[3].ToString();
                    }));

                    // Auto controlled by algorithm
                    if (_isAotoControlled)
                    {
                        Miniquad.Miniquad.SetThrottleOutputs_PC(throttles[0], throttles[1], throttles[2], throttles[3]);
                    }
                }
            }
        }
Пример #25
0
 public SerialPortDetectorThreadWrapper(string portName, bool sendOnCompletedToMainThread = true) : base(sendOnCompletedToMainThread)
 {
     _serialPortController             = SerialPortParams.NewSerialPort(portName);
     _serialPortController.onDetected += Detect;
 }
Пример #26
0
 private void OnLoad(object sender, RoutedEventArgs e)
 {
     serialPortController = new SerialPortController(false);
     txtPortName.Text     = serialPortController.PortName;
     txtBaudRate.Text     = serialPortController.Baudrate.ToString();
 }
Пример #27
0
        public void InitialVariables()
        {
            otherController = new OtherController();

            ovalPictureBox.BackgroundImageLayout = ImageLayout.Zoom;

            serialPortController           = new SerialPortController(true);
            serialPortController.PortOpen += () =>
            {
                // System.Windows.MessageBox.Show("port open");
                this.Dispatcher.Invoke(() =>
                {
                    imageSerialportStatus.Source = new BitmapImage(new Uri("/Resource/SerialPortSuccess.png", UriKind.Relative));
                });
            };
            serialPortController.PortClose += () =>
            {
                // System.Windows.MessageBox.Show("port closed");
                this.Dispatcher.Invoke(() =>
                {
                    imageSerialportStatus.Source = new BitmapImage(new Uri("/Resource/SerialPortFail.png", UriKind.Relative));
                });
            };
            serialPortController.NewDataReceived += (string data) =>
            {
                if (data.Substring(data.Length - 1, 1) == "\r")
                {
                    data = data.Substring(0, data.Length - 1);
                }
                //System.Windows.MessageBox.Show(data);
                switch (data)
                {
                case "LIVE":
                    new Task(() => LivePreView()).Start();
                    break;

                case "SAVE":
                    if (pedalController.SaveOnSave)
                    {
                        SaveToGallery();
                    }
                    if (pedalController.SetImageRightOnSave)
                    {
                        SetImageRight();
                    }
                    break;

                case "FREEZE":
                    CaptureJpeg();
                    StopLivePreView();
                    if (pedalController.SaveOnFreeze)
                    {
                        SaveToGallery();
                    }
                    break;
                }
            };

            dvrControl        = new DvrController();
            galleryController = new GalleryController();
            pedalController   = new PedalController();
            captureController = new CaptureController();

            patientDbContext = new PatientDbContext();

            dgTodayWorkBench.DataContext = patientDbContext.Patients.ToList();

            pateintTodayForm.nowRefresh      += LoadTodayPatientTable;
            pateintTodayForm.onSelectPatient += (int Id, string fullName) =>
            {
                mainTabControl.SelectedIndex = 1;
                PatientId = Id;
                galleryController.CreateAndOpenGalley(Id);
                galleryControl.setGalleryId(Id);
                patientWorkBenchName.Text = fullName;
                //picCapture.Source = null;


                partBottom.Visibility = Visibility.Collapsed;
            };


            galleryControl.onChangeSelectedItem += (BitmapImage bitmapImage) =>
            {
                this.Dispatcher.Invoke(() =>
                {
                    //ellipseGeometry.Center = new Point(bitmapImage.Width / 2, bitmapImage.Height / 2);

                    //int startX = (int)(bitmapImage.Width - bitmapImage.Height) / 2;

                    //int endX = (int)(bitmapImage.Width + startX);

                    ////CroppedBitmap croppedBitmap = new CroppedBitmap(bitmapImage, new Int32Rect(startX, 0, endX, (int)bitmapImage.Height));

                    //croppedBitmap.SourceRect = new Int32Rect(startX, 0, endX, (int)bitmapImage.Height);

                    picCapture.Source = bitmapImage;
                });
            };
        }
 public void OnTurnRight(SerialPortController sp, Master ms)
 {
     curRPM = Config.max_rpm / 10;
     Debug.LogFormat("current RPM: %d\n", curRPM);
     turnRight(sp, ms, curRPM);
 }
Пример #29
0
 public void ClearAllEvent()
 {
     SerialPortController.GetInstance().ClearAllEvent();
 }
 public void OnMonsterMode(SerialPortController sp, Master ms)
 {
     sp.sendDownstreamPacket(ms.setAllRPM(5000, 5000, 5000, 5000, 5000, 0));
 }