testServer: testRandom, testTable added

This commit is contained in:
Matej Sekoranja
2013-03-22 22:43:45 +01:00
parent 10a62738df
commit 2233439fad
2 changed files with 169 additions and 129 deletions

View File

@@ -236,6 +236,69 @@ public:
};
static epics::pvData::PVStructure::shared_pointer createNTTable(int columnsCount)
{
StringArray fieldNames(columnsCount);
FieldConstPtrArray fields(columnsCount);
char sbuf[16];
vector<String> labels;
for (int i = 0; i < columnsCount; i++)
{
sprintf(sbuf, "column%d", i);
fieldNames[i] = sbuf;
fields[i] = getFieldCreate()->createScalarArray(pvDouble);
labels.push_back(sbuf);
}
Structure::const_shared_pointer valueStructure(
getFieldCreate()->createStructure(fieldNames, fields)
);
StringArray tableFieldNames(2);
FieldConstPtrArray tableFields(2);
tableFieldNames[0] = "labels";
tableFields[0] = getFieldCreate()->createScalarArray(pvString);
tableFieldNames[1] = "value";
tableFields[1] = valueStructure;
PVStructure::shared_pointer result(
getPVDataCreate()->createPVStructure(
getFieldCreate()->createStructure(
"uri:ev4:nt/2012/pwd:NTTable", tableFieldNames, tableFields)
)
);
static_pointer_cast<PVStringArray>(result->getScalarArrayField("labels", pvString))->put(0, labels.size(), &labels[0], 0);
return result;
}
static void generateNTTableDoubleValues(epics::pvData::PVStructure::shared_pointer result)
{
PVStringArray::shared_pointer pvLabels(static_pointer_cast<PVStringArray>(result->getScalarArrayField("labels", pvString)));
StringArrayData ld;
pvLabels->get(0, pvLabels->getLength(), ld);
PVStructure::shared_pointer resultValue = result->getStructureField("value");
#define ROWS 10
double values[ROWS];
#define FILL_VALUES(OFFSET) \
for (int r = 0; r < ROWS; r++) \
values[r] = rand()/((double)RAND_MAX+1) + OFFSET;
int offset = 0;
for (vector<String>::iterator iter = ld.data.begin();
iter != ld.data.end();
iter++, offset++)
{
FILL_VALUES(offset);
static_pointer_cast<PVDoubleArray>(resultValue->getScalarArrayField(*iter, pvDouble))->put(0, ROWS, values, 0);
}
}
class ChannelFindRequesterImpl : public ChannelFindRequester
{
virtual void channelFindResult(epics::pvData::Status const & status,
@@ -501,7 +564,7 @@ class MockChannelProcess :
return;
}
m_valueField = static_pointer_cast<PVScalar>(field);
m_valueField = dynamic_pointer_cast<PVScalar>(field);
PVFieldPtr ts = pvStructure->getSubField("timeStamp");
if (ts) m_timeStamp.attach(ts);
@@ -529,76 +592,83 @@ class MockChannelProcess :
virtual void process(bool lastRequest)
{
switch (m_valueField->getScalar()->getScalarType())
if (m_pvStructure->getStructure()->getID() == "uri:ev4:nt/2012/pwd:NTTable")
{
case pvBoolean:
generateNTTableDoubleValues(m_pvStructure);
}
else if (m_valueField.get())
{
switch (m_valueField->getScalar()->getScalarType())
{
// negate
PVBooleanPtr pvBoolean = static_pointer_cast<PVBoolean>(m_valueField);
pvBoolean->put(!pvBoolean->get());
break;
}
case pvByte:
{
// increment by one
PVBytePtr pvByte = static_pointer_cast<PVByte>(m_valueField);
pvByte->put(pvByte->get() + 1);
break;
}
case pvShort:
{
// increment by one
PVShortPtr pvShort = static_pointer_cast<PVShort>(m_valueField);
pvShort->put(pvShort->get() + 1);
break;
}
case pvInt:
{
// increment by one
PVIntPtr pvInt = static_pointer_cast<PVInt>(m_valueField);
pvInt->put(pvInt->get() + 1);
break;
}
case pvLong:
{
// increment by one
PVLongPtr pvLong = static_pointer_cast<PVLong>(m_valueField);
pvLong->put(pvLong->get() + 1);
break;
}
case pvFloat:
{
// increment by one
PVFloatPtr pvFloat = static_pointer_cast<PVFloat>(m_valueField);
pvFloat->put(pvFloat->get() + 1.0f);
break;
}
case pvDouble:
{
// increment by one
PVDoublePtr pvDouble = static_pointer_cast<PVDouble>(m_valueField);
pvDouble->put(pvDouble->get() + 1.0);
break;
}
case pvString:
{
// increment by one
PVStringPtr pvString = static_pointer_cast<PVString>(m_valueField);
String val = pvString->get();
if (val.empty())
pvString->put("gen0");
else
case pvBoolean:
{
char c = val[0];
c++;
pvString->put("gen" + c);
// negate
PVBooleanPtr pvBoolean = static_pointer_cast<PVBoolean>(m_valueField);
pvBoolean->put(!pvBoolean->get());
break;
}
break;
case pvByte:
{
// increment by one
PVBytePtr pvByte = static_pointer_cast<PVByte>(m_valueField);
pvByte->put(pvByte->get() + 1);
break;
}
case pvShort:
{
// increment by one
PVShortPtr pvShort = static_pointer_cast<PVShort>(m_valueField);
pvShort->put(pvShort->get() + 1);
break;
}
case pvInt:
{
// increment by one
PVIntPtr pvInt = static_pointer_cast<PVInt>(m_valueField);
pvInt->put(pvInt->get() + 1);
break;
}
case pvLong:
{
// increment by one
PVLongPtr pvLong = static_pointer_cast<PVLong>(m_valueField);
pvLong->put(pvLong->get() + 1);
break;
}
case pvFloat:
{
// increment by one
PVFloatPtr pvFloat = static_pointer_cast<PVFloat>(m_valueField);
pvFloat->put(pvFloat->get() + 1.0f);
break;
}
case pvDouble:
{
double noise = ((rand()/(double)RAND_MAX)-0.5)*2;
// increment by one
PVDoublePtr pvDouble = static_pointer_cast<PVDouble>(m_valueField);
pvDouble->put(pvDouble->get() + noise /*1.0*/);
break;
}
case pvString:
{
// increment by one
PVStringPtr pvString = static_pointer_cast<PVString>(m_valueField);
String val = pvString->get();
if (val.empty())
pvString->put("gen0");
else
{
char c = val[3];
c++;
pvString->put("gen" + c);
}
break;
}
default:
// noop
break;
}
default:
// noop
break;
}
if (m_timeStamp.isAttached())
@@ -944,57 +1014,9 @@ class MockChannelRPC : public ChannelRPC
}
else
{
int columnsCount = atoi(columns->get().c_str());
StringArray fieldNames(columnsCount);
FieldConstPtrArray fields(columnsCount);
char sbuf[16];
vector<String> labels;
for (int i = 0; i < columnsCount; i++)
{
sprintf(sbuf, "column%d", i);
fieldNames[i] = sbuf;
fields[i] = getFieldCreate()->createScalarArray(pvDouble);
labels.push_back(sbuf);
}
Structure::const_shared_pointer valueStructure(
getFieldCreate()->createStructure(fieldNames, fields)
);
StringArray tableFieldNames(2);
FieldConstPtrArray tableFields(2);
tableFieldNames[0] = "labels";
tableFields[0] = getFieldCreate()->createScalarArray(pvString);
tableFieldNames[1] = "value";
tableFields[1] = valueStructure;
PVStructure::shared_pointer result(
getPVDataCreate()->createPVStructure(
getFieldCreate()->createStructure(
"uri:ev4:nt/2012/pwd:NTTable", tableFieldNames, tableFields)
)
);
static_pointer_cast<PVStringArray>(result->getScalarArrayField("labels", pvString))->put(0, labels.size(), &labels[0], 0);
PVStructure::shared_pointer resultValue = result->getStructureField("value");
srand ( time(NULL) );
#define ROWS 10
double values[ROWS];
#define FILL_VALUES(OFFSET) \
for (int r = 0; r < ROWS; r++) \
values[r] = rand()/((double)RAND_MAX+1) + OFFSET;
int offset = 0;
for (vector<String>::iterator iter = labels.begin();
iter != labels.end();
iter++, offset++)
{
FILL_VALUES(offset);
static_pointer_cast<PVDoubleArray>(resultValue->getScalarArrayField(*iter, pvDouble))->put(0, ROWS, values, 0);
}
PVStructure::shared_pointer result = createNTTable(columnsCount);
generateNTTableDoubleValues(result);
m_channelRPCRequester->requestDone(Status::Ok, result);
}
}
@@ -1048,8 +1070,6 @@ class MockChannelRPC : public ChannelRPC
);
static_pointer_cast<PVStringArray>(result->getScalarArrayField("name", pvString))->put(0, labels.size(), &labels[0], 0);
srand ( time(NULL) );
int32 len = columnsCount;
vector<double> mv(len);
for (int r = 0; r < len; r++)
@@ -1107,8 +1127,6 @@ class MockChannelRPC : public ChannelRPC
int32 dimValues[] = { rowsVal, colsVal };
static_pointer_cast<PVIntArray>(result->getScalarArrayField("dim", pvInt))->put(0, 2, &dimValues[0], 0);
srand ( time(NULL) );
PVStringPtr byColumns = static_pointer_cast<PVString>(args->getSubField("bycolumns"));
bool bycolumns = (byColumns.get() && byColumns->get() == "1");
@@ -1567,13 +1585,19 @@ class MockChannel : public Channel {
printf("=============------------------------------------!!!\n");
*/
}
else if (m_name.find("testNTImage") == 0 || m_name.find("testMP") == 0
else if (m_name.find("testMP") == 0
|| m_name.find("testImage") == 0)
{
m_pvStructure = getPVDataCreate()->createPVStructure(makeImageStruc());
initImageEPICSv4GrayscaleLogo(m_pvStructure);
}
else if (m_name.find("testADC") == 0)
else if (m_name.find("testTable") == 0)
{
cout << "test Taaa ble " << endl;
m_pvStructure = createNTTable(5); // 5 columns
generateNTTableDoubleValues(m_pvStructure);
}
else if (m_name.find("testADC") == 0)
{
int i = 0;
int totalFields = 6;
@@ -1850,7 +1874,9 @@ class MockServerChannelProvider : public ChannelProvider,
m_mpChannel(),
m_scan1Hz(1.0),
m_scan1HzThread(),
m_adcAction(),
m_scan10Hz(0.1),
m_scan10HzThread(),
m_adcAction(),
m_adcThread(),
m_imgAction(0.1),
m_imgThread()
@@ -1860,7 +1886,8 @@ class MockServerChannelProvider : public ChannelProvider,
virtual ~MockServerChannelProvider()
{
m_scan1Hz.stopped.set();
m_adcAction.stopped.set();
m_scan10Hz.stopped.set();
m_adcAction.stopped.set();
m_imgAction.stopped.set();
}
@@ -1874,10 +1901,18 @@ class MockServerChannelProvider : public ChannelProvider,
m_counterChannel = MockChannel::create(chProviderPtr, cr, "testCounter", "local");
std::tr1::shared_ptr<ChannelProcessRequesterImpl> cpr(new ChannelProcessRequesterImpl());
ChannelProcess::shared_pointer process = m_counterChannel->createChannelProcess(cpr, PVStructure::shared_pointer());
//process->process(false);
m_scan1Hz.toProcess.push_back(process);
m_scan1Hz.toProcess.push_back(process);
m_scan1HzThread.reset(new Thread("process1hz", highPriority, &m_scan1Hz));
Channel::shared_pointer c = MockChannel::create(chProviderPtr, cr, "testRandom", "local");
process = c->createChannelProcess(cpr, PVStructure::shared_pointer());
m_scan10Hz.toProcess.push_back(process);
c = MockChannel::create(chProviderPtr, cr, "testTable", "local");
process = c->createChannelProcess(cpr, PVStructure::shared_pointer());
m_scan1Hz.toProcess.push_back(process);
m_scan1HzThread.reset(new Thread("process1hz", highPriority, &m_scan1Hz));
m_scan10HzThread.reset(new Thread("process10hz", highPriority, &m_scan10Hz));
m_adcChannel = MockChannel::create(chProviderPtr, cr, "testADC", "local");
m_adcAction.name = "testADC";
@@ -1967,7 +2002,10 @@ class MockServerChannelProvider : public ChannelProvider,
ProcessAction m_scan1Hz;
auto_ptr<Thread> m_scan1HzThread;
ADCAction m_adcAction;
ProcessAction m_scan10Hz;
auto_ptr<Thread> m_scan10HzThread;
ADCAction m_adcAction;
auto_ptr<Thread> m_adcThread;
NTImageAction m_imgAction;
@@ -2059,6 +2097,8 @@ int main(int argc, char *argv[])
SET_LOG_LEVEL(debug ? logLevelDebug : logLevelError);
srand ( time(NULL) );
testServer(timeToRun);
shutdownSimADCs();