/******************************************************************************* | |
* Copyright (c) 2012 -2014 AIT, fortiss GmbH, Hit robot group | |
* This program and the accompanying materials are made available under the | |
* terms of the Eclipse Public License 2.0 which is available at | |
* http://www.eclipse.org/legal/epl-2.0. | |
* | |
* SPDX-License-Identifier: EPL-2.0 | |
* | |
* Contributors: | |
* Filip Andren, Alois Zoitl - initial API and implementation and/or initial documentation | |
* ys guo - Fix opc module compilation errors and deadlock bug | |
*******************************************************************************/ | |
#include "opcconnectionhandler.h" | |
#include "opcconnection.h" | |
#include <extevhandlerhelper.h> | |
#include "opceventhandler.h" | |
#include "commfb.h" | |
using namespace forte::com_infra; | |
DEFINE_SINGLETON(COpcConnectionHandler); | |
COpcConnectionHandler::COpcConnectionHandler(){ | |
} | |
COpcConnectionHandler::~COpcConnectionHandler(){ | |
TOpcConnectionList::Iterator itEnd = m_lOpcConnectionList.end(); | |
for(TOpcConnectionList::Iterator it = m_lOpcConnectionList.begin(); it != itEnd; ++it){ | |
delete (*it); | |
} | |
} | |
COpcConnection* COpcConnectionHandler::getOpcConnection(const char *pa_acHost, const char *pa_acServerName, const char* pa_acGroupName, unsigned long pa_nReqUpdateRate, float pa_nDeadBand, CComLayer* pa_pComCallback){ | |
COpcConnection *newConnection = findOpcConnection(pa_acHost, pa_acServerName); | |
if(newConnection == NULL){ | |
newConnection = new COpcConnection(pa_acHost, pa_acServerName, &(getExtEvHandler<COpcEventHandler>(*pa_pComCallback->getCommFB()))); | |
m_lOpcConnectionList.pushBack(newConnection); | |
} | |
newConnection->addGroup(pa_acGroupName, pa_nReqUpdateRate, pa_nDeadBand, pa_pComCallback); | |
return newConnection; | |
} | |
void COpcConnectionHandler::removeOpcConnection(const char *pa_acHost, const char *pa_acServerName, const char* pa_acGroupName){ | |
COpcConnection *existingCon = findOpcConnection(pa_acHost, pa_acServerName); | |
if(existingCon != NULL){ | |
existingCon->removeGroup(pa_acGroupName); | |
if(existingCon->getGroupCount() == 0) { | |
deleteOpcConnection(pa_acHost, pa_acServerName); | |
} | |
} | |
} | |
COpcConnection* COpcConnectionHandler::findOpcConnection(const char* pa_acHost, const char* pa_acServerName){ | |
TOpcConnectionList::Iterator itEnd = m_lOpcConnectionList.end(); | |
for(TOpcConnectionList::Iterator it = m_lOpcConnectionList.begin(); it != itEnd; ++it){ | |
if(strcmp(it->getHost(), pa_acHost) == 0 && strcmp(it->getServerName(), pa_acServerName) == 0) { | |
return (*it); | |
} | |
} | |
return NULL; | |
} | |
void COpcConnectionHandler::deleteOpcConnection(const char* pa_acHost, const char* pa_acServerName){ | |
TOpcConnectionList::Iterator itDelete = m_lOpcConnectionList.begin(); | |
TOpcConnectionList::Iterator it = m_lOpcConnectionList.begin(); | |
TOpcConnectionList::Iterator itEnd = m_lOpcConnectionList.end(); | |
if(it != itEnd){ | |
if(strcmp(it->getHost(), pa_acHost) == 0 && strcmp(it->getServerName(), pa_acServerName)){ | |
m_lOpcConnectionList.popFront(); | |
return; | |
} | |
++it; | |
while(it != itEnd){ | |
if(strcmp(it->getHost(), pa_acHost) == 0 && strcmp(it->getServerName(), pa_acServerName)){ | |
m_lOpcConnectionList.eraseAfter(itDelete); | |
return; | |
} | |
++itDelete; | |
++it; | |
} | |
} | |
} |