Example #1
0
        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;
        }
Example #2
0
        //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;
            }
        }
Example #3
0
        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;
        }
Example #4
0
        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;
        }
Example #5
0
        //============================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;
        }