Пример #1
0
        private void TxThreadProcess()
        {
            while (true)
            {
                if (TxQueue.Count > 0 || AddPkg2TxQueue.WaitOne(TIME_OUT_WAIT_TX_EVENT))
                {
                    if (DECONFLICT_TIME > 0)
                    {
                        Thread.Sleep(DECONFLICT_TIME);
                    }

                    int count = 0;
                    while (l2State != L2State_E.NORMAL_MODE)
                    {
                        Thread.Sleep(10);
                        if (count++ > 100) // 100*10 = 1000 ms, NOTE : check again that no data package is take time longer 1s
                        {
                            break;
                        }
                    }

                    lock (TxQueue)
                    {
                        L2Pkg pkg = TxQueue.Dequeue();

                        //May be clean received buffer
                        L1Handler.CleanRxBuffer();

                        //Send data
                        L2SendPkg(pkg);
                        AddPkg2TxQueue.Reset();
                    }
                }
            }
        }
Пример #2
0
        public bool L2TXAddPkg(L2Pkg pkg)
        {
            if (TxQueue.Count > MAX_QUEUE_POS)
            {
                return(false);
            }
            else
            {
                lock (TxQueue)
                {
                    //Add data to queue and raise event
                    TxQueue.Enqueue(pkg);

                    AddPkg2TxQueue.Set();

                    return(true);
                }
            }
        }
Пример #3
0
        public bool L2TXAddPkg(byte[] sendData, bool isNeedACK, uint resend, byte cmd)
        {
            if (TxQueue.Count > MAX_QUEUE_POS)
            {
                Trace.WriteLine("TxQueue is full.");
                return(false);
            }
            else
            {
                lock (TxQueue)
                {
                    //Add data to queue and raise event
                    L2Pkg pkg = new L2Pkg(sendData, isNeedACK, resend, cmd);

                    TxQueue.Enqueue(pkg);

                    AddPkg2TxQueue.Set();

                    return(true);
                }
            }
        }
Пример #4
0
        private void L2SendPkg(L2Pkg pkg)
        {
            if (pkg.isNeededACK)
            {
                int  sendTimes = (int)pkg.resend + 1;
                bool respond   = false;

                //Send data and wait respond
                do
                {
                    l2State = L2State_E.TX_MODE;

                    sL1Object_t obj = new sL1Object_t();
                    L1Object.L1Object_BuildFromData(this, pkg.data, pkg.MinorCmd, u8Seq, ref obj);

                    byte[] temp = new byte[pkg.data.Length + 1 + L1Object.HEADER_LENGTH];

                    L1Object.L1Object_L1ObjectToArray(obj, ref temp);

                    L1Handler.Send(temp);

                    l2State = L2State_E.WAIT_RESP_MODE;
                    //Wait respond event
                    if (ACKRespondEvent.WaitOne(TIME_WAIT_DEV_RESPOND))
                    {
                        respond = true;
                    }
                    else
                    {
                        Trace.WriteLine("L2:Resend " + sendTimes.ToString());
                        if (IsResetEn)
                        {
                            try
                            {
                                L1Handler.Close();
                                L1Handler.Open();
                            }
                            catch (Exception ex)
                            {
                                l2State = L2State_E.ERROR;
                                Trace.WriteLine(ex.Message);
                            }
                        }
                    }

                    ACKRespondEvent.Reset();

                    sendTimes--;
                } while (respond == false && sendTimes > 0);

                if (respond == false && sendTimes <= 0)
                {
                    l2State = L2State_E.ERROR;
                }
                else
                {
                    l2State = L2State_E.NORMAL_MODE;
                }
            }
            else
            {
                l2State = L2State_E.TX_MODE;

                sL1Object_t obj = new sL1Object_t();
                L1Object.L1Object_BuildFromData(this, pkg.data, pkg.MinorCmd, u8Seq, ref obj);

                byte[] temp = new byte[pkg.data.Length + 1 + L1Object.HEADER_LENGTH];

                L1Object.L1Object_L1ObjectToArray(obj, ref temp);

                L1Handler.Send(temp);

                l2State = L2State_E.NORMAL_MODE;
            }
        }