/** * \return TRUE if client removed else FALSE * * Removes the client with client id dwClientId. */ static BOOL bRemoveClient(DWORD dwClientId) { INT i; BOOL bResult = FALSE; bResult = FALSE; if (sg_unClientCnt > 0) { UINT unClientIndex = 0; if (bGetClientObj(dwClientId, unClientIndex)) { sg_asClientToBufMap[unClientIndex].m_dwClientID = 0; memset (sg_asClientToBufMap[unClientIndex].m_acClientName, 0, sizeof (char) * MAX_PATH); for (i = 0; i < MAX_BUFF_ALLOWED; i++) { sg_asClientToBufMap[unClientIndex].m_pClientBuf[i] = NULL; } sg_asClientToBufMap[unClientIndex].m_unBufCount = 0; if ((unClientIndex + 1) < sg_unClientCnt) { sg_asClientToBufMap[unClientIndex] = sg_asClientToBufMap[sg_unClientCnt - 1]; } sg_unClientCnt--; bResult = TRUE; } } return(bResult); }
/** * \return S_OK for success, S_FALSE for failure * * Registers the buffer pBufObj to the client ClientID */ HRESULT CDIL_CAN_MHS::CAN_ManageMsgBuf(BYTE bAction, DWORD ClientID, CBaseCANBufFSE* pBufObj) { HRESULT hResult = S_FALSE; UINT unClientIndex; UINT i; if (ClientID != 0) { if (bGetClientObj(ClientID, unClientIndex)) { SCLIENTBUFMAP &sClientObj = sg_asClientToBufMap[unClientIndex]; if (bAction == MSGBUF_ADD) { // **** Add msg buffer if (pBufObj) { if (sClientObj.m_unBufCount < MAX_BUFF_ALLOWED) { if (bIsBufferExists(sClientObj, pBufObj) == FALSE) { sClientObj.m_pClientBuf[sClientObj.m_unBufCount++] = pBufObj; hResult = S_OK; } else hResult = ERR_BUFFER_EXISTS; } } } else if (bAction == MSGBUF_CLEAR) { // **** Clear msg buffer if (pBufObj != NULL) //REmove only buffer mentioned bRemoveClientBuffer(sClientObj.m_pClientBuf, sClientObj.m_unBufCount, pBufObj); else // Remove all { for (i = 0; i < sClientObj.m_unBufCount; i++) sClientObj.m_pClientBuf[i] = NULL; sClientObj.m_unBufCount = 0; } hResult = S_OK; } ////else //// ASSERT(FALSE); } else hResult = ERR_NO_CLIENT_EXIST; } else { if (bAction == MSGBUF_CLEAR) { // **** clear msg buffer for (UINT i = 0; i < sg_unClientCnt; i++) CAN_ManageMsgBuf(MSGBUF_CLEAR, sg_asClientToBufMap[i].m_dwClientID, NULL); } hResult = S_OK; } return(hResult); }
/** * \brief This function will remove the existing client ID * \param[in] dwClientId, client ID to be removed * \return Returns TRUE if client ID removal is success, else FALSE * \authors Arunkumar Karri * \date 07.10.2011 Created */ static BOOL bRemoveClient(DWORD dwClientId) { BOOL bResult = FALSE; if (sg_unClientCnt > 0) { UINT unClientIndex = (UINT)-1; if (bGetClientObj(dwClientId, unClientIndex)) { /* clear the client first */ if (sg_asClientToBufMap[unClientIndex].hClientHandle != 0) { HRESULT hResult = S_OK;//(*pfCAN_RemoveClient)(sg_asClientToBufMap[unClientIndex].hClientHandle); if (hResult == S_OK) { sg_asClientToBufMap[unClientIndex].dwClientID = 0; sg_asClientToBufMap[unClientIndex].hClientHandle = 0; memset (sg_asClientToBufMap[unClientIndex].pacClientName, 0, sizeof (char) * MAX_PATH); for (int i = 0; i < MAX_BUFF_ALLOWED; i++) { sg_asClientToBufMap[unClientIndex].pClientBuf[i] = nullptr; } sg_asClientToBufMap[unClientIndex].unBufCount = 0; bResult = TRUE; } else { vRetrieveAndLog(hResult, __FILE__, __LINE__); } } else { sg_asClientToBufMap[unClientIndex].dwClientID = 0; memset (sg_asClientToBufMap[unClientIndex].pacClientName, 0, sizeof (char) * MAX_PATH); for (int i = 0; i < MAX_BUFF_ALLOWED; i++) { sg_asClientToBufMap[unClientIndex].pClientBuf[i] = nullptr; } sg_asClientToBufMap[unClientIndex].unBufCount = 0; bResult = TRUE; } if (bResult == TRUE) { if ((unClientIndex + 1) < sg_unClientCnt) { sg_asClientToBufMap[unClientIndex] = sg_asClientToBufMap[sg_unClientCnt - 1]; } sg_unClientCnt--; } } } return bResult; }
/** * This function writes the message to the corresponding clients buffer */ static void vWriteIntoClientsBuffer(STCANDATA& can_data) { UINT ClientId, i, j; BOOL bClientExists; static SACK_MAP sAckMap; static UINT Index = (UINT)-1; static STCANDATA sTempCanData; // Write into the client's buffer and Increment message Count if (can_data.m_ucDataType == TX_FLAG) { ClientId = 0; sAckMap.m_Channel = can_data.m_uDataInfo.m_sCANMsg.m_ucChannel; sAckMap.m_MsgID = can_data.m_uDataInfo.m_sCANMsg.m_unMsgID; if (bRemoveMapEntry(sAckMap, ClientId)) { bClientExists = bGetClientObj(ClientId, Index); for (i = 0; i < sg_unClientCnt; i++) { //Tx for sender node if (/*(i == CAN_MONITOR_NODE_INDEX) ||*/ (bClientExists && (i == Index))) { for (j = 0; j < sg_asClientToBufMap[i].m_unBufCount; j++) { sg_asClientToBufMap[i].m_pClientBuf[j]->WriteIntoBuffer(&can_data); } } else { //Send the other nodes as Rx. for (UINT j = 0; j < sg_asClientToBufMap[i].m_unBufCount; j++) { sTempCanData = can_data; sTempCanData.m_ucDataType = RX_FLAG; sg_asClientToBufMap[i].m_pClientBuf[j]->WriteIntoBuffer(&sTempCanData); } } } } } else // provide it to everybody { for (i = 0; i < sg_unClientCnt; i++) { for (j = 0; j < sg_asClientToBufMap[i].m_unBufCount; j++) { sg_asClientToBufMap[i].m_pClientBuf[j]->WriteIntoBuffer(&can_data); } } } }
static BOOL bRemoveClient(DWORD dwClientId) { BOOL bResult = FALSE; if (sg_unClientCnt > 0) { UINT unClientIndex = (UINT)-1; if (bGetClientObj(dwClientId, unClientIndex)) { //clear the client first sg_ushTempClientID = (SHORT)sg_asClientToBufMap[unClientIndex].dwClientID; sg_hTmpClientHandle = sg_asClientToBufMap[unClientIndex].hClientHandle; sg_hTmpPipeHandle = sg_asClientToBufMap[unClientIndex].hPipeFileHandle; HRESULT hResult = PerformAnOperation(UNREGISTER); if (hResult == S_OK) { sg_asClientToBufMap[unClientIndex].dwClientID = 0; sg_asClientToBufMap[unClientIndex].hClientHandle = NULL; sg_asClientToBufMap[unClientIndex].hPipeFileHandle = NULL; memset (sg_asClientToBufMap[unClientIndex].pacClientName, 0, sizeof (TCHAR) * MAX_PATH); for (int i = 0; i < MAX_BUFF_ALLOWED; i++) { sg_asClientToBufMap[unClientIndex].pClientBuf[i] = NULL; } sg_asClientToBufMap[unClientIndex].unBufCount = 0; bResult = TRUE; } else { sg_pIlog->vLogAMessage(__FILE__, __LINE__, _T("Unregister failed")); } if (bResult == TRUE) { if ((unClientIndex + 1) < sg_unClientCnt) { sg_asClientToBufMap[unClientIndex] = sg_asClientToBufMap[sg_unClientCnt - 1]; } sg_unClientCnt--; } } } return bResult; }
/** * \brief Registers the buffer pBufObj to the client ClientID * \param[in] bAction, contains one of the values MSGBUF_ADD or MSGBUF_CLEAR * \param[in] ClientID, is the client ID * \param[in] pBufObj, is pointer to CBaseCANBufFSE object * \return S_OK for success, S_FALSE for failure * \authors Arunkumar Karri * \date 07.10.2011 Created */ HRESULT CDIL_ISOLAR_EVE_VCAN::CAN_ManageMsgBuf(BYTE bAction, DWORD ClientID, CBaseCANBufFSE* pBufObj) { HRESULT hResult = S_FALSE; if (ClientID != 0) { UINT unClientIndex; if (bGetClientObj(ClientID, unClientIndex)) { SCLIENTBUFMAP& sClientObj = sg_asClientToBufMap[unClientIndex]; if (bAction == MSGBUF_ADD) { /* Add msg buffer */ if (pBufObj != nullptr) { if (sClientObj.unBufCount < MAX_BUFF_ALLOWED) { if (bIsBufferExists(sClientObj, pBufObj) == FALSE) { sClientObj.pClientBuf[sClientObj.unBufCount++] = pBufObj; hResult = S_OK; } else { hResult = ERR_BUFFER_EXISTS; } } } } else if (bAction == MSGBUF_CLEAR) { /* clear msg buffer */ if (pBufObj != nullptr) { /* Remove only buffer mentioned */ bRemoveClientBuffer(sClientObj.pClientBuf, sClientObj.unBufCount, pBufObj); } else { /* Remove all */ for (UINT i = 0; i < sClientObj.unBufCount; i++) { sClientObj.pClientBuf[i] = nullptr; } sClientObj.unBufCount = 0; } hResult = S_OK; } } else { hResult = ERR_NO_CLIENT_EXIST; } } else { if (bAction == MSGBUF_CLEAR) { /* clear msg buffer */ for (UINT i = 0; i < sg_unClientCnt; i++) { CAN_ManageMsgBuf(MSGBUF_CLEAR, sg_asClientToBufMap[i].dwClientID, nullptr); } hResult = S_OK; } } return hResult; }