From a9024cd52c42c2ee2e5e34a5ffce2e97975fd8bf Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Fri, 18 Jan 2013 15:12:58 +0100 Subject: [PATCH] eget NTNameValue support --- testApp/remote/eget.cpp | 94 +++++++++++++++++++++++++++++++++++ testApp/remote/testServer.cpp | 55 ++++++++++++++++++++ 2 files changed, 149 insertions(+) diff --git a/testApp/remote/eget.cpp b/testApp/remote/eget.cpp index e2f3793..57246ac 100644 --- a/testApp/remote/eget.cpp +++ b/testApp/remote/eget.cpp @@ -399,6 +399,98 @@ void formatNTMatrix(std::ostream& o, PVStructurePtr const & pvStruct) } } + +void formatNTNameValue(std::ostream& o, PVStructurePtr const & pvStruct) +{ + PVStringArrayPtr name = dynamic_pointer_cast(pvStruct->getScalarArrayField("name", pvString)); + if (name.get() == 0) + { + std::cerr << "no string[] 'name' field in NTNameValue" << std::endl; + return; + } + + PVFieldPtr value = pvStruct->getSubField("value"); + if (value.get() == 0) + { + std::cerr << "no 'value' field in NTNameValue" << std::endl; + return; + } + + PVScalarArrayPtr array = dynamic_pointer_cast(value); + if (array.get() == 0) + { + std::cerr << "malformed NTNameValue, 'value' field is not scalar_t[]" << std::endl; + return; + } + + if (name->getLength() != array->getLength()) + { + std::cerr << "malformed NTNameValue, length of 'name' and 'value' array does not equal" << std::endl; + return; + } + + size_t numColumns = name->getLength(); + + // get names + StringArrayData nameData; + name->get(0, name->getLength(), nameData); + + // get max column size + size_t maxColumnLength = getLongestString(nameData.data); + + size_t valueLen = getLongestString(array); + if (valueLen > maxColumnLength) maxColumnLength = valueLen; + + // add some space + size_t padding = 2; + maxColumnLength += padding; + + bool transpose = (mode == TerseMode); + if (transpose) + { + + // + // , , ... + // value values ... + // + + // first print names + for (size_t i = 0; i < numColumns; i++) + { + o << std::setw(maxColumnLength) << std::right << nameData.data[i]; + } + o << std::endl; + + // then values + for (size_t i = 0; i < numColumns; i++) + { + o << std::setw(maxColumnLength) << std::right; + array->dumpValue(o, i); + } + o << std::endl; + } + else + { + + // + // values... + // values... + // ... + // + + for (size_t i = 0; i < numColumns; i++) + { + o << std::setw(maxColumnLength) << std::left << nameData.data[i]; + o << std::setw(maxColumnLength) << std::right; + array->dumpValue(o, i); + o << std::endl; + } + + } + +} + + typedef void(*NTFormatterFunc)(std::ostream& o, PVStructurePtr const & pvStruct); typedef map NTFormatterLUTMap; NTFormatterLUTMap ntFormatterLUT; @@ -410,6 +502,7 @@ void initializeNTFormatterLUT() ntFormatterLUT["uri:ev4:nt/2012/pwd:NTTable"] = formatNTTable; ntFormatterLUT["uri:ev4:nt/2012/pwd:NTMatrix"] = formatNTMatrix; ntFormatterLUT["uri:ev4:nt/2012/pwd:NTAny"] = formatNTAny; + ntFormatterLUT["uri:ev4:nt/2012/pwd:NTNameValue"] = formatNTNameValue; // // TODO remove: smooth transition @@ -420,6 +513,7 @@ void initializeNTFormatterLUT() ntFormatterLUT["NTTable"] = formatNTTable; ntFormatterLUT["NTMatrix"] = formatNTMatrix; ntFormatterLUT["NTAny"] = formatNTAny; + ntFormatterLUT["NTNameValue"] = formatNTNameValue; // StandardPV "support" ntFormatterLUT["scalar_t"] = formatNTScalar; diff --git a/testApp/remote/testServer.cpp b/testApp/remote/testServer.cpp index ca0f9df..1065087 100644 --- a/testApp/remote/testServer.cpp +++ b/testApp/remote/testServer.cpp @@ -921,6 +921,61 @@ class MockChannelRPC : public ChannelRPC } m_channelRPCRequester->requestDone(Status::Ok, result); } + } + else if (m_channelName == "testNTNameValue") + { + PVStructure::shared_pointer args( + (pvArgument->getStructure()->getID() == "uri:ev4:nt/2012/pwd:NTURI") ? + pvArgument->getStructureField("query") : + pvArgument + ); + + // TODO type check, getStringField is verbose + PVStringPtr columns = static_pointer_cast(args->getSubField("columns")); + if (columns.get() == 0) + { + PVStructure::shared_pointer nullPtr; + Status errorStatus(Status::STATUSTYPE_ERROR, "no columns specified"); + m_channelRPCRequester->requestDone(errorStatus, nullPtr); + } + else + { + + int columnsCount = atoi(columns->get().c_str()); + + char sbuf[16]; + vector labels; + for (int i = 0; i < columnsCount; i++) + { + sprintf(sbuf, "name%d", i); + labels.push_back(sbuf); + } + + StringArray tableFieldNames(2); + FieldConstPtrArray tableFields(2); + tableFieldNames[0] = "name"; + tableFields[0] = getFieldCreate()->createScalarArray(pvString); + tableFieldNames[1] = "value"; + tableFields[1] = getFieldCreate()->createScalarArray(pvDouble); + + PVStructure::shared_pointer result( + getPVDataCreate()->createPVStructure( + getFieldCreate()->createStructure( + "uri:ev4:nt/2012/pwd:NTNameValue", tableFieldNames, tableFields) + ) + ); + 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++) + mv[r] = rand()/((double)RAND_MAX+1) + (int)(r); + static_pointer_cast(result->getScalarArrayField("value", pvDouble))->put(0, len, &mv[0], 0); + + m_channelRPCRequester->requestDone(Status::Ok, result); + } } else if (m_channelName == "testNTMatrix") {