1#ifndef Cpl_Dm_Mp_Array_h_
2#define Cpl_Dm_Mp_Array_h_
22#ifndef OPTION_CPL_DM_MP_ARRAY_TEMP_ARRAY_NUM_ELEMENTS
23#define OPTION_CPL_DM_MP_ARRAY_TEMP_ARRAY_NUM_ELEMENTS 8
67 const char* symbolicName,
79 const char* symbolicName,
83 void* initialValueSrcPtr );
90 virtual bool readArrayElements(
void* dstData,
size_t dstNumElements,
size_t srcIndex = 0, uint16_t* seqNumPtr = 0 ) const noexcept;
117 void copyDataTo_(
void* dstData,
size_t dstSize )
const noexcept;
120 void copyDataFrom_(
const void* srcData,
size_t srcSize )
noexcept;
123 bool isDataEqual_(
const void* otherData )
const noexcept;
130 bool importMetadata_( const
void* srcDataStream,
size_t& bytesConsumed ) noexcept;
133 bool exportMetadata_(
void* dstDataStream,
size_t& bytesAdded ) const noexcept;
143template <class ELEMTYPE>
149 const char* symbolicName,
152 :
ArrayBase_( myModelBase, symbolicName, myDataPtr, numElements, sizeof( ELEMTYPE ) )
162 const char* symbolicName,
166 :
ArrayBase_( myModelBase, symbolicName, myDataPtr, numElements, sizeof( ELEMTYPE ), srcData )
173 inline bool read( ELEMTYPE* dstArrray,
size_t dstNumElements,
size_t srcIndex = 0, uint16_t* seqNumPtr = 0 ) const noexcept
194 size_t dstNumElements,
196 size_t srcIndex = 0 )
199 return readAndSync( dstArrray, dstNumElements, observerToSync, seqNum , srcIndex);
206 size_t dstNumElements,
209 size_t srcIndex = 0 )
220 JsonObject obj = doc.createNestedObject(
"val" );
222 JsonArray arr = obj.createNestedArray(
"elems" );
223 ELEMTYPE* elemPtr = (ELEMTYPE*)
m_dataPtr;
226 arr.add( elemPtr[i] );
235 if ( src.is<JsonObject>() ==
false )
239 *errorMsg =
"'val' key/value pair is NOT an JSON object";
245 JsonArray elems = src[
"elems"];
246 if ( elems.isNull() )
250 *errorMsg =
"'val' key/value pair is missing the embedded 'elems' array";
256 size_t startIdx = src[
"start"] | 0;
259 size_t numElements = elems.size();
264 errorMsg->format(
"Number of array elements ([%lu+%lu)] exceeds the MP's element count (%lu)", startIdx, numElements,
m_numElements );
271 while ( numElements )
279 if ( elems[idx].is<ELEMTYPE>() ==
false )
283 errorMsg->format(
"Failed parsing element[%lu]. Content of the MP is suspect!", offset );
287 tempArray[idx] = elems[idx + offset].as<ELEMTYPE>();
304template <
class ELEMTYPE,
int NUMELEMS,
class MPTYPE>
309 ELEMTYPE m_data[NUMELEMS];
314 const char* symbolicName )
325 const char* symbolicName,
327 :
NumericArrayBase_<ELEMTYPE>( myModelBase, symbolicName, m_data, NUMELEMS, srcData )
335 return ArrayBase_::copyArrayFrom( src, lockRequest );
341 ArrayBase_::attachSubscriber( observer, initialSeqNumber );
347 ArrayBase_::detachSubscriber( observer );
373 const char* getTypeAsText() const noexcept
375 return "Cpl::Dm::Mp::ArrayUint8";
400 const char* getTypeAsText() const noexcept
402 return "Cpl::Dm::Mp::ArrayUint32";
427 const char* getTypeAsText() const noexcept
429 return "Cpl::Dm::Mp::ArrayUint64";
454 const char* getTypeAsText() const noexcept
456 return "Cpl::Dm::Mp::ArrayInt8";
481 const char* getTypeAsText() const noexcept
483 return "Cpl::Dm::Mp::ArrayInt32";
508 const char* getTypeAsText() const noexcept
510 return "Cpl::Dm::Mp::ArrayInt64";
535 const char* getTypeAsText() const noexcept
537 return "Cpl::Dm::Mp::ArrayFloat";
562 const char* getTypeAsText() const noexcept
564 return "Cpl::Dm::Mp::ArrayDouble";
#define OPTION_CPL_DM_MP_ARRAY_TEMP_ARRAY_NUM_ELEMENTS
The number of Elements in the temporary array (that is allocated on the STACK) when parsing the array...
Definition Array.h:23
This concrete class implements a simple Model Database.
Definition ModelDatabase.h:56
This concrete class provide common infrastructure for a Model Point.
Definition ModelPointCommon_.h:32
bool readAndSync(void *dstData, size_t dstSize, uint16_t &seqNum, SubscriberApi &observerToSync)
This method is used to read the MP contents and synchronize the observer with the current MP contents...
Definition ModelPointCommon_.h:93
void * m_dataPtr
Reference to my Data.
Definition ModelPointCommon_.h:226
This mostly abstract class defines the interface for a Model Point.
Definition ModelPoint.h:46
LockRequest_T
Options related to the Model Point's locked state.
Definition ModelPoint.h:50
@ eNO_REQUEST
No change in the MP's lock state is requested.
Definition ModelPoint.h:51
static const uint16_t SEQUENCE_NUMBER_UNKNOWN
Magic value to use when registering for a change notification and application does not 'know' the cur...
Definition ModelPoint.h:62
virtual void setJSONVal(JsonDocument &doc) noexcept=0
This method converts the MP data to a JSON key/value pair.
virtual void attachSubscriber(SubscriberApi &observer, uint16_t initialSeqNumber=SEQUENCE_NUMBER_UNKNOWN) noexcept=0
This method is used to attach a subscriber to a Model Point.
virtual bool fromJSON_(JsonVariant &src, LockRequest_T lockRequest, uint16_t &retSequenceNumber, Cpl::Text::String *errorMsg) noexcept=0
This method has PACKAGE Scope, i.e.
This a mostly concrete class provides 'common' implementation for a Model Point who's data is a array...
Definition Array.h:46
virtual uint16_t copyArrayFrom(const ArrayBase_ &src, Cpl::Dm::ModelPoint::LockRequest_T lockRequest=Cpl::Dm::ModelPoint::eNO_REQUEST) noexcept
Updates the MP with the valid-state/data from 'src'. Note: the src.lock state is NOT copied.
size_t elemIndex
Starting array index.
Definition Array.h:53
uint8_t * elemPtr
Pointer to the 1st element in the array to read/write.
Definition Array.h:51
size_t getNumElements() const noexcept
Returns the number of element in the array. This method IS thread safe.
Definition Array.h:109
void copyDataTo_(void *dstData, size_t dstSize) const noexcept
See Cpl::Dm::ModelPoint.
size_t m_numElements
Number of elements in the array.
Definition Array.h:58
bool exportMetadata_(void *dstDataStream, size_t &bytesAdded) const noexcept
See Cpl::Dm::ModelPoint.
size_t getInternalDataSize_() const noexcept
See Cpl::Dm::Point.
bool importMetadata_(const void *srcDataStream, size_t &bytesConsumed) noexcept
See Cpl::Dm::ModelPoint.
bool isDataEqual_(const void *otherData) const noexcept
See Cpl::Dm::ModelPoint.
size_t numElements
Number of element to read/write.
Definition Array.h:52
void copyDataFrom_(const void *srcData, size_t srcSize) noexcept
See Cpl::Dm::ModelPoint.
size_t m_elementSize
Size, in bytes, of an element.
Definition Array.h:61
virtual bool readArrayElements(void *dstData, size_t dstNumElements, size_t srcIndex=0, uint16_t *seqNumPtr=0) const noexcept
The caller can read a subset of array starting from the specified index in the Model Point's array.
ArrayBase_(Cpl::Dm::ModelDatabase &myModelBase, const char *symbolicName, void *myDataPtr, size_t numElements, size_t elementSize)
Constructor: Invalid MP.
virtual uint16_t writeArrayElements(const void *srcData, size_t srcNumElements, size_t dstIndex=0, Cpl::Dm::ModelPoint::LockRequest_T lockRequest=Cpl::Dm::ModelPoint::eNO_REQUEST) noexcept
The caller can write a subset of array starting from the specified index in the Model Point's array.
double Array
Definition Array.h:546
float Array
Definition Array.h:519
int32_t Array
Definition Array.h:465
int64_t Array
Definition Array.h:492
int8_t Array
Definition Array.h:438
uint32_t Array
Definition Array.h:384
uint64_t Array
Definition Array.h:411
uint8_t Array
Definition Array.h:357
This mostly concrete template class implements an 'numeric Array' Model Point with an element size of...
Definition Array.h:305
This template class extends the implementation of ArrayBase_ to support the toJSON() and fromJSON_() ...
Definition Array.h:144
This abstract class defines the Subscriber interface - for change notifications - to a Model Points d...
Definition SubscriberApi.h:34
This template class defines a type safe Subscriber.
Definition Subscriber.h:82
This abstract class defines the operations that can be before on a NULL terminated string.
Definition String.h:40
The 'Cpl' namespace is the root name space for the Colony.
Definition Api16.h:20