Beispiel #1
0
 public SerialPortHandler(BetterSerialPort serialPort, int byteTimeout = 2)
 {
     this.serialPort       = serialPort;
     serialPortByteTimeout = byteTimeout;
     toSerThreadQueue      = new BlockingCollection <SerialTask>();
     fromSerThreadQueue    = new BlockingCollection <SerialTask>();
 }
Beispiel #2
0
        public KA3005P()
        {
            BetterSerialPort serialPort1 = new BetterSerialPort(BetterSerialPort.StopBits.One, BetterSerialPort.Parity.None);

            serport1 = new SerialPortHandler(serialPort1);
            serport1.SerialPortBroke += Serport1_SerialPortBroke;
            SetStatusIndicators(0);
        }
Beispiel #3
0
 /// <summary>
 /// Fase di connessione.
 /// </summary>
 private static void ThreadedConnection()
 {
     Utilities.LogD(TAG, "In attesa di connessione...");
     do
     {
         has_Connected = false;
         while (!has_Connected)
         {
             string[] porte = SerialPort.GetPortNames(); //Ottiene la lista dei nomi delle porte correntemente utilizzate dal sistema operativo
             for (int i = 0; i < porte.Length; i++)
             {
                 Utilities.LogD(TAG, "Presente porta: " + porte[i]);
             }
             for (int i = 0; i < porte.Length; i++)   //Scorre le porte alla ricerca di quella giusta
             {
                 if (porte != null)
                 {
                     if (porte[i].Contains("ACM") || porte[i].Contains("COM"))           //Arduino usa l'abstract control model (ACM), per cui in linux based os le porte di arduino iniziano sempre per ACM, non per COM.
                     {
                         seriale             = new BetterSerialPort(porte[i], baudrate); //Inizializza la porta scelta al baudrate scelto
                         seriale.ReadTimeout = timeout;                                  //setta il timeout, cioé la quantità di tempo dopo il quale, se non si riceve risposta, la connessione al dispositivo viene annullata.
                         seriale.Handshake   = Handshake.None;                           //Nessaun handshaking col dispositivo perché ne faccio uno manuale.
                         seriale.DtrEnable   = true;                                     //Abilito il data terminal ready (DTR) per segnalare ad arduino che il PC è pronto a comunicare.
                         seriale.Encoding    = System.Text.Encoding.ASCII;
                         //seriale.DataReceived += new SerialDataReceivedEventHandler(ParseData); //Event listener NON FUNZIONA CON UNITY (BUG NOTO)
                         if (seriale.IsOpen)
                         {
                             Utilities.LogD(TAG, "Impossibile aprire arduino: seriale già aperto!");
                             seriale.Close();
                         }
                         else
                         {
                             try {
                                 seriale.Open(); //Apro la comunicazione col seriale
                                 Utilities.LogD(TAG, "Connesso alla porta [" + porte[i] + "]");
                                 i             = porte.Length;
                                 has_Connected = true;
                             } catch (UnauthorizedAccessException uae) {
                                 Utilities.LogD(TAG, "Accesso non autorizzato alla porta [" + porte[i] + "] -> [" + uae + "]");
                             } catch (ArgumentOutOfRangeException aoore) {
                                 Utilities.LogD(TAG, "Argument out of range alla porta [" + porte[i] + "] -> [" + aoore + "]");
                             } catch (IOException ioe) {
                                 Utilities.LogD(TAG, "IO exception alla porta [" + porte[i] + "] -> [" + ioe + "]");
                             } catch (IndexOutOfRangeException ioore) {
                                 Utilities.LogD(TAG, "Index out of range -> [" + ioore + "]");
                             }
                         }
                     }
                 }
                 Thread.Sleep(100);
             }
         }
         while (seriale != null && seriale.IsOpen)
         {
             //IN
             string incoming = seriale.ReadLine();
             if (incoming.Length > 0 && incoming != null)
             {
                 Utilities.LogD(TAG, "Ricevuto messaggio da arduino [" + incoming + "]");
                 //Do something with this data here.
             }
             //OUT ASYNC
             if (outgoingQueue.TryDequeue(out string msg))
             {
                 if (msg != "" && msg != null)
                 {
                     Utilities.LogD(TAG, "Invio messaggio ad arduino [" + msg + "]");
                     try {
                         seriale.Write(msg);
                         seriale.Clear();
                     } catch (InvalidOperationException e) {
                         Utilities.LogE(TAG, "Operazione non valida [" + e + "]");
                     } catch (ArgumentNullException e) {
                         Utilities.LogE(TAG, "Argomento nullo [" + e + "]");
                     } catch (TimeoutException e) {
                         Utilities.LogE(TAG, "Timeout [" + e + "]");
                     }
                 }
             }
             Thread.Sleep(5); //Giusto per non schiattare la board. Tanto 5 ms non si sentono.
         }
         //seriale.Close();
         //seriale.Dispose();
         has_Connected = false;
         Utilities.LogD(TAG, "arduino disconesso, tento la riconnessione...");
     } while (true);
 }
Beispiel #4
0
        public GUI()
        {
            InitializeComponent();

            portInfoLabel.Text = string.Format("{0}@{1}kbaud",
                                               ControlStation.Properties.Settings.Default.PortName,
                                               ControlStation.Properties.Settings.Default.BaudRate / 1000);

            //setup serial port
            BetterSerialPort port = new BetterSerialPort(ControlStation.Properties.Settings.Default.PortName,
                                                         ControlStation.Properties.Settings.Default.BaudRate);

            //handles communication thread
            comms = new SerialCommunication(port);
            //displays port info and connect/disconnect button
            comms.CommunicationException += OnCommunicationException;
            comms.Started         += OnCommunicationStarted;
            comms.Stopped         += OnCommunicationStopped;
            comms.TenElapsed      += OnTenElapsed;
            comms.FiftyElapsed    += OnHundredElapsed;
            comms.ThousandElapsed += OnThousandElapsed;

            //construct sensor and actuator objects
            depth = new DepthSensor(new DepthData());
            imu   = new OrientationSensor(new OrientationData());

            List <ToolData> toolList = new List <ToolData>();

            for (int i = 0; i < 3; i++)
            {
                toolList.Add(new ToolData());
            }
            tools = new ToolsActuator(toolList);

            List <ESCData> escList = new List <ESCData>();

            for (int i = 0; i < 6; i++)
            {
                escList.Add(new ESCData());
            }
            escs      = new PropulsionSensor(escList);
            thrusters = new PropulsionActuator(escList);

            StatusData state = new StatusData();

            status        = new StatusSensor(state);
            statusControl = new StatusActuator(state);

            versioning = new DiagnosticsSensor(new VersionData());

            //put them in the list
            devices = new List <GenericAbstractDevice>();
            devices.Add(depth);
            devices.Add(imu);
            devices.Add(escs);
            devices.Add(thrusters);
            devices.Add(tools);
            devices.Add(status);
            devices.Add(statusControl);
            devices.Add(versioning);

            statusPanel.Controls.Add(status, 0, 0);
            statusPanel.Controls.Add(statusControl, 0, 1);
            statusPanel.Controls.Add(versioning, 0, 2);
            statusPanel.Controls.Add(escs, 1, 0);
            statusPanel.SetRowSpan(escs, 3);

            toolsPanel.Controls.Add(tools);

            thrustersPanel.Controls.Add(thrusters);

            depthBox.Controls.Add(depth);
            attitudeBox.Controls.Add(imu);

            //disable all devices to start off
            foreach (GenericAbstractDevice device in devices)
            {
                device.Enabled = false;
            }
        }