示例#1
0
        /// <summary>
        /// Transmit CAN message via ES581.3
        /// </summary>
        public int nWriteMessage(sTCAN_MSG sMessage)
        {
            int nReturn = 0;

            icsSpyMessage SpyMsg = new icsSpyMessage();

            SpyMsg.ArbIDOrHeader   = (int)sMessage.m_unMsgID;
            SpyMsg.NumberBytesData = sMessage.m_ucDataLen;
            SpyMsg.StatusBitField  = 0;
            SpyMsg.StatusBitField2 = 0;
            if (sMessage.m_ucRTR == 1)
            {
                SpyMsg.StatusBitField |= (uint)SPY_STATUS_REMOTE_FRAME;
            }
            if (sMessage.m_ucEXTENDED == 1)
            {
                SpyMsg.StatusBitField |= (uint)SPY_STATUS_XTD_FRAME;
            }
            SpyMsg.Data = sMessage.m_ucData;  // what if data> 8Byte?
            if (icsneoTxMessages(m_anhObject, ref SpyMsg, 1, 1) != 0)
            {
                nReturn = 1;
            }
            return(nReturn);
        }
示例#2
0
        /**
         * \param[in]  CurrSpyMsg Message polled from the bus in neoVI format
         * \param[out] sCanData Application specific data format
         * \param[in]  unChannel channel
         * \return TRUE (always)
         *
         * This will classify the messages, which can be one of Rx, Tx or
         * Error messages. In case of Err messages this identifies under
         * what broader category (Rx / Tx) does this occur.
         */
        public bool bClassifyMsgType(ref icsSpyMessage CurrSpyMsg,
                                     ref sTCANDATA sCanData)
        {
            if ((long.Parse(CurrSpyMsg.StatusBitField.ToString()) & long.Parse(VALUECAN_ERROR_BITS.ToString())) > 0)
            {
                sCanData.m_ucDataType = ERR_FLAG;
            }
            else if ((long.Parse(CurrSpyMsg.StatusBitField.ToString()) & long.Parse(SPY_STATUS_CAN_BUS_OFF.ToString())) > 0)
            {
                sCanData.m_ucDataType = ERR_FLAG;
            }
            else
            {
                //Check for RTR Message
                if ((long.Parse(CurrSpyMsg.StatusBitField.ToString()) & long.Parse(SPY_STATUS_REMOTE_FRAME.ToString())) > 0)
                {
                    sCanData.m_ucDataType = RX_FLAG;
                    sCanData.m_uDataInfo.m_sCANMsg.m_ucRTR = 1;
                }
                else
                {
                    sCanData.m_uDataInfo.m_sCANMsg.m_ucRTR = 0;
                }
                if ((long.Parse(CurrSpyMsg.StatusBitField.ToString()) & long.Parse(SPY_STATUS_TX_MSG.ToString())) > 0)
                {
                    sCanData.m_ucDataType = TX_FLAG;
                }
                else if ((long.Parse(CurrSpyMsg.StatusBitField.ToString()) & long.Parse(SPY_STATUS_NETWORK_MESSAGE_TYPE.ToString())) > 0)
                {
                    sCanData.m_ucDataType = RX_FLAG;
                }

                // Copy data length
                sCanData.m_uDataInfo.m_sCANMsg.m_ucDataLen = CurrSpyMsg.NumberBytesData;

                // Copy the message data
                sCanData.m_uDataInfo.m_sCANMsg.m_ucData = CurrSpyMsg.Data;

                // Copy the message ID
                sCanData.m_uDataInfo.m_sCANMsg.m_unMsgID = (uint)CurrSpyMsg.ArbIDOrHeader;

                // Check for extended message indication
                if ((long.Parse(CurrSpyMsg.StatusBitField.ToString()) & long.Parse(SPY_STATUS_XTD_FRAME.ToString())) > 0)
                {
                    sCanData.m_uDataInfo.m_sCANMsg.m_ucEXTENDED = 1;
                }
                else
                {
                    sCanData.m_uDataInfo.m_sCANMsg.m_ucEXTENDED = 0;
                }
            }
            return(true);
        }
 public static void ConvertCANtoJ1850Message(ref icsSpyMessage icsCANStruct, ref icsSpyMessageJ1850 icsJ1850Struct)
 {
     icsJ1850Struct.StatusBitField      = icsCANStruct.StatusBitField;
     icsJ1850Struct.StatusBitField2     = icsCANStruct.StatusBitField2;
     icsJ1850Struct.TimeHardware        = icsCANStruct.TimeHardware;
     icsJ1850Struct.TimeHardware2       = icsCANStruct.TimeHardware2;
     icsJ1850Struct.TimeSystem          = icsCANStruct.TimeSystem;
     icsJ1850Struct.TimeSystem2         = icsCANStruct.TimeSystem2;
     icsJ1850Struct.TimeStampHardwareID = icsCANStruct.TimeStampHardwareID;
     icsJ1850Struct.TimeStampSystemID   = icsCANStruct.TimeStampSystemID;
     icsJ1850Struct.NetworkID           = icsCANStruct.NetworkID;
     icsJ1850Struct.NodeID            = icsCANStruct.NodeID;
     icsJ1850Struct.Protocol          = icsCANStruct.Protocol;
     icsJ1850Struct.MessagePieceID    = icsCANStruct.MessagePieceID;
     icsJ1850Struct.ColorID           = icsCANStruct.ColorID;
     icsJ1850Struct.NumberBytesHeader = icsCANStruct.NumberBytesHeader;
     icsJ1850Struct.NumberBytesData   = icsCANStruct.NumberBytesData;
     icsJ1850Struct.DescriptionID     = icsCANStruct.DescriptionID;
     icsJ1850Struct.Header1           = Convert.ToByte(icsCANStruct.ArbIDOrHeader & 0xff);
     icsJ1850Struct.Header2           = Convert.ToByte((0xFF00 & icsCANStruct.ArbIDOrHeader) / 256);
     icsJ1850Struct.Header3           = Convert.ToByte((0xFF0000 & icsCANStruct.ArbIDOrHeader) / 65536);
     icsJ1850Struct.Data1             = icsCANStruct.Data1;
     icsJ1850Struct.Data2             = icsCANStruct.Data2;
     icsJ1850Struct.Data3             = icsCANStruct.Data3;
     icsJ1850Struct.Data4             = icsCANStruct.Data4;
     icsJ1850Struct.Data5             = icsCANStruct.Data5;
     icsJ1850Struct.Data6             = icsCANStruct.Data6;
     icsJ1850Struct.Data7             = icsCANStruct.Data7;
     icsJ1850Struct.Data8             = icsCANStruct.Data8;
     icsJ1850Struct.AckBytes1         = icsCANStruct.AckBytes1;
     icsJ1850Struct.AckBytes2         = icsCANStruct.AckBytes2;
     icsJ1850Struct.AckBytes3         = icsCANStruct.AckBytes3;
     icsJ1850Struct.AckBytes4         = icsCANStruct.AckBytes4;
     icsJ1850Struct.AckBytes5         = icsCANStruct.AckBytes5;
     icsJ1850Struct.AckBytes6         = icsCANStruct.AckBytes6;
     icsJ1850Struct.AckBytes7         = icsCANStruct.AckBytes7;
     icsJ1850Struct.AckBytes8         = icsCANStruct.AckBytes8;
     icsJ1850Struct.Value             = icsCANStruct.Value;
     icsJ1850Struct.MiscData          = icsCANStruct.MiscData;
 }
 public static void ConvertJ1850toCAN(ref icsSpyMessage icsCANStruct, ref icsSpyMessageJ1850 icsJ1850Struct)
 {
     //Becuse memcopy is not available.
     icsCANStruct.StatusBitField      = icsJ1850Struct.StatusBitField;
     icsCANStruct.StatusBitField2     = icsJ1850Struct.StatusBitField2;
     icsCANStruct.TimeHardware        = icsJ1850Struct.TimeHardware;
     icsCANStruct.TimeHardware2       = icsJ1850Struct.TimeHardware2;
     icsCANStruct.TimeSystem          = icsJ1850Struct.TimeSystem;
     icsCANStruct.TimeSystem2         = icsJ1850Struct.TimeSystem2;
     icsCANStruct.TimeStampHardwareID = icsJ1850Struct.TimeStampHardwareID;
     icsCANStruct.TimeStampSystemID   = icsJ1850Struct.TimeStampSystemID;
     icsCANStruct.NetworkID           = icsJ1850Struct.NetworkID;
     icsCANStruct.NodeID            = icsJ1850Struct.NodeID;
     icsCANStruct.Protocol          = icsJ1850Struct.Protocol;
     icsCANStruct.MessagePieceID    = icsJ1850Struct.MessagePieceID;
     icsCANStruct.ColorID           = icsJ1850Struct.ColorID;
     icsCANStruct.NumberBytesHeader = icsJ1850Struct.NumberBytesHeader;
     icsCANStruct.NumberBytesData   = icsJ1850Struct.NumberBytesData;
     icsCANStruct.DescriptionID     = icsJ1850Struct.DescriptionID;
     icsCANStruct.ArbIDOrHeader     = (icsJ1850Struct.Header3 * 65536) + (icsJ1850Struct.Header2 * 256) + icsJ1850Struct.Header1;
     icsCANStruct.Data1             = icsJ1850Struct.Data1;
     icsCANStruct.Data2             = icsJ1850Struct.Data2;
     icsCANStruct.Data3             = icsJ1850Struct.Data3;
     icsCANStruct.Data4             = icsJ1850Struct.Data4;
     icsCANStruct.Data5             = icsJ1850Struct.Data5;
     icsCANStruct.Data6             = icsJ1850Struct.Data6;
     icsCANStruct.Data7             = icsJ1850Struct.Data7;
     icsCANStruct.Data8             = icsJ1850Struct.Data8;
     icsCANStruct.AckBytes1         = icsJ1850Struct.AckBytes1;
     icsCANStruct.AckBytes2         = icsJ1850Struct.AckBytes2;
     icsCANStruct.AckBytes3         = icsJ1850Struct.AckBytes3;
     icsCANStruct.AckBytes4         = icsJ1850Struct.AckBytes4;
     icsCANStruct.AckBytes5         = icsJ1850Struct.AckBytes5;
     icsCANStruct.AckBytes6         = icsJ1850Struct.AckBytes6;
     icsCANStruct.AckBytes7         = icsJ1850Struct.AckBytes7;
     icsCANStruct.AckBytes8         = icsJ1850Struct.AckBytes8;
     icsCANStruct.Value             = icsJ1850Struct.Value;
     icsCANStruct.MiscData          = icsJ1850Struct.MiscData;
 }
 public static extern Int32 icsneoScriptWriteTxMessage(Int32 hObject, UInt32 iIndex, ref icsSpyMessage pTxMessage);
 public static extern Int32 icsneoScriptWriteRxMessage(Int32 hObject, UInt32 iIndex, ref icsSpyMessage pRxMessageMask, ref icsSpyMessage pRxMessageValue);
 public static extern Int32 icsneoGetTimeStampForMsg(Int32 hObject, ref icsSpyMessage pMsg, ref double pTimeStamp);
 public static extern Int32 icsneoTxMessages(Int32 hObject, ref icsSpyMessage pMsg, Int32 lNetworkID, Int32 lNumMessages);
 public static extern Int32 icsneoGetMessages(Int32 hObject, ref icsSpyMessage pMsg, ref Int32 pNumberOfMessages, ref Int32 pNumberOfErrors);
