示例#1
0
        public void RXThread()
        {
            XLClass.XLcanRxEvent receivedEvent = new XLClass.XLcanRxEvent();
            XLDefine.XL_Status   xlStatus      = XLDefine.XL_Status.XL_SUCCESS;
            XLDefine.WaitResults waitResult    = new XLDefine.WaitResults();

            while (true)
            {
                waitResult = (XLDefine.WaitResults)WaitForSingleObject(eventHandle, 1000);

                // If event occurred...
                if (waitResult != XLDefine.WaitResults.WAIT_TIMEOUT)
                {
                    // ...init xlStatus first
                    xlStatus = XLDefine.XL_Status.XL_SUCCESS;

                    // afterwards: while hw queue is not empty...
                    while (xlStatus != XLDefine.XL_Status.XL_ERR_QUEUE_IS_EMPTY)
                    {
                        // ...block RX thread to generate RX-Queue overflows
                        while (blockRxThread)
                        {
                            Thread.Sleep(1000);
                        }

                        // ...receive data from hardware.
                        xlStatus = CANDriver.XL_CanReceive(portHandle, ref receivedEvent);

                        //  If receiving succeed....
                        if (xlStatus == XLDefine.XL_Status.XL_SUCCESS)
                        {
                            rawRxString = CANDriver.XL_CanGetEventString(receivedEvent);
                        }
                    }
                }
                // No event occurred
            }
        }
示例#2
0
        public void CanTp_ReceptionInd()
        {
            // Create new object containing received data
            XLClass.xl_event receivedEvent = new XLClass.xl_event();

            // Result of XL Driver function calls
            XLDefine.XL_Status xlStatus = XLDefine.XL_Status.XL_SUCCESS;

            // Result values of WaitForSingleObject
            XLDefine.WaitResults waitResult = new XLDefine.WaitResults();


            byte diagFrameType;

            byte[] diagPDU = new byte[1024];
            int    diagPDULength = 0, diagPDUoffset = 0;
            byte   diagSequenceNum = 0;
            byte   diagFlowState;

            // Note: this thread will be destroyed by MAIN

            while (true)
            {
                // Wait for hardware events
                waitResult = (XLDefine.WaitResults)WaitForSingleObject(eventHandle, 1000);
                if (waitFrameType == 0)
                {
                    continue;
                }

                // If event occurred...
                if (waitResult != XLDefine.WaitResults.WAIT_TIMEOUT)
                {
                    // ...init xlStatus first
                    xlStatus = XLDefine.XL_Status.XL_SUCCESS;

                    // afterwards: while hw queue is not empty...
                    while (xlStatus != XLDefine.XL_Status.XL_ERR_QUEUE_IS_EMPTY)
                    {
                        // ...block RX thread to generate RX-Queue overflows
                        while (blockRxThread)
                        {
                            Thread.Sleep(1000);
                        }

                        // ...receive data from hardware.
                        xlStatus = CANTPDriver.XL_Receive(portHandle, ref receivedEvent);

                        //  If receiving succeed....
                        if (xlStatus == XLDefine.XL_Status.XL_SUCCESS)
                        {
                            Console.WriteLine(receivedEvent.tagData.can_Msg.id);
                            if ((receivedEvent.flags & XLDefine.XL_MessageFlags.XL_EVENT_FLAG_OVERRUN) != 0)
                            {
                                Console.WriteLine("-- XL_EVENT_FLAG_OVERRUN --");
                            }

                            // ...and data is a Rx msg...
                            if (receivedEvent.tag == XLDefine.XL_EventTags.XL_RECEIVE_MSG)
                            {
                                if (receivedEvent.tagData.can_Msg.id == this.RxID)
                                {
                                    Console.WriteLine(CANTPDriver.XL_GetEventString(receivedEvent));
                                    diagFrameType = (byte)(receivedEvent.tagData.can_Msg.data[0] >> 4);

                                    switch (diagFrameType)
                                    {
                                    //Single Frame
                                    case 0:
                                        if (waitFrameType == 1)
                                        {
                                            diagPDULength = receivedEvent.tagData.can_Msg.data[0] & 0x0F;
                                            for (int i = 0; i < diagPDULength; i++)
                                            {
                                                diagPDU[i] = receivedEvent.tagData.can_Msg.data[i + 1];
                                            }
                                            OnDiagPduReceived(diagPDU, diagPDULength);
                                            Console.WriteLine("PDU Length:" + diagPDULength);
                                        }
                                        break;

                                    //FirstFrame
                                    case 1:
                                        if (waitFrameType == 1)
                                        {
                                            diagPDULength = (receivedEvent.tagData.can_Msg.data[0] & 0x0F) * 256 + (receivedEvent.tagData.can_Msg.data[1]);
                                            for (int i = 0; i < 6; i++)
                                            {
                                                diagPDU[i] = receivedEvent.tagData.can_Msg.data[i + 2];
                                            }
                                            diagPDUoffset   = 6;
                                            diagSequenceNum = 0;
                                            CanTpSendFlowControlFrame();
                                            waitFrameType = 2;
                                            Console.WriteLine("PDU Length:" + diagPDULength);
                                        }
                                        break;

                                    //ConsecutiveFrame
                                    case 2:
                                        if (waitFrameType == 2)
                                        {
                                            if (diagSequenceNum + 1 == (byte)(receivedEvent.tagData.can_Msg.data[0] & 0x0F))
                                            {
                                                diagSequenceNum = (byte)(receivedEvent.tagData.can_Msg.data[0] & 0x0F);
                                                for (int i = diagPDUoffset; i < diagPDUoffset + 7; i++)
                                                {
                                                    diagPDU[i] = receivedEvent.tagData.can_Msg.data[i + 1];
                                                }
                                                if (diagPDUoffset == diagPDULength)
                                                {
                                                    OnDiagPduReceived(diagPDU, diagPDULength);
                                                }
                                            }
                                        }
                                        break;

                                    //FlowControl
                                    case 3:
                                        if (waitFrameType == 3)
                                        {
                                            diagFlowState        = (byte)(receivedEvent.tagData.can_Msg.data[0] & 0x0F);
                                            this.TxdiagBlockSize = receivedEvent.tagData.can_Msg.data[1];
                                            this.TxdiagSTmin     = receivedEvent.tagData.can_Msg.data[2];
                                            waitforFlowControlEvent.Set();
                                        }
                                        break;
                                    }
                                }


                                //if ((receivedEvent.tagData.can_Msg.flags & XLDefine.XL_MessageFlags.XL_CAN_MSG_FLAG_OVERRUN) != 0)
                                //{
                                //    Console.WriteLine("-- XL_CAN_MSG_FLAG_OVERRUN --");
                                //}

                                //// ...check various flags
                                //if ((receivedEvent.tagData.can_Msg.flags & XLDefine.XL_MessageFlags.XL_CAN_MSG_FLAG_ERROR_FRAME)
                                //    == XLDefine.XL_MessageFlags.XL_CAN_MSG_FLAG_ERROR_FRAME)
                                //{
                                //    Console.WriteLine("ERROR FRAME");
                                //}

                                //else if ((receivedEvent.tagData.can_Msg.flags & XLDefine.XL_MessageFlags.XL_CAN_MSG_FLAG_REMOTE_FRAME)
                                //    == XLDefine.XL_MessageFlags.XL_CAN_MSG_FLAG_REMOTE_FRAME)
                                //{
                                //    Console.WriteLine("REMOTE FRAME");
                                //}

                                //else
                                //{
                                //    Console.WriteLine(CANTPDriver.XL_GetEventString(receivedEvent));
                                //}
                            }
                        }
                    }
                }
                // No event occurred
            }
        }
