Exemplo n.º 1
0
/**
 * \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);
}
Exemplo n.º 2
0
/*******************************************************************************
  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);
}