Closed wanglin86769 closed 1 year ago
Thank you for reporting this.
I also think it is a bug that the element types of dimension
and attribute
are not printed.
I think this issue should be addressed by 2a83e49ae7e9669a51224c76ab57be80e8050706.
$ ./bin/linux-x86_64/pvxinfo my:pv:name
my:pv:name from [fe80::7816:e3ff:fe25:5208]%5:5075
struct "epics:nt/NTNDArray:1.0" {
union {
bool[] booleanValue
int8_t[] byteValue
int16_t[] shortValue
int32_t[] intValue
int64_t[] longValue
uint8_t[] ubyteValue
uint16_t[] ushortValue
uint32_t[] uintValue
uint64_t[] ulongValue
float floatValue
double doubleValue
} value
struct "codec_t" {
string name
any parameters
} codec
int64_t compressedSize
int64_t uncompressedSize
int32_t uniqueId
struct "time_t" {
int64_t secondsPastEpoch
int32_t nanoseconds
int32_t userTag
} dataTimeStamp
struct "alarm_t" {
int32_t severity
int32_t status
string message
} alarm
struct "time_t" {
int64_t secondsPastEpoch
int32_t nanoseconds
int32_t userTag
} timeStamp
struct[] {
int32_t size
int32_t offset
int32_t fullSize
int32_t binning
bool reverse
} dimension
struct[] {
string name
any value
string[] tags
string descriptor
struct "alarm_t" {
int32_t severity
int32_t status
string message
} alarm
struct "time_t" {
int64_t secondsPastEpoch
int32_t nanoseconds
int32_t userTag
} timeStamp
int32_t sourceType
string source
} attribute
}
When shown with values, all null/zero in this case.
$ ./bin/linux-x86_64/pvxget -F tree my:pv:name
my:pv:name
struct "epics:nt/NTNDArray:1.0" {
union value null
struct "codec_t" {
string name = ""
any parameters null
} codec
int64_t compressedSize = 0
int64_t uncompressedSize = 0
int32_t uniqueId = 0
struct "time_t" {
int64_t secondsPastEpoch = 0
int32_t nanoseconds = 0
int32_t userTag = 0
} dataTimeStamp
struct "alarm_t" {
int32_t severity = 0
int32_t status = 0
string message = ""
} alarm
struct "time_t" {
int64_t secondsPastEpoch = 0
int32_t nanoseconds = 0
int32_t userTag = 0
} timeStamp
struct[] dimension = {0}[]
struct[] attribute = {0}[]
}
After building the latest master branch of PVXS on Debian 10, pvxinfo and pvxget printed the expected result for the empty NTNDArray data. Thank you for fixing this.
fyi. I had a look at https://github.com/wanglin86769/node-epics-pva/blob/master/wrapper/wrapper.cpp I would be interested in seeing a JSON output format (eg. Value::Fmt::JSON
) added alongside the tree and delta formats.
Thanks for your interest in JSON format. If there is something that I can contribute, I will be glad to do it.
I think the key point is to output pvxs::Value in valid JSON format, since JSON syntax is strict. For example, some problems I encountered were,
- If some possible pvAccess data types are not taken into account, unexpected output with invalid JSON format may be generated.
A "reversible" mapping would be best. That is, one which could be parsed to recover the original with no loss of information. I understand that this would likely be difficult as among other aspects, JSON has no direct analog to the PVD structure ID names (eg. enum_t
). Nor the struct
vs union
distinction. Some of this project would need to be establishing a convention. eg. special otherwise invalid field name like "+id":"enum_t"
Or "+type":"struct"
.
3. The numbers NaN and Infinity are not support in JSON, they are considered null.
If not initially, at some point an option for JSON5 format would be helpful. fyi. epics-base has included a JSON5 aware parser since 7.0.5, which I would like in future to start using with PVXS.
Describe the bug The pvxinfo CLI tool also shows the null value for StoreType::Compound data types like any or union.
To Reproduce Steps to reproduce the behavior:
Start a PVXS server and provide NTNDArray data as follows,
Use pvxinfo to print info for "my:pv:name",
Expected behavior pvxinfo prints info without value.
Information (please complete the following):
From the source code, it looks like null values are always printed no matter what fmt._showValue is, https://github.com/mdavidsaver/pvxs/blob/master/src/datafmt.cpp