示例#10
0
        /**
         * \param[in] psCanDataArray Pointer to CAN Message Array of Structures
         * \param[in] nMessage Maximun number of message to read or size of the CAN Message Array
         * \param[out] Message Actual Messages Read
         * \return Returns S_OK if successful otherwise corresponding Error code.
         *
         * This function will read multiple CAN messages from the driver.
         * The other fuctionality is same as single message read. This
         * will update the variable nMessage with the actual messages
         * read.
         */
        public int nReadMultiMessage(sTCANDATA[] psCanDataArray, ref int nMessage /* int nChannelIndex*/)
        {
            int   i           = 0;
            int   nReturn     = 0;
            int   s_CurrIndex = 0;
            Int32 s_Messages  = 0;
            Int32 nErrMsg     = 0;

            if (s_CurrIndex == 0)
            {
                nReturn = icsneoGetMessages(m_anhObject, s_asSpyMsg, ref s_Messages, ref nErrMsg);
            }
            ushort ushRxErr = 0, ushTxErr = 0;

            if (nErrMsg > 0)
            {
                int nErrors = 0;
                nReturn = icsneoGetErrorMessages(m_anhObject, ref s_anErrorCodes, ref nErrors);
                if ((nReturn == NEOVI_OK) && (nErrors > 0))
                {
                    for (int j = 0; j < nErrors; j++)
                    {
                        switch (s_anErrorCodes[j])
                        {
                        case 2:       //NEOVI_ERROR_DLL_USB_SEND_DATA_ERROR
                        {
                            ++ushTxErr;
                        }
                        break;

                        case 39:     // NEOVI_ERROR_DLL_RX_MSG_FRAME_ERR
                        case 40:     //NEOVI_ERROR_DLL_RX_MSG_FIFO_OVER
                        case 41:     //NEOVI_ERROR_DLL_RX_MSG_CHK_SUM_ERR
                        {
                            ++ushRxErr;
                        }
                        break;

                        default:
                        {
                            // Do nothing until further clarification is received
                        }
                        break;
                        }
                    }
                }
            }
            // End of first level of error message processing

            // START

            /* Create the time stamp map. This means getting the local time and assigning
             * offset value to the QuadPart.
             */
            //UInt64 QuadPartRef = 0;
            if (CREATE_MAP_TIMESTAMP == sg_byCurrState)
            {
                icsSpyMessage CurrSpyMsg = new icsSpyMessage();
                CurrSpyMsg = s_asSpyMsg[s_CurrIndex];

                double dTimestamp = 0;
                nReturn = icsneoGetTimeStampForMsg(m_anhObject, ref CurrSpyMsg, ref dTimestamp);
                if (nReturn == NEOVI_OK)
                {
                    sg_byCurrState = CALC_TIMESTAMP_READY;
                    nReturn        = 1;

                    long g_QueryTickCount;
                    g_QueryTickCount = 0;
                    QueryPerformanceCounter(ref g_QueryTickCount);

                    long unConnectionTimer;
                    unConnectionTimer = ((g_QueryTickCount * 10000) / sg_lnFrequency) - sg_TimeStamp;
                    if ((dTimestamp * 10000) >= unConnectionTimer)
                    {
                        sg_TimeStamp = (long)((dTimestamp * 10000) - unConnectionTimer);
                    }
                    else
                    {
                        sg_TimeStamp = (long)(unConnectionTimer - (dTimestamp * 10000));
                    }
                }
                else
                {
                    nReturn = -1;
                }
            }
            //End
            int  nLimForAppBuf  = nMessage;
            bool bChannelCnfgrd = false;

            for (; (i < nLimForAppBuf) && (s_CurrIndex < s_Messages);)
            {
                sTCANDATA     sCanData   = new sTCANDATA();
                icsSpyMessage CurrSpyMsg = new icsSpyMessage();
                CurrSpyMsg = s_asSpyMsg[s_CurrIndex];
                if (true)
                {
                    bChannelCnfgrd = true;
                    sCanData.m_uDataInfo.m_sCANMsg.m_ucChannel = 0x01;  // tbd
                    double dTimestamp = 0;
                    icsneoGetTimeStampForMsg(m_anhObject, ref CurrSpyMsg, ref dTimestamp);
                    sCanData.m_lTickCount = (long)(dTimestamp * 10000);
                    bClassifyMsgType(ref CurrSpyMsg, ref sCanData);
                    psCanDataArray[i] = sCanData;
                }
                s_CurrIndex++;
                if (bChannelCnfgrd)
                {
                    i++;
                }
            }

            if ((s_CurrIndex == MAX_BUFFER_VALUECAN) || (s_CurrIndex == s_Messages))
            {
                s_CurrIndex = 0;
                s_Messages  = 0;
            }

            nMessage = i;

            return(1);
        }
