libdas2
das2 core C utilities
|
#include <das2/packet.h>
Holds information for a single packet type in a Das2 stream.
A Das2 Stream may consist of up to 99 different types of packets. In the following Das2 Stream snippet two different types of packets are defined:
Each <packet> element above is a serialized PacketDescriptor. This structure and it's associated functions are responsible for:
To help them do their jobs, PacketDescriptors hold and array of PlaneDescriptors, as well a byte field containing up to one data packet's worth of bytes.
Packet Descriptors are part of a Das2 Stream. To define a new packet type call:
or a similar function. This particular version creates a PacketDescriptor that only has an <x> plane. Using the following to add <y> and/or <yscan> planes to the packet.
Optionally additions properties such as labels may be added to each <y> or <yscan> plane using:
and related functions.
When reading Das2 Streams PacketDescriptors are created automatically as the input is read by the processStream() method of the StreamHandler.
The PacketDiscriptor has a 1-Packet wide buffer. This buffer is used to build up the output data for a single packet. To set the value for the various planes use:
and related functions. Once that job is complete, transmit the data packet using:
The details of encoding the data according the format stored in the packet descriptor are handled by the library.
Public Member Functions | |
PktDesc * | new_PktDesc (void) |
Creates a packet descriptor with the default settings. More... | |
PktDesc * | new_PktDesc_xml (DasBuf *pBuf, DasDesc *pParent, int nPktId) |
Create a PktDesc from XML data. More... | |
int | PktDesc_getId (const PktDesc *pThis) |
Get the packet ID for this packet. More... | |
const char * | PktDesc_getGroup (const PktDesc *pThis) |
Get the data group for this packet. More... | |
void | PktDesc_setGroup (PktDesc *pThis, const char *sGroup) |
Set the data group for this packet. More... | |
size_t | PktDesc_recBytes (const PktDesc *pThis) |
Get the size of data records defined by a packet descriptor. More... | |
size_t | PktDesc_getNPlanes (const PktDesc *pThis) |
Get the number of planes in this type of packet. More... | |
size_t | PktDesc_getNPlanesOfType (const PktDesc *pThis, plane_type_t pt) |
Get the number of planes of a particular type in a packet. More... | |
int | PktDesc_addPlane (PktDesc *pThis, PlaneDesc *pPlane) |
Add a plane to a packet. More... | |
DasErrCode | PktDesc_copyPlanes (PktDesc *pThis, const PktDesc *pOther) |
Copy in all planes from another a packet descriptor. More... | |
bool | PktDesc_validate (PktDesc *pThis) |
Check to see if a legal plane layout is present. More... | |
plane_type_t | PktDesc_getPlaneType (const PktDesc *pThis, int iPlane) |
Determine the type of plane by index. More... | |
PlaneDesc * | PktDesc_getPlane (PktDesc *pThis, int iplane) |
returns the PlaneDescriptor for plane number iplane This can be used to query properties of the plane, such as units and the name. More... | |
int | PktDesc_getPlaneIdxByType (const PktDesc *pThis, plane_type_t ptype, int iRelIndex) |
Gets the Nth plane of a given type. More... | |
int | PktDesc_getPlaneIdxByName (PktDesc *pThis, const char *name, plane_type_t planeType) |
returns the plane number for the named plane. More... | |
PlaneDesc * | PktDesc_getXPlane (PktDesc *pThis) |
returns the PlaneDescriptor for the 1st X Tag plane. | |
DasErrCode | PktDesc_encode (const PktDesc *pThis, DasBuf *pBuf) |
Serialize a packet descriptor as XML data. More... | |
DasErrCode | PktDesc_encodeData (const PktDesc *pThis, DasBuf *pBuf) |
Serialize a packet's current data In addition to holding the format information for Das2 Stream packets PktDesc objects also hold a a single packet's worth of data. More... | |
DasErrCode | PktDesc_decodeData (PktDesc *pThis, DasBuf *pBuf) |
Decode 1 packet's worth of data from a buffer. More... | |
DasErrCode | PktDesc_setValue (PktDesc *pThis, size_t uPlane, size_t uItem, double val) |
Convenience function for setting a single value in a plane This is just a shortcut for: More... | |
DasErrCode | PktDesc_setValues (PktDesc *pThis, size_t uPlane, const double *pVals) |
Convenience function for setting an array of values in a plane This is just a shortcut for: More... | |
Data Fields | |
void * | pUser |
User data pointer. More... | |
Descriptor Functions | |
These work for any type of Descriptor, including PlaneDesc , PktDesc, StreamDesc, DasDs and DasVar. To make your compiler happy you will need to cast Plane, Packet and Stream Descriptor pointers to just the generic type of Descriptor pointer when using these functions. For example: | |
bool | DasDesc_equals (const DasDesc *pOne, const DasDesc *pTwo) |
Check to see if two descriptors contain the same properties Note, the order of the properties may be different between the descriptors but if the contents are the same then the descriptors are considered to be equal. More... | |
const DasDesc * | DasDesc_parent (DasDesc *pThis) |
The the parent of a Descriptor. More... | |
size_t | DasDesc_length (const DasDesc *pThis) |
Get the number of properties in a descriptor. More... | |
const char * | DasDesc_getNameByIdx (const DasDesc *pThis, size_t uIdx) |
Get a property name by an index. More... | |
const char * | DasDesc_getValByIdx (const DasDesc *pThis, size_t uIdx) |
Get a property value by an index. More... | |
const char * | DasDesc_getTypeByIdx (const DasDesc *pThis, size_t uIdx) |
Get a data type of a property by an index. | |
bool | DasDesc_has (const DasDesc *pThis, const char *propertyName) |
Determine if a property is present in a Descriptor or it's ancestors. More... | |
DasErrCode | DasDesc_set (DasDesc *pThis, const char *sType, const char *sName, const char *sVal) |
Generic property setter. More... | |
bool | DasDesc_remove (DasDesc *pThis, const char *propretyName) |
Remove a property from a descriptor, if preset. More... | |
const char * | DasDesc_getStr (const DasDesc *pThis, const char *propertyName) |
read the property of type String named propertyName. | |
DasErrCode | DasDesc_setStr (DasDesc *pThis, const char *sName, const char *sVal) |
SetProperty methods add properties to any Descriptor (stream,packet,plane). More... | |
DasErrCode | DasDesc_vSetStr (DasDesc *pThis, const char *sName, const char *sFmt,...) |
Set a string property in the manner of sprintf. | |
double | DasDesc_getDouble (const DasDesc *pThis, const char *propertyName) |
Read the property of type double named propertyName. More... | |
DasErrCode | DasDesc_setDouble (DasDesc *pThis, const char *propertyName, double value) |
Set property of type double. | |
double | DasDesc_getDatum (DasDesc *pThis, const char *sPropName, das_units units) |
Get the a numeric property in the specified units. More... | |
DasErrCode | DasDesc_setDatum (DasDesc *pThis, const char *sName, double rVal, das_units units) |
Set property of type Datum (double, UnitType pair) More... | |
double * | DasDesc_getDoubleAry (DasDesc *pThis, const char *propertyName, int *nitems) |
Get the values of an array property. More... | |
DasErrCode | DasDesc_setDoubleArray (DasDesc *pThis, const char *propertyName, int nitems, double *value) |
Set the property of type double array. | |
int | DasDesc_getInt (const DasDesc *pThis, const char *propertyName) |
Get a property integer value. More... | |
DasErrCode | DasDesc_setInt (DasDesc *pThis, const char *sName, int nVal) |
Set the property of type int. | |
bool | DasDesc_getBool (DasDesc *pThis, const char *sPropName) |
Get a property boolean value. More... | |
DasErrCode | DasDesc_setDatumRng (DasDesc *pThis, const char *sName, double beg, double end, das_units units) |
Set property of type DatumRange (double, double, UnitType triple) | |
DasErrCode | DasDesc_getStrRng (DasDesc *pThis, const char *sName, char *sMin, char *sMax, das_units *pUnits, size_t uLen) |
Get a property of type DatumRange with unconverted strings. More... | |
DasErrCode | DasDesc_setFloatAry (DasDesc *pThis, const char *propertyName, int nitems, float *value) |
Set the property of type float array. More... | |
void | DasDesc_copyIn (DasDesc *pThis, const DasDesc *source) |
Deepcopy properties into a descriptor. More... | |
DasErrCode | DasDesc_encode (DasDesc *pThis, DasBuf *pBuf, const char *sIndent) |
Encode a generic set of properties to a buffer. More... | |
PktDesc * new_PktDesc | ( | void | ) |
Creates a packet descriptor with the default settings.
Create a PktDesc from XML data.
pBuf | The buffer to read. Reading will start with the read point and will run until DasBuf_remaining() is 0 or the end tag is found, which ever comes first. |
pParent | The parent packet descriptor, this may be NULL |
nPktId | The packet's ID within it's parent's array. May be 0 if and only if the pParent is NULL |
int PktDesc_getId | ( | const PktDesc * | pThis | ) |
Get the packet ID for this packet.
Each packet type within a Das 2 Stream has a unique ID form 1 to 99 inclusive. Note that ID's can be reused! So processing code must be on the lookout for re-definition packets.
const char * PktDesc_getGroup | ( | const PktDesc * | pThis | ) |
Get the data group for this packet.
Packets with the same group should be able to be plotted on the same graph. This is the same as a join in QDataset terms
pThis | A pointer to a packet desciptor structure |
void PktDesc_setGroup | ( | PktDesc * | pThis, |
const char * | sGroup | ||
) |
Set the data group for this packet.
pThis | A pointer to a packet descriptor structure |
sGroup | The new group name which must be a valid id. |
size_t PktDesc_recBytes | ( | const PktDesc * | pThis | ) |
Get the size of data records defined by a packet descriptor.
pThis | The packet descriptor to query |
size_t PktDesc_getNPlanes | ( | const PktDesc * | pThis | ) |
Get the number of planes in this type of packet.
pThis | the packet descriptor in question |
size_t PktDesc_getNPlanesOfType | ( | const PktDesc * | pThis, |
plane_type_t | pt | ||
) |
Get the number of planes of a particular type in a packet.
pThis | The packet descriptor to check |
pt | the plane type to check |
Add a plane to a packet.
All data in a das2 stream are sent via packets, each packet type has 1-100 planes. A plane can be a single column of numbers, which has one value per data packet, or in the case of <yscan> planes they can be more like sub-tables which have many values per packet. The newly added plane will have this PktDesc assigned as it's parent.
Planes have types. A Packet must have at least 1 <x> plane. In general it may have as many <y> <yscan> planes as it likes up to the plane limit. For packets with <z> planes, no <yscan> planes are allowed and one and only one <y> plane must be preset. This function enforces the packet formation rules. In summary the following patterns are legal.
where [] indicates optional planes. Note: Y and YScan planes can be interleaved in any order.
This function adds the plane after all existing planes. Thus the index of any existing planes is not altered.
pThis | The packet descriptor to receive the new plane definition |
pPlane | The plane to add |
DasErrCode PktDesc_copyPlanes | ( | PktDesc * | pThis, |
const PktDesc * | pOther | ||
) |
Copy in all planes from another a packet descriptor.
Deepcopy's the plane descriptors in pOther and attaches the newly allocated planes to this PktDesc object. This packet descriptor must not already have any planes defined or this function will fail.
pThis | the destination for the newly allocated PlaneDescriptors |
pOther | the source of the PlaneDescriptors |
bool PktDesc_validate | ( | PktDesc * | pThis | ) |
Check to see if a legal plane layout is present.
Since not all checks for a legal packet layout can be made while the sub-objects are being added to the packet descriptor, this function is provided to check the layout after adding all planes to a packet.
pThis | The packet descriptor to check |
plane_type_t PktDesc_getPlaneType | ( | const PktDesc * | pThis, |
int | iPlane | ||
) |
Determine the type of plane by index.
pThis | the packet descriptor to query |
iPlane | the index in question. Valid values for this parameter are 0 to MAXPLANES - 1 |
returns the PlaneDescriptor for plane number iplane This can be used to query properties of the plane, such as units and the name.
pThis | The packet descriptor to query |
iplane | The index of the plane to retrieve. The 0th plane is an <x> plane if one is present in the stream. |
int PktDesc_getPlaneIdxByType | ( | const PktDesc * | pThis, |
plane_type_t | ptype, | ||
int | iRelIndex | ||
) |
Gets the Nth plane of a given type.
This is useful for iterating over all planes of a given type.
pThis | A packet descriptor structure pointer. |
ptype | The plane type, one X, Y, Z, YScan |
iRelIndex | The number of the plane of a given type to find. The lowest index will be 0 for a given type. |
int PktDesc_getPlaneIdxByName | ( | PktDesc * | pThis, |
const char * | name, | ||
plane_type_t | planeType | ||
) |
returns the plane number for the named plane.
pThis | The packet descriptor to query. |
name | The name in of the plane to find |
planeType | if not set to 0, then PlaneType must also match. Note that typically the 0th plane is typically the <x> plane. |
DasErrCode PktDesc_encode | ( | const PktDesc * | pThis, |
DasBuf * | pBuf | ||
) |
Serialize a packet descriptor as XML data.
pThis | The packet descriptor to store as string data |
pBuf | A buffer object to received the string data |
DasErrCode PktDesc_encodeData | ( | const PktDesc * | pThis, |
DasBuf * | pBuf | ||
) |
Serialize a packet's current data In addition to holding the format information for Das2 Stream packets PktDesc objects also hold a a single packet's worth of data.
Use this function to encode the current data values for output.
pThis | The packet descriptor that has been loaded with data |
pBuf | A buffer to receive the encoded bytes |
DasErrCode PktDesc_decodeData | ( | PktDesc * | pThis, |
DasBuf * | pBuf | ||
) |
Decode 1 packet's worth of data from a buffer.
pThis | the packet descriptor to handle decoding |
pBuf | The buffer with the data, data will be read from the current read point. |
DasErrCode PktDesc_setValue | ( | PktDesc * | pThis, |
size_t | uPlane, | ||
size_t | uItem, | ||
double | val | ||
) |
Convenience function for setting a single value in a plane This is just a shortcut for:
pThis | The packet descriptor in question. |
uPlane | The index of the plane to receive the values |
uItem | The index of the item in the plane to be set to the new value |
val | The new value for this item in this plane. |
DasErrCode PktDesc_setValues | ( | PktDesc * | pThis, |
size_t | uPlane, | ||
const double * | pVals | ||
) |
Convenience function for setting an array of values in a plane This is just a shortcut for:
pThis | The packet descriptor in question. |
uPlane | The index of the plane to receive the values |
pVals | The array of values to set. The array is assumed to be the same length as the number of items in plane uPlane |
Check to see if two descriptors contain the same properties Note, the order of the properties may be different between the descriptors but if the contents are the same then the descriptors are considered to be equal.
Note that parent descriptor properties are not checked when handling the comparison.
pOne | The first descriptor |
pTwo | The second descriptor |
The the parent of a Descriptor.
Plane descriptors are owned by packet descriptors and packet descriptors are owned by stream descriptors. This function lets you craw the ownership hierarchy
pThis |
|
inherited |
Get the number of properties in a descriptor.
Descriptor's have a hierarchy. In general when a property is requested, if a given Descriptor does not have a property the request is passed to the parent descriptor. This function only returns the number of properties in the given descriptor. It does not include properties owned by parents or ancestors.
This is useful when iterating over all properties in a descriptor.
pThis | A pointer to the descriptor to query |
|
inherited |
Get a property name by an index.
This is useful when iterating over all properties in a Descriptor. Only properties owed by a descriptor are queried in this manner. Parent descriptors are not consulted.
pThis | A pointer to the descriptor to query |
uIdx | The index of the property, will be a value between 0 and the return value from Desc_getNProps() |
|
inherited |
Get a property value by an index.
This is useful when iterating over all properties in a Descriptor. Only properties owned by a descriptor are queried in this manner. Parent descriptors are not consulted.
pThis | A pointer to the descriptor to query |
uIdx | The number of the property, will be a value from 0 and 1 less than the return value from Desc_getNProps() |
|
inherited |
Determine if a property is present in a Descriptor or it's ancestors.
pThis | the descriptor object to query |
propertyName | the name of the property to retrieve. |
|
inherited |
Generic property setter.
All properties are stored internally as strings. The various typed Desc_setProp* functions all call this function after converting their arguments to strings.
pThis | The Descriptor to receive the property |
sType | The Type of property should be one of the strings:
|
sName | The property name, which cannot contain spaces |
sVal | The value, which may be anything including NULL |
|
inherited |
Remove a property from a descriptor, if preset.
It is safe to call this function for properties not present on the descriptor, it simply does nothing and returns false.
|
inherited |
SetProperty methods add properties to any Descriptor (stream,packet,plane).
The typed methods (e.g. setPropertyDatum) property tag the property with a type so that it will be parsed into the given type.
|
inherited |
Read the property of type double named propertyName.
The property value is parsed using sscanf.
Get the a numeric property in the specified units.
Descriptor properties my be provided as Datums. Datums are a double value along with a specified measurement unit.
pThis | The Descriptor containing the property in question. |
sPropName | The name of the property to retrieve. |
units | The units of measure in which the return value will be represented. If the property value is stored in a different set of units than those indicated by this parameter than the output will be converted to the given unit type. |
|
inherited |
Set property of type Datum (double, UnitType pair)
If a property with this name already exists it is 1st deleted and then the new property is added in its place.
pThis | The descriptor to receive the property |
sName | The name of the property to set |
rVal | The numeric value of the property |
units | The units of measure for the property |
|
inherited |
Get the values of an array property.
Space for the array is allocated by getDoubleArrayFromString. and nitems is set to indicate the size of the array.
[in] | pThis | the descriptor object to query |
[in] | propertyName | the name of the proprety to retrieve |
[out] | nitems | a pointer to a an integer containing the number of values in the returned array. |
|
inherited |
Get a property integer value.
pThis | the descriptor object to query |
propertyName | the name of the proprety to retrieve |
|
inherited |
Get a property boolean value.
pThis | the descriptor object to query |
sPropName | the name of the proprety to retrieve |
|
inherited |
Get a property of type DatumRange with unconverted strings.
This version is handy if you just want to know the intrinsic units of the range without converting the values to some specific type of double value.
|
inherited |
Set the property of type float array.
Note the array is cast to a double array before encoding.
Deepcopy properties into a descriptor.
pThis | the descriptor to receive a copy of the properties |
source | the descriptor with the properties to be copied. |
|
inherited |
Encode a generic set of properties to a buffer.
pThis | The descriptors who's properties should be encoded |
pBuf | A buffer object to receive the XML data |
sIndent | An indent level for the property strings, makes 'em look nice |
void* pUser |
User data pointer.
The stream->packet->plane hierarchy provides a good organizational structure for application data, especially for applications whose purpose is to filter streams. This pointer can be used to hold a reference to information that is not serialized. It is initialized to NULL when a packet descriptor is created otherwise the library doesn't deal with it in any other way.