blob: c9a7f5de8ca5cfbba3f875d3b71ab2bdbc4c2fcb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 - 2013 ACIN, nxtControl GmbH, fortiss GmbH
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Alois Zoitl, Ingo Hegny, Stansilav Meduna, Monika Wenger
* - initial implementation and rework communication infrastructure
*******************************************************************************/
#ifndef _FORTE_ARRAY_H_
#define _FORTE_ARRAY_H_
#include "forte_any_derived.h"
#ifdef FORTE_SUPPORT_ARRAYS
/*!\ingroup COREDTS CIEC_ARRAY represents the array data type according to IEC 61131.
*/
class CIEC_ARRAY : public CIEC_ANY_DERIVED{
DECLARE_FIRMWARE_DATATYPE(ARRAY)
public:
CIEC_ARRAY(TForteUInt16 paLength, CStringDictionary::TStringId paArrayType);
explicit CIEC_ARRAY(const CIEC_ARRAY& paValue);
virtual ~CIEC_ARRAY();
//!Function to configure the array if it is created via the typelib
void setup(TForteUInt16 paLength, CStringDictionary::TStringId paArrayType);
/*! \brief Get the array's size
*
* With this command the size of the array can be evaluated.
*
* \param - No parameters necessary.
* \return - the length of the array.
*/
TForteUInt16 size() const{
return (0 != getSpecs()) ? getSpecs()->mLength : static_cast<TForteUInt16>(0);
}
/*! \brief Operator: CIEC_INT data type [unsigned int] data type
*
* This command implements the index operator for a C++ unsigned int index.
* \param paIndex Index
* \return Can be the following response:
* - Pointer to given object.
*/
CIEC_ANY* operator [](TForteUInt16 paIndex){
return (paIndex < size()) ? &(getArray()[paIndex]) : 0;
}
;
const CIEC_ANY* operator [](TForteUInt16 paIndex) const{
return (paIndex < size()) ? &(getArray()[paIndex]) : 0;
}
CIEC_ARRAY& operator =(const CIEC_ARRAY &paValue){
if( this != &paValue) {
setValue(paValue);
}
return *this;
}
/*! \brief Get the data type of elements inside the array
*
*/
CIEC_ANY::EDataTypeID getElementDataTypeID() const{
return getReferenceElement() != 0 ? getReferenceElement()->getDataTypeID() : CIEC_ANY::e_ANY;
}
;
virtual void setValue(const CIEC_ANY& paValue);
virtual EDataTypeID getDataTypeID() const{
return CIEC_ANY::e_ARRAY;
}
/*! \brief Converts array value to data type value
*
* This command implements a conversion function from IEC61131
* data type (array format) to a C++ conform type.
* This function is necessary for communication with a proper engineering system.
* \param pa_pacValue string buffer
* \return number of bytes taken used from the buffer
* -1 on on error
*/
virtual int fromString(const char *paValue);
/*! \brief Converts data type value to array
*
* This command implements a conversion function from C++ data type
* to IEC61131 conform data type (array format).
* This function is necessary for communication with a proper engineering system.
* \param pa_rsValue Reference to the given String
* \return number of bytes used in the buffer
* -1 on error
*/
virtual int toString(char* paValue, size_t paBufferSize) const;
virtual size_t getToStringBufferSize() const;
private:
//This constructor is only to be used by the create instance method
CIEC_ARRAY();
class CArraySpecs {
public:
explicit CArraySpecs(TForteUInt16 paLength) :
mLength(paLength) {
mArray = new CIEC_ANY[paLength + 1]; //store an additional reference element in the first place
}
~CArraySpecs() {
delete[] mArray;
}
TForteUInt16 mLength;
CIEC_ANY *getRefElement(){
return mArray;
}
const CIEC_ANY *getRefElement() const{
return mArray;
}
CIEC_ANY *getArrayContent(){
return &(mArray[1]); //the array content starts from the first entry in our array
}
const CIEC_ANY *getArrayContent() const {
return &(mArray[1]); //the array content starts from the first entry in our array
}
private:
CIEC_ANY *mArray;
};
/*! \brief CIEC_ARRAY data type member value is a array of CIEC_ANY.
*
* This list contains the elements in the array of the type given by
* the reference pointer.
*
*/
CIEC_ANY *getArray(){
return (0 != getSpecs()) ? getSpecs()->getArrayContent() : static_cast<CIEC_ANY *>(0);
}
const CIEC_ANY *getArray() const{
return (0 != getSpecs()) ? getSpecs()->getArrayContent() : static_cast<const CIEC_ANY *>(0);
}
CIEC_ANY *getReferenceElement() {
return (0 != getSpecs()) ? getSpecs()->getRefElement() : static_cast<CIEC_ANY *>(0);
}
const CIEC_ANY *getReferenceElement() const {
return (0 != getSpecs()) ? getSpecs()->getRefElement() : static_cast<CIEC_ANY *>(0);
}
const CArraySpecs* getSpecs() const {
return reinterpret_cast<const CArraySpecs*>(getGenData());
}
CArraySpecs* getSpecs() {
return reinterpret_cast<CArraySpecs*>(getGenData());
}
void clear();
void initializeFromString(TForteUInt16 paArraySize, int* paValueLen, TForteUInt16 paPosition, const char* paSrcString, CIEC_ANY ** paBufVal);
static void findNextNonBlankSpace(const char** paRunner);
};
#endif /* FORTE_SUPPORT_ARRAYS */
#endif /*_FORTE_ARRAY_H_*/