/// <summary>
 /// Initialize a ComPort using the supplied parameters.
 /// </summary>
 /// <param name="portName">The port name to connect too.</param>
 /// <param name="portParameters">The parameters to use when setting up the ComPort</param>
 public ComPortBase(string portName, ComParameters portParameters)
 {
     _portParameters.CopyFrom(portParameters);
     _serialPort.PortName     = portName;
     _serialPort.ReadTimeout  = portParameters.TimeoutMilliseconds;
     _serialPort.WriteTimeout = portParameters.TimeoutMilliseconds;
     _serialPort.BaudRate     = portParameters.BaudRate;
 }
        /// <summary>
        /// Checks to see if a ComPort responds to an given command.
        /// </summary>
        /// <param name="portName">The ComPort to check.</param>
        /// <param name="portParameters">The parameters to use when connecting to the port and checking for responce.</param>
        /// <returns>ComPort if the unit responds as expected, null otherwise.</returns>
        public static T CheckPort <T>(string portName, ComParameters portParameters) where T : ComPortBase
        {
            var serialPort = (T)Activator.CreateInstance(typeof(T), portName, portParameters);

            serialPort.Connect();

            if (serialPort.SendConnectionTest())
            {
                return(serialPort);
            }

            serialPort.Disconnect();
            return(null);
        }
        /// <summary>
        /// Function to connect to the first ComPort in the provided list that responds to the ComParameters correctly.
        /// </summary>
        /// <param name="portsToCheck">A list of ComPorts to check. Format should be "COM#".</param>
        /// <param name="portParameters">The ComParameters to use when checking each port for correct responce.</param>
        /// <returns>ComPort if the unit responds as expected, null otherwise.</returns>
        public static T AutoConnectComPort <T>(List <string> portsToCheck, ComParameters portParameters) where T : ComPortBase
        {
            if (!Monitor.TryEnter(AutoConnectingLock, portParameters.MaxDelayMilliseconds))
            {
                return(null);
            }

            // storage variable for return port
            T connectedPort = null;

            try
            {
                // kick off all the checkport tasks
                var portCheckTasks = portsToCheck.Where(p => p != null)
                                     .Select(port => Task.Factory.StartNew(() => CheckPort <T>(port, portParameters)))
                                     .Cast <Task>().ToList();

                // wait allotted time for ports to connect
                Task.WaitAll(portCheckTasks.ToArray(), portParameters.TimeoutMilliseconds + portParameters.MaxDelayMilliseconds);

                // pull the first connected port out of the list
                connectedPort = portCheckTasks.Cast <Task <T> >().FirstOrDefault(s => s.Result != null)?.Result;

                // close any other ports in the list that were connected
                foreach (var task in portCheckTasks.Cast <Task <T> >().Where(s => s.Result != null && s.Result != connectedPort))
                {
                    task.Result.Disconnect();
                }
            }
            catch (Exception ex)
            {
                ex.ToString();
                // ignored
            }
            finally
            {
                Monitor.Exit(AutoConnectingLock);
            }

            // return port, will be null if no port connected
            return(connectedPort);
        }
        /// <summary>
        /// Creates a new ThreadedComPortBase object.
        /// </summary>
        /// <param name="threadName">The threadname to report during closing and error events.</param>
        /// <param name="closingWorker">The closing worker this thread should subscribe too.</param>
        /// <param name="connectionParameters">The ComParameters to use when testing connections</param>
        /// <param name="mode">Which connection mode to use when selecting ComPorts to test.</param>
        /// <param name="selectionRule">The selectionRule to use when mode = SelectionRule.</param>
        public ThreadedComPortBase(string threadName, ClosingWorker closingWorker, ComParameters connectionParameters,
                                   ConnectionMode mode, Func <ComPortInfo, bool> selectionRule = null) : base(threadName)
        {
            _threadName = threadName;
            closingWorker?.AddThread(this);
            ConnectionParameters.CopyFrom(connectionParameters);

            // initialize the StateMachine
            WorkerState = new StateDefinition();
            MachineFunctions.InitializeStates(WorkerStateMachine = new StepDefinition(threadName, true, WorkerState)
            {
                #region StateMachine
                SubSteps = new List <StepDefinition>
                {
                    new StepDefinition("Searching")
                    {
                        Delegate = StateMachine_Searching, DelayTimeMs = 200
                    },
                    new StepDefinition("Connection Check")
                    {
                        Delegate = StateMachine_ConnectionCheck, DelayTimeMs = 200
                    },
                    new StepDefinition("Complete")
                    {
                        Delegate = StateMachine_Complete, DelayTimeMs = 200
                    }
                }
                #endregion // StateMachine
            });

            // set the mode for this com port
            ChangeMode(mode, selectionRule);

            // initialize ThreadingBase
            WorkerThreads = new List <ThreadInfo>
            {
                new ThreadInfo(new Thread(Worker), "State Machine", threadName, WorkerStateMachine)
            };
        }
 /// <summary>
 /// Initialize a VisiLEDComPort using the supplied parameters.
 /// </summary>
 /// <param name="portName">The port name to connect too.</param>
 /// <param name="portParameters">The parameters to use when setting up the VisiLEDComPort</param>
 public VisiLEDComPort(string portName, ComParameters portParameters) : base(portName, portParameters)
 {
 }
