blob: 25202014b37a5f8af7adc764420108f23dd1bd6f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 AIT, ACIN
* 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
*******************************************************************************/
#include "opcconnectionimpl.h"
#include "opceventhandler.h"
#include "opcconnection.h"
#include "opcprocessvar.h"
#include "OPCClient.h"
#include "OPCHost.h"
#include "OPCServer.h"
#include "OPCGroup.h"
#include "OPCItem.h"
COpcConnectionImpl::COpcConnectionImpl(const char *pa_acHost, const char *pa_acServerName, COpcConnection* pa_pOpcConn) :
m_pOpcConn(pa_pOpcConn), m_pOpcHost(0), m_pOpcServer(0), m_acHost(pa_acHost), m_acServerName(pa_acServerName), m_acGroupName(0), m_nReqUpdateRate(0), m_nRealUpdateRate(0), m_nDeadBand(0) {
}
COpcConnectionImpl::~COpcConnectionImpl(){
}
void COpcConnectionImpl::connect(){
try{
COPCClient::init();
m_pOpcHost = COPCClient::makeHost(m_acHost);
m_pOpcServer = m_pOpcHost->connectDAServer(m_acServerName);
} catch (OPCException &e){
m_pOpcConn->response_connect(false);
return;
}
m_pOpcConn->response_connect(true);
}
void COpcConnectionImpl::addItem(COpcProcessVar* pa_pNewItem){
COPCGroup* itemGroup = getOpcGroup(pa_pNewItem->getItemGroupName(), pa_pNewItem->getItemFunction());
ATL::CString itemName(pa_pNewItem->getItemName());
try{
COPCItem* newItem = itemGroup->addItem(itemName, true);
pa_pNewItem->setOpcItem(newItem);
pa_pNewItem->setIsActive(true);
} catch (OPCException &e){
pa_pNewItem->setIsActive(false);
}
m_pOpcConn->response_itemAdded(pa_pNewItem);
}
void COpcConnectionImpl::addGroup(const char* pa_acGroupName, unsigned long pa_nReqUpdateRate, float pa_nDeadBand){
m_lOpcGroupSettingsList.pushBack(new SOpcGroupSettings(pa_acGroupName, pa_nReqUpdateRate, pa_nDeadBand));
}
int COpcConnectionImpl::sendItemData(COpcProcessVar* pa_pNewItem){
return 0;
}
void COpcConnectionImpl::OnDataChange(COPCGroup & group, CAtlMap<COPCItem *, OPCItemData *> & changes){
TItemDataList itemList;
for(POSITION pos = changes.GetStartPosition(); pos != NULL;){
OPCItemData *itemData = changes.GetValueAt(pos);
COPCItem *item = changes.GetNextKey(pos);
itemList.pushBack(new SOpcItemData((LPCTSTR) (item->getName()), (Variant) itemData->vDataValue));
}
const char *c_groupName = (const char*) group.getName();
int position = 0;
const char * subStrRead = strstr(c_groupName, "_read");
if(subStrRead != NULL) {
position = subStrRead - c_groupName;
}
else{
//TODO Should not happen error
}
char * groupName = (char*) malloc(position + 1);
strncpy(groupName, c_groupName, position);
groupName[position] = '\0';
m_pOpcConn->response_dataReceived(groupName, itemList);
free(groupName);
}
COPCGroup* COpcConnectionImpl::getOpcGroup(const char* pa_acGroupName, COpcProcessVar::EOpcProcessVarFunctions pa_eFunction){
COPCGroup *retGroup = NULL;
TOpcGroupSettingsList::Iterator itEnd = m_lOpcGroupSettingsList.end();
for(TOpcGroupSettingsList::Iterator it = m_lOpcGroupSettingsList.begin(); it != itEnd; ++it){
if(strcmp(it->m_acGroupName, pa_acGroupName) == 0){
if(pa_eFunction == COpcProcessVar::e_FBOutput){
if(!(it->m_bReadGroupAdded)){
char *groupName = (char*) malloc(strlen(pa_acGroupName) + 5 + 1);
strcpy(groupName, pa_acGroupName);
strcat(groupName, "_read");
try{
it->m_pOpcGroupRead = retGroup = m_pOpcServer->makeGroup(groupName, true, it->m_nReqUpdateRate, it->m_nRevisedUpdateRate, it->m_nDeadBand);
it->m_pOpcGroupRead->enableAsynch(*this);
it->m_bReadGroupAdded = true;
} catch (OPCException &e){
// TODO
}
free(groupName);
} else {
retGroup = it->m_pOpcGroupRead;
}
}
else if(pa_eFunction == COpcProcessVar::e_FBInput){
if(!(it->m_bWriteGroupAdded)){
char *groupName = (char*) malloc(strlen(pa_acGroupName) + 6 + 1);
strcpy(groupName, pa_acGroupName);
strcat(groupName, "_write");
try{
it->m_pOpcGroupWrite = retGroup = m_pOpcServer->makeGroup(groupName, true, it->m_nReqUpdateRate, it->m_nRevisedUpdateRate, it->m_nDeadBand);
it->m_bWriteGroupAdded = true;
} catch (OPCException &e){
// TODO
}
free(groupName);
} else {
retGroup = it->m_pOpcGroupWrite;
}
}
break;
}
}
return retGroup;
}