diff --git a/testApp/remote/eget.cpp b/testApp/remote/eget.cpp index 8379d41..dad52ee 100644 --- a/testApp/remote/eget.cpp +++ b/testApp/remote/eget.cpp @@ -26,6 +26,9 @@ using namespace std::tr1; using namespace epics::pvData; using namespace epics::pvAccess; +enum PrintMode { ValueOnlyMode, StructureMode, TerseMode }; +PrintMode mode = ValueOnlyMode; + void formatNTAny(std::ostream& o, PVStructurePtr const & pvStruct) { @@ -54,9 +57,15 @@ void formatNTScalar(std::ostream& o, PVStructurePtr const & pvStruct) std::ostream& formatScalarArray(std::ostream& o, PVScalarArrayPtr const & pvScalarArray) { size_t len = pvScalarArray->getLength(); - o << len << std::endl; - for (size_t i = 0; i < len; i++) - (pvScalarArray.get())->dumpValue(o, i) << std::endl; + if (len == 0) + { + o << "(empty)" << std::endl; + } + else + { + for (size_t i = 0; i < len; i++) + (pvScalarArray.get())->dumpValue(o, i) << std::endl; + } return o; } @@ -142,32 +151,65 @@ void formatNTTable(std::ostream& o, PVStructurePtr const & pvStruct) size_t padding = 2; maxColumnLength += padding; - // first print labels - StringArrayData data; - labels->get(0, numColumns, data); - for (size_t i = 0; i < numColumns; i++) + // get labels + StringArrayData labelsData; + labels->get(0, numColumns, labelsData); + + // TerseMode as Transpose + if (mode != TerseMode) { - o << std::setw(maxColumnLength) << std::right << data.data[i]; - } - o << std::endl; - // then values - for (size_t r = 0; r < maxValues; r++) + // + // , , ... + // values values ... + // + + // first print labels + for (size_t i = 0; i < numColumns; i++) + { + o << std::setw(maxColumnLength) << std::right << labelsData.data[i]; + } + o << std::endl; + + // then values + for (size_t r = 0; r < maxValues; r++) + { + for (size_t i = 0; i < numColumns; i++) + { + o << std::setw(maxColumnLength) << std::right; + if (r < columnData[i]->getLength()) + columnData[i]->dumpValue(o, r); + else + o << ""; + } + o << std::endl; + } + + } + else { - for (size_t i = 0; i < numColumns; i++) - { - o << std::setw(maxColumnLength) << std::right; - if (r < columnData[i]->getLength()) - columnData[i]->dumpValue(o, r); - else - o << ""; - } - o << std::endl; + + // + // values... + // values... + // ... + // + + for (size_t i = 0; i < numColumns; i++) + { + o << std::setw(maxColumnLength) << std::left << labelsData.data[i]; + for (size_t r = 0; r < maxValues; r++) + { + o << std::setw(maxColumnLength) << std::right; + if (r < columnData[i]->getLength()) + columnData[i]->dumpValue(o, r); + else + o << ""; + } + o << std::endl; + } + } - - // reset back - o << std::left; - } @@ -223,15 +265,43 @@ void formatNTMatrix(std::ostream& o, PVStructurePtr const & pvStruct) size_t padding = 2; size_t maxColumnLength = getLongestString(value) + padding; - size_t ix = 0; - for (int32 r = 0; r < rows; r++) + // TerseMode as Transpose + if (mode != TerseMode) { - for (int32 c = 0; c < cols; c++) - { - o << std::setw(maxColumnLength) << std::right; - value->dumpValue(o, ix++); - } - o << std::endl; + + // + // el1 el2 el3 + // el4 el5 el6 + // + + size_t ix = 0; + for (int32 r = 0; r < rows; r++) + { + for (int32 c = 0; c < cols; c++) + { + o << std::setw(maxColumnLength) << std::right; + value->dumpValue(o, ix++); + } + o << std::endl; + } + + } + else + { + // + // el1 el4 + // el2 el5 + // el3 el6 + // + for (int32 c = 0; c < cols; c++) + { + for (int32 r = 0; r < rows; r++) + { + o << std::setw(maxColumnLength) << std::right; + value->dumpValue(o, r * rows + c); + } + o << std::endl; + } } } @@ -310,9 +380,6 @@ void formatNT(std::ostream& o, PVFieldPtr const & pv) double timeOut = DEFAULT_TIMEOUT; string request(DEFAULT_REQUEST); -enum PrintMode { ValueOnlyMode, StructureMode, TerseMode }; -PrintMode mode = ValueOnlyMode; - char fieldSeparator = ' '; void usage (void) @@ -728,6 +795,7 @@ int main (int argc, char *argv[]) std::cout << std::boolalpha; terseSeparator(fieldSeparator); + terseArrayCount(false); bool allOK = true; diff --git a/testApp/remote/pvutils.cpp b/testApp/remote/pvutils.cpp index c2d7792..a69edc6 100644 --- a/testApp/remote/pvutils.cpp +++ b/testApp/remote/pvutils.cpp @@ -35,6 +35,13 @@ void terseSeparator(char c) separator = c; } +char arrayCountFlag = true; +void terseArrayCount(bool flag) +{ + arrayCountFlag = flag; +} + + std::ostream& terse(std::ostream& o, PVField::shared_pointer const & pv) { Type type = pv->getField()->getType(); @@ -76,12 +83,15 @@ std::ostream& terseStructure(std::ostream& o, PVStructure::shared_pointer const std::ostream& terseScalarArray(std::ostream& o, PVScalarArray::shared_pointer const & pvArray) { size_t length = pvArray->getLength(); - if (length<=0) + if (arrayCountFlag) { - o << '0'; - return o; + if (length<=0) + { + o << '0'; + return o; + } + o << length << separator; } - o << length << separator; bool first = true; for (size_t i = 0; i < length; i++) { @@ -104,12 +114,15 @@ std::ostream& terseScalarArray(std::ostream& o, PVScalarArray::shared_pointer co std::ostream& terseStructureArray(std::ostream& o, PVStructureArray::shared_pointer const & pvArray) { size_t length = pvArray->getLength(); - if (length<=0) + if (arrayCountFlag) { - o << '0'; - return o; + if (length<=0) + { + o << '0'; + return o; + } + o << length << separator; } - o << length << separator; StructureArrayData data = StructureArrayData(); pvArray->get(0, length, data); diff --git a/testApp/remote/pvutils.h b/testApp/remote/pvutils.h index 21ba4cf..187041c 100644 --- a/testApp/remote/pvutils.h +++ b/testApp/remote/pvutils.h @@ -8,6 +8,7 @@ void convertArray(epics::pvData::StringBuilder buffer, epics::pvData::PVScalarAr void convertStructureArray(epics::pvData::StringBuilder buffer, epics::pvData::PVStructureArray * pvdata, int notFirst); void terseSeparator(char c); +void terseArrayCount(bool flag); std::ostream& terse(std::ostream& o, epics::pvData::PVField::shared_pointer const & pv); std::ostream& terseStructure(std::ostream& o, epics::pvData::PVStructure::shared_pointer const & pvStructure); std::ostream& terseScalarArray(std::ostream& o, epics::pvData::PVScalarArray::shared_pointer const & pvArray); diff --git a/testApp/remote/testServer.cpp b/testApp/remote/testServer.cpp index 5b10d31..2e8edfe 100644 --- a/testApp/remote/testServer.cpp +++ b/testApp/remote/testServer.cpp @@ -463,15 +463,17 @@ class MockChannelRPC : public ChannelRPC #define ROWS 10 double values[ROWS]; - #define FILL_VALUES \ + #define FILL_VALUES(OFFSET) \ for (int r = 0; r < ROWS; r++) \ - values[r] = (rand()-RAND_MAX/2)/(double)(RAND_MAX/2); + values[r] = rand()/((double)RAND_MAX+1) + OFFSET; +// values[r] = (rand()-RAND_MAX/2)/(double)(RAND_MAX/2); // -1 ... 1 + int offset = 0; for (vector::iterator iter = labels.begin(); iter != labels.end(); - iter++) + iter++, offset++) { - FILL_VALUES; + FILL_VALUES(offset); static_pointer_cast(resultValue->getScalarArrayField(*iter, pvDouble))->put(0, ROWS, values, 0); } m_channelRPCRequester->requestDone(Status::Ok, result); @@ -521,7 +523,8 @@ class MockChannelRPC : public ChannelRPC int32 len = rowsVal * colsVal; vector mv(len); for (int r = 0; r < len; r++) - mv[r] = (rand()-RAND_MAX/2)/(double)(RAND_MAX/2); +// mv[r] = (rand()-RAND_MAX/2)/(double)(RAND_MAX/2); // -1 .. 1 + mv[r] = rand()/((double)RAND_MAX+1) + r/rowsVal; static_pointer_cast(result->getScalarArrayField("value", pvDouble))->put(0, len, &mv[0], 0); m_channelRPCRequester->requestDone(Status::Ok, result);