public void EnQueue(IKvController box)
 {
     requestsList.Enqueue(new Request()
     {
         Box = box
     });
 }
Ejemplo n.º 2
0
 public FloatTag(short id, IKvController kvController) : base(id, kvController)
 {
 }
Ejemplo n.º 3
0
 public ITag(short id, IKvController kvController)
 {
     this._id         = id;
     this._controller = kvController;
 }
        public void Init(SerialPort port)
        {
            Status     = ServiceStatus.Initial;
            serialPort = port;
            if (!serialPort.IsOpen)
            {
                serialPort.Open();
                LogRequest("CR\r\n");
                var i = 0;
                while (i < 5)
                {
                    if (serialPort.BytesToRead > 0)
                    {
                        var resp = serialPort.ReadLine();
                        if (resp.StartsWith("CC"))
                        {
                            Status = ServiceStatus.Ready;
                            break;
                        }
                        else
                        {
                            Status = ServiceStatus.Error;
                        }
                    }
                    Thread.Sleep(10);
                    i++;
                }
                if (this.Status != ServiceStatus.Ready)
                {
                    throw new Exception("Connect PLC failed!");
                }
            }
            serialPort.DataReceived += delegate {
                if (serialPort.BytesToRead > 0)
                {
                    var resp = serialPort.ReadLine();
                    if (this.currentBox != null)
                    {
                        this.currentBox.UpdateUI(resp);
                        this.currentBox = null;
                    }
                    Status = ServiceStatus.Ready;
                }
            };

            Request nextRequest = null;

            var postTask = new Task(delegate {
                while (true && Status != ServiceStatus.Stop)
                {
                    if (Status == ServiceStatus.Ready)
                    {
                        if (firstPriorityList.Count > 0)
                        {
                            nextRequest = firstPriorityList.Dequeue();
                        }
                        else if (requestsList.Count > 0)
                        {
                            nextRequest = requestsList.Dequeue();
//			                                        if(nextRequest.Box!=null){
//			                                            var ctrl = (System.Windows.Forms.Control)nextRequest.Box;
//			                                            if(!ctrl.IsHandleCreated){
//			                                                requestsList.Enqueue(nextRequest);
//			                                                Status = ServiceStatus.Ready;
//			                                                continue;
//			                                            }
//			                                        }
                        }
                        if (nextRequest.Box != null)
                        {
                            currentBox = nextRequest.Box;
                        }
                        var cmd = nextRequest.Box != null?nextRequest.Box.GetReadCmd(): nextRequest.RequestText;

                        if (string.IsNullOrEmpty(cmd))
                        {
                            Status = ServiceStatus.Ready;
                            continue;
                        }
                        LogRequest(cmd);
                        Status = ServiceStatus.Posted;
                        if (nextRequest.Box != null)
                        {
                            if (nextRequest.Box.KVAutoSync)
                            {
                                requestsList.Enqueue(nextRequest);
                            }
                        }
                        continue;
                    }
                    Thread.Sleep(1);
                }
            });

            postTask.Start();
        }