NTMultiChannel support now available.
This commit is contained in:
@@ -40,6 +40,13 @@ examplePvaClientMultiDouble_LIBS += pvAccess
|
||||
examplePvaClientMultiDouble_LIBS += pvData
|
||||
examplePvaClientMultiDouble_LIBS += Com
|
||||
|
||||
PROD_HOST += examplePvaClientNTMulti
|
||||
examplePvaClientNTMulti_SRCS += examplePvaClientNTMulti.cpp
|
||||
examplePvaClientNTMulti_LIBS += pvaClient
|
||||
examplePvaClientNTMulti_LIBS += pvAccess
|
||||
examplePvaClientNTMulti_LIBS += pvData
|
||||
examplePvaClientNTMulti_LIBS += Com
|
||||
|
||||
PROD_HOST += helloWorldRPC
|
||||
helloWorldRPC_SRCS += helloWorldRPC.cpp
|
||||
helloWorldRPC_LIBS += pvaClient
|
||||
|
||||
@@ -33,7 +33,7 @@ cout << "num " << num << " names " << channelNames << endl;
|
||||
PvaClientMultiPutDoublePtr multiPut(multiChannel->createPut());
|
||||
PvaClientMultiMonitorDoublePtr multiMonitor(multiChannel->createMonitor());
|
||||
shared_vector<double> data(num,0);
|
||||
for(double value = 0.0; value< 1.0; value+= .2) {
|
||||
for(double value = 0.2; value< 2.3; value+= 1.0) {
|
||||
try {
|
||||
for(size_t i=0; i<num; ++i) data[i] = value + i;
|
||||
cout << "put " << data << endl;
|
||||
@@ -57,7 +57,7 @@ int main(int argc,char *argv[])
|
||||
size_t num = 5;
|
||||
shared_vector<string> channelNames(num);
|
||||
channelNames[0] = "double01";
|
||||
channelNames[1] = "double02";
|
||||
channelNames[1] = "int01";
|
||||
channelNames[2] = "double03";
|
||||
channelNames[3] = "double04";
|
||||
channelNames[4] = "double05";
|
||||
@@ -68,7 +68,7 @@ int main(int argc,char *argv[])
|
||||
example(pva,"ca",names);
|
||||
channelNames = shared_vector<string>(num);
|
||||
channelNames[0] = "exampleDouble01";
|
||||
channelNames[1] = "exampleDouble02";
|
||||
channelNames[1] = "exampleInt";
|
||||
channelNames[2] = "exampleDouble03";
|
||||
channelNames[3] = "exampleDouble04";
|
||||
channelNames[4] = "exampleDouble05";
|
||||
|
||||
141
example/src/examplePvaClientNTMulti.cpp
Normal file
141
example/src/examplePvaClientNTMulti.cpp
Normal file
@@ -0,0 +1,141 @@
|
||||
/*examplePvaClientNTMulti.cpp */
|
||||
/**
|
||||
* Copyright - See the COPYRIGHT that is included with this distribution.
|
||||
* EPICS pvData is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
*/
|
||||
/**
|
||||
* @author mrk
|
||||
*/
|
||||
|
||||
/* Author: Marty Kraimer */
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <pv/pvaClientMultiChannel.h>
|
||||
#include <pv/convert.h>
|
||||
|
||||
using std::tr1::static_pointer_cast;
|
||||
using namespace std;
|
||||
using namespace epics::pvData;
|
||||
using namespace epics::pvAccess;
|
||||
using namespace epics::pvaClient;
|
||||
|
||||
static PVDataCreatePtr pvDataCreate = getPVDataCreate();
|
||||
static ConvertPtr convert = getConvert();
|
||||
|
||||
static void setValue(PVUnionPtr const &pvUnion, double value)
|
||||
{
|
||||
UnionConstPtr u = pvUnion->getUnion();
|
||||
FieldConstPtr field = u->getField(0);
|
||||
Type type = field->getType();
|
||||
if(type==scalar) {
|
||||
ScalarConstPtr scalar = static_pointer_cast<const Scalar>(field);
|
||||
ScalarType scalarType = scalar->getScalarType();
|
||||
if(scalarType==pvDouble) {
|
||||
PVDoublePtr pvValue = static_pointer_cast<PVDouble>(
|
||||
pvDataCreate->createPVScalar(pvDouble));
|
||||
pvValue->put(value);
|
||||
pvUnion->set(0,pvValue);
|
||||
return;
|
||||
}
|
||||
if(scalarType==pvString) {
|
||||
PVStringPtr pvValue = static_pointer_cast<PVString>(
|
||||
pvDataCreate->createPVScalar(pvString));
|
||||
stringstream ss;
|
||||
ss << "value" << value;
|
||||
pvValue->put(ss.str());
|
||||
pvUnion->set(0,pvValue);
|
||||
return;
|
||||
}
|
||||
throw std::runtime_error("only pvDouble and pvString are supported");
|
||||
}
|
||||
if(type==scalarArray) {
|
||||
ScalarArrayConstPtr scalarArray = static_pointer_cast<const ScalarArray>(field);
|
||||
ScalarType scalarType = scalarArray->getElementType();
|
||||
if(scalarType==pvDouble) {
|
||||
size_t num = 5;
|
||||
PVDoubleArrayPtr pvValue = static_pointer_cast<PVDoubleArray>(
|
||||
pvDataCreate->createPVScalarArray(pvDouble));
|
||||
shared_vector<double> data(num);
|
||||
for(size_t i=0; i<num; ++i) data[i] = value +i;
|
||||
pvValue->replace(freeze(data));
|
||||
pvUnion->set(0,pvValue);
|
||||
return;
|
||||
}
|
||||
if(scalarType==pvString) {
|
||||
size_t num = 5;
|
||||
PVStringArrayPtr pvValue = static_pointer_cast<PVStringArray>(
|
||||
pvDataCreate->createPVScalarArray(pvString));
|
||||
shared_vector<string> data(num);
|
||||
for(size_t i=0; i<num; ++i) {
|
||||
stringstream ss;
|
||||
ss << "value" << value << i;
|
||||
data[i] = ss.str();
|
||||
}
|
||||
pvValue->replace(freeze(data));
|
||||
pvUnion->set(0,pvValue);
|
||||
return;
|
||||
}
|
||||
throw std::runtime_error("only pvDouble and pvString are supported");
|
||||
}
|
||||
throw std::runtime_error("only scalar and scalarArray fields are supported");
|
||||
}
|
||||
|
||||
static void example(
|
||||
PvaClientPtr const &pva,
|
||||
string provider,
|
||||
shared_vector<const string> const &channelNames)
|
||||
{
|
||||
|
||||
size_t num = channelNames.size();
|
||||
PvaClientMultiChannelPtr multiChannel(
|
||||
PvaClientMultiChannel::create(pva,channelNames,provider));
|
||||
PvaClientNTMultiGetPtr multiGet(multiChannel->createNTGet());
|
||||
PvaClientNTMultiPutPtr multiPut(multiChannel->createNTPut());
|
||||
PvaClientNTMultiMonitorPtr multiMonitor(multiChannel->createNTMonitor());
|
||||
shared_vector<epics::pvData::PVUnionPtr> data = multiPut->getValues();
|
||||
for(double value = 0.0; value< 2.1; value+= 1.0) {
|
||||
for(size_t i=0; i<num ; ++i) {
|
||||
PVUnionPtr pvUnion = data[i];
|
||||
setValue(pvUnion,value);
|
||||
}
|
||||
multiPut->put();
|
||||
multiGet->get();
|
||||
PvaClientNTMultiDataPtr multiData = multiGet->getData();
|
||||
PVStructurePtr pvStructure = multiData->getPVTop();
|
||||
cout << "pvStructure\n" << pvStructure << endl;
|
||||
bool result = multiMonitor->waitEvent(.1);
|
||||
while(result) {
|
||||
multiData = multiMonitor->getData();
|
||||
pvStructure = multiData->getPVTop();
|
||||
cout << "monitor pvStructure\n" << pvStructure << endl;
|
||||
result = multiMonitor->poll();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc,char *argv[])
|
||||
{
|
||||
PvaClientPtr pva = PvaClient::create();
|
||||
size_t num = 4;
|
||||
shared_vector<string> channelNames(num);
|
||||
channelNames[0] = "double01";
|
||||
channelNames[1] = "string01";
|
||||
channelNames[2] = "doubleArray01";
|
||||
channelNames[3] = "stringArray01";
|
||||
cout << "dbRecord pva\n";
|
||||
shared_vector<const string> names(freeze(channelNames));
|
||||
example(pva,"pva",names);
|
||||
cout << "dbRecord ca\n";
|
||||
example(pva,"ca",names);
|
||||
channelNames = shared_vector<string>(num);
|
||||
channelNames[0] = "exampleDouble";
|
||||
channelNames[1] = "exampleString";
|
||||
channelNames[2] = "exampleDoubleArray";
|
||||
channelNames[3] = "exampleStringArray";
|
||||
names = freeze(channelNames);
|
||||
cout << "pvRecord pva\n";
|
||||
example(pva,"pva",names);
|
||||
return 0;
|
||||
}
|
||||
@@ -13,12 +13,16 @@
|
||||
#include <iostream>
|
||||
|
||||
#include <pv/pvaClient.h>
|
||||
#include <pv/convert.h>
|
||||
|
||||
using std::tr1::static_pointer_cast;
|
||||
using namespace std;
|
||||
using namespace epics::pvData;
|
||||
using namespace epics::pvAccess;
|
||||
using namespace epics::pvaClient;
|
||||
|
||||
static ConvertPtr convert = getConvert();
|
||||
|
||||
|
||||
static void examplePut(PvaClientPtr const &pva)
|
||||
{
|
||||
@@ -45,10 +49,29 @@ static void examplePut(PvaClientPtr const &pva)
|
||||
}
|
||||
}
|
||||
|
||||
static void examplePVFieldPut(PvaClientPtr const &pva)
|
||||
{
|
||||
cout << "example put\n";
|
||||
PvaClientChannelPtr channel = pva->channel("exampleDouble");
|
||||
PvaClientPutPtr put = channel->put();
|
||||
PvaClientPutDataPtr putData = put->getData();
|
||||
PVFieldPtr pvField = putData->getValue();
|
||||
PVScalarPtr pvScalar = static_pointer_cast<PVScalar>(pvField);
|
||||
try {
|
||||
convert->fromDouble(pvScalar,1.0); put->put();
|
||||
cout << channel->get("field()")->getData()->showChanged(cout) << endl;
|
||||
convert->fromDouble(pvScalar,2.0); put->put();
|
||||
cout << channel->get("field()")->getData()->showChanged(cout) << endl;
|
||||
} catch (std::runtime_error e) {
|
||||
cout << "exception " << e.what() << endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int main(int argc,char *argv[])
|
||||
{
|
||||
PvaClientPtr pva = PvaClient::create();
|
||||
examplePut(pva);
|
||||
examplePVFieldPut(pva);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user