示例#6
0
 /// <summary>
 /// AutoConnect function called by the CVLSThreadedComPort class. A derived class can override this function
 /// to return a different derived type of CVLSComPort for the connect function. This allows for extension of
 /// the CVLSThreadedComPort.
 /// </summary>
 /// <param name="portsToCheck">Which ports to check for a connection.</param>
 /// <param name="portParameters">Which parameters to use when checking ports.</param>
 /// <returns></returns>
 protected override ComPortBase AutoConnectComPort(List <string> portsToCheck, ComParameters portParameters)
 {
     return(ComPortBase.AutoConnectComPort <CVLSComPort>(portsToCheck, portParameters));
 }
示例#7
0
 /// <summary>
 /// Create a TelnetSocket using specific ComParameters.
 /// </summary>
 /// <param name="comParameters"></param>
 public TelnetSocket(ComParameters comParameters)
 {
     ComParameters.CopyFrom(comParameters);
 }
示例#8
0
 /// <summary>
 /// Initialize a CVLSComPort using the supplied parameters.
 /// </summary>
 /// <param name="portName">The port name to connect too.</param>
 /// <param name="portParameters">The parameters to use when setting up the CVLSComPort</param>
 public CVLSComPort(string portName, ComParameters portParameters) : base(portName, portParameters)
 {
     Protocol     = new LegacyProtocol(this);
     ProtocolEcho = new LegacyProtocol(this, true);
 }
 /// <summary>
 /// Initialize a KL2500LEDComPort using the supplied parameters.
 /// </summary>
 /// <param name="portName">The port name to connect too.</param>
 /// <param name="portParameters">The parameters to use when setting up the KL2500LEDComPort</param>
 public KL2500LEDComPort(string portName, ComParameters portParameters) : base(portName, portParameters)
 {
     Protocol     = new Protocol(this);
     ProtocolEcho = new Protocol(this, true);
 }
 /// <summary>
 /// Connect function called by the ThreadedComPortBase class. A derived class can override this function
 /// to return a different derived type of ComPortBase for the connect function. This allows for extension of
 /// the ThreadedComPortBase.
 /// </summary>
 /// <param name="port">Which ports to connect too.</param>
 /// <param name="portParameters">Which parameters to use when checking ports.</param>
 /// <returns></returns>
 protected virtual ComPortBase ConnectComPort(string port, ComParameters portParameters)
 {
     return(new ComPortBase(port, portParameters));
 }
 /// <summary>
 /// AutoConnect function called by the ThreadedComPortBase class. A derived class can override this function
 /// to return a different derived type of ComPortBase for the connect function. This allows for extension of
 /// the ThreadedComPortBase.
 /// </summary>
 /// <param name="portsToCheck">Which ports to check for a connection.</param>
 /// <param name="portParameters">Which parameters to use when checking ports.</param>
 /// <returns></returns>
 protected virtual ComPortBase AutoConnectComPort(List <string> portsToCheck, ComParameters portParameters)
 {
     return(ComPortBase.AutoConnectComPort <ComPortBase>(portsToCheck, portParameters));
 }