HRESULT CMsgContainerCAN::GetMessageName(STCANDATA& sCANMsg, CString& msgName, bool formatHexForId)
{
    if (IS_ERR_MESSAGE(sCANMsg.m_ucDataType))
    {
        GetErrorInfo(sCANMsg, msgName);
    }
    else
    {
        //Message Name
        std::string strName = "";
        IFrame* pouFrame = nullptr;
        ERRORCODE eResult = mBmNetwork->GetFrame(CAN, 0, sCANMsg.m_uDataInfo.m_sCANMsg.m_unMsgID, nullptr, &pouFrame);
        if (EC_SUCCESS == eResult && nullptr != pouFrame)
        {
            pouFrame->GetName(strName);
            msgName = strName.c_str();
        }
        else
        {
            if (formatHexForId == true)
            {
                msgName.Format("0x%X", sCANMsg.m_uDataInfo.m_sCANMsg.m_unMsgID);
            }
            else
            {
                msgName.Format("%d", sCANMsg.m_uDataInfo.m_sCANMsg.m_unMsgID);
            }
        }
    }
    return S_OK;
}
/******************************************************************************
    Function Name    :  nCreateKeyWithCodeAndType
    Input(s)         :
    Output           :
    Functionality    :  Creates a key for SmsgDispEntry map
    Member of        :  CMsgContainerCAN
    Friend of        :      -
    Author(s)        :  Anish kumar
    Date Created     :  01.04.2010
******************************************************************************/
__int64 CMsgContainerCAN::nCreateMapIndexKey( LPVOID pMsgData )
{
    STCANDATA* pouCANData = (STCANDATA*)pMsgData;
    STCAN_MSG& sMsg = pouCANData->m_uDataInfo.m_sCANMsg;

    // Form message to get message index in the CMap
    int nMsgID = 0;
    if (IS_ERR_MESSAGE(pouCANData->m_ucDataType))
    {
        nMsgID = MAKE_RX_TX_MESSAGE( usProcessCurrErrorEntry(pouCANData->m_uDataInfo.m_sErrInfo),
                                     IS_RX_MESSAGE(pouCANData->m_ucDataType));
    }
    else
    {
        nMsgID = MAKE_RX_TX_MESSAGE( sMsg.m_unMsgID,
                                     IS_RX_MESSAGE(pouCANData->m_ucDataType));
    }

    nMsgID = MAKE_DEFAULT_MESSAGE_TYPE(nMsgID);
    // For extended message
    if (sMsg.m_ucEXTENDED)
    {
        nMsgID = MAKE_EXTENDED_MESSAGE_TYPE(nMsgID);
    }
    // Apply Channel Information
    __int64 n64MapIndex = MAKE_CHANNEL_SPECIFIC_MESSAGE( nMsgID,
                          sMsg.m_ucChannel );
    return n64MapIndex;
}
COLORREF CMsgContainerCAN::getMessageColor(long long key, bool isAppendMode, CMessageAttrib* msgAttributes/*has to be removed*/)
{
    if (msgAttributes == nullptr)
    {
        return RGB(0, 0, 0);
    }
    HRESULT hResult = S_FALSE;
    STCANDATASPL sCANMsg;
    if (isAppendMode == true)
    {
        STCANDATASPL sSplCANMsg;
        hResult = m_ouAppendCanBuf.ReadFromBuffer(&sSplCANMsg, (int)key);
        sCANMsg.m_ucDataType = sSplCANMsg.m_ucDataType;
        sCANMsg.m_uDataInfo = sSplCANMsg.m_uDataInfo;
    }
    else
    {
        hResult = hReadFromOWBuffer(&sCANMsg, key);
    }
    if (CALL_SUCCESS == hResult)
    {
        if (IS_ERR_MESSAGE(sCANMsg.m_ucDataType))
        {
            return COLOUR_ERROR_MSG;
        }
        else
        {
            return msgAttributes->GetCanIDColour(sCANMsg.m_uDataInfo.m_sCANMsg.m_unMsgID);
        }
    }
    return RGB(0,0,0);
}
//converts STCANDATA into SFRAMEINFO_BASIC_CAN
static void vFormatCANDataMsg(STCANDATA* pMsgCAN,
                              tagSFRAMEINFO_BASIC_CAN* CurrDataCAN)