示例#11
0
 public static extern int icsneoGetTimeStampForMsg(int hObject, ref icsSpyMessage pMsg, ref double pTimeStamp);
        public async Task GetMessageFromCAN()
        {
            long          lResult      = 0;
            icsSpyMessage stMessagesTx = new icsSpyMessage();
            long          lNetworkID;
            int           uiTimeout = 0;

            // Has the uset open neoVI yet?;
            if (m_bPortOpen == false)
            {
                MessageBox.Show("ValueCAN not connected");
                return; // do not read messages if we haven't opened neoVI yet
            }

            // Read the Network we will transmit on (indicated by lstNetwork ListBox)
            lNetworkID = (int)eNETWORK_ID.NETID_HSCAN;
            stMessagesTx.StatusBitField = 0;
            tCANWait.Start();
            timeDelay.Start();

            while (StartDAQ)
            {
                mutex.WaitOne(250);
                var        txMsgCount = qTxMsg.Count;
                CAN_TX_MSG txMsg      = null;
                Console.WriteLine("TX Msg count = {0}", txMsgCount);
                if (txMsgCount > 0)
                {
                    txMsg = qTxMsg.Dequeue();
                }
                mutex.ReleaseMutex();


                if ((txMsgCount > 0) && (txMsg != null))
                {
                    stMessagesTx.ArbIDOrHeader   = txMsg.lArbId;          // The ArbID
                    stMessagesTx.NumberBytesData = txMsg.iNumBytes;       // The number of Data Bytes

                    stMessagesTx.Data1 = txMsg.bData[0];
                    stMessagesTx.Data2 = txMsg.bData[1];
                    stMessagesTx.Data3 = txMsg.bData[2];
                    stMessagesTx.Data4 = txMsg.bData[3];
                    stMessagesTx.Data5 = txMsg.bData[4];
                    stMessagesTx.Data6 = txMsg.bData[5];
                    stMessagesTx.Data7 = txMsg.bData[6];
                    stMessagesTx.Data8 = txMsg.bData[7];
                    Console.WriteLine("Sending TX MSG: ARB ID = " + icsNeoDll.ConvertToHex(Convert.ToString(txMsg.lArbId)) + " Data : " + BitConverter.ToString(txMsg.bData));
                    // Transmit the assembled message
                    lResult = icsNeoDll.icsneoTxMessages(m_hObject, ref stMessagesTx, (int)lNetworkID, 1);
                    if (lResult != 1)
                    {
                        Console.WriteLine("!!!!!!!!!!!!!!!!!!!!!! Problem Transmitting Message");
                        await Task.Delay(2000);

                        continue;
                    }
                    timeDelay.Restart();
                }
                else
                {
                    Console.WriteLine("No TX MSG in Queue");
                }

                if (lResult == 1 && iNumberOfMessages > 0)
                {
                    // send the collected raw data bytes for processing
                    //ProcessReceivedMsg(Encoding.ASCII.GetBytes(sMsgData));
                    //Console.WriteLine("Num of Msg = {0}", iNumberOfMessages);
                    ProcessReceivedMsg(iNumberOfMessages, ToByteArray(stMessages));

                    Array.Clear(stMessages, 0, stMessages.Length);
                    iNumberOfMessages = -1;
                    lResult           = 0;
                }

                uiTimeout = 0;
                iElapsed  = Convert.ToInt32(timeDelay.Elapsed.TotalMilliseconds);
                if (iElapsed < Constants.RX_Timeout)
                {
                    uiTimeout = Constants.RX_Timeout - iElapsed;
                }
                else if (iElapsed < Constants.DAQ_Interval)
                {
                    uiTimeout = Constants.DAQ_Interval - iElapsed;
                }

                tCANWait.Restart();
                //Console.WriteLine("Ui Timeout before if {0}", uiTimeout);
                if (uiTimeout > 0)
                {
                    //Console.WriteLine("UI Timeout = {0}", uiTimeout);
                    if (icsNeoDll.icsneoWaitForRxMessagesWithTimeOut(m_hObject, Convert.ToUInt32(uiTimeout)) == 1)
                    {
                        // Message reveived success
                        if (tCANWait.Elapsed.TotalMilliseconds < uiTimeout)
                        {
                            //Console.WriteLine("########### Waiting for Timeout");
                            await Task.Delay((uiTimeout - Convert.ToInt32(tCANWait.Elapsed.TotalMilliseconds)));
                        }
                        Console.WriteLine("####### Message Received:: Time taken : {0} ########", timeDelay.Elapsed.TotalMilliseconds);
                    }
                    lResult = icsNeoDll.icsneoGetMessages(m_hObject, ref stMessages[0], ref iNumberOfMessages, ref iNumberOfErrors);
                }

                iElapsed = Convert.ToInt32(timeDelay.Elapsed.TotalMilliseconds);
                if (iElapsed < Constants.DAQ_Interval)
                {
                    //Console.WriteLine("Task Delay time = {0}", (Constants.DAQ_Interval - iElapsed));
                    await Task.Delay((Constants.DAQ_Interval - iElapsed));
                }
                //Console.WriteLine("End iElapsed = {0}", iElapsed);
            }
        }