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(); } } } }
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); } } }
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); } } }
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; } }