From 2233439fad2904f0df6e6aadfc68f0a949e65c3d Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Fri, 22 Mar 2013 22:43:45 +0100 Subject: [PATCH] testServer: testRandom, testTable added --- testApp/remote/pvinfo.cpp | 2 +- testApp/remote/testServer.cpp | 296 +++++++++++++++++++--------------- 2 files changed, 169 insertions(+), 129 deletions(-) diff --git a/testApp/remote/pvinfo.cpp b/testApp/remote/pvinfo.cpp index de0f3eb..b9fa995 100644 --- a/testApp/remote/pvinfo.cpp +++ b/testApp/remote/pvinfo.cpp @@ -151,7 +151,7 @@ int main (int argc, char *argv[]) channel->printInfo(); String s; structure->toString(&s); - std::cout << s << std::endl; + std::cout << s << std::endl << std::endl; } else { diff --git a/testApp/remote/testServer.cpp b/testApp/remote/testServer.cpp index a09c964..248dfaa 100644 --- a/testApp/remote/testServer.cpp +++ b/testApp/remote/testServer.cpp @@ -236,6 +236,69 @@ public: }; + +static epics::pvData::PVStructure::shared_pointer createNTTable(int columnsCount) +{ + StringArray fieldNames(columnsCount); + FieldConstPtrArray fields(columnsCount); + char sbuf[16]; + vector 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(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(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::iterator iter = ld.data.begin(); + iter != ld.data.end(); + iter++, offset++) + { + FILL_VALUES(offset); + static_pointer_cast(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(field); + m_valueField = dynamic_pointer_cast(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(m_valueField); - pvBoolean->put(!pvBoolean->get()); - break; - } - case pvByte: - { - // increment by one - PVBytePtr pvByte = static_pointer_cast(m_valueField); - pvByte->put(pvByte->get() + 1); - break; - } - case pvShort: - { - // increment by one - PVShortPtr pvShort = static_pointer_cast(m_valueField); - pvShort->put(pvShort->get() + 1); - break; - } - case pvInt: - { - // increment by one - PVIntPtr pvInt = static_pointer_cast(m_valueField); - pvInt->put(pvInt->get() + 1); - break; - } - case pvLong: - { - // increment by one - PVLongPtr pvLong = static_pointer_cast(m_valueField); - pvLong->put(pvLong->get() + 1); - break; - } - case pvFloat: - { - // increment by one - PVFloatPtr pvFloat = static_pointer_cast(m_valueField); - pvFloat->put(pvFloat->get() + 1.0f); - break; - } - case pvDouble: - { - // increment by one - PVDoublePtr pvDouble = static_pointer_cast(m_valueField); - pvDouble->put(pvDouble->get() + 1.0); - break; - } - case pvString: - { - // increment by one - PVStringPtr pvString = static_pointer_cast(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(m_valueField); + pvBoolean->put(!pvBoolean->get()); + break; } - break; + case pvByte: + { + // increment by one + PVBytePtr pvByte = static_pointer_cast(m_valueField); + pvByte->put(pvByte->get() + 1); + break; + } + case pvShort: + { + // increment by one + PVShortPtr pvShort = static_pointer_cast(m_valueField); + pvShort->put(pvShort->get() + 1); + break; + } + case pvInt: + { + // increment by one + PVIntPtr pvInt = static_pointer_cast(m_valueField); + pvInt->put(pvInt->get() + 1); + break; + } + case pvLong: + { + // increment by one + PVLongPtr pvLong = static_pointer_cast(m_valueField); + pvLong->put(pvLong->get() + 1); + break; + } + case pvFloat: + { + // increment by one + PVFloatPtr pvFloat = static_pointer_cast(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(m_valueField); + pvDouble->put(pvDouble->get() + noise /*1.0*/); + break; + } + case pvString: + { + // increment by one + PVStringPtr pvString = static_pointer_cast(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 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(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::iterator iter = labels.begin(); - iter != labels.end(); - iter++, offset++) - { - FILL_VALUES(offset); - static_pointer_cast(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(result->getScalarArrayField("name", pvString))->put(0, labels.size(), &labels[0], 0); - srand ( time(NULL) ); - int32 len = columnsCount; vector mv(len); for (int r = 0; r < len; r++) @@ -1107,8 +1127,6 @@ class MockChannelRPC : public ChannelRPC int32 dimValues[] = { rowsVal, colsVal }; static_pointer_cast(result->getScalarArrayField("dim", pvInt))->put(0, 2, &dimValues[0], 0); - srand ( time(NULL) ); - PVStringPtr byColumns = static_pointer_cast(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 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 m_scan1HzThread; - ADCAction m_adcAction; + ProcessAction m_scan10Hz; + auto_ptr m_scan10HzThread; + + ADCAction m_adcAction; auto_ptr 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();