{
    if (RX_FLAG == pMsgCAN->m_ucDataType)
    {
        CurrDataCAN->m_eDrctn = DIR_RX;
    }
	else
    {
        CurrDataCAN->m_eDrctn = DIR_TX;
    }

	if (IS_ERR_MESSAGE(pMsgCAN->m_ucDataType))
	{
		CurrDataCAN->m_eEventType = ERROR_ACTIVE;
	}
	else
	{
		CurrDataCAN->m_eEventType = ERROR_INVALID;
	}

    CurrDataCAN->m_eChannel = pMsgCAN->m_uDataInfo.m_sCANMsg.m_ucChannel;

    if (pMsgCAN->m_uDataInfo.m_sCANMsg.m_ucEXTENDED != 0)
    {
        CurrDataCAN->m_byIDType = TYPE_ID_CAN_EXTENDED;
    }
    else
    {
        CurrDataCAN->m_byIDType = TYPE_ID_CAN_STANDARD;
    }

    if ( pMsgCAN->m_uDataInfo.m_sCANMsg.m_bCANFD )
    {
        CurrDataCAN->m_byMsgType = TYPE_MSG_CAN_FD;
    }
    else if (pMsgCAN->m_uDataInfo.m_sCANMsg.m_ucRTR != 0)
    {
        CurrDataCAN->m_byMsgType = TYPE_MSG_CAN_RTR;
    }
    else
    {
        CurrDataCAN->m_byMsgType = TYPE_MSG_CAN_NON_RTR;
    }

	CurrDataCAN->m_dwFrameID = pMsgCAN->m_uDataInfo.m_sCANMsg.m_unMsgID;
}
HRESULT CMsgContainerCAN::sendMessage(long long key, bool isAppendMode/*has to be removed*/)
{
    if (nullptr!= m_pouDIL_CAN_Interface)
    {
        HRESULT hResult = S_FALSE;
        STCANDATASPL sCANMsg;
        if (isAppendMode == true)
        {
            STCANDATASPL sSplCANMsg;
            hResult = m_ouAppendCanBuf.ReadFromBuffer(&sSplCANMsg, (int)key);
            sCANMsg.m_ucDataType = sSplCANMsg.m_ucDataType;
            sCANMsg.m_uDataInfo = sSplCANMsg.m_uDataInfo;
        }
        else
        {
            hResult = hReadFromOWBuffer(&sCANMsg, key);
        }
        if (!(IS_ERR_MESSAGE(sCANMsg.m_ucDataType)))
        {
            m_pouDIL_CAN_Interface->DILC_SendMsg(m_dwClientId, sCANMsg.m_uDataInfo.m_sCANMsg);
        }
    }
    return S_FALSE;
}
/******************************************************************************
    Function Name    :  hUpdateFormattedMsgStruct
    Input(s)         :  
    Output           :  
    Functionality    :  Format the requested Msg and save it in Format data 
                        structure which is accessible from the User module
    Member of        :  CMsgContainerCAN
    Friend of        :      -
    Author(s)        :  Anish kumar
    Date Created     :  01.04.2010
******************************************************************************/
HRESULT CMsgContainerCAN::hUpdateFormattedMsgStruct(int nListIndex,
                                                 int &nMsgCode, 
                                                 BYTE bExprnFlag_Disp,
                                                 __int64 nTimeOffset)
{
    HRESULT hResult = S_FALSE;
    nMsgCode  = 0;	
    static STCANDATA sCANCurrData;
    static STCANDATASPL sCANCurrDataSpl;
    memset( &m_sOutFormattedData, 0, sizeof(m_sOutFormattedData) );
    if( IS_MODE_APPEND(bExprnFlag_Disp) )
    {
        //INT nType = 0;
		//INT nSize =sizeof(sCANCurrDataSpl);
        //In append mode providing interpret state is not required
		//hResult = m_ouAppendCanBuf.ReadEntry(nType, (BYTE*)&sCANCurrDataSpl, nSize, nListIndex, 0); 
        hResult = m_ouAppendCanBuf.ReadFromBuffer(&sCANCurrDataSpl, nListIndex);		
        sCANCurrData = *((STCANDATA*)&sCANCurrDataSpl);
        if (IS_TM_REL_SET(bExprnFlag_Disp))
        {
            //If relative time then the time will be delta time, for formatting
            sCANCurrData.m_lTickCount.QuadPart = sCANCurrDataSpl.m_nDeltime;
        }
    }
    else
    {
        hResult = m_ouOWCanBuf.ReadFromBuffer(&sCANCurrData, nListIndex);
        if (hResult == S_OK)
        {
            if (IS_TM_REL_SET(bExprnFlag_Disp))
            {
                //If relative time then the time will be delta time, for formatting
                sCANCurrData.m_lTickCount.QuadPart -= nTimeOffset;
            }
        }
    }
    
    if (hResult == S_OK)
    {
        m_ouFormatCAN.vFormatCANDataMsg(&sCANCurrData, 
                                        &m_sOutFormattedData, 
                                        bExprnFlag_Disp);

		//If Message is erroneous, return S_FALSE
		if(IS_ERR_MESSAGE(sCANCurrData.m_ucDataType))
		{
			nMsgCode = usProcessCurrErrorEntry(sCANCurrData.m_uDataInfo.m_sErrInfo);				
			return S_FALSE;
		}

        //Now add the name of message if present in database else show the code
        nMsgCode = sCANCurrData.m_uDataInfo.m_sCANMsg.m_unMsgID;	
    }
    else
    {
        memset (&m_sOutFormattedData, 0, sizeof(m_sOutFormattedData));
		nMsgCode = -1;
    }	

    return hResult;
}
Beispiel #7
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);
}
Beispiel #8
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);
}