示例#3
0
        public string Receive()
        {
            string dataFromDriver = "";

            for (int i = 0; i < 8; i++)
            {
                ReceivedData[i] = 0;
            }
            XLClass.xl_event     receivedEvent = new XLClass.xl_event();
            XLDefine.XL_Status   xlStatus      = XLDefine.XL_Status.XL_SUCCESS;
            XLDefine.WaitResults waitResult    = (XLDefine.WaitResults)WaitForSingleObject(eventHandle, 1000);
            if (waitResult != XLDefine.WaitResults.WAIT_TIMEOUT)
            {
                dataFromDriver += $"[{DateTime.Now.Hour:D2} : {DateTime.Now.Minute:D2} : {DateTime.Now.Second:D2} : {DateTime.Now.Millisecond:D3}]   ";
                while (xlStatus != XLDefine.XL_Status.XL_ERR_QUEUE_IS_EMPTY)
                {
                    xlStatus = driver.XL_Receive(portHandle, ref receivedEvent);
                    switch (receivedEvent.tag)
                    {
                    case XLDefine.XL_EventTags.XL_LIN_MSG:
                        string dir = "RX".PadRight(3);
                        if ((receivedEvent.tagData.linMsgApi.linMsg.flags & XLDefine.XL_MessageFlags.XL_LIN_MSGFLAG_TX)
                            == XLDefine.XL_MessageFlags.XL_LIN_MSGFLAG_TX)
                        {
                            dir = "TX".PadRight(3);
                        }
                        else
                        {
                            for (int i = 0; i < 8; i++)
                            {
                                ReceivedData[i] = receivedEvent.tagData.linMsgApi.linMsg.data[i];
                            }
                        }

                        dataFromDriver += ("XL_LIN_MSG, " + dir + " id: " +
                                           receivedEvent.tagData.linMsgApi.linMsg.id.ToString("X2").PadRight(3) + ", data: " +
                                           receivedEvent.tagData.linMsgApi.linMsg.data[0].ToString("X2") + " " +
                                           receivedEvent.tagData.linMsgApi.linMsg.data[1].ToString("X2") + " " +
                                           receivedEvent.tagData.linMsgApi.linMsg.data[2].ToString("X2") + " " +
                                           receivedEvent.tagData.linMsgApi.linMsg.data[3].ToString("X2") + " " +
                                           receivedEvent.tagData.linMsgApi.linMsg.data[4].ToString("X2") + " " +
                                           receivedEvent.tagData.linMsgApi.linMsg.data[5].ToString("X2") + " " +
                                           receivedEvent.tagData.linMsgApi.linMsg.data[6].ToString("X2") + " " +
                                           receivedEvent.tagData.linMsgApi.linMsg.data[7].ToString("X2")) + " (cha-1) " +
                                          receivedEvent.chanIndex.ToString();
                        break;

                    case XLDefine.XL_EventTags.XL_LIN_ERRMSG:
                        dataFromDriver += ("XL_LIN_ERRMSG");
                        break;

                    case XLDefine.XL_EventTags.XL_LIN_SYNCERR:
                        dataFromDriver += ("XL_LIN_SYNCERR");
                        break;

                    case XLDefine.XL_EventTags.XL_LIN_NOANS:
                        dataFromDriver += ("XL_LIN_NOANS") + " (cha-1) " + receivedEvent.chanIndex.ToString();
                        break;

                    case XLDefine.XL_EventTags.XL_LIN_WAKEUP:
                        dataFromDriver += ("XL_LIN_WAKEUP");
                        break;

                    case XLDefine.XL_EventTags.XL_LIN_SLEEP:
                        dataFromDriver += ("XL_LIN_SLEEP");
                        break;

                    case XLDefine.XL_EventTags.XL_LIN_CRCINFO:
                        dataFromDriver += ("XL_LIN_CRCINFO");
                        break;
                    }
                }
            }
            else
            {
                dataFromDriver += "Timeout";
            }
            //Trace.WriteLine(dataFromDriver);
            driver.XL_FlushReceiveQueue(portHandle);
            return(dataFromDriver);
        }
