/** * \req RS_24_08 Standard frames are considered. * \req RS_24_09 Extended frames are considered. * \req RS_24_10 RTR frames are considered. * \req RS_24_11 Error frames occurs under the purview of status data * * Calculate the Bus statistics in m_sBusStatistics structure */ void CBusStatisticCAN::vUpdateBusStatistics(STCANDATA& sCanData) { EnterCriticalSection(&m_omCritSecBS); m_sCurrEntry = sCanData.m_uDataInfo.m_sCANMsg; int nCurrentChannelIndex = sCanData.m_uDataInfo.m_sCANMsg.m_ucChannel - 1; INT nDLC = sCanData.m_uDataInfo.m_sCANMsg.m_ucDataLen; if ((nCurrentChannelIndex < 0) || (nCurrentChannelIndex > (defNO_OF_CHANNELS - 1))) { nCurrentChannelIndex = 0; //take appropriate action } if(m_sCurrEntry.m_ucRTR == 1) m_sSubBusStatistics[ nCurrentChannelIndex ].m_unDLCCount+= sCanData.m_uDataInfo.m_sCANMsg.m_ucDataLen; //is it Tx Message if(IS_TX_MESSAGE(sCanData.m_ucDataType)) { if(IS_ERR_MESSAGE(sCanData.m_ucDataType)) { m_sSubBusStatistics[nCurrentChannelIndex].m_unErrorTxCount++; } else { m_sSubBusStatistics[nCurrentChannelIndex].m_unTotalTxMsgCount++; if (m_sCurrEntry.m_ucRTR == 0) // Non RTR message { if (m_sCurrEntry.m_ucEXTENDED == 0) { m_sSubBusStatistics[ nCurrentChannelIndex ].m_unTxSTDMsgCount++; m_sSubBusStatistics[ nCurrentChannelIndex ].m_unTotalBitsperSec += m_unBitsStdMsg[nDLC]; } else { m_sSubBusStatistics[ nCurrentChannelIndex ].m_unTxEXTDMsgCount++; m_sSubBusStatistics[ nCurrentChannelIndex ].m_unTotalBitsperSec += m_unBitsExdMsg[nDLC]; } } else // RTR message { if (m_sCurrEntry.m_ucEXTENDED == 0) { m_sSubBusStatistics[ nCurrentChannelIndex ].m_unTxSTD_RTRMsgCount++; m_sSubBusStatistics[ nCurrentChannelIndex ].m_unTotalBitsperSec += m_unBitsStdMsg[0]; } else { m_sSubBusStatistics[ nCurrentChannelIndex ].m_unTxEXTD_RTRMsgCount++; m_sSubBusStatistics[ nCurrentChannelIndex ].m_unTotalBitsperSec += m_unBitsExdMsg[0]; } } } } //is it Rx Message else if(IS_RX_MESSAGE(sCanData.m_ucDataType)) { if(IS_ERR_MESSAGE(sCanData.m_ucDataType)) { m_sSubBusStatistics[nCurrentChannelIndex].m_unErrorTxCount++; } else { m_sSubBusStatistics[nCurrentChannelIndex].m_unTotalRxMsgCount++; if (m_sCurrEntry.m_ucRTR == 0) // Non RTR message { if (m_sCurrEntry.m_ucEXTENDED == 0) { m_sSubBusStatistics[ nCurrentChannelIndex ].m_unRxSTDMsgCount++; //m_sSubBusStatistics[ nCurrentChannelIndex ].m_unSTDMsgBits = nDLC + floor((double)(nDLC / 5 + TYPE_STD_CONST1)); m_sSubBusStatistics[ nCurrentChannelIndex ].m_unTotalBitsperSec += m_unBitsStdMsg[nDLC]; } else { m_sSubBusStatistics[ nCurrentChannelIndex ].m_unRxEXTDMsgCount++; m_sSubBusStatistics[ nCurrentChannelIndex ].m_unTotalBitsperSec += m_unBitsExdMsg[nDLC]; } } else // RTR message { if (m_sCurrEntry.m_ucEXTENDED == 0) { m_sSubBusStatistics[ nCurrentChannelIndex ].m_unRxSTD_RTRMsgCount++; m_sSubBusStatistics[ nCurrentChannelIndex ].m_unTotalBitsperSec += m_unBitsStdMsg[0]; } else { m_sSubBusStatistics[ nCurrentChannelIndex ].m_unRxEXTD_RTRMsgCount++; m_sSubBusStatistics[ nCurrentChannelIndex ].m_unTotalBitsperSec += m_unBitsExdMsg[0]; } } } } else { //Is it is Error m_sSubBusStatistics[nCurrentChannelIndex].m_unErrorTotalCount++; if (sCanData.m_uDataInfo.m_sErrInfo.m_ucErrType == ERROR_BUS) { // Update Statistics information m_sSubBusStatistics[ nCurrentChannelIndex ].m_unErrorTotalCount++; USHORT usErrorID = sCanData.m_uDataInfo.m_sErrInfo.m_ucReg_ErrCap & 0xE0; // Received message if (usErrorID & 0x20) { m_sSubBusStatistics[ nCurrentChannelIndex ].m_unErrorRxCount++; } else { m_sSubBusStatistics[ nCurrentChannelIndex ].m_unErrorTxCount++; } m_sSubBusStatistics[ nCurrentChannelIndex ].m_unTotalBitsperSec += defBITS_ERR_FRAME; } } LeaveCriticalSection(&m_omCritSecBS); }
/******************************************************************************* Function Name : vFormatCANDataMsg Input(s) : - Output : - Functionality : Format CAN data bytes Member of : CFormatMsgCAN Author(s) : Ratnadip Date Created : 8.7.2009 Modifications : ArunKumar K 08.09.2010, Added handler for error messages. ERR_FLAG *******************************************************************************/ void CFormatMsgCAN::vFormatCANDataMsg(STCANDATA* pMsgCAN, SFORMATTEDDATA_CAN* CurrDataCAN, BYTE bExprnFlag_Log) { /*PROCESS ERROR MSGS: If Error Message type. Change the data and type fields. */ if (IS_ERR_MESSAGE(pMsgCAN->m_ucDataType)) { USHORT usErrCode = usProcessCurrErrorEntry(pMsgCAN->m_uDataInfo.m_sErrInfo); if( usErrCode != ERROR_UNKNOWN ) { // Format error message char* ptrStrErrName = NULL; ptrStrErrName = vFormatCurrErrorEntry(usErrCode); if(ptrStrErrName) { strcpy_s(CurrDataCAN->m_acDataDec, LENGTH_STR_DATA_CAN, ptrStrErrName); strcpy_s(CurrDataCAN->m_acDataHex, LENGTH_STR_DATA_CAN, ptrStrErrName); } } CurrDataCAN->m_dwMsgID = 0; sprintf_s(CurrDataCAN->m_acMsgIDDec, FORMAT_STR_ID_DEC, CurrDataCAN->m_dwMsgID); strcpy_s(CurrDataCAN->m_acType, LENGTH_STR_TYPE_CAN, "ERR"); } else { if (IS_RX_MESSAGE(pMsgCAN->m_ucDataType)) { CurrDataCAN->m_eDirection = DIR_RX; CurrDataCAN->m_acMsgDir[0] = _T('R'); } else if (IS_TX_MESSAGE(pMsgCAN->m_ucDataType)) { CurrDataCAN->m_eDirection = DIR_TX; CurrDataCAN->m_acMsgDir[0] = _T('T'); } CurrDataCAN->m_acMsgDir[1] = _T('x'); TYPE_CHANNEL CurrChannel = pMsgCAN->m_uDataInfo.m_sCANMsg.m_ucChannel; // Assuming default CAN msg if (pMsgCAN->m_uDataInfo.m_sCANMsg.m_bCANFD) // Incase of CANFD msg { CurrChannel = pMsgCAN->m_uDataInfo.m_sCANMsg.m_ucChannel; } if ((CurrChannel >= CHANNEL_CAN_MIN) && (CurrChannel <= CHANNEL_CAN_MAX )) { sprintf_s(CurrDataCAN->m_acChannel, "%d", CurrChannel); } memset(CurrDataCAN->m_acType,'\0',sizeof(CurrDataCAN->m_acType)); if (pMsgCAN->m_uDataInfo.m_sCANMsg.m_ucEXTENDED != 0) { CurrDataCAN->m_byIDType = TYPE_ID_CAN_EXTENDED; strcpy_s(CurrDataCAN->m_acType, LENGTH_STR_DESCRIPTION_CAN, _("x")); } else { CurrDataCAN->m_byIDType = TYPE_ID_CAN_STANDARD; strcpy_s(CurrDataCAN->m_acType, LENGTH_STR_DESCRIPTION_CAN, _("s")); } /* If it is a CAN FD frame */ if ( pMsgCAN->m_uDataInfo.m_sCANMsg.m_bCANFD ) { strcpy_s(&CurrDataCAN->m_acType[1], LENGTH_STR_DESCRIPTION_CAN, _("-fd")); } else if (pMsgCAN->m_uDataInfo.m_sCANMsg.m_ucRTR != 0) // CANFD cannot have RTR frames { CurrDataCAN->m_byMsgType |= TYPE_MSG_CAN_RTR; strcpy_s(&CurrDataCAN->m_acType[1], LENGTH_STR_DESCRIPTION_CAN, _("r")); } /* If it is a CAN FD frame */ //if ( pMsgCAN->m_bCANFDMsg ) //{ // _itoa_s(pMsgCAN->m_uDataInfo.m_sCANMsg.m_ucDataLen, CurrDataCAN->m_acDataLen, 10); // strcpy_s(CurrDataCAN->m_acMsgDesc, LENGTH_STR_DESCRIPTION_CAN, "Description"); // CurrDataCAN->m_u64TimeStamp = pMsgCAN->m_lTickCount.QuadPart; // CurrDataCAN->m_dwMsgID = pMsgCAN->m_uDataInfo.m_sCANMsg.m_unMsgID; // CurrDataCAN->m_byDataLength = pMsgCAN->m_uDataInfo.m_sCANMsg.m_ucDataLen; // memcpy(CurrDataCAN->m_abData, pMsgCAN->m_uDataInfo.m_sCANMsg.m_aucCANFDData, // CurrDataCAN->m_byDataLength); //} //else { _itoa_s(pMsgCAN->m_uDataInfo.m_sCANMsg.m_ucDataLen, CurrDataCAN->m_acDataLen, 10); strcpy_s(CurrDataCAN->m_acMsgDesc, LENGTH_STR_DESCRIPTION_CAN, "Description"); CurrDataCAN->m_dwMsgID = pMsgCAN->m_uDataInfo.m_sCANMsg.m_unMsgID; CurrDataCAN->m_byDataLength = pMsgCAN->m_uDataInfo.m_sCANMsg.m_ucDataLen; memcpy(CurrDataCAN->m_abData, pMsgCAN->m_uDataInfo.m_sCANMsg.m_ucData, CurrDataCAN->m_byDataLength); } } CurrDataCAN->m_u64TimeStamp = pMsgCAN->m_lTickCount.QuadPart; /* PROCESS ERROR MSGS ENDS */ vFormatTime(bExprnFlag_Log, CurrDataCAN); vFormatDataAndId(bExprnFlag_Log, CurrDataCAN); }