/// <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); }
/** * \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);
/** * \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); }
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); } }