示例#4
0
        // -----------------------------------------------------------------------------------------------
        /// <summary>
        /// EVENT THREAD (RX)
        ///
        /// RX thread waits for Vector interface events and displays filtered CAN messages.
        /// </summary>
        // -----------------------------------------------------------------------------------------------
        public void RXThread()
        {
            // Create new object containing received data
            XLClass.xl_event receivedEvent = new XLClass.xl_event();

            // Result of XL Driver function calls
            XLDefine.XL_Status xlStatus = XLDefine.XL_Status.XL_SUCCESS;

            // Result values of WaitForSingleObject
            XLDefine.WaitResults waitResult = new XLDefine.WaitResults();



            // Note: this thread will be destroyed by MAIN
            while (true)
            {
                // Wait for hardware events
                //waitResult = (XLDefine.WaitResults)WaitForSingleObject(eventHandle, 1000);

                // If event occurred...
                if (waitResult != XLDefine.WaitResults.WAIT_TIMEOUT)
                {
                    // ...init xlStatus first
                    xlStatus = XLDefine.XL_Status.XL_SUCCESS;

                    // afterwards: while hw queue is not empty...
                    while (xlStatus != XLDefine.XL_Status.XL_ERR_QUEUE_IS_EMPTY)
                    {
                        // ...block RX thread to generate RX-Queue overflows
                        while (blockRxThread)
                        {
                            Thread.Sleep(1000);
                        }

                        // ...receive data from hardware.
                        xlStatus = CANDemo.XL_Receive(portHandle, ref receivedEvent);

                        //  If receiving succeed....
                        if (xlStatus == XLDefine.XL_Status.XL_SUCCESS)
                        {
                            if ((receivedEvent.flags & XLDefine.XL_MessageFlags.XL_EVENT_FLAG_OVERRUN) != 0)
                            {
                                Console.WriteLine("-- XL_EVENT_FLAG_OVERRUN --");
                            }

                            // ...and data is a Rx msg...
                            if (receivedEvent.tag == XLDefine.XL_EventTags.XL_RECEIVE_MSG)
                            {
                                if ((receivedEvent.tagData.can_Msg.flags & XLDefine.XL_MessageFlags.XL_CAN_MSG_FLAG_OVERRUN) != 0)
                                {
                                    Console.WriteLine("-- XL_CAN_MSG_FLAG_OVERRUN --");
                                }

                                // ...check various flags
                                if ((receivedEvent.tagData.can_Msg.flags & XLDefine.XL_MessageFlags.XL_CAN_MSG_FLAG_ERROR_FRAME)
                                    == XLDefine.XL_MessageFlags.XL_CAN_MSG_FLAG_ERROR_FRAME)
                                {
                                    Console.WriteLine("ERROR FRAME");
                                }

                                else if ((receivedEvent.tagData.can_Msg.flags & XLDefine.XL_MessageFlags.XL_CAN_MSG_FLAG_REMOTE_FRAME)
                                         == XLDefine.XL_MessageFlags.XL_CAN_MSG_FLAG_REMOTE_FRAME)
                                {
                                    Console.WriteLine("REMOTE FRAME");
                                }

                                else
                                {
                                    Console.WriteLine(CANDemo.XL_GetEventString(receivedEvent));
                                }
                            }
                        }
                    }
                }
                // No event occurred
            }
        }