public Result API_ControlAbort( ) { #if _TRACE_OUT_PUT PrintMagToTxt("API_ControlAbort"); #endif //Ask CheckTagAccessPkt function stop. enumINVENTORY_STATUS = ENUM_FLOW_CONTROL.ABORT; //Result result = Result.OK; //ENUM_CMD TxCmd = ENUM_CMD.NOTHING; //byte[] buf = new byte[10]; //Array.Clear(buf, 0, buf.Length); //TxCmd = ENUM_CMD.CONTROL_ABORT; //buf[0] = (byte)TxCmd; //if ( false == SendData(buf) ) // return Result.FAILURE; //Array.Clear(buf, 0, buf.Length); ////Check receive data //if ( false == ReceiveData( TxCmd, ref buf ) ) // return Result.FAILURE; ////Check result //result = ConvertResult(buf[1]); //if (Result.OK != result) // return result; return Result.OK; }
//Reset receive flow protected void ResetRxFlow(ENMU_PKT_TYPE r_Type) { RxPktTpye = r_Type; RxStep = ENMU_PKT_FLOW.STEP_HEADER_1; m_timeBefReg = DateTime.Now; //Reset flag while restart tag access/inventory if (RxPktTpye == ENMU_PKT_TYPE.TAG_ACCESS) { bCheckTimeOut = false; enumINVENTORY_STATUS = ENUM_FLOW_CONTROL.NOTHING; } }
public Result API_ControlResume( ) { #if _TRACE_OUT_PUT PrintMagToTxt("API_ControlResume"); #endif //Require CheckTagAccessPkt function resume. enumINVENTORY_STATUS = ENUM_FLOW_CONTROL.RESUME; //this command deesn't response return Result.OK; }
protected bool CheckTagAccessPkt( [In] CommonParms strcParms ) { ENUM_CMD result = ENUM_CMD.NOTHING; ArrayList MultiBuf = new ArrayList(); byte[] SingleBuf = new Byte[64]; Array.Clear(SingleBuf, 0, SingleBuf.Length); //Reset Receive flow ResetRxFlow(ENMU_PKT_TYPE.TAG_ACCESS); try { while (true) { #if _TRACE_OUT_PUT PrintMagToTxt("CheckTagAccessPkt"); #endif //Start Time Out flow. (Not command timeout. It's process timeout) if(bCheckTimeOut) { TimeSpan ts = new TimeSpan(DateTime.Now.Ticks - m_timeBefAccess.Ticks); if (ts.TotalSeconds > 3) { #if _TRACE_OUT_PUT PrintMagToTxt("CheckTagAccessPkt: TIME_OUT"); #endif //Send Abort to check that skip inventory status. //this.ControlAbort(); this.ControlCancel();//??modified for abort??// clsPacket.TRANS_API_ClearBuffer(); return true; } } switch (enumINVENTORY_STATUS) { case ENUM_FLOW_CONTROL.PAUSE: #if _TRACE_OUT_PUT PrintMagToTxt("CheckTagAccessPkt: PAUSE"); #endif enumINVENTORY_STATUS = ENUM_FLOW_CONTROL.NOTHING; ControlPause(); break; case ENUM_FLOW_CONTROL.RESUME: #if _TRACE_OUT_PUT PrintMagToTxt("CheckTagAccessPkt: RESUME"); #endif enumINVENTORY_STATUS = ENUM_FLOW_CONTROL.NOTHING; ControlResume(); break; case ENUM_FLOW_CONTROL.ABORT: #if _TRACE_OUT_PUT PrintMagToTxt("CheckTagAccessPkt: ABORT"); #endif enumINVENTORY_STATUS = ENUM_FLOW_CONTROL.NOTHING; //Abort all inventory data from memory. clsPacket.TRANS_API_ClearBuffer(); ControlAbort(); bCheckTimeOut = true; m_timeBefAccess = DateTime.Now; break; case ENUM_FLOW_CONTROL.CANCEL: #if _TRACE_OUT_PUT PrintMagToTxt("CheckTagAccessPkt: CANCEL"); #endif enumINVENTORY_STATUS = ENUM_FLOW_CONTROL.NOTHING; ControlCancel(); bCheckTimeOut = true; m_timeBefAccess = DateTime.Now; break; } //Only wait End Packet or Abort Common Packet to stop the process. //don't need command timeout. result = Regular( ref SingleBuf, false ); switch (result) { //case ENUM_CMD.TIME_OUT: // if (strcParms.OpMode == RadioOperationMode.CONTINUOUS || // strcParms.OpMode == RadioOperationMode.NONCONTINUOUS ) // break; // PrintMagToTxt("CheckTagAccessPkt: TIME_OUT"); // clsPacket.TRANS_API_ClearBuffer(); // return false; case ENUM_CMD.CONTROL_ABORT: #if _TRACE_OUT_PUT PrintMagToTxt("CheckTagAccessPkt: bAbort"); #endif return true; break; case ENUM_CMD.BEGIN: #if _TRACE_OUT_PUT PrintMagToTxt("CheckTagAccessPkt: BEGIN"); #endif //If get first packet, reset the flow. if (usDivideSeq == 1) { usDataTotalLenDw = usDataSingleLenDw; if (0 != MultiBuf.Count) MultiBuf.RemoveRange(0, MultiBuf.Count); } else { //The packet sequence is more then 1, but buffer doesn't have data. //It means lossing some packets. Ignore this inventory or tag access. if (0 == MultiBuf.Count) break; usDataTotalLenDw += usDataSingleLenDw; } HandleCallBack(strcParms, SingleBuf); Array.Clear(SingleBuf, 0, SingleBuf.Length); usDataTotalLenDw = 0; if (0 != MultiBuf.Count) MultiBuf.RemoveRange(0, MultiBuf.Count); break; case ENUM_CMD.END: #if _TRACE_OUT_PUT PrintMagToTxt("CheckTagAccessPkt: END"); #endif //If get first packet, reset the flow. if (usDivideSeq == 1) { usDataTotalLenDw = usDataSingleLenDw; if (0 != MultiBuf.Count) MultiBuf.RemoveRange(0, MultiBuf.Count); } else { //The packet sequence is more then 1, but buffer doesn't have data. //It means lossing some packets. Ignore this inventory or tag access. if (0 == MultiBuf.Count) break; usDataTotalLenDw += usDataSingleLenDw; } HandleCallBack(strcParms, SingleBuf); Array.Clear(SingleBuf, 0, SingleBuf.Length); usDataTotalLenDw = 0; if (0 != MultiBuf.Count) MultiBuf.RemoveRange(0, MultiBuf.Count); return true; break; case ENUM_CMD.UPDAUE_ENTER_UPDATE_MODE: #if _TRACE_OUT_PUT PrintMagToTxt("CheckTagAccessPkt: UPDAUE_ENTER_UPDATE_MODE"); #endif //If get first packet, reset the flow. if (usDivideSeq == 1) { usDataTotalLenDw = usDataSingleLenDw; if (0 != MultiBuf.Count) MultiBuf.RemoveRange(0, MultiBuf.Count); } else { //The packet sequence is more then 1, but buffer doesn't have data. //It means lossing some packets. Ignore this inventory or tag access. if (0 == MultiBuf.Count) break; usDataTotalLenDw += usDataSingleLenDw; } HandleCallBack(strcParms, SingleBuf); Array.Clear(SingleBuf, 0, SingleBuf.Length); usDataTotalLenDw = 0; if (0 != MultiBuf.Count) MultiBuf.RemoveRange(0, MultiBuf.Count); break; case ENUM_CMD.INVENTORY: case ENUM_CMD.TAG_ACCESS: #if _TRACE_OUT_PUT PrintMagToTxt("CheckTagAccessPkt: INVENTORY/TAG_ACCESS"); #endif //If get first packet, reset the flow. if (usDivideSeq == 1) { usDataTotalLenDw = usDataSingleLenDw; if (0 != MultiBuf.Count) MultiBuf.RemoveRange(0, MultiBuf.Count); } else { //The packet sequence is more then 1, but buffer doesn't have data. //It means lossing some packets. Ignore this inventory or tag access. if (0 == MultiBuf.Count) break; // usDataTotalLenDw += usDataSingleLenDw; } if ( true == CheckPktEnd(SingleBuf) ) //report end { //Check multi-buffer size if (0 == MultiBuf.Count) //Single packet { HandleCallBack(strcParms, SingleBuf); } else //Multi packet { //combine data if (false == AddDataToMultiBuf(ref MultiBuf, SingleBuf)) { if (0 != MultiBuf.Count) MultiBuf.RemoveRange(0, MultiBuf.Count); break; } //Copy ArrayList bufeer to byte [] buffer byte[] tmpBuf = MultiBuf.ToArray(typeof(byte)) as byte[]; if (null == tmpBuf) { if (0 != MultiBuf.Count) MultiBuf.RemoveRange(0, MultiBuf.Count); break; } HandleCallBack(strcParms, tmpBuf); MultiBuf.RemoveRange(0, MultiBuf.Count); } usDataTotalLenDw = 0; } else //report not end. Continue. { //Check multi-buffer size if (0 == MultiBuf.Count) //at first packet { //Push data to multi buffer MultiBuf.AddRange(SingleBuf); //Remove CRC (last 2 bytes). Don't need CRC. //Because want to combine data form different //packet, the data in next packet will replace //CRC address. /* Mod by james for large user memory, 2012-12-04 */ // MultiBuf.RemoveRange(MultiBuf.Count - 3, 2); MultiBuf.RemoveRange(MultiBuf.Count - 2, 2); /* End by james for large user memory, 2012-12-04 */ } else //Combine packets { //combine data if (false == AddDataToMultiBuf(ref MultiBuf, SingleBuf)) { if (0 != MultiBuf.Count) MultiBuf.RemoveRange(0, MultiBuf.Count); break; } } } //Clear single buffer to receive next packet Array.Clear(SingleBuf, 0, SingleBuf.Length); break; default: break; } TimeBeginPeriod(1); System.Threading.Thread.Sleep( (int)Settings.Default.uiInterval ); TimeEndPeriod(1); }//while }//try catch (Exception e) { clsPacket.TRANS_API_ClearBuffer(); //ControlAbort();/*Mod by Rick for Abort, 2013-2-18*/ ControlCancel(); return false; } return true; }
//============================Control Operation=================================== public Result API_ControlCancel( ) { #if _TRACE_OUT_PUT PrintMagToTxt("API_ControlCancel"); #endif enumINVENTORY_STATUS = ENUM_FLOW_CONTROL.CANCEL; //this command deesn't response return Result.OK; }