esphome_elektromer_han/components/xt211/unused/gxserializer.c

9276 lines
350 KiB
C

//
// --------------------------------------------------------------------------
// Gurux Ltd
//
//
//
// Filename: $HeadURL$
//
// Version: $Revision$,
// $Date$
// $Author$
//
// Copyright (c) Gurux Ltd
//
//---------------------------------------------------------------------------
//
// DESCRIPTION
//
// This file is a part of Gurux Device Framework.
//
// Gurux Device Framework is Open Source software; you can redistribute it
// and/or modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; version 2 of the License.
// Gurux Device Framework is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// This code is licensed under the GNU General Public License v2.
// Full text may be retrieved at http://www.gnu.org/licenses/gpl-2.0.txt
//---------------------------------------------------------------------------
#include "gxignore.h"
#ifndef DLMS_IGNORE_SERIALIZER
#include "gxmem.h"
#include "gxserializer.h"
#include "helpers.h"
#include "objectarray.h"
#include "cosem.h"
#include "dlms.h"
#include "bytebuffer.h"
#ifdef DLMS_DEBUG
#include "serverevents.h"
#endif //DLMS_DEBUG
//Serialization version is increased every time when structure of serialized data is changed.
#define SERIALIZATION_VERSION 1
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
#include <assert.h>
#endif
#include "gxmem.h"
#if _MSC_VER > 1400
#include <crtdbg.h>
#endif
unsigned char ser_isEof(gxSerializerSettings* serializeSettings)
{
#if !defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__))
return feof(serializeSettings->stream);
#else
return !(serializeSettings->position < SERIALIZER_SIZE());
#endif //(!defined(GX_DLMS_MICROCONTROLLER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
}
int ser_loadUInt8(gxSerializerSettings* serializeSettings, unsigned char* value)
{
#if !defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__))
return fread(value, sizeof(unsigned char), 1, serializeSettings->stream) != 1;
#else
int ret = SERIALIZER_LOAD((uint16_t)serializeSettings->position, sizeof(unsigned char), (void*)value);
if (ret == 0)
{
++serializeSettings->position;
}
return ret;
#endif //(!defined(GX_DLMS_MICROCONTROLLER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
}
int ser_loadUInt16(gxSerializerSettings* serializeSettings, uint16_t* value)
{
#if !defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__))
return fread(value, sizeof(uint16_t), 1, serializeSettings->stream) != 1;
#else
int ret = SERIALIZER_LOAD(serializeSettings->position, sizeof(uint16_t), (void*)value);
if (ret == 0)
{
serializeSettings->position += sizeof(uint16_t);
}
return ret;
#endif //(!defined(GX_DLMS_MICROCONTROLLER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
}
int ser_loadUInt32(gxSerializerSettings* serializeSettings, void* value)
{
#if !defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__))
return fread(value, sizeof(uint32_t), 1, serializeSettings->stream) != 1;
#else
int ret = SERIALIZER_LOAD(serializeSettings->position, sizeof(uint32_t), value);
if (ret == 0)
{
serializeSettings->position += sizeof(uint32_t);
}
return ret;
#endif //(!defined(GX_DLMS_MICROCONTROLLER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
}
int ser_loadUInt64(gxSerializerSettings* serializeSettings, uint64_t* value)
{
#if !defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__))
return fread(value, sizeof(uint64_t), 1, serializeSettings->stream) != 1;
#else
int ret = SERIALIZER_LOAD(serializeSettings->position, sizeof(uint64_t), (void*)value);
if (ret == 0)
{
serializeSettings->position += sizeof(uint64_t);
}
return ret;
#endif //(!defined(GX_DLMS_MICROCONTROLLER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
}
int ser_loadInt8(gxSerializerSettings* serializeSettings, signed char* value)
{
return ser_loadUInt8(serializeSettings, (unsigned char*)value);
}
int ser_loadInt16(gxSerializerSettings* serializeSettings, int16_t* value)
{
return ser_loadUInt16(serializeSettings, (uint16_t*)value);
}
int ser_loadInt32(gxSerializerSettings* serializeSettings, int32_t* value)
{
return ser_loadUInt32(serializeSettings, (uint32_t*)value);
}
int ser_loadInt64(gxSerializerSettings* serializeSettings, int64_t* value)
{
return ser_loadUInt64(serializeSettings, (uint64_t*)value);
}
int ser_seek(gxSerializerSettings* serializeSettings, int count)
{
#if !defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__))
if (fseek(serializeSettings->stream, count, SEEK_CUR) != 0)
{
return DLMS_ERROR_CODE_HARDWARE_FAULT;
}
#else
serializeSettings->position += count;
#endif //(!defined(GX_DLMS_MICROCONTROLLER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
return 0;
}
#ifdef DLMS_IGNORE_MALLOC
//Whether to save the item.
unsigned char ser_serialize(gxSerializerSettings* serializeSettings)
{
if (serializeSettings->savedObject != NULL && serializeSettings->currentIndex != 0)
{
return serializeSettings->savedObject == serializeSettings->currentObject &&
(serializeSettings->savedAttributes & 1 << (serializeSettings->currentIndex - 1)) != 0;
}
return 1;
}
#endif //DLMS_IGNORE_MALLOC
int ser_save(gxSerializerSettings* serializeSettings, const void* item, uint16_t count)
{
#ifdef DLMS_IGNORE_MALLOC
if (!ser_serialize(serializeSettings))
{
return ser_seek(serializeSettings, count);
}
#endif //DLMS_IGNORE_MALLOC
#if !defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__))
if (fwrite(item, count, 1, serializeSettings->stream) != 1)
{
return DLMS_ERROR_CODE_OUTOFMEMORY;
}
return 0;
#else
int ret = SERIALIZER_SAVE(serializeSettings->position, count, item);
//Update changed positions.
if (serializeSettings->position < serializeSettings->updateStart)
{
serializeSettings->updateStart = serializeSettings->position;
}
serializeSettings->position += count;
if (serializeSettings->updateEnd < serializeSettings->position)
{
serializeSettings->updateEnd = serializeSettings->position;
}
return ret;
#endif //(!defined(GX_DLMS_MICROCONTROLLER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
}
int ser_saveUInt8(
gxSerializerSettings* serializeSettings,
unsigned char item)
{
return ser_save(serializeSettings, &item, 1);
}
#if defined(GX_DLMS_BYTE_BUFFER_SIZE_32) || (!defined(GX_DLMS_MICROCONTROLLER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
int ser_set(
gxSerializerSettings* serializeSettings,
const unsigned char* pSource,
uint32_t count
#ifdef DLMS_IGNORE_MALLOC
, uint32_t capacity
#endif //DLMS_IGNORE_MALLOC
)
#else
int ser_set(
gxSerializerSettings* serializeSettings,
const unsigned char* pSource,
uint16_t count
#ifdef DLMS_IGNORE_MALLOC
, uint16_t capacity
#endif //DLMS_IGNORE_MALLOC
)
#endif
{
int ret;
#ifdef DLMS_IGNORE_MALLOC
if (capacity < count)
{
return DLMS_ERROR_CODE_INVALID_PARAMETER;
}
if (!ser_serialize(serializeSettings))
{
return ser_seek(serializeSettings, capacity);
}
#endif //DLMS_IGNORE_MALLOC
ret = 0;
uint16_t pos;
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_saveUInt8(serializeSettings, pSource[pos])) != 0)
{
break;
}
}
#if !(!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
#ifdef DLMS_IGNORE_MALLOC
serializeSettings->position += capacity - count;
//Update changed positions.
if (serializeSettings->position < serializeSettings->updateStart)
{
serializeSettings->updateStart = serializeSettings->position;
}
if (serializeSettings->updateEnd < serializeSettings->position)
{
serializeSettings->updateEnd = serializeSettings->position;
}
#endif //DLMS_IGNORE_MALLOC
#endif //!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__))
return ret;
}
#if defined(GX_DLMS_BYTE_BUFFER_SIZE_32) || (!defined(GX_DLMS_MICROCONTROLLER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
int ser_get(
gxSerializerSettings* serializeSettings,
unsigned char* value,
uint32_t count
#ifdef DLMS_IGNORE_MALLOC
, uint32_t capacity
#endif //DLMS_IGNORE_MALLOC
)
#else
int ser_get(
gxSerializerSettings* serializeSettings,
unsigned char* value,
uint16_t count
#ifdef DLMS_IGNORE_MALLOC
, uint16_t capacity
#endif //DLMS_IGNORE_MALLOC
)
#endif
{
int ret = 0;
#ifdef DLMS_IGNORE_MALLOC
if (capacity < count)
{
return DLMS_ERROR_CODE_INVALID_PARAMETER;
}
#endif //DLMS_IGNORE_MALLOC
#if !defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__))
if (fread(value, sizeof(unsigned char), count, serializeSettings->stream) != count)
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
#else
if ((ret = SERIALIZER_LOAD((uint16_t)serializeSettings->position, count, value)) == 0)
{
serializeSettings->position += count;
}
#endif//!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__))
#if !(!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
#ifdef DLMS_IGNORE_MALLOC
if (ret == 0)
{
serializeSettings->position += capacity - count;
}
#endif //#ifdef DLMS_IGNORE_MALLOC
#endif //!(!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
return ret;
}
#if defined(GX_DLMS_BYTE_BUFFER_SIZE_32) || (!defined(GX_DLMS_MICROCONTROLLER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
int ser_set2(
gxByteBuffer* arr,
gxSerializerSettings* serializeSettings,
uint32_t count
#ifdef DLMS_IGNORE_MALLOC
, uint16_t capacity
#endif //DLMS_IGNORE_MALLOC
)
#else
int ser_set2(
gxByteBuffer* arr,
gxSerializerSettings* serializeSettings,
uint16_t count
#ifdef DLMS_IGNORE_MALLOC
, uint16_t capacity
#endif //DLMS_IGNORE_MALLOC
)
#endif
{
int ret = 0;
#ifdef DLMS_IGNORE_MALLOC
if (capacity != 0)
#else
if (count != 0)
#endif //DLMS_IGNORE_MALLOC
{
if (count != 0)
{
ret = bb_allocate(arr, arr->size, count);
}
if (ret == 0)
{
#if !defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__))
int pos;
for (pos = 0; pos != count; ++pos)
{
if (fread(&arr->data[pos + arr->size], sizeof(unsigned char), 1, serializeSettings->stream) != 1)
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
}
}
#else
if ((ret = SERIALIZER_LOAD(serializeSettings->position, count, arr->data + arr->size)) == 0)
{
serializeSettings->position += count;
}
#endif //(!defined(GX_DLMS_MICROCONTROLLER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
if (ret == 0)
{
arr->size += count;
#if !(!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
#ifdef DLMS_IGNORE_MALLOC
serializeSettings->position += capacity - count;
#endif //DLMS_IGNORE_MALLOC
#endif //!(!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
}
}
}
return ret;
}
int ser_loadObjectCount(gxSerializerSettings* serializeSettings, uint16_t* count)
{
int ret;
#ifdef DLMS_IGNORE_MALLOC
uint16_t tmp;
ret = ser_loadUInt16(serializeSettings, &tmp);
*count = tmp;
#else
unsigned char ch;
ret = ser_loadUInt8(serializeSettings, &ch);
if (ret != 0)
{
return ret;
}
if (ch > 0x80)
{
if (ch == 0x81)
{
ret = ser_loadUInt8(serializeSettings, &ch);
*count = ch;
}
else if (ch == 0x82)
{
uint16_t tmp;
ret = ser_loadUInt16(serializeSettings, &tmp);
*count = tmp;
}
else if (ch == 0x84)
{
uint32_t value;
ret = ser_loadUInt32(serializeSettings, &value);
*count = (uint16_t)value;
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
}
else
{
*count = ch;
}
#endif //DLMS_IGNORE_MALLOC
return ret;
}
int ser_checkArray2(gxSerializerSettings* serializeSettings, uint16_t* count, unsigned char checkDataType)
{
int ret;
unsigned char ch;
uint16_t cnt;
if (checkDataType)
{
if ((ret = ser_loadUInt8(serializeSettings, &ch)) != 0)
{
return ret;
}
if (ch != DLMS_DATA_TYPE_ARRAY)
{
return DLMS_ERROR_CODE_UNMATCH_TYPE;
}
}
//Get array count.
if ((ret = ser_loadObjectCount(serializeSettings, &cnt)) != 0)
{
return ret;
}
#ifndef DLMS_COSEM_EXACT_DATA_TYPES
if (*count < cnt)
{
return DLMS_ERROR_CODE_INCONSISTENT_CLASS_OR_OBJECT;
}
#endif //DLMS_COSEM_EXACT_DATA_TYPES
* count = cnt;
return 0;
}
int ser_loadDateTime(gxtime* value, gxSerializerSettings* serializeSettings, DLMS_DATA_TYPE type)
{
int ret = 0;
time_clear(value);
uint16_t size;
if (type == DLMS_DATA_TYPE_DATETIME)
{
size = 12;
}
else if (type == DLMS_DATA_TYPE_DATE)
{
size = 5;
}
else if (type == DLMS_DATA_TYPE_TIME)
{
size = 4;
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
if (ret == 0)
{
dlmsVARIANT tmp;
GX_DATETIME(tmp) = value;
unsigned char buff[12];
gxByteBuffer bb;
bb_attach(&bb, buff, size, sizeof(buff));
#if !defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__))
int pos;
for (pos = 0; pos != size; ++pos)
{
if (fread(&buff[pos], sizeof(unsigned char), 1, serializeSettings->stream) != 1)
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
}
}
#else
if ((ret = SERIALIZER_LOAD(serializeSettings->position, size, buff)) == 0)
{
serializeSettings->position += size;
}
#endif //!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__))
ret = dlms_changeType(&bb, type, &tmp);
}
return ret;
}
int ser_loadVariantArray(gxSerializerSettings* serializeSettings, variantArray* arr, uint16_t* count)
{
int ret = ser_loadObjectCount(serializeSettings, count);
if (ret == 0)
{
va_clear(arr);
#ifdef DLMS_IGNORE_MALLOC
arr->size = *count;
ret = ser_loadObjectCount(serializeSettings, count);
#else
#endif //DLMS_IGNORE_MALLOC
va_capacity(arr, *count);
}
return ret;
}
#if defined(DLMS_IGNORE_MALLOC)
int ser_loadBitStringtoVariant(gxSerializerSettings* serializeSettings, dlmsVARIANT* value)
{
int ret;
uint16_t count;
if ((ret = ser_loadObjectCount(serializeSettings, &count)) != 0)
{
return ret;
}
uint16_t capacity;
if ((ret = ser_loadObjectCount(serializeSettings, &capacity)) != 0)
{
return ret;
}
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
if (value->capacity != capacity)
{
printf("Warning! Serialized capacity is different than allocated capacity.\n");
}
#endif //defined(_WIN32) || defined(_WIN64) || defined(__linux__)
value->size = count;
return ser_get(serializeSettings, value->pVal, ba_getByteCount(count), ba_getByteCount(capacity));
}
#endif //DLMS_IGNORE_MALLOC
int ser_loadOctetString(gxSerializerSettings* serializeSettings, gxByteBuffer* value)
{
int ret;
uint16_t count;
if ((ret = ser_loadObjectCount(serializeSettings, &count)) != 0)
{
return ret;
}
#ifdef DLMS_IGNORE_MALLOC
uint16_t capacity;
if ((ret = ser_loadObjectCount(serializeSettings, &capacity)) != 0)
{
return ret;
}
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
if (bb_getCapacity(value) != capacity)
{
printf("Warning! Serialized capacity is different than allocated capacity.\n");
}
#endif //defined(_WIN32) || defined(_WIN64) || defined(__linux__)
if ((ret = bb_clear(value)) == 0 &&
(ret = ser_set2(value, serializeSettings, count, capacity)) == 0)
{
}
#else
if ((ret = bb_clear(value)) == 0 &&
(ret = ser_set2(value, serializeSettings, count)) == 0)
{
}
#endif //DLMS_IGNORE_MALLOC
return ret;
}
int ser_loadOctetString2(gxSerializerSettings* serializeSettings, char** value)
{
int ret;
uint16_t count;
if ((ret = ser_loadObjectCount(serializeSettings, &count)) != 0)
{
return ret;
}
#ifdef DLMS_IGNORE_MALLOC
uint16_t capacity;
if ((ret = ser_loadObjectCount(serializeSettings, &capacity)) != 0)
{
return ret;
}
#endif //DLMS_IGNORE_MALLOC
#if !defined(DLMS_USE_CUSTOM_MALLOC) && !defined(DLMS_IGNORE_MALLOC)
if (*value != NULL)
{
gxfree(*value);
}
*value = (char*)gxmalloc(count + 1);
#endif //#if !defined(DLMS_USE_CUSTOM_MALLOC) && !defined(DLMS_IGNORE_MALLOC)
if ((ret = ser_get(serializeSettings, (unsigned char*)*value, count
#ifdef DLMS_IGNORE_MALLOC
, capacity
#endif//DLMS_IGNORE_MALLOC
)) == 0)
{
(*value)[count] = 0;
}
return ret;
}
int ser_loadOctetString3(
gxSerializerSettings* serializeSettings,
unsigned char* value,
uint16_t* count)
{
int ret;
if ((ret = ser_loadObjectCount(serializeSettings, count)) != 0)
{
return ret;
}
#ifdef DLMS_IGNORE_MALLOC
uint16_t capacity;
if ((ret = ser_loadObjectCount(serializeSettings, &capacity)) != 0)
{
return ret;
}
#endif //DLMS_IGNORE_MALLOC
ret = ser_get(serializeSettings, value, *count
#ifdef DLMS_IGNORE_MALLOC
, capacity
#endif //DLMS_IGNORE_MALLOC
);
#ifdef DLMS_IGNORE_MALLOC
if (*count < capacity)
{
value[*count] = 0;
}
#endif //DLMS_IGNORE_MALLOC
return ret;
}
int ser_getOctetString2(gxSerializerSettings* serializeSettings, unsigned char* value, uint16_t* size)
{
uint16_t tmp;
int ret;
if ((ret = ser_loadOctetString3(serializeSettings, value, &tmp)) == 0)
{
if (size != NULL)
{
*size = tmp;
}
}
return ret;
}
int ser_getOctetString(gxSerializerSettings* serializeSettings, gxByteBuffer* value)
{
int ret;
uint16_t count;
if ((ret = ser_loadObjectCount(serializeSettings, &count)) != 0)
{
return ret;
}
bb_clear(value);
#ifdef DLMS_IGNORE_MALLOC
uint16_t capacity;
if ((ret = ser_loadObjectCount(serializeSettings, &capacity)) != 0)
{
return ret;
}
bb_capacity(value, capacity);
#else
if ((ret = bb_capacity(value, count)) != 0)
{
return ret;
}
#endif //DLMS_IGNORE_MALLOC
value->size = count;
return ret = ser_get(serializeSettings, value->data, count
#ifdef DLMS_IGNORE_MALLOC
, capacity
#endif //DLMS_IGNORE_MALLOC
);
}
#ifndef DLMS_IGNORE_FLOAT32
int ser_loadFloat(
gxSerializerSettings* serializeSettings,
float* value)
{
typedef union
{
float value;
unsigned char b[sizeof(float)];
} HELPER;
HELPER tmp;
int ret;
if ((ret = ser_loadUInt8(serializeSettings, &tmp.b[3])) == 0 &&
(ret = ser_loadUInt8(serializeSettings, &tmp.b[2])) == 0 &&
(ret = ser_loadUInt8(serializeSettings, &tmp.b[1])) == 0 &&
(ret = ser_loadUInt8(serializeSettings, &tmp.b[0])) == 0)
{
*value = tmp.value;
}
return ret;
}
#endif //DLMS_IGNORE_FLOAT32
#ifndef DLMS_IGNORE_FLOAT64
int ser_loadDouble(
gxSerializerSettings* serializeSettings,
double* value)
{
typedef union
{
double value;
unsigned char b[sizeof(double)];
} HELPER;
HELPER tmp;
int ret;
if ((ret = ser_loadUInt8(serializeSettings, &tmp.b[7])) == 0 &&
(ret = ser_loadUInt8(serializeSettings, &tmp.b[6])) == 0 &&
(ret = ser_loadUInt8(serializeSettings, &tmp.b[5])) == 0 &&
(ret = ser_loadUInt8(serializeSettings, &tmp.b[4])) == 0 &&
(ret = ser_loadUInt8(serializeSettings, &tmp.b[3])) == 0 &&
(ret = ser_loadUInt8(serializeSettings, &tmp.b[2])) == 0 &&
(ret = ser_loadUInt8(serializeSettings, &tmp.b[1])) == 0 &&
(ret = ser_loadUInt8(serializeSettings, &tmp.b[0])) == 0)
{
*value = tmp.value;
}
return ret;
}
#endif //DLMS_IGNORE_FLOAT64
int ser_loadBitString(gxSerializerSettings* serializeSettings, bitArray* value)
{
int ret;
uint16_t count;
if ((ret = ser_loadObjectCount(serializeSettings, &count)) != 0)
{
return ret;
}
#ifdef DLMS_IGNORE_MALLOC
uint16_t capacity;
if ((ret = ser_loadObjectCount(serializeSettings, &capacity)) != 0)
{
return ret;
}
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
uint16_t size = ba_getByteCount(ba_getCapacity(value));
if (size != capacity)
{
printf("Warning! Serialized capacity is different than allocated capacity.\n");
}
#endif //defined(_WIN32) || defined(_WIN64) || defined(__linux__)
#endif //DLMS_IGNORE_MALLOC
#ifndef DLMS_IGNORE_MALLOC
if ((ret = ba_capacity(value, count)) != 0)
{
return ret;
}
#endif // DLMS_IGNORE_MALLOC
value->size = count;
ret = ser_get(serializeSettings, value->data, ba_getByteCount(count)
#ifdef DLMS_IGNORE_MALLOC
, capacity
#endif //DLMS_IGNORE_MALLOC
);
return ret;
}
#ifdef DLMS_IGNORE_MALLOC
int ser_loadBitString2(gxSerializerSettings* serializeSettings,
unsigned char* value,
uint16_t expectedCapacity,
uint16_t* size)
{
int ret;
uint16_t count;
if ((ret = ser_loadObjectCount(serializeSettings, &count)) != 0)
{
return ret;
}
uint16_t capacity;
if ((ret = ser_loadObjectCount(serializeSettings, &capacity)) != 0)
{
return ret;
}
if (expectedCapacity != capacity)
{
return DLMS_ERROR_CODE_INVALID_PARAMETER;
}
*size = count;
ret = ser_get(serializeSettings, value, ba_getByteCount(count)
, capacity
);
return ret;
}
#endif //DLMS_IGNORE_MALLOC
// Get item from the buffer if DLMS_IGNORE_MALLOC is defined.
// Otherwice create the variant object dynamically.
int ser_getVariantArrayItem(variantArray* arr, uint16_t index, dlmsVARIANT** value)
{
#ifdef DLMS_IGNORE_MALLOC
int ret = va_getByIndex(arr, index, value);
if (ret == 0)
{
var_clear(*value);
}
return ret;
#else
* value = gxmalloc(sizeof(dlmsVARIANT));
if (*value == NULL)
{
return DLMS_ERROR_CODE_OUTOFMEMORY;
}
var_init(*value);
return va_push(arr, *value);
#endif //DLMS_COSEM_EXACT_DATA_TYPES
}
int ser_loadVariant(dlmsVARIANT* data,
gxSerializerSettings* serializeSettings)
{
int ret;
unsigned char ch;
var_clear(data);
if ((ret = ser_loadUInt8(serializeSettings, &ch)) == 0)
{
//Update data type if not reference.
if ((data->vt & DLMS_DATA_TYPE_BYREF) == 0)
{
data->vt = ch;
}
if (ch == DLMS_DATA_TYPE_NONE)
{
//Do nothing.
return DLMS_ERROR_CODE_OK;
}
switch (data->vt & ~DLMS_DATA_TYPE_BYREF)
{
case DLMS_DATA_TYPE_ARRAY:
case DLMS_DATA_TYPE_STRUCTURE:
{
uint16_t pos, count;
dlmsVARIANT* tmp;
#ifndef DLMS_IGNORE_MALLOC
data->Arr = gxmalloc(sizeof(variantArray));
va_init(data->Arr);
#else
dlmsVARIANT tmp2;
var_init(&tmp2);
va_clear(data->Arr);
#endif //DLMS_IGNORE_MALLOC
if ((ret = ser_loadVariantArray(serializeSettings, data->Arr, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if (pos < data->Arr->size)
{
if ((ret = ser_getVariantArrayItem(data->Arr, pos, &tmp)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
else
{
var_clear(&tmp2);
tmp = &tmp2;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = ser_loadVariant(tmp, serializeSettings)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
//Return original size.
data->Arr->size = count;
#endif //DLMS_IGNORE_MALLOC
}
break;
}
case DLMS_DATA_TYPE_BOOLEAN:
{
ret = ser_loadUInt8(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) == 0 ? &data->boolVal : data->pboolVal);
break;
}
case DLMS_DATA_TYPE_BIT_STRING:
#if !defined(DLMS_IGNORE_MALLOC)
data->bitArr = (bitArray*)gxmalloc(sizeof(bitArray));
ba_init(data->bitArr);
ret = ser_loadBitString(serializeSettings, data->bitArr);
#else
ret = ser_loadBitStringtoVariant(serializeSettings, data);
#endif //!defined(DLMS_IGNORE_MALLOC)
break;
case DLMS_DATA_TYPE_INT32:
ret = ser_loadInt32(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) == 0 ? &data->lVal : data->plVal);
break;
case DLMS_DATA_TYPE_UINT32:
ret = ser_loadUInt32(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) == 0 ? &data->ulVal : data->pulVal);
break;
case DLMS_DATA_TYPE_STRING:
#if !defined(DLMS_IGNORE_MALLOC)
data->byteArr = (gxByteBuffer*)gxmalloc(sizeof(gxByteBuffer));
bb_init(data->byteArr);
ret = ser_getOctetString(serializeSettings, data->byteArr);
#else
ret = ser_loadOctetString3(serializeSettings, (unsigned char*)data->pVal, &data->size);
#endif //!defined(DLMS_IGNORE_MALLOC)
break;
case DLMS_DATA_TYPE_STRING_UTF8:
#if !defined(DLMS_IGNORE_MALLOC)
data->byteArr = (gxByteBuffer*)gxmalloc(sizeof(gxByteBuffer));
bb_init(data->byteArr);
ret = ser_getOctetString(serializeSettings, data->byteArr);
#else
ret = ser_loadOctetString3(serializeSettings, data->pVal, &data->size);
#endif //!defined(DLMS_IGNORE_MALLOC)
break;
case DLMS_DATA_TYPE_OCTET_STRING:
#if !defined(DLMS_IGNORE_MALLOC)
data->byteArr = (gxByteBuffer*)gxmalloc(sizeof(gxByteBuffer));
bb_init(data->byteArr);
ret = ser_getOctetString(serializeSettings, data->byteArr);
#else
ret = ser_loadOctetString3(serializeSettings, data->pVal, &data->size);
#endif // DLMS_IGNORE_MALLOC
break;
case DLMS_DATA_TYPE_BINARY_CODED_DESIMAL:
ret = ser_loadUInt8(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) == 0 ? &data->bVal : data->pbVal);
break;
case DLMS_DATA_TYPE_INT8:
ret = ser_loadInt8(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) == 0 ? &data->cVal : data->pcVal);
break;
case DLMS_DATA_TYPE_INT16:
ret = ser_loadInt16(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) == 0 ? &data->iVal : data->piVal);
break;
case DLMS_DATA_TYPE_UINT8:
ret = ser_loadUInt8(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) == 0 ? &data->bVal : data->pbVal);
break;
case DLMS_DATA_TYPE_UINT16:
ret = ser_loadUInt16(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) == 0 ? &data->uiVal : data->puiVal);
break;
case DLMS_DATA_TYPE_COMPACT_ARRAY:
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
case DLMS_DATA_TYPE_INT64:
ret = ser_loadInt64(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) == 0 ? &data->llVal : data->pllVal);
break;
case DLMS_DATA_TYPE_UINT64:
ret = ser_loadUInt64(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) == 0 ? &data->ullVal : data->pullVal);
break;
case DLMS_DATA_TYPE_ENUM:
ret = ser_loadUInt8(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) == 0 ? &data->bVal : data->pbVal);
break;
#ifndef DLMS_IGNORE_FLOAT32
case DLMS_DATA_TYPE_FLOAT32:
ret = ser_loadFloat(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) == 0 ? &data->fltVal : data->pfltVal);
break;
#endif //DLMS_IGNORE_FLOAT32
#ifndef DLMS_IGNORE_FLOAT64
case DLMS_DATA_TYPE_FLOAT64:
ret = ser_loadDouble(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) == 0 ? &data->dblVal : data->pdblVal);
break;
#endif //DLMS_IGNORE_FLOAT64
case DLMS_DATA_TYPE_DATETIME:
#if defined(DLMS_IGNORE_MALLOC)
ret = ser_loadDateTime((gxtime*)data->pVal, serializeSettings, DLMS_DATA_TYPE_DATETIME);
#else
data->dateTime = (gxtime*)gxmalloc(sizeof(gxtime));
ret = ser_loadDateTime(data->dateTime, serializeSettings, DLMS_DATA_TYPE_DATETIME);
#endif //DLMS_IGNORE_MALLOC
break;
case DLMS_DATA_TYPE_DATE:
#if defined(DLMS_IGNORE_MALLOC)
ret = ser_loadDateTime((gxtime*)data->pVal, serializeSettings, DLMS_DATA_TYPE_DATE);
#else
data->dateTime = (gxtime*)gxmalloc(sizeof(gxtime));
ret = ser_loadDateTime(data->dateTime, serializeSettings, DLMS_DATA_TYPE_DATE);
#endif //DLMS_IGNORE_MALLOC
break;
case DLMS_DATA_TYPE_TIME:
#if defined(DLMS_IGNORE_MALLOC)
ret = ser_loadDateTime((gxtime*)data->pVal, serializeSettings, DLMS_DATA_TYPE_TIME);
#else
data->dateTime = (gxtime*)gxmalloc(sizeof(gxtime));
ret = ser_loadDateTime(data->dateTime, serializeSettings, DLMS_DATA_TYPE_TIME);
#endif //DLMS_IGNORE_MALLOC
break;
default:
#ifdef _DEBUG
//Assert in debug version.
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
assert(0);
#endif
#endif
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
}
return ret;
}
int ser_saveUInt16(
gxSerializerSettings* serializeSettings,
uint16_t item)
{
#ifdef DLMS_IGNORE_MALLOC
if (!ser_serialize(serializeSettings))
{
return ser_seek(serializeSettings, sizeof(uint16_t));
}
#endif //DLMS_IGNORE_MALLOC
return ser_save(serializeSettings, &item, sizeof(uint16_t));
}
int ser_saveUInt32(
gxSerializerSettings* serializeSettings,
uint32_t item)
{
#ifdef DLMS_IGNORE_MALLOC
if (!ser_serialize(serializeSettings))
{
return ser_seek(serializeSettings, sizeof(uint32_t));
}
#endif //DLMS_IGNORE_MALLOC
return ser_save(serializeSettings, &item, sizeof(uint32_t));
}
int ser_saveUInt64(
gxSerializerSettings* serializeSettings,
uint64_t item)
{
#ifdef DLMS_IGNORE_MALLOC
if (!ser_serialize(serializeSettings))
{
return ser_seek(serializeSettings, sizeof(uint64_t));
}
#endif //DLMS_IGNORE_MALLOC
return ser_save(serializeSettings, &item, sizeof(uint64_t));
}
int ser_saveInt8(
gxSerializerSettings* serializeSettings,
signed char item)
{
return ser_saveUInt8(serializeSettings, (unsigned char)item);
}
int ser_saveInt16(
gxSerializerSettings* serializeSettings,
int16_t item)
{
return ser_saveUInt16(serializeSettings, (uint16_t)item);
}
int ser_saveInt32(
gxSerializerSettings* serializeSettings,
int32_t item)
{
return ser_saveUInt32(serializeSettings, (uint32_t)item);
}
int ser_saveInt64(
gxSerializerSettings* serializeSettings,
int64_t item)
{
return ser_saveUInt64(serializeSettings, (uint64_t)item);
}
int ser_saveDateTime2(
gxtime* dateTime,
gxSerializerSettings* serializeSettings)
{
int ret;
unsigned char buff[12];
gxByteBuffer bb;
BB_ATTACH(bb, buff, 0);
if ((ret = var_getDateTime2(dateTime, &bb)) == 0 &&
(ret = ser_set(serializeSettings, bb.data, bb.size
#ifdef DLMS_IGNORE_MALLOC
, bb_getCapacity(&bb)
#endif //DLMS_IGNORE_MALLOC
)) == 0)
{
}
return ret;
}
int ser_saveDate(
gxtime* dateTime,
gxSerializerSettings* serializeSettings)
{
int ret;
unsigned char buff[5];
gxByteBuffer bb;
BB_ATTACH(bb, buff, 0);
if ((ret = var_getDate(dateTime, &bb)) == 0 &&
(ret = ser_set(serializeSettings, bb.data, bb.size
#ifdef DLMS_IGNORE_MALLOC
, bb_getCapacity(&bb)
#endif //DLMS_IGNORE_MALLOC
)) == 0)
{
}
return ret;
}
int ser_saveTime(
gxtime* dateTime,
gxSerializerSettings* serializeSettings)
{
int ret;
unsigned char buff[4];
gxByteBuffer bb;
BB_ATTACH(bb, buff, 0);
if ((ret = var_getTime(dateTime, &bb)) == 0 &&
(ret = ser_set(serializeSettings, bb.data, bb.size
#ifdef DLMS_IGNORE_MALLOC
, bb_getCapacity(&bb)
#endif //DLMS_IGNORE_MALLOC
)) == 0)
{
}
return ret;
}
#ifndef DLMS_IGNORE_FLOAT32
int ser_saveFloat(
gxSerializerSettings* serializeSettings,
float value)
{
typedef union
{
float value;
char b[sizeof(float)];
} HELPER;
HELPER tmp;
tmp.value = value;
int ret;
if ((ret = ser_saveUInt8(serializeSettings, tmp.b[3])) == 0 &&
(ret = ser_saveUInt8(serializeSettings, tmp.b[2])) == 0 &&
(ret = ser_saveUInt8(serializeSettings, tmp.b[1])) == 0 &&
(ret = ser_saveUInt8(serializeSettings, tmp.b[0])) == 0)
{
}
return ret;
}
#endif //DLMS_IGNORE_FLOAT32
#ifndef DLMS_IGNORE_FLOAT64
int ser_saveDouble(
gxSerializerSettings* serializeSettings,
double value)
{
typedef union
{
double value;
char b[sizeof(double)];
} HELPER;
HELPER tmp;
tmp.value = value;
int ret;
if ((ret = ser_saveUInt8(serializeSettings, tmp.b[7])) == 0 &&
(ret = ser_saveUInt8(serializeSettings, tmp.b[6])) == 0 &&
(ret = ser_saveUInt8(serializeSettings, tmp.b[5])) == 0 &&
(ret = ser_saveUInt8(serializeSettings, tmp.b[4])) == 0 &&
(ret = ser_saveUInt8(serializeSettings, tmp.b[3])) == 0 &&
(ret = ser_saveUInt8(serializeSettings, tmp.b[2])) == 0 &&
(ret = ser_saveUInt8(serializeSettings, tmp.b[1])) == 0 &&
(ret = ser_saveUInt8(serializeSettings, tmp.b[0])) == 0)
{
}
return ret;
}
#endif //DLMS_IGNORE_FLOAT64
// Set count of items.
int ser_saveObjectCount(uint32_t count, gxSerializerSettings* serializeSettings)
{
int ret;
#ifdef DLMS_IGNORE_MALLOC
ret = ser_saveUInt16(serializeSettings, (uint16_t)count);
#else
if (count < 0x80)
{
ret = ser_saveUInt8(serializeSettings, (unsigned char)count);
}
else if (count < 0x100)
{
if ((ret = ser_saveUInt8(serializeSettings, 0x81)) == 0)
{
ret = ser_saveUInt8(serializeSettings, (unsigned char)count);
}
}
else if (count < 0x10000)
{
if ((ret = ser_saveUInt8(serializeSettings, 0x82)) == 0)
{
ret = ser_saveUInt16(serializeSettings, (uint16_t)count);
}
}
else
{
if ((ret = ser_saveUInt8(serializeSettings, 0x84)) == 0)
{
ret = ser_saveUInt32(serializeSettings, count);
}
}
#endif// DLMS_IGNORE_MALLOC
return ret;
}
int ser_setOctetString2(
gxSerializerSettings* serializeSettings,
const unsigned char* value,
uint16_t size,
uint16_t capacity)
{
int ret;
if (value == NULL)
{
size = 0;
}
if ((ret = ser_saveObjectCount(size, serializeSettings)) != 0 ||
#ifdef DLMS_IGNORE_MALLOC
(ret = ser_saveObjectCount(capacity, serializeSettings)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = ser_set(serializeSettings, value, size
#ifdef DLMS_IGNORE_MALLOC
, capacity
#endif //DLMS_IGNORE_MALLOC
)) != 0)
{
//Error code is returned at the end of the function.
}
return ret;
}
//Returns bytes as Big Endian byteorder.
int ser_saveBytes3(
dlmsVARIANT* data,
DLMS_DATA_TYPE type,
gxSerializerSettings* serializeSettings)
{
int ret = 0, pos;
if ((type & DLMS_DATA_TYPE_BYREF) != 0)
{
return ser_saveBytes3(data, type & ~DLMS_DATA_TYPE_BYREF, serializeSettings);
}
if ((ret = ser_saveUInt8(serializeSettings, type)) != 0)
{
return ret;
}
if (type == DLMS_DATA_TYPE_STRUCTURE ||
type == DLMS_DATA_TYPE_ARRAY)
{
dlmsVARIANT* tmp;
if ((ret = ser_saveObjectCount(data->Arr->size, serializeSettings)) == 0)
{
#ifdef DLMS_IGNORE_MALLOC
uint16_t originalSize = va_size(data->Arr);
uint16_t count = va_getCapacity(data->Arr);
if ((ret = ser_saveObjectCount(count, serializeSettings)) != 0)
{
return ret;
}
data->Arr->size = count;
#endif //DLMS_IGNORE_MALLOC
for (pos = 0; pos != va_size(data->Arr); ++pos)
{
if ((ret = va_getByIndex(data->Arr, pos, &tmp)) != DLMS_ERROR_CODE_OK ||
(ret = ser_saveBytes3(tmp, tmp->vt, serializeSettings)) != DLMS_ERROR_CODE_OK)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
//Return original size.
data->Arr->size = originalSize;
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
switch (type)
{
case DLMS_DATA_TYPE_NONE:
break;
case DLMS_DATA_TYPE_UINT8:
case DLMS_DATA_TYPE_ENUM:
ret = ser_saveUInt8(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) != 0 ? *data->pbVal : data->bVal);
break;
case DLMS_DATA_TYPE_BOOLEAN:
if ((data->vt & DLMS_DATA_TYPE_BYREF) != 0)
{
ret = ser_saveUInt8(serializeSettings, *data->pbVal == 0 ? 0 : 1);
}
else
{
ret = ser_saveUInt8(serializeSettings, data->bVal == 0 ? 0 : 1);
}
break;
case DLMS_DATA_TYPE_UINT16:
ret = ser_saveUInt16(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) != 0 ? *data->puiVal : data->uiVal);
break;
case DLMS_DATA_TYPE_UINT32:
ret = ser_saveUInt32(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) != 0 ? *data->pulVal : data->ulVal);
break;
case DLMS_DATA_TYPE_UINT64:
ret = ser_saveUInt64(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) != 0 ? *data->pullVal : data->ullVal);
break;
case DLMS_DATA_TYPE_INT8:
ret = ser_saveUInt8(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) != 0 ? *data->pcVal : data->cVal);
break;
case DLMS_DATA_TYPE_INT16:
ret = ser_saveInt16(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) != 0 ? *data->puiVal : data->uiVal);
break;
case DLMS_DATA_TYPE_INT32:
ret = ser_saveUInt32(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) != 0 ? *data->plVal : data->lVal);
break;
case DLMS_DATA_TYPE_INT64:
ret = ser_saveInt64(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) != 0 ? *data->pllVal : data->llVal);
break;
case DLMS_DATA_TYPE_FLOAT32:
#ifndef DLMS_IGNORE_FLOAT32
ret = ser_saveFloat(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) != 0 ? *data->pfltVal : data->fltVal);
#else
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
#endif //DLMS_IGNORE_FLOAT32
break;
case DLMS_DATA_TYPE_FLOAT64:
#ifndef DLMS_IGNORE_FLOAT64
ret = ser_saveDouble(serializeSettings, (data->vt & DLMS_DATA_TYPE_BYREF) != 0 ? *data->pdblVal : data->dblVal);
#else
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
#endif //DLMS_IGNORE_FLOAT64
break;
case DLMS_DATA_TYPE_STRING:
#ifdef DLMS_IGNORE_MALLOC
ret = ser_setOctetString2(serializeSettings, data->pbVal, data->size, data->capacity);
#else
ret = ser_setOctetString2(serializeSettings, data->byteArr->data, (uint16_t)data->byteArr->size, (uint16_t)data->byteArr->capacity);
#endif //DLMS_IGNORE_MALLOC
break;
case DLMS_DATA_TYPE_OCTET_STRING:
#ifndef DLMS_IGNORE_MALLOC
if (data->vt == DLMS_DATA_TYPE_DATETIME)
{
if ((ret = ser_saveUInt8(serializeSettings, 12)) == 0)
{
ret = ser_saveDateTime2(data->dateTime, serializeSettings);
}
}
else if (data->vt == DLMS_DATA_TYPE_DATE)
{
if ((ret = ser_saveUInt8(serializeSettings, 5)) == 0)
{
ret = ser_saveDate(data->dateTime, serializeSettings);
}
}
else if (data->vt == DLMS_DATA_TYPE_TIME)
{
if ((ret = ser_saveUInt8(serializeSettings, 4)) == 0)
{
ret = ser_saveTime(data->dateTime, serializeSettings);
}
}
else
{
ret = ser_setOctetString2(serializeSettings, data->byteArr->data, (uint16_t)data->byteArr->size, (uint16_t)data->byteArr->capacity);
}
#else
if (data->vt == (DLMS_DATA_TYPE_BYREF | DLMS_DATA_TYPE_DATETIME))
{
if ((ret = ser_saveUInt8(serializeSettings, 12)) == 0)
{
ret = ser_saveDateTime2(data->pVal, serializeSettings);
}
}
else if (data->vt == (DLMS_DATA_TYPE_BYREF | DLMS_DATA_TYPE_DATE))
{
if ((ret = ser_saveUInt8(serializeSettings, 5)) == 0)
{
ret = ser_saveDate(data->pVal, serializeSettings);
}
}
else if (data->vt == (DLMS_DATA_TYPE_BYREF | DLMS_DATA_TYPE_TIME))
{
if ((ret = ser_saveUInt8(serializeSettings, 4)) == 0)
{
ret = ser_saveTime(data->pVal, serializeSettings);
}
}
else if (data->vt == (DLMS_DATA_TYPE_BYREF | DLMS_DATA_TYPE_OCTET_STRING))
{
if ((ret = ser_saveObjectCount(data->size, serializeSettings)) != 0 ||
#ifdef DLMS_IGNORE_MALLOC
(ret = ser_saveObjectCount(data->capacity, serializeSettings)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = ser_set(serializeSettings, data->pbVal, data->size, data->capacity)) != 0)
{
//Error code is returned at the end of the function.
}
}
#endif //DLMS_IGNORE_MALLOC
break;
case DLMS_DATA_TYPE_DATETIME:
{
#ifdef DLMS_IGNORE_MALLOC
ret = ser_saveDateTime2(data->pVal, serializeSettings);
#else
ret = ser_saveDateTime2(data->dateTime, serializeSettings);
#endif //DLMS_IGNORE_MALLOC
break;
}
case DLMS_DATA_TYPE_DATE:
{
#ifdef DLMS_IGNORE_MALLOC
ret = ser_saveDate(data->pVal, serializeSettings);
#else
ret = ser_saveDate(data->dateTime, serializeSettings);
#endif //DLMS_IGNORE_MALLOC
break;
}
case DLMS_DATA_TYPE_TIME:
{
#ifdef DLMS_IGNORE_MALLOC
ret = ser_saveTime(data->pVal, serializeSettings);
#else
ret = ser_saveTime(data->dateTime, serializeSettings);
#endif //DLMS_IGNORE_MALLOC
break;
}
case DLMS_DATA_TYPE_BIT_STRING:
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = ser_saveObjectCount(data->size, serializeSettings)) == 0 &&
(ret = ser_saveObjectCount(data->capacity, serializeSettings)) == 0)
{
ret = ser_set(serializeSettings, data->pVal, ba_getByteCount(data->size), ba_getByteCount(data->capacity));
}
#else
if ((ret = ser_saveObjectCount(data->bitArr->size, serializeSettings)) == 0)
{
ret = ser_set(serializeSettings, data->bitArr->data, ba_getByteCount(data->bitArr->size)
#ifdef DLMS_IGNORE_MALLOC
, ba_getByteCount(ba_getCapacity(data->bitArr))
#endif //DLMS_IGNORE_MALLOC
);
}
#endif //DLMS_IGNORE_MALLOC
break;
}
default:
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
assert(0);
#endif
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
//Returns bytes as Big Endian byteorder.
int ser_saveBytes(
dlmsVARIANT* data,
gxSerializerSettings* serializeSettings)
{
return ser_saveBytes3(data, data->vt, serializeSettings);
}
unsigned char isAttributeSet(gxSerializerSettings* serializeSettings, uint16_t attributes, unsigned char index)
{
#ifdef DLMS_IGNORE_MALLOC
serializeSettings->currentIndex = index;
#endif //DLMS_IGNORE_MALLOC
return (attributes & 1 << (index - 1)) != 0;
}
//Returns ignored attributes.
uint16_t ser_getIgnoredAttributes(gxSerializerSettings* serializeSettings, gxObject* object)
{
uint16_t ret = 0;
if (serializeSettings != NULL)
{
int pos;
for (pos = 0; pos != serializeSettings->count; ++pos)
{
if (serializeSettings->ignoredAttributes[pos].target == object ||
serializeSettings->ignoredAttributes[pos].objectType == object->objectType)
{
ret |= serializeSettings->ignoredAttributes[pos].attributes;
}
}
}
return ret;
}
int ser_saveDateTime(gxtime* value, gxSerializerSettings* serializeSettings)
{
int ret;
if ((ret = ser_saveDateTime2(value, serializeSettings)) != 0)
{
//Error code is returned at the end of the function.
}
return ret;
}
int ser_saveOctetString(gxSerializerSettings* serializeSettings, gxByteBuffer* value)
{
int ret;
if ((ret = ser_saveObjectCount(bb_size(value), serializeSettings)) == 0 &&
#ifndef DLMS_IGNORE_MALLOC
(ret = ser_set(serializeSettings, value->data, bb_size(value)
#ifdef DLMS_IGNORE_MALLOC
, bb_getCapacity(value)
#endif //DLMS_IGNORE_MALLOC
)) == 0)
#else
(ret = ser_saveObjectCount(bb_getCapacity(value), serializeSettings)) == 0 &&
(ret = ser_set(serializeSettings, value->data, bb_getCapacity(value), bb_getCapacity(value))) == 0)
#endif //DLMS_IGNORE_MALLOC
{
//Error code is returned at the end of the function.
}
return ret;
}
int ser_saveOctetString3(gxSerializerSettings* serializeSettings, char* value, uint16_t len, uint16_t capacity)
{
int ret;
if (capacity < len)
{
//size is bigger then the capacity.
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
else
{
if ((ret = ser_saveObjectCount(len, serializeSettings)) != 0 ||
#ifndef DLMS_IGNORE_MALLOC
(ret = ser_set(serializeSettings, (unsigned char*)value, len)) != 0)
#else
(ret = ser_saveObjectCount(capacity, serializeSettings)) != 0 ||
(ret = ser_set(serializeSettings, (unsigned char*)value, len, capacity)) != 0)
#endif //DLMS_IGNORE_MALLOC
{
//Error code is returned at the end of the function.
}
}
return ret;
}
int ser_saveOctetString2(gxSerializerSettings* serializeSettings, char* value, uint16_t capacity)
{
uint16_t len;
if (value != NULL)
{
len = (uint16_t)strlen(value);
}
else
{
len = 0;
}
return ser_saveOctetString3(serializeSettings, value, len, capacity);
}
int ser_saveBitString(gxSerializerSettings* serializeSettings, bitArray* value)
{
int ret;
if ((ret = ser_saveObjectCount(value->size, serializeSettings)) != 0 ||
#ifndef DLMS_IGNORE_MALLOC
(ret = ser_set(serializeSettings, value->data, ba_getByteCount(value->size))) != 0)
#else
(ret = ser_saveObjectCount(ba_getByteCount(ba_getCapacity(value)), serializeSettings)) != 0 ||
(ret = ser_set(serializeSettings, value->data, ba_getByteCount(ba_getCapacity(value)), ba_getByteCount(ba_getCapacity(value)))) != 0)
#endif
{
//Error code is returned at the end of the function.
}
return ret;
}
int ser_saveBitString2(gxSerializerSettings* serializeSettings, unsigned char* value, int size, int capacity)
{
int ret;
if ((ret = ser_saveObjectCount(size, serializeSettings)) != 0 ||
#ifndef DLMS_IGNORE_MALLOC
(ret = ser_set(serializeSettings, value, ba_getByteCount(size))) != 0)
#else
(ret = ser_saveObjectCount(ba_getByteCount(capacity), serializeSettings)) != 0 ||
(ret = ser_set(serializeSettings, value, ba_getByteCount(capacity), ba_getByteCount(capacity))) != 0)
#endif
{
//Error code is returned at the end of the function.
}
return ret;
}
int ser_saveObjectArrayCount(gxSerializerSettings* serializeSettings, objectArray* arr, uint16_t* count)
{
int ret;
if ((ret = ser_saveObjectCount(arr->size, serializeSettings)) == 0)
{
*count = arr->size;
#ifdef DLMS_IGNORE_MALLOC
arr->size = oa_getCapacity(arr);
if ((ret = ser_saveObjectCount(arr->size, serializeSettings)) != 0)
{
return ret;
}
#else
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
int ser_saveVariantArrayCount(gxSerializerSettings* serializeSettings, variantArray* arr, uint16_t* count)
{
int ret;
if ((ret = ser_saveObjectCount(arr->size, serializeSettings)) == 0)
{
*count = arr->size;
#ifdef DLMS_IGNORE_MALLOC
arr->size = va_getCapacity(arr);
if ((ret = ser_saveObjectCount(arr->size, serializeSettings)) != 0)
{
return ret;
}
#else
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
int ser_saveArrayCount(gxSerializerSettings* serializeSettings, gxArray* arr, uint16_t* count)
{
int ret;
if ((ret = ser_saveObjectCount(arr->size, serializeSettings)) == 0)
{
*count = arr->size;
#ifdef DLMS_IGNORE_MALLOC
arr->size = arr_getCapacity(arr);
if ((ret = ser_saveObjectCount(arr->size, serializeSettings)) != 0)
{
return ret;
}
#else
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
#ifndef DLMS_IGNORE_DATA
int ser_saveData(gxSerializerSettings* serializeSettings, gxData* object)
{
if (!isAttributeSet(serializeSettings, ser_getIgnoredAttributes(serializeSettings, (gxObject*)object), 2))
{
return ser_saveBytes(&object->value, serializeSettings);
}
return 0;
}
#endif //DLMS_IGNORE_DATA
#ifndef DLMS_IGNORE_REGISTER
int ser_saveRegister(
gxSerializerSettings* serializeSettings,
gxRegister* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 3))
{
if ((ret = ser_saveUInt8(serializeSettings, object->scaler)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->unit)) != 0)
{
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 2))
{
if ((ret = ser_saveBytes(&object->value, serializeSettings)) != 0)
{
}
}
return ret;
}
#endif //DLMS_IGNORE_REGISTER
#ifndef DLMS_IGNORE_CLOCK
int ser_saveClock(
gxSerializerSettings* serializeSettings,
gxClock* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveDateTime(&object->time, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveInt16(serializeSettings, object->timeZone)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveUInt8(serializeSettings, object->status)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveDateTime(&object->begin, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_saveDateTime(&object->end, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_saveUInt8(serializeSettings, object->deviation)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_saveUInt8(serializeSettings, object->enabled)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_saveUInt8(serializeSettings, object->clockBase)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_CLOCK
#ifndef DLMS_IGNORE_SCRIPT_TABLE
int ser_saveScriptTable(
gxSerializerSettings* serializeSettings,
gxScriptTable* object)
{
int ret = 0, pos, pos2;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
uint16_t count, count2;
gxScript* s;
gxScriptAction* sa;
if ((ret = ser_saveArrayCount(serializeSettings, &object->scripts, &count)) == 0)
{
for (pos = 0; pos != object->scripts.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(&object->scripts, pos, (void**)&s, sizeof(gxScript), 0)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex3(&object->scripts, pos, (void**)&s, 0)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = ser_saveUInt16(serializeSettings, s->id)) == 0 &&
(ret = ser_saveArrayCount(serializeSettings, &s->actions, &count2)) == 0)
{
for (pos2 = 0; pos2 != s->actions.size; ++pos2)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(&s->actions, pos2, (void**)&sa, sizeof(gxScriptAction), 0)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, sa->type)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex3(&s->actions, pos2, (void**)&sa, 0)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, sa->type)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
#ifndef DLMS_IGNORE_OBJECT_POINTERS
if (sa->target == NULL)
{
if ((ret = ser_saveUInt16(serializeSettings, 0)) != 0 ||
(ret = ser_set(serializeSettings, EMPTY_LN, sizeof(EMPTY_LN)
#ifdef DLMS_IGNORE_MALLOC
, sizeof(EMPTY_LN)
#endif //DLMS_IGNORE_MALLOC
)) != 0)
{
break;
}
}
else
{
if ((ret = ser_saveUInt16(serializeSettings, sa->target->objectType)) != 0 ||
(ret = ser_set(serializeSettings, sa->target->logicalName, sizeof(sa->target->logicalName)
#ifdef DLMS_IGNORE_MALLOC
, sizeof(sa->target->logicalName)
#endif //DLMS_IGNORE_MALLOC
)) != 0)
{
break;
}
}
#else
if ((ret = ser_saveUInt16(serializeSettings, sa->objectType)) != 0 ||
(ret = ser_set(serializeSettings, sa->logicalName, sizeof(sa->logicalName))) != 0)
{
break;
}
#endif //DLMS_IGNORE_OBJECT_POINTERS
if ((ret = ser_saveUInt8(serializeSettings, sa->index)) != 0 ||
(ret = ser_saveBytes(&sa->parameter, serializeSettings)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
s->actions.size = count2;
#endif //DLMS_IGNORE_MALLOC
}
if (ret != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
object->scripts.size = count;
#endif //DLMS_IGNORE_MALLOC
}
}
return ret;
}
#endif //DLMS_IGNORE_SCRIPT_TABLE
#ifndef DLMS_IGNORE_SPECIAL_DAYS_TABLE
int ser_saveSpecialDaysTable(
gxSerializerSettings* serializeSettings,
gxSpecialDaysTable* object)
{
int ret = 0;
uint16_t pos, count;
gxSpecialDay* sd;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
if ((ret = ser_saveArrayCount(serializeSettings, &object->entries, &count)) == 0)
{
for (pos = 0; pos != object->entries.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(&object->entries, pos, (void**)&sd, sizeof(gxSpecialDay), 0)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex3(&object->entries, pos, (void**)&sd, 0)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = ser_saveUInt16(serializeSettings, sd->index)) != 0 ||
(ret = ser_saveDateTime(&sd->date, serializeSettings)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, sd->dayId)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
object->entries.size = count;
#endif //DLMS_IGNORE_MALLOC
}
}
return ret;
}
#endif //DLMS_IGNORE_SPECIAL_DAYS_TABLE
#ifndef DLMS_IGNORE_TCP_UDP_SETUP
int ser_saveTcpUdpSetup(
gxSerializerSettings* serializeSettings,
gxTcpUdpSetup* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveUInt16(serializeSettings, object->port)) != 0) ||
#ifndef DLMS_IGNORE_OBJECT_POINTERS
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_set(serializeSettings, obj_getLogicalName(object->ipSetup), 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0) ||
#else
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_set(&ba, object->ipReference, 6)) != 0) ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveUInt16(serializeSettings, object->maximumSegmentSize)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveUInt8(serializeSettings, object->maximumSimultaneousConnections)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_saveUInt16(serializeSettings, object->inactivityTimeout)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_TCP_UDP_SETUP
#ifndef DLMS_IGNORE_MBUS_MASTER_PORT_SETUP
int ser_saveMBusMasterPortSetup(
gxSerializerSettings* serializeSettings,
gxMBusMasterPortSetup* object)
{
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
return ser_saveUInt8(serializeSettings, object->commSpeed);
}
return 0;
}
#endif //DLMS_IGNORE_MBUS_MASTER_PORT_SETUP
int saveTimeWindow(gxSerializerSettings* serializeSettings, gxArray* arr)
{
int ret;
uint16_t count, pos;
#ifdef DLMS_IGNORE_MALLOC
gxTimePair* k;
#else
gxKey* k;
#endif //DLMS_IGNORE_MALLOC
if ((ret = ser_saveArrayCount(serializeSettings, arr, &count)) == 0)
{
for (pos = 0; pos != arr->size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(arr, pos, (void**)&k, sizeof(gxTimePair), 0)) != 0 ||
(ret = ser_saveDateTime(&k->first, serializeSettings)) != 0 ||
(ret = ser_saveDateTime(&k->second, serializeSettings)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(arr, pos, (void**)&k), 0) != 0 ||
(ret = ser_saveDateTime((gxtime*)k->key, serializeSettings)) != 0 ||
(ret = ser_saveDateTime((gxtime*)k->value, serializeSettings)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
#ifdef DLMS_IGNORE_MALLOC
arr->size = count;
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
int saveObjectsInternal(gxSerializerSettings* serializeSettings, gxArray* objects)
{
uint16_t count, pos;
int ret;
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
gxTarget* it;
#else
gxKey* it;
#endif //DLMS_IGNORE_MALLOC
if ((ret = ser_saveArrayCount(serializeSettings, objects, &count)) == 0)
{
for (pos = 0; pos != objects->size; ++pos)
{
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(objects, pos, (void**)&it, sizeof(gxTarget), 0)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, pos < count ? it->target->objectType : 0)) != 0 ||
(ret = ser_set(serializeSettings, pos < count ? obj_getLogicalName(it->target) : EMPTY_LN, 6, 6)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, pos < count ? it->attributeIndex : 0)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, pos < count ? it->dataIndex : 0)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex3(objects, pos, (void**)&it, 0)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, pos < objects->size ? it->target->objectType : 0)) != 0 ||
(ret = ser_set(serializeSettings, obj_getLogicalName(it->target), 6, 6)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, pos < objects->size ? it->attributeIndex : 0)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, pos < objects->size ? it->dataIndex : 0)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
#else
if ((ret = arr_getByIndex3(objects, pos, (void**)&it, 0)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, pos < objects->size ? ((gxObject*)it->key)->objectType : 0)) != 0 ||
(ret = ser_set(serializeSettings, obj_getLogicalName((gxObject*)it->key), 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, pos < objects->size ? ((gxTarget*)it->value)->attributeIndex : 0)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, pos < objects->size ? ((gxTarget*)it->value)->dataIndex : 0)) != 0)
{
break;
}
#endif //defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
}
#ifdef DLMS_IGNORE_MALLOC
objects->size = count;
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
#ifndef DLMS_IGNORE_PUSH_SETUP
int ser_savePushSetup(
gxSerializerSettings* serializeSettings,
gxPushSetup* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = saveObjectsInternal(serializeSettings, &object->pushObjectList)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) &&
((ret = ser_saveUInt8(serializeSettings, object->service)) != 0 ||
(ret = ser_saveOctetString(serializeSettings, &object->destination)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->message)) != 0)) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = saveTimeWindow(serializeSettings, &object->communicationWindow)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveUInt16(serializeSettings, object->randomisationStartInterval)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_saveUInt8(serializeSettings, object->numberOfRetries)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_saveUInt16(serializeSettings, object->repetitionDelay)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_PUSH_SETUP
#ifndef DLMS_IGNORE_AUTO_CONNECT
int ser_saveAutoConnect(
gxSerializerSettings* serializeSettings,
gxAutoConnect* object)
{
#ifdef DLMS_IGNORE_MALLOC
gxDestination* dest;
#else
gxByteBuffer* dest;
#endif //DLMS_IGNORE_MALLOC
uint16_t pos, count;
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveUInt8(serializeSettings, object->mode)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveUInt8(serializeSettings, object->repetitions)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveUInt16(serializeSettings, object->repetitionDelay)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = saveTimeWindow(serializeSettings, &object->callingWindow)) != 0))
{
}
else
{
if (!isAttributeSet(serializeSettings, ignored, 6))
{
if ((ret = ser_saveArrayCount(serializeSettings, &object->destinations, &count)) == 0)
{
for (pos = 0; pos != object->destinations.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(&object->destinations, pos, (void**)&dest, sizeof(gxDestination), 0)) != 0 ||
(ret = ser_saveOctetString3(serializeSettings, (char*)dest->value, dest->size, sizeof(dest->value))) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex3(&object->destinations, pos, (void**)&dest, 0)) != 0 ||
(ret = ser_saveOctetString3(serializeSettings, (char*)dest->data, (unsigned short)dest->size, (unsigned short)dest->capacity)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
#ifdef DLMS_IGNORE_MALLOC
object->destinations.size = count;
#endif //DLMS_IGNORE_MALLOC
}
}
return ret;
}
#endif //DLMS_IGNORE_AUTO_CONNECT
#ifndef DLMS_IGNORE_ACTIVITY_CALENDAR
int ser_saveSeasonProfile(gxArray* arr, gxSerializerSettings* serializeSettings)
{
gxSeasonProfile* it;
int ret;
uint16_t pos, count;
if ((ret = ser_saveArrayCount(serializeSettings, arr, &count)) == 0)
{
for (pos = 0; pos != arr->size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(arr, pos, (void**)&it, sizeof(gxSeasonProfile), 0)) != 0)
{
break;
}
if ((ret = ser_saveOctetString3(serializeSettings, (char*)it->name.value, it->name.size, sizeof(it->name.value))) != 0 ||
(ret = ser_saveDateTime(&it->start, serializeSettings)) != 0 ||
(ret = ser_saveOctetString3(serializeSettings, (char*)it->weekName.value, it->weekName.size, sizeof(it->weekName.value))) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex3(arr, pos, (void**)&it, 0)) != 0)
{
break;
}
if ((ret = ser_saveOctetString(serializeSettings, &it->name)) != 0 ||
(ret = ser_saveDateTime(&it->start, serializeSettings)) != 0 ||
(ret = ser_saveOctetString(serializeSettings, &it->weekName)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
#ifdef DLMS_IGNORE_MALLOC
arr->size = count;
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
int ser_saveweekProfile(gxArray* arr, gxSerializerSettings* serializeSettings)
{
gxWeekProfile* it;
int ret;
uint16_t pos, count;
if ((ret = ser_saveArrayCount(serializeSettings, arr, &count)) == 0)
{
for (pos = 0; pos != arr->size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(arr, pos, (void**)&it, sizeof(gxWeekProfile), 0)) != 0 ||
(ret = ser_saveOctetString3(serializeSettings, (char*)it->name.value, it->name.size, sizeof(it->name.value))) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex3(arr, pos, (void**)&it, 0)) != 0 ||
(ret = ser_saveOctetString(serializeSettings, &it->name)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = ser_saveUInt8(serializeSettings, it->monday)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->tuesday)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->wednesday)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->thursday)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->friday)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->saturday)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->sunday)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
arr->size = count;
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
int ser_saveDayProfile(gxArray* arr, gxSerializerSettings* serializeSettings)
{
gxDayProfile* dp;
gxDayProfileAction* it;
int ret;
uint16_t pos, pos2, count, count2;
if ((ret = ser_saveArrayCount(serializeSettings, arr, &count)) == 0)
{
for (pos = 0; pos != arr->size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(arr, pos, (void**)&dp, sizeof(gxDayProfile), 0)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex3(arr, pos, (void**)&dp, 0)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = ser_saveUInt8(serializeSettings, dp->dayId)) != 0 ||
(ret = ser_saveArrayCount(serializeSettings, &dp->daySchedules, &count2)) != 0)
{
break;
}
for (pos2 = 0; pos2 != dp->daySchedules.size; ++pos2)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(&dp->daySchedules, pos2, (void**)&it, sizeof(gxDayProfileAction), 0)) != 0 ||
#else
if ((ret = arr_getByIndex3(&dp->daySchedules, pos2, (void**)&it, 0)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
#ifndef DLMS_IGNORE_OBJECT_POINTERS
(ret = ser_set(serializeSettings, obj_getLogicalName(it->script), 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
#else
(ret = hlp_appendLogicalName(serializeSettings, it->scriptLogicalName)) != 0 ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
(ret = ser_saveUInt16(serializeSettings, it->scriptSelector)) != 0 ||
(ret = ser_saveDateTime(&it->startTime, serializeSettings)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
dp->daySchedules.size = count2;
#endif //DLMS_IGNORE_MALLOC
}
#ifdef DLMS_IGNORE_MALLOC
arr->size = count;
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
int ser_saveActivityCalendar(
gxSerializerSettings* serializeSettings,
gxActivityCalendar* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveOctetString(serializeSettings, &object->calendarNameActive)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveSeasonProfile(&object->seasonProfileActive, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveweekProfile(&object->weekProfileTableActive, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveDayProfile(&object->dayProfileTableActive, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_saveOctetString(serializeSettings, &object->calendarNamePassive)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_saveSeasonProfile(&object->seasonProfilePassive, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_saveweekProfile(&object->weekProfileTablePassive, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_saveDayProfile(&object->dayProfileTablePassive, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 10) && (ret = ser_saveDateTime(&object->time, serializeSettings)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_ACTIVITY_CALENDAR
#ifndef DLMS_IGNORE_SECURITY_SETUP
int ser_saveSecuritySetup(
gxSerializerSettings* serializeSettings,
gxSecuritySetup* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveUInt8(serializeSettings, object->securityPolicy)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveUInt8(serializeSettings, object->securitySuite)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveOctetString(serializeSettings, &object->serverSystemTitle)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveOctetString(serializeSettings, &object->clientSystemTitle)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_SECURITY_SETUP
#ifndef DLMS_IGNORE_IEC_HDLC_SETUP
int ser_saveHdlcSetup(
gxSerializerSettings* serializeSettings,
gxIecHdlcSetup* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveUInt8(serializeSettings, object->communicationSpeed)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveUInt8(serializeSettings, object->windowSizeTransmit)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveUInt8(serializeSettings, object->windowSizeReceive)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveUInt16(serializeSettings, object->maximumInfoLengthTransmit)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_saveUInt16(serializeSettings, object->maximumInfoLengthReceive)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_saveUInt16(serializeSettings, object->interCharachterTimeout)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_saveUInt16(serializeSettings, object->inactivityTimeout)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_saveUInt16(serializeSettings, object->deviceAddress)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_IEC_HDLC_SETUP
#ifndef DLMS_IGNORE_IEC_LOCAL_PORT_SETUP
int ser_saveLocalPortSetup(
gxSerializerSettings* serializeSettings,
gxLocalPortSetup* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveUInt8(serializeSettings, object->defaultMode)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveUInt8(serializeSettings, object->defaultBaudrate)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveUInt8(serializeSettings, object->proposedBaudrate)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveUInt8(serializeSettings, object->responseTime)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_saveOctetString(serializeSettings, &object->deviceAddress)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_saveOctetString(serializeSettings, &object->password1)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_saveOctetString(serializeSettings, &object->password2)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_saveOctetString(serializeSettings, &object->password5)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_IEC_LOCAL_PORT_SETUP
#ifndef DLMS_IGNORE_IEC_TWISTED_PAIR_SETUP
int ser_saveIecTwistedPairSetup(
gxSerializerSettings* serializeSettings,
gxIecTwistedPairSetup* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveUInt8(serializeSettings, object->mode)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveUInt8(serializeSettings, object->speed)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveOctetString(serializeSettings, &object->primaryAddresses)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveOctetString(serializeSettings, &object->tabis)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_IEC_TWISTED_PAIR_SETUP
#ifndef DLMS_IGNORE_DEMAND_REGISTER
int ser_saveDemandRegister(
gxSerializerSettings* serializeSettings,
gxDemandRegister* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveBytes(&object->currentAverageValue, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveBytes(&object->lastAverageValue, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveUInt8(serializeSettings, object->scaler)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveUInt8(serializeSettings, object->unit)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_saveBytes(&object->status, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_saveDateTime(&object->captureTime, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_saveDateTime(&object->startTimeCurrent, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_saveUInt32(serializeSettings, object->period)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 10) && (ret = ser_saveUInt16(serializeSettings, object->numberOfPeriods)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_DEMAND_REGISTER
#ifndef DLMS_IGNORE_REGISTER_ACTIVATION
int ser_saveRegisterActivation(
gxSerializerSettings* serializeSettings,
gxRegisterActivation* object)
{
int ret = 0;
uint16_t count, pos;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
#ifdef DLMS_IGNORE_OBJECT_POINTERS
gxObjectDefinition* od;
#else
gxObject* od;
#endif //DLMS_IGNORE_OBJECT_POINTERS
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
gxRegisterActivationMask* it;
#else
gxKey* it;
#endif //DLMS_IGNORE_MALLOC
if (!isAttributeSet(serializeSettings, ignored, 2))
{
#if defined(DLMS_IGNORE_MALLOC)
if ((ret = ser_saveArrayCount(serializeSettings, &object->registerAssignment, &count)) == 0)
#else
if ((ret = ser_saveObjectArrayCount(serializeSettings, &object->registerAssignment, &count)) == 0)
#endif //DLMS_IGNORE_MALLOC
{
for (pos = 0; pos != object->registerAssignment.size; ++pos)
{
#ifndef DLMS_IGNORE_OBJECT_POINTERS
#if defined(DLMS_IGNORE_MALLOC)
if ((ret = arr_getByIndexRef(&object->registerAssignment, pos, (void**)&od)) != 0 ||
#else
#if defined(DLMS_COSEM_EXACT_DATA_TYPES)
if ((ret = arr_getByIndex3(&object->registerAssignment, pos, (void**)&od, 0)) != 0 ||
#else
if ((ret = oa_getByIndex(&object->registerAssignment, pos, &od)) != 0 ||
#endif //defined(DLMS_COSEM_EXACT_DATA_TYPES)
#endif //DLMS_IGNORE_MALLOC
#else
if ((ret = arr_getByIndex3(&object->registerAssignment, pos, (void**)&od, 0)) != 0 ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
(ret = ser_saveUInt16(serializeSettings, pos < count && od != NULL ? od->objectType : 0)) != 0 ||
(ret = ser_set(serializeSettings, pos < count && od != NULL ? obj_getLogicalName(od) : EMPTY_LN, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
object->registerAssignment.size = count;
#endif //DLMS_IGNORE_MALLOC
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3) &&
(ret = ser_saveArrayCount(serializeSettings, &object->maskList, &count)) == 0)
{
for (pos = 0; pos != object->maskList.size; ++pos)
{
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(&object->maskList, pos, (void**)&it, sizeof(gxRegisterActivationMask), 0)) != 0 ||
(ret = ser_saveOctetString3(serializeSettings, (char*)it->name, it->length, sizeof(it->name))) != 0 ||
(ret = ser_saveOctetString3(serializeSettings, (char*)it->indexes, it->count, sizeof(it->indexes))) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex4(&object->maskList, pos, (void**)&it, sizeof(gxRegisterActivationMask), 0)) != 0 ||
(ret = ser_saveOctetString(serializeSettings, &it->name)) != 0 ||
(ret = ser_saveOctetString(serializeSettings, &it->indexes)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
#else
if ((ret = arr_getByIndex3(&object->maskList, pos, (void**)&it, 0)) != 0 ||
(ret = ser_saveOctetString(serializeSettings, (gxByteBuffer*)it->key)) != 0 ||
(ret = ser_saveOctetString(serializeSettings, (gxByteBuffer*)it->value)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
#ifdef DLMS_IGNORE_MALLOC
object->maskList.size = count;
#endif //DLMS_IGNORE_MALLOC
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4))
{
ret = ser_saveOctetString(serializeSettings, &object->activeMask);
}
return ret;
}
#endif //DLMS_IGNORE_REGISTER_ACTIVATION
#if !(defined(DLMS_IGNORE_REGISTER_MONITOR) && defined(DLMS_IGNORE_LIMITER))
int ser_saveActionItem(
gxActionItem* item,
gxSerializerSettings* serializeSettings)
{
int ret;
#ifndef DLMS_IGNORE_OBJECT_POINTERS
if ((ret = ser_set(serializeSettings, obj_getLogicalName((gxObject*)item->script), 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
#else
if ((ret = ser_set(serializeSettings, item->logicalName, 6)) != 0 ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
(ret = ser_saveUInt16(serializeSettings, item->scriptSelector)) != 0)
{
}
return ret;
}
#endif //!defined(DLMS_IGNORE_REGISTER_MONITOR) && !defined(DLMS_IGNORE_LIMITER)
#ifndef DLMS_IGNORE_REGISTER_MONITOR
int ser_saveRegisterMonitor(
gxSerializerSettings* serializeSettings,
gxRegisterMonitor* object)
{
int ret = 0;
uint16_t count, pos;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
dlmsVARIANT* tmp;
gxActionSet* as;
if (!isAttributeSet(serializeSettings, ignored, 2))
{
if ((ret = ser_saveVariantArrayCount(serializeSettings, &object->thresholds, &count)) == 0)
{
for (pos = 0; pos != object->thresholds.size; ++pos)
{
if (pos < object->thresholds.size)
{
if ((ret = va_getByIndex(&object->thresholds, pos, &tmp)) != 0)
{
break;
}
}
if ((ret = ser_saveBytes(tmp, serializeSettings)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
object->thresholds.size = count;
#endif //DLMS_IGNORE_MALLOC
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3))
{
#ifndef DLMS_IGNORE_OBJECT_POINTERS
if (((ret = ser_saveUInt16(serializeSettings, object->monitoredValue.target == NULL ? 0 : object->monitoredValue.target->objectType)) != 0 ||
(ret = ser_set(serializeSettings, obj_getLogicalName(object->monitoredValue.target), 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0))
{
}
#else
if ((ret = ser_saveUInt16(serializeSettings, object->monitoredValue.target == NULL ? 0 : object->monitoredValue.objectType)) != 0 ||
(ret = ser_set(serializeSettings, obj_getLogicalName(object->monitoredValue.logicalName), 6)) != 0)
{
}
#endif //DLMS_IGNORE_OBJECT_POINTERS
if (ret == 0)
{
ret = ser_saveUInt8(serializeSettings, object->monitoredValue.attributeIndex);
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4))
{
if ((ret = ser_saveArrayCount(serializeSettings, &object->actions, &count)) == 0)
{
for (pos = 0; pos != object->actions.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(&object->actions, pos, (void**)&as, sizeof(gxActionSet), 0)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex3(&object->actions, pos, (void**)&as, 0)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = ser_saveActionItem(&as->actionUp, serializeSettings)) != 0 ||
(ret = ser_saveActionItem(&as->actionDown, serializeSettings)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
object->actions.size = count;
#endif //DLMS_IGNORE_MALLOC
}
}
return ret;
}
#endif //DLMS_IGNORE_REGISTER_MONITOR
#ifndef DLMS_IGNORE_ACTION_SCHEDULE
int ser_saveActionSchedule(
gxSerializerSettings* serializeSettings,
gxActionSchedule* object)
{
uint16_t pos, count;
int ret = 0;
gxtime* tm;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
#ifndef DLMS_IGNORE_OBJECT_POINTERS
if ((ret = ser_set(serializeSettings, obj_getLogicalName((gxObject*)object->executedScript), 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) == 0)
{
ret = ser_saveUInt16(serializeSettings, object->executedScriptSelector);
}
#else
if ((ret = ser_set(serializeSettings, object->executedScriptLogicalName, 6)) == 0)
{
ret = ser_saveUInt16(serializeSettings, object->executedScriptSelector);
}
#endif //DLMS_IGNORE_OBJECT_POINTERS
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3))
{
ret = ser_saveUInt8(serializeSettings, object->type);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4))
{
//Add count.
if ((ret = ser_saveArrayCount(serializeSettings, &object->executionTime, &count)) == 0)
{
for (pos = 0; pos != object->executionTime.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(&object->executionTime, pos, (void**)&tm, sizeof(gxtime), 0)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex3(&object->executionTime, pos, (void**)&tm, 0)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = ser_saveDateTime(tm, serializeSettings)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
object->executionTime.size = count;
#endif //DLMS_IGNORE_MALLOC
}
}
return ret;
}
#endif //DLMS_IGNORE_ACTION_SCHEDULE
#ifndef DLMS_IGNORE_SAP_ASSIGNMENT
int ser_saveSapAssignment(
gxSerializerSettings* serializeSettings,
gxSapAssignment* object)
{
uint16_t pos, count;
int ret = 0;
gxSapItem* it;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
//Add count.
if ((ret = ser_saveArrayCount(serializeSettings, &object->sapAssignmentList, &count)) == 0)
{
for (pos = 0; pos != object->sapAssignmentList.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(&object->sapAssignmentList, pos, (void**)&it, sizeof(gxSapItem), 0)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, it->id)) != 0 ||
(ret = ser_saveOctetString3(serializeSettings, (char*)it->name.value, it->name.size, sizeof(it->name.value))) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex3(&object->sapAssignmentList, pos, (void**)&it, 0)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, it->id)) != 0 ||
(ret = ser_saveOctetString(serializeSettings, &it->name)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
#ifdef DLMS_IGNORE_MALLOC
object->sapAssignmentList.size = count;
#endif //DLMS_IGNORE_MALLOC
}
}
return ret;
}
#endif //DLMS_IGNORE_SAP_ASSIGNMENT
#ifndef DLMS_IGNORE_AUTO_ANSWER
int ser_saveAutoAnswer(
gxSerializerSettings* serializeSettings,
gxAutoAnswer* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveUInt8(serializeSettings, object->mode)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = saveTimeWindow(serializeSettings, &object->listeningWindow)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveUInt8(serializeSettings, object->status)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveUInt8(serializeSettings, object->numberOfCalls)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_saveUInt8(serializeSettings, object->numberOfRingsInListeningWindow)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_saveUInt8(serializeSettings, object->numberOfRingsOutListeningWindow)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_saveUInt8(serializeSettings, object->numberOfRingsOutListeningWindow)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_AUTO_ANSWER
#ifndef DLMS_IGNORE_IP4_SETUP
int ser_saveIp4Setup(
gxSerializerSettings* serializeSettings,
gxIp4Setup* object)
{
uint16_t pos, count;
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
uint32_t* tmp;
#else
dlmsVARIANT* tmp;
#endif //DLMS_IGNORE_MALLOC
gxip4SetupIpOption* ip;
if (!isAttributeSet(serializeSettings, ignored, 2))
{
#ifndef DLMS_IGNORE_OBJECT_POINTERS
ret = ser_set(serializeSettings, obj_getLogicalName(object->dataLinkLayer), 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
);
#else
ret = ser_set(serializeSettings, object->dataLinkLayerReference, 6);
#endif //DLMS_IGNORE_OBJECT_POINTERS
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3))
{
(ret = ser_saveUInt32(serializeSettings, object->ipAddress));
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4))
{
#if defined(DLMS_IGNORE_MALLOC)
if ((ret = ser_saveArrayCount(serializeSettings, &object->multicastIPAddress, &count)) == 0)
#else
if ((ret = ser_saveVariantArrayCount(serializeSettings, &object->multicastIPAddress, &count)) == 0)
#endif //DLMS_IGNORE_MALLOC
{
for (pos = 0; pos != object->multicastIPAddress.size; ++pos)
{
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
if ((ret = arr_getByIndex4(&object->multicastIPAddress, pos, (void**)&tmp, sizeof(uint32_t), 0)) != 0 ||
(ret = ser_saveUInt32(serializeSettings, *tmp)) != 0)
{
break;
}
#else
if ((ret = va_getByIndex(&object->multicastIPAddress, pos, &tmp)) != 0 ||
(ret = ser_saveUInt32(serializeSettings, tmp->ulVal)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
#ifdef DLMS_IGNORE_MALLOC
object->multicastIPAddress.size = count;
#endif //DLMS_IGNORE_MALLOC
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 5) &&
(ret = ser_saveArrayCount(serializeSettings, &object->ipOptions, &count)) == 0)
{
for (pos = 0; pos != object->ipOptions.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(&object->ipOptions, pos, (void**)&ip, sizeof(gxip4SetupIpOption), 0)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex3(&object->ipOptions, pos, (void**)&ip, 0)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = ser_saveUInt8(serializeSettings, ip->type)) != 0)
{
break;
}
#ifdef DLMS_IGNORE_MALLOC
if ((ret = ser_saveOctetString3(serializeSettings, (char*)ip->data.value, ip->data.size, sizeof(ip->data.value))) != 0)
{
break;
}
#else
if ((ret = ser_saveOctetString(serializeSettings, &ip->data)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
#ifdef DLMS_IGNORE_MALLOC
object->ipOptions.size = count;
#endif //DLMS_IGNORE_MALLOC
}
if (ret == 0)
{
if ((!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_saveUInt32(serializeSettings, object->subnetMask)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_saveUInt32(serializeSettings, object->gatewayIPAddress)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_saveUInt8(serializeSettings, object->useDHCP)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_saveUInt32(serializeSettings, object->primaryDNSAddress)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 10) && (ret = ser_saveUInt32(serializeSettings, object->secondaryDNSAddress)) != 0))
{
}
}
return ret;
}
#endif //DLMS_IGNORE_IP4_SETUP
#ifndef DLMS_IGNORE_IP6_SETUP
int saveIpv6Address(IN6_ADDR* address, gxSerializerSettings* serializeSettings)
{
unsigned char* tmp;
#if defined(_WIN32) || defined(_WIN64)//Windows includes
tmp = address->u.Byte;
#else //Linux includes.
tmp = address->s6_addr;
#endif
return ser_set(serializeSettings, tmp, 16
#ifdef DLMS_IGNORE_MALLOC
, 16
#endif //DLMS_IGNORE_MALLOC
);
}
int saveAddressList(gxArray* list, gxSerializerSettings* serializeSettings)
{
IN6_ADDR* it;
uint16_t pos, count;
int ret = 0;
if ((ret = ser_saveArrayCount(serializeSettings, list, &count)) == 0)
{
for (pos = 0; pos != list->size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(list, pos, (void**)&it, sizeof(IN6_ADDR), 0)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex3(list, pos, (void**)&it, 0)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = saveIpv6Address(it, serializeSettings)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
list->size = count;
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
int ser_saveIp6Setup(
gxSerializerSettings* serializeSettings,
gxIp6Setup* object)
{
uint16_t pos, count;
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
#ifndef DLMS_IGNORE_OBJECT_POINTERS
ret = ser_set(serializeSettings, obj_getLogicalName(object->dataLinkLayer), 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
);
#else
ret = ser_set(serializeSettings, object->dataLinkLayerReference, 6));
#endif //DLMS_IGNORE_OBJECT_POINTERS
}
if (ret == 0)
{
if ((!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveUInt8(serializeSettings, object->addressConfigMode)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = saveAddressList(&object->unicastIPAddress, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = saveAddressList(&object->multicastIPAddress, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = saveAddressList(&object->gatewayIPAddress, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = saveIpv6Address(&object->primaryDNSAddress, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = saveIpv6Address(&object->secondaryDNSAddress, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_saveUInt8(serializeSettings, object->trafficClass)) != 0))
{
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 10))
{
gxNeighborDiscoverySetup* it;
if ((ret = ser_saveArrayCount(serializeSettings, &object->neighborDiscoverySetup, &count)) == 0)
{
for (pos = 0; pos != object->neighborDiscoverySetup.size; ++pos)
{
if ((ret = arr_getByIndex4(&object->neighborDiscoverySetup, pos, (void**)&it, sizeof(gxNeighborDiscoverySetup), 0)) != 0)
{
break;
}
if ((ret = ser_saveUInt8(serializeSettings, it->maxRetry)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, it->retryWaitTime)) != 0 ||
(ret = ser_saveUInt32(serializeSettings, it->sendPeriod)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
object->neighborDiscoverySetup.size = count;
#endif //DLMS_IGNORE_MALLOC
}
}
return ret;
}
#endif //DLMS_IGNORE_IP6_SETUP
#ifndef DLMS_IGNORE_G3_PLC_MAC_LAYER_COUNTERS
int ser_saveG3PlcMacLayerCounters(
gxSerializerSettings* serializeSettings,
gxG3PlcMacLayerCounters* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveUInt32(serializeSettings, object->txDataPacketCount)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveUInt32(serializeSettings, object->rxDataPacketCount)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveUInt32(serializeSettings, object->txCmdPacketCount)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveUInt32(serializeSettings, object->rxCmdPacketCount)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_saveUInt32(serializeSettings, object->cSMAFailCount)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_saveUInt32(serializeSettings, object->cSMANoAckCount)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_saveUInt32(serializeSettings, object->badCrcCount)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_saveUInt32(serializeSettings, object->txDataBroadcastCount)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 10) && (ret = ser_saveUInt32(serializeSettings, object->rxDataBroadcastCount)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_G3_PLC_MAC_LAYER_COUNTERS
#ifndef DLMS_IGNORE_G3_PLC_MAC_SETUP
int ser_saveKeyTable(gxSerializerSettings* serializeSettings, gxArray* keys)
{
int ret;
uint16_t pos, count;
gxG3MacKeyTable* it;
if ((ret = ser_saveArrayCount(serializeSettings, keys, &count)) == 0)
{
for (pos = 0; pos != keys->size; ++pos)
{
if ((ret = arr_getByIndex4(keys, pos, (void**)&it, sizeof(gxG3MacKeyTable), 0)) != 0)
{
break;
}
if ((ret = ser_saveUInt8(serializeSettings, it->id)) != 0 ||
(ret = ser_saveOctetString3(serializeSettings, (char*)it->key, MAX_G3_MAC_KEY_TABLE_KEY_SIZE, MAX_G3_MAC_KEY_TABLE_KEY_SIZE)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
keys->size = count;
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
int ser_saveNeighbourTable(gxSerializerSettings* serializeSettings, gxArray* neighbours)
{
int ret;
uint16_t pos, count;
gxNeighbourTable* it;
if ((ret = ser_saveArrayCount(serializeSettings, neighbours, &count)) == 0)
{
for (pos = 0; pos != neighbours->size; ++pos)
{
if ((ret = arr_getByIndex4(neighbours, pos, (void**)&it, sizeof(gxNeighbourTable), 0)) != 0)
{
break;
}
if ((ret = ser_saveUInt16(serializeSettings, it->shortAddress)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->payloadModulationScheme)) != 0 ||
#ifdef DLMS_IGNORE_MALLOC
(ret = ser_saveBitString2(serializeSettings, it->toneMap[pos].value, it->toneMap[pos].size, 8 * MAX_G3_MAC_NEIGHBOUR_TABLE_TONE_MAP_ITEM_SIZE)) != 0 ||
#else
(ret = ser_saveBitString(serializeSettings, &it->toneMap)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = ser_saveUInt8(serializeSettings, it->modulation)) != 0 ||
(ret = ser_saveInt8(serializeSettings, it->txGain)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->txRes)) != 0 ||
#ifdef DLMS_IGNORE_MALLOC
(ret = ser_saveBitString2(serializeSettings, it->txCoeff[pos].value, it->txCoeff[pos].size, 8 * MAX_G3_MAC_NEIGHBOUR_TABLE_GAIN_ITEM_SIZE)) != 0 ||
#else
(ret = ser_saveBitString(serializeSettings, &it->txCoeff)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = ser_saveUInt8(serializeSettings, it->lqi)) != 0 ||
(ret = ser_saveInt8(serializeSettings, it->phaseDifferential)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->tmrValidTime)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->noData)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
neighbours->size = count;
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
int ser_saveMacPosTable(gxSerializerSettings* serializeSettings, gxArray* table)
{
int ret;
uint16_t pos, count;
gxMacPosTable* it;
if ((ret = ser_saveArrayCount(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != table->size; ++pos)
{
if ((ret = arr_getByIndex4(table, pos, (void**)&it, sizeof(gxMacPosTable), 0)) != 0)
{
break;
}
if ((ret = ser_saveUInt16(serializeSettings, it->shortAddress)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->lqi)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->validTime)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
table->size = count;
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
int ser_saveG3PlcMacSetup(
gxSerializerSettings* serializeSettings,
gxG3PlcMacSetup* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveUInt16(serializeSettings, object->shortAddress)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveUInt16(serializeSettings, object->rcCoord)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveUInt16(serializeSettings, object->panId)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveKeyTable(serializeSettings, &object->keyTable)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_saveUInt32(serializeSettings, object->frameCounter)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_saveBitString(serializeSettings, &object->toneMask)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_saveUInt8(serializeSettings, object->tmrTtl)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_saveUInt8(serializeSettings, object->maxFrameRetries)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 10) && (ret = ser_saveUInt8(serializeSettings, object->neighbourTableEntryTtl)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 11) && (ret = ser_saveNeighbourTable(serializeSettings, &object->neighbourTable)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 12) && (ret = ser_saveUInt8(serializeSettings, object->highPriorityWindowSize)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 13) && (ret = ser_saveUInt8(serializeSettings, object->cscmFairnessLimit)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 14) && (ret = ser_saveUInt8(serializeSettings, object->beaconRandomizationWindowLength)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 15) && (ret = ser_saveUInt8(serializeSettings, object->macA)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 16) && (ret = ser_saveUInt8(serializeSettings, object->macK)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 17) && (ret = ser_saveUInt8(serializeSettings, object->minCwAttempts)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 18) && (ret = ser_saveUInt8(serializeSettings, object->cenelecLegacyMode)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 19) && (ret = ser_saveUInt8(serializeSettings, object->fccLegacyMode)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 20) && (ret = ser_saveUInt8(serializeSettings, object->maxBe)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 21) && (ret = ser_saveUInt8(serializeSettings, object->maxCsmaBackoffs)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 22) && (ret = ser_saveUInt8(serializeSettings, object->minBe)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 23) && (ret = ser_saveUInt8(serializeSettings, object->macBroadcastMaxCwEnabled)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 24) && (ret = ser_saveUInt8(serializeSettings, object->macTransmitAtten)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 25) && (ret = ser_saveMacPosTable(serializeSettings, &object->macPosTable)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_G3_PLC_MAC_SETUP
#ifndef DLMS_IGNORE_G3_PLC_6LO_WPAN
int ser_saveRoutingConfiguration(gxSerializerSettings* serializeSettings, gxArray* table)
{
int ret;
uint16_t pos, count;
gxRoutingConfiguration* it;
if ((ret = ser_saveArrayCount(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != table->size; ++pos)
{
if ((ret = arr_getByIndex4(table, pos, (void**)&it, sizeof(gxRoutingConfiguration), 0)) != 0)
{
break;
}
if ((ret = ser_saveUInt8(serializeSettings, it->netTraversalTime)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, it->routingTableEntryTtl)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->kr)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->km)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->kc)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->kq)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->kh)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->krt)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->rReqRetries)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->rReqReqWait)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, it->blacklistTableEntryTtl)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->unicastRreqGenEnable)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->rlcEnabled)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->addRevLinkCost)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
table->size = count;
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
int ser_saveRoutingTable(gxSerializerSettings* serializeSettings, gxArray* table)
{
int ret;
uint16_t pos, count;
gxRoutingTable* it;
if ((ret = ser_saveArrayCount(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != table->size; ++pos)
{
if ((ret = arr_getByIndex4(table, pos, (void**)&it, sizeof(gxRoutingTable), 0)) != 0)
{
break;
}
if ((ret = ser_saveUInt16(serializeSettings, it->destinationAddress)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, it->nextHopAddress)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, it->routeCost)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->hopCount)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->weakLinkCount)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, it->validTime)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
table->size = count;
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
int ser_saveContextInformationTable(gxSerializerSettings* serializeSettings, gxArray* table)
{
int ret;
uint16_t pos, count;
gxContextInformationTable* it;
if ((ret = ser_saveArrayCount(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != table->size; ++pos)
{
if ((ret = arr_getByIndex4(table, pos, (void**)&it, sizeof(gxContextInformationTable), 0)) != 0)
{
break;
}
if ((ret = ser_saveUInt8(serializeSettings, it->cid)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->contextLength)) != 0 ||
(ret = ser_saveOctetString3(serializeSettings, (char*)it->context, 16, 16)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->compression)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, it->validLifetime)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
table->size = count;
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
int ser_saveBlacklistTable(gxSerializerSettings* serializeSettings, gxArray* table)
{
int ret;
uint16_t pos, count;
gxBlacklistTable* it;
if ((ret = ser_saveArrayCount(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != table->size; ++pos)
{
if ((ret = arr_getByIndex4(table, pos, (void**)&it, sizeof(gxBlacklistTable), 0)) != 0)
{
break;
}
if ((ret = ser_saveUInt16(serializeSettings, it->neighbourAddress)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, it->validTime)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
table->size = count;
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
int ser_saveBroadcastLogTable(gxSerializerSettings* serializeSettings, gxArray* table)
{
int ret;
uint16_t pos, count;
gxBroadcastLogTable* it;
if ((ret = ser_saveArrayCount(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != table->size; ++pos)
{
if ((ret = arr_getByIndex4(table, pos, (void**)&it, sizeof(gxBroadcastLogTable), 0)) != 0)
{
break;
}
if ((ret = ser_saveUInt16(serializeSettings, it->sourceAddress)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->sequenceNumber)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, it->validTime)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
table->size = count;
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
int ser_saveUInt16Array(gxSerializerSettings* serializeSettings, gxArray* table)
{
int ret;
uint16_t pos, count;
uint16_t* it;
if ((ret = ser_saveArrayCount(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != table->size; ++pos)
{
if ((ret = arr_getByIndex4(table, pos, (void**)&it, sizeof(uint16_t), 0)) != 0)
{
break;
}
if ((ret = ser_saveUInt16(serializeSettings, *it)) != 0)
{
break;
}
}
table->size = count;
}
return ret;
}
#else
int ser_saveUInt16Array(gxSerializerSettings* serializeSettings, variantArray* table)
{
int ret;
uint16_t pos, count;
dlmsVARIANT* it;
if ((ret = ser_saveVariantArrayCount(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != table->size; ++pos)
{
if ((ret = va_getByIndex(table, pos, &it)) != 0)
{
break;
}
if ((ret = ser_saveUInt16(serializeSettings, it->uiVal)) != 0)
{
break;
}
}
}
return ret;
}
#endif //defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
int ser_saveG3Plc6LoWPAN(
gxSerializerSettings* serializeSettings,
gxG3Plc6LoWPAN* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveUInt8(serializeSettings, object->maxHops)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveUInt8(serializeSettings, object->weakLqiValue)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveUInt8(serializeSettings, object->securityLevel)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveOctetString(serializeSettings, &object->prefixTable)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_saveRoutingConfiguration(serializeSettings, &object->routingConfiguration)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_saveUInt16(serializeSettings, object->broadcastLogTableEntryTtl)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_saveRoutingTable(serializeSettings, &object->routingTable)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_saveContextInformationTable(serializeSettings, &object->contextInformationTable)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 10) && (ret = ser_saveBlacklistTable(serializeSettings, &object->blacklistTable)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 11) && (ret = ser_saveBroadcastLogTable(serializeSettings, &object->broadcastLogTable)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 12) && (ret = ser_saveUInt16Array(serializeSettings, &object->groupTable)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 13) && (ret = ser_saveUInt16(serializeSettings, object->maxJoinWaitTime)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 14) && (ret = ser_saveUInt8(serializeSettings, object->pathDiscoveryTime)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 15) && (ret = ser_saveUInt8(serializeSettings, object->activeKeyIndex)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 16) && (ret = ser_saveUInt8(serializeSettings, object->metricType)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 17) && (ret = ser_saveUInt16(serializeSettings, object->coordShortAddress)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 18) && (ret = ser_saveUInt8(serializeSettings, object->disableDefaultRouting)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 19) && (ret = ser_saveUInt8(serializeSettings, object->deviceType)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 20) && (ret = ser_saveUInt8(serializeSettings, object->defaultCoordRouteEnabled)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 21) && (ret = ser_saveUInt16Array(serializeSettings, &object->destinationAddress)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 22) && (ret = ser_saveUInt8(serializeSettings, object->lowLQI)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 23) && (ret = ser_saveUInt8(serializeSettings, object->highLQI)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_G3_PLC_6LO_WPAN
#ifndef DLMS_IGNORE_FUNCTION_CONTROL
int ser_saveActivationStatus(gxSerializerSettings* serializeSettings, gxArray* table)
{
int ret;
uint16_t pos, count;
functionStatus* it;
if ((ret = ser_saveArrayCount(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != table->size; ++pos)
{
if ((ret = arr_getByIndex4(table, pos, (void**)&it, sizeof(functionStatus), 0)) != 0)
{
break;
}
#ifdef DLMS_IGNORE_MALLOC
if ((ret = ser_saveOctetString3(serializeSettings, (char*)it->name, it->size, sizeof(it->name))) != 0)
{
break;
}
#else
if ((ret = ser_saveOctetString(serializeSettings, &it->name)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = ser_saveUInt8(serializeSettings, it->status)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
table->size = count;
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
int ser_saveFunctionList(gxSerializerSettings* serializeSettings, gxArray* table)
{
int ret;
uint16_t pos, pos2, count;
functionalBlock* it;
gxObject* obj;
if ((ret = ser_saveArrayCount(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != table->size; ++pos)
{
if ((ret = arr_getByIndex4(table, pos, (void**)&it, sizeof(functionalBlock), 0)) != 0)
{
break;
}
#ifdef DLMS_IGNORE_MALLOC
if ((ret = ser_saveOctetString3(serializeSettings, (char*)it->name, it->nameSize, sizeof(it->name))) != 0)
{
break;
}
//Save count.
if ((ret = ser_saveObjectCount(it->functionSpecificationsSize, serializeSettings)) == 0 &&
//Save capacity.
(ret = ser_saveObjectCount(MAX_FUNCTION_TARGET_LENGTH, serializeSettings)) == 0)
#else
if ((ret = ser_saveOctetString(serializeSettings, &it->name)) != 0)
{
break;
}
if ((ret = ser_saveObjectArrayCount(serializeSettings, &it->functionSpecifications, &count)) == 0)
#endif //DLMS_IGNORE_MALLOC
{
#ifdef DLMS_IGNORE_MALLOC
for (pos2 = 0; pos2 != MAX_FUNCTION_TARGET_LENGTH; ++pos2)
#else
for (pos2 = 0; pos2 != it->functionSpecifications.size; ++pos2)
#endif //DLMS_IGNORE_MALLOC
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = oa_getByIndex(&it->functionSpecifications, pos2, &obj)) != DLMS_ERROR_CODE_OK ||
(ret = ser_saveUInt16(serializeSettings, obj->objectType)) != DLMS_ERROR_CODE_OK ||
(ret = ser_set(serializeSettings, obj->logicalName, 6)) != 0)
{
break;
}
#else
if (pos < it->functionSpecificationsSize)
{
obj = it->functionSpecifications[pos2];
}
else
{
obj = NULL;
}
if ((ret = ser_saveUInt16(serializeSettings, obj == NULL ? 0 : obj->objectType)) != DLMS_ERROR_CODE_OK ||
(ret = ser_set(serializeSettings, obj_getLogicalName(obj), 6, 6)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
if (ret != 0)
{
return ret;
}
}
#ifdef DLMS_IGNORE_MALLOC
table->size = count;
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
int ser_saveFunctionControl(
gxSerializerSettings* serializeSettings,
gxFunctionControl* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveActivationStatus(serializeSettings, &object->activationStatus)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveFunctionList(serializeSettings, &object->functions)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_FUNCTION_CONTROL
#ifndef DLMS_IGNORE_ARRAY_MANAGER
int ser_saveArrayManagerElements(gxSerializerSettings* serializeSettings, gxArray* table)
{
int ret;
uint16_t pos, count;
gxArrayManagerItem* it;
if ((ret = ser_saveArrayCount(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != table->size; ++pos)
{
if ((ret = arr_getByIndex4(table, pos, (void**)&it, sizeof(gxArrayManagerItem), 0)) != 0)
{
break;
}
if ((ret = ser_saveUInt8(serializeSettings, it->id)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, it->element.target != NULL ? it->element.target->objectType : 0)) != 0 ||
(ret = ser_set(serializeSettings, obj_getLogicalName(it->element.target), 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
(ret = ser_saveInt8(serializeSettings, it->element.attributeIndex)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
table->size = count;
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
int ser_saveArrayManager(
gxSerializerSettings* serializeSettings,
gxArrayManager* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveArrayManagerElements(serializeSettings, &object->elements)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_ARRAY_MANAGER
#ifndef DLMS_IGNORE_UTILITY_TABLES
int ser_saveUtilityTables(
gxSerializerSettings* serializeSettings,
gxUtilityTables* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveUInt16(serializeSettings, object->tableId)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveOctetString(serializeSettings, &object->buffer)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_UTILITY_TABLES
#ifndef DLMS_IGNORE_MBUS_DIAGNOSTIC
int ser_saveMbusDiagnostic(
gxSerializerSettings* serializeSettings,
gxMbusDiagnostic* object)
{
gxBroadcastFrameCounter* it;
int ret = 0;
uint16_t pos, count;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveUInt8(serializeSettings, object->receivedSignalStrength)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveUInt8(serializeSettings, object->channelId)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveUInt8(serializeSettings, object->linkStatus)) != 0))
{
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 5))
{
if ((ret = ser_saveArrayCount(serializeSettings, &object->broadcastFrames, &count)) == 0)
{
for (pos = 0; pos != object->broadcastFrames.size; ++pos)
{
if ((ret = arr_getByIndex4(&object->broadcastFrames, pos, (void**)&it, sizeof(gxBroadcastFrameCounter), 0)) != 0)
{
break;
}
if ((ret = ser_saveUInt8(serializeSettings, it->clientId)) != 0 ||
(ret = ser_saveUInt32(serializeSettings, it->counter)) != 0 ||
(ret = ser_saveDateTime(&it->timeStamp, serializeSettings)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
object->broadcastFrames.size = count;
#endif //DLMS_IGNORE_MALLOC
}
if (ret == 0)
{
if ((!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_saveUInt32(serializeSettings, object->transmissions)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_saveUInt32(serializeSettings, object->receivedFrames)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_saveUInt32(serializeSettings, object->failedReceivedFrames)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_saveUInt8(serializeSettings, object->captureTime.attributeId)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_saveDateTime(&object->captureTime.timeStamp, serializeSettings)) != 0))
{
}
}
}
return ret;
}
#endif //DLMS_IGNORE_MBUS_DIAGNOSTIC
int ser_loadArray(gxSerializerSettings* serializeSettings, gxArray* arr, uint16_t* count)
{
int ret = ser_loadObjectCount(serializeSettings, count);
if (ret == 0)
{
#ifdef DLMS_IGNORE_MALLOC
arr->size = *count;
ret = ser_loadObjectCount(serializeSettings, count);
if (arr_getCapacity(arr) != *count)
{
return DLMS_ERROR_CODE_INVALID_PARAMETER;
}
#else
arr_clear(arr);
arr_capacity(arr, *count);
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
int loadTimeWindow(
gxSerializerSettings* serializeSettings,
gxArray* arr)
{
int ret;
uint16_t pos;
gxtime* start, * end;
uint16_t count;
#ifdef DLMS_IGNORE_MALLOC
gxTimePair* k;
#endif //DLMS_IGNORE_MALLOC
arr_clearKeyValuePair(arr);
if ((ret = ser_loadArray(serializeSettings, arr, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(arr, pos, (void**)&k, sizeof(gxTimePair), 0)) != 0)
{
break;
}
start = &k->first;
end = &k->second;
#else
start = (gxtime*)gxmalloc(sizeof(gxtime));
if (start == NULL)
{
return DLMS_ERROR_CODE_OUTOFMEMORY;
}
end = (gxtime*)gxmalloc(sizeof(gxtime));
if (end == NULL)
{
return DLMS_ERROR_CODE_OUTOFMEMORY;
}
if ((ret = arr_push(arr, key_init(start, end))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = ser_loadDateTime(start, serializeSettings, DLMS_DATA_TYPE_DATETIME)) != 0 ||
(ret = ser_loadDateTime(end, serializeSettings, DLMS_DATA_TYPE_DATETIME)) != 0)
{
break;
}
}
}
return ret;
}
#ifndef DLMS_IGNORE_MBUS_PORT_SETUP
int ser_saveMbusPortSetup(
gxSerializerSettings* serializeSettings,
gxMBusPortSetup* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_set(serializeSettings, object->profileSelection, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveUInt8(serializeSettings, object->portCommunicationStatus)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveUInt8(serializeSettings, object->dataHeaderType)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveUInt8(serializeSettings, object->primaryAddress)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_saveUInt32(serializeSettings, object->identificationNumber)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_saveUInt16(serializeSettings, object->manufacturerId)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_saveUInt8(serializeSettings, object->mBusVersion)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_saveUInt8(serializeSettings, object->deviceType)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 10) && (ret = ser_saveUInt16(serializeSettings, object->maxPduSize)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 11) && (ret = saveTimeWindow(serializeSettings, &object->listeningWindow)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_MBUS_PORT_SETUP
#ifndef DLMS_IGNORE_MBUS_SLAVE_PORT_SETUP
int ser_saveMbusSlavePortSetup(
gxSerializerSettings* serializeSettings,
gxMbusSlavePortSetup* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveUInt8(serializeSettings, object->defaultBaud)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveUInt8(serializeSettings, object->availableBaud)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveUInt8(serializeSettings, object->addressState)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveUInt8(serializeSettings, object->busAddress)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_MBUS_SLAVE_PORT_SETUP
#ifndef DLMS_IGNORE_IMAGE_TRANSFER
int ser_saveImageTransfer(
gxSerializerSettings* serializeSettings,
gxImageTransfer* object)
{
uint16_t pos, count;
int ret = 0;
gxImageActivateInfo* it;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveUInt32(serializeSettings, object->imageBlockSize)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveBitString(serializeSettings, &object->imageTransferredBlocksStatus)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveUInt32(serializeSettings, object->imageFirstNotTransferredBlockNumber)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveUInt8(serializeSettings, object->imageTransferEnabled)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_saveUInt8(serializeSettings, object->imageTransferStatus)) != 0))
{
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 7))
{
if ((ret = ser_saveArrayCount(serializeSettings, &object->imageActivateInfo, &count)) == 0)
{
for (pos = 0; pos != object->imageActivateInfo.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(&object->imageActivateInfo, pos, (void**)&it, sizeof(gxImageActivateInfo), 0)) != 0)
{
break;
}
if ((ret = ser_saveUInt32(serializeSettings, it->size)) != 0 ||
(ret = ser_saveOctetString3(serializeSettings, (char*)it->identification.data, it->identification.size, sizeof(it->identification.data))) != 0 ||
(ret = ser_saveOctetString3(serializeSettings, (char*)it->signature.data, it->signature.size, sizeof(it->signature.data))) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex3(&object->imageActivateInfo, pos, (void**)&it, 0)) != 0)
{
break;
}
if ((ret = ser_saveUInt32(serializeSettings, it->size)) != 0 ||
(ret = ser_saveOctetString(serializeSettings, &it->identification)) != 0 ||
(ret = ser_saveOctetString(serializeSettings, &it->signature)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
#ifdef DLMS_IGNORE_MALLOC
object->imageActivateInfo.size = count;
#endif //DLMS_IGNORE_MALLOC
}
}
return ret;
}
#endif //DLMS_IGNORE_IMAGE_TRANSFER
#ifndef DLMS_IGNORE_DISCONNECT_CONTROL
int ser_saveDisconnectControl(
gxSerializerSettings* serializeSettings,
gxDisconnectControl* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveUInt8(serializeSettings, object->outputState)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveUInt8(serializeSettings, object->controlState)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveUInt8(serializeSettings, object->controlMode)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_DISCONNECT_CONTROL
#ifndef DLMS_IGNORE_LIMITER
int ser_saveLimiter(
gxSerializerSettings* serializeSettings,
gxLimiter* object)
{
uint16_t pos, count;
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
uint16_t* it;
#else
dlmsVARIANT* it;
#endif //DLMS_IGNORE_MALLOC
if (!isAttributeSet(serializeSettings, ignored, 2))
{
if ((ret = ser_set(serializeSettings, obj_getLogicalName(object->monitoredValue), 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) == 0)
ret = ser_saveUInt8(serializeSettings, object->selectedAttributeIndex);
}
if (ret == 0)
{
if ((!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveBytes(&object->thresholdActive, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveBytes(&object->thresholdNormal, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveBytes(&object->thresholdEmergency, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_saveUInt32(serializeSettings, object->minOverThresholdDuration)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_saveUInt32(serializeSettings, object->minUnderThresholdDuration)) != 0))
{
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 8))
{
if ((ret = ser_saveUInt16(serializeSettings, object->emergencyProfile.id)) != 0 ||
(ret = ser_saveDateTime(&object->emergencyProfile.activationTime, serializeSettings)) != 0 ||
(ret = ser_saveUInt32(serializeSettings, object->emergencyProfile.duration)) != 0)
{
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 9))
{
#if defined(DLMS_IGNORE_MALLOC)
if ((ret = ser_saveArrayCount(serializeSettings, &object->emergencyProfileGroupIDs, &count)) == 0)
#else
if ((ret = ser_saveVariantArrayCount(serializeSettings, &object->emergencyProfileGroupIDs, &count)) == 0)
#endif //DLMS_IGNORE_MALLOC
{
for (pos = 0; pos != object->emergencyProfileGroupIDs.size; ++pos)
{
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
if ((ret = arr_getByIndex4(&object->emergencyProfileGroupIDs, pos, (void**)&it, sizeof(uint16_t), 0)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, *it)) != 0)
{
break;
}
#else
if ((ret = va_getByIndex(&object->emergencyProfileGroupIDs, pos, &it)) != 0 ||
(ret = ser_saveBytes(it, serializeSettings)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
#ifdef DLMS_IGNORE_MALLOC
object->emergencyProfileGroupIDs.size = count;
#endif //DLMS_IGNORE_MALLOC
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 10))
{
ret = ser_saveUInt8(serializeSettings, object->emergencyProfileActive);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 11))
{
if ((ret = ser_saveActionItem(&object->actionOverThreshold, serializeSettings)) == 0)
{
ret = ser_saveActionItem(&object->actionUnderThreshold, serializeSettings);
}
}
return ret;
}
#endif //DLMS_IGNORE_LIMITER
#ifndef DLMS_IGNORE_MBUS_CLIENT
int ser_saveMBusClient(
gxSerializerSettings* serializeSettings,
gxMBusClient* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveUInt32(serializeSettings, object->capturePeriod)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveUInt8(serializeSettings, object->primaryAddress)) != 0) ||
#ifndef DLMS_IGNORE_OBJECT_POINTERS
(!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_set(serializeSettings, obj_getLogicalName(object->mBusPort), 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0) ||
#else
(!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_set(serializeSettings, obj_getLogicalName(object->mBusPortReference), 6)) != 0) ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_saveUInt32(serializeSettings, object->identificationNumber)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_saveUInt16(serializeSettings, object->manufacturerID)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_saveUInt8(serializeSettings, object->dataHeaderVersion)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_saveUInt8(serializeSettings, object->deviceType)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 10) && (ret = ser_saveUInt8(serializeSettings, object->accessNumber)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 11) && (ret = ser_saveUInt8(serializeSettings, object->status)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 12) && (ret = ser_saveUInt8(serializeSettings, object->alarm)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 13) && (ret = ser_saveUInt16(serializeSettings, object->configuration)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 14) && (ret = ser_saveUInt8(serializeSettings, object->encryptionKeyStatus)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_MBUS_CLIENT
#ifndef DLMS_IGNORE_MODEM_CONFIGURATION
int ser_saveModemConfiguration(
gxSerializerSettings* serializeSettings,
gxModemConfiguration* object)
{
int ret = 0;
uint16_t pos, count;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
gxModemInitialisation* mi;
#ifdef DLMS_IGNORE_MALLOC
gxModemProfile* it;
#else
gxByteBuffer* it;
#endif //DLMS_IGNORE_MALLOC
if (!isAttributeSet(serializeSettings, ignored, 2))
{
ret = ser_saveUInt8(serializeSettings, object->communicationSpeed);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3) &&
(ret = ser_saveArrayCount(serializeSettings, &object->initialisationStrings, &count)) == 0)
{
for (pos = 0; pos != object->initialisationStrings.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(&object->initialisationStrings, pos, (void**)&mi, sizeof(gxModemInitialisation), 0)) != 0 ||
(ret = ser_saveOctetString3(serializeSettings, (char*)mi->request.value, mi->request.size, sizeof(mi->request.value))) != 0 ||
(ret = ser_saveOctetString3(serializeSettings, (char*)mi->response.value, mi->response.size, sizeof(mi->response.value))) != 0 ||
(ret = ser_saveUInt16(serializeSettings, mi->delay)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex3(&object->initialisationStrings, pos, (void**)&mi, 0)) != 0 ||
(ret = ser_saveOctetString(serializeSettings, &mi->request)) != 0 ||
(ret = ser_saveOctetString(serializeSettings, &mi->response)) != 0 ||
(ret = ser_saveInt16(serializeSettings, mi->delay)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
#ifdef DLMS_IGNORE_MALLOC
object->initialisationStrings.size = count;
#endif //DLMS_IGNORE_MALLOC
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4) &&
(ret = ser_saveArrayCount(serializeSettings, &object->modemProfile, &count)) == 0)
{
for (pos = 0; pos != object->modemProfile.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(&object->modemProfile, pos, (void**)&it, sizeof(gxModemProfile), 0)) != 0 ||
(ret = ser_saveOctetString3(serializeSettings, (char*)it->value, it->size, sizeof(it->value))) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex3(&object->modemProfile, pos, (void**)&it, 0)) != 0 ||
(ret = ser_saveOctetString(serializeSettings, it)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
#ifdef DLMS_IGNORE_MALLOC
object->modemProfile.size = count;
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
#endif //DLMS_IGNORE_MODEM_CONFIGURATION
#ifndef DLMS_IGNORE_MAC_ADDRESS_SETUP
int ser_saveMacAddressSetup(
gxSerializerSettings* serializeSettings,
gxMacAddressSetup* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
ret = ser_saveOctetString(serializeSettings, &object->macAddress);
}
return ret;
}
#endif //DLMS_IGNORE_MAC_ADDRESS_SETUP
#ifndef DLMS_IGNORE_GPRS_SETUP
int ser_saveQualityOfService(
gxQualityOfService* object,
gxSerializerSettings* serializeSettings)
{
int ret;
if ((ret = ser_saveUInt8(serializeSettings, object->precedence)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->delay)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->reliability)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->peakThroughput)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->meanThroughput)) != 0)
{
}
return ret;
}
int ser_saveGPRSSetup(
gxSerializerSettings* serializeSettings,
gxGPRSSetup* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveOctetString(serializeSettings, &object->apn)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveInt16(serializeSettings, object->pinCode)) != 0))
{
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4))
{
if (((ret = ser_saveQualityOfService(&object->defaultQualityOfService, serializeSettings)) != 0 ||
(ret = ser_saveQualityOfService(&object->requestedQualityOfService, serializeSettings)) != 0))
{
}
}
return ret;
}
#endif //DLMS_IGNORE_GPRS_SETUP
#ifndef DLMS_IGNORE_EXTENDED_REGISTER
int ser_saveExtendedRegister(
gxSerializerSettings* serializeSettings,
gxExtendedRegister* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
ret = ser_saveBytes(&object->value, serializeSettings);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3))
{
if ((ret = ser_saveUInt8(serializeSettings, object->scaler)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->unit)) != 0)
{
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4))
{
ret = ser_saveBytes(&object->status, serializeSettings);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 5))
{
ret = ser_saveDateTime(&object->captureTime, serializeSettings);
}
return ret;
}
#endif //DLMS_IGNORE_EXTENDED_REGISTER
#ifndef DLMS_IGNORE_ASSOCIATION_LOGICAL_NAME
int ser_saveApplicationContextName(gxSerializerSettings* serializeSettings, gxApplicationContextName* object)
{
int ret;
if ((ret = ser_set(serializeSettings, object->logicalName, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->jointIsoCtt)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->country)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, object->countryName)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->identifiedOrganization)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->dlmsUA)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->applicationContext)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->contextId)) != 0)
{
}
return ret;
}
int ser_savexDLMSContextType(gxSerializerSettings* serializeSettings, gxXDLMSContextType* object)
{
int ret;
if ((ret = ser_saveUInt32(serializeSettings, object->conformance)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, object->maxReceivePduSize)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, object->maxSendPduSize)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->qualityOfService)) != 0 ||
(ret = ser_saveOctetString(serializeSettings, &object->cypheringInfo)) != 0)
{
}
return ret;
}
int ser_saveAuthenticationMechanismName(
gxSerializerSettings* serializeSettings,
gxAuthenticationMechanismName* object)
{
int ret;
if ((ret = ser_saveUInt8(serializeSettings, object->jointIsoCtt)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->country)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, object->countryName)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->identifiedOrganization)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->dlmsUA)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->authenticationMechanismName)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->mechanismId)) != 0)
{
}
return ret;
}
int ser_saveAssociationLogicalName(
gxSerializerSettings* serializeSettings,
gxAssociationLogicalName* object)
{
int ret = 0;
uint16_t pos, count;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
#ifdef DLMS_IGNORE_MALLOC
gxUser* it;
#else
gxKey2* it;
#endif //DLMS_IGNORE_MALLOC
//Save object list.
if (!isAttributeSet(serializeSettings, ignored, 2))
{
gxObject* obj;
if ((ret = ser_saveObjectArrayCount(serializeSettings, &object->objectList, &count)) == 0)
{
for (pos = 0; pos != object->objectList.size; ++pos)
{
if ((ret = oa_getByIndex(&object->objectList, pos, &obj)) != DLMS_ERROR_CODE_OK ||
(ret = ser_saveUInt8(serializeSettings, obj->version)) != DLMS_ERROR_CODE_OK ||
(ret = ser_saveUInt16(serializeSettings, obj->objectType)) != DLMS_ERROR_CODE_OK ||
(ret = ser_set(serializeSettings, obj->logicalName, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
object->objectList.size = count;
#endif //DLMS_IGNORE_MALLOC
}
if (ret != 0)
{
return ret;
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3))
{
if ((ret = ser_saveUInt8(serializeSettings, object->clientSAP)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, object->serverSAP)) != 0)
{
}
}
if (ret == 0)
{
if ((!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveApplicationContextName(serializeSettings, &object->applicationContextName)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_savexDLMSContextType(serializeSettings, &object->xDLMSContextInfo)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_saveAuthenticationMechanismName(serializeSettings, &object->authenticationMechanismName)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_saveOctetString(serializeSettings, &object->secret)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_saveUInt8(serializeSettings, object->associationStatus)) != 0))
{
}
}
//Security Setup Reference is from version 1.
if (ret == 0 && object->base.version > 0)
{
#ifndef DLMS_IGNORE_SECURITY_SETUP
if (!isAttributeSet(serializeSettings, ignored, 9))
{
#ifndef DLMS_IGNORE_OBJECT_POINTERS
ret = ser_set(serializeSettings, obj_getLogicalName((gxObject*)object->securitySetup), 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
);
#else
ret = ser_set(&ba, object->securitySetupReference, 6);
#endif //DLMS_IGNORE_OBJECT_POINTERS
}
#endif //DLMS_IGNORE_SECURITY_SETUP
}
if (ret == 0 && object->base.version > 1)
{
if (!isAttributeSet(serializeSettings, ignored, 10) &&
(ret = ser_saveArrayCount(serializeSettings, &object->userList, &count)) == 0)
{
for (pos = 0; pos != object->userList.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(&object->userList, pos, (void**)&it, sizeof(gxUser), 0)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->id)) != 0 ||
(ret = ser_saveOctetString2(serializeSettings, it->name, MAX_USER_NAME_LENGTH)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex3(&object->userList, pos, (void**)&it, 0)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->key)) != 0 ||
(ret = ser_saveOctetString2(serializeSettings, it->value, (uint16_t)((gxByteBuffer*)it->value)->size)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
#ifdef DLMS_IGNORE_MALLOC
object->userList.size = count;
#endif //DLMS_IGNORE_MALLOC
}
}
return ret;
}
#endif //DLMS_IGNORE_ASSOCIATION_LOGICAL_NAME
#ifndef DLMS_IGNORE_ASSOCIATION_SHORT_NAME
int ser_saveAssociationShortName(
gxSerializerSettings* serializeSettings,
gxAssociationShortName* object)
{
int ret = 0;
uint16_t pos, count;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
#ifdef DLMS_IGNORE_MALLOC
gxUser* it;
#else
gxKey2* it;
#endif //DLMS_IGNORE_MALLOC
//Save object list.
if (!isAttributeSet(serializeSettings, ignored, 2))
{
gxObject* obj;
if ((ret = ser_saveObjectArrayCount(serializeSettings, &object->objectList, &count)) == 0)
{
for (pos = 0; pos != object->objectList.size; ++pos)
{
if ((ret = oa_getByIndex(&object->objectList, pos, &obj)) != DLMS_ERROR_CODE_OK ||
(ret = ser_saveInt16(serializeSettings, obj->shortName)) != DLMS_ERROR_CODE_OK ||
(ret = ser_saveUInt8(serializeSettings, obj->version)) != DLMS_ERROR_CODE_OK ||
(ret = ser_saveUInt16(serializeSettings, obj->objectType)) != DLMS_ERROR_CODE_OK ||
(ret = ser_set(serializeSettings, obj->logicalName, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
object->objectList.size = count;
#endif //DLMS_IGNORE_MALLOC
}
if (ret != 0)
{
return ret;
}
}
//Security Setup Reference is from version 2.
if (ret == 0 && object->base.version > 2)
{
#ifndef DLMS_IGNORE_SECURITY_SETUP
if (!isAttributeSet(serializeSettings, ignored, 9))
{
#ifndef DLMS_IGNORE_OBJECT_POINTERS
ret = ser_set(serializeSettings, obj_getLogicalName((gxObject*)object->securitySetup), 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
);
#else
ret = ser_set(&ba, object->securitySetupReference, 6);
#endif //DLMS_IGNORE_OBJECT_POINTERS
}
#endif //DLMS_IGNORE_SECURITY_SETUP
}
if (ret == 0 && object->base.version > 3)
{
if (!isAttributeSet(serializeSettings, ignored, 10) &&
(ret = ser_saveArrayCount(serializeSettings, &object->userList, &count)) == 0)
{
for (pos = 0; pos != object->userList.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(&object->userList, pos, (void**)&it, sizeof(gxUser), 0)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->id)) != 0 ||
(ret = ser_saveOctetString2(serializeSettings, it->name, MAX_USER_NAME_LENGTH)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex3(&object->userList, pos, (void**)&it, 0)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it->key)) != 0 ||
(ret = ser_saveOctetString2(serializeSettings, it->value, (uint16_t)((gxByteBuffer*)it->value)->size)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
#ifdef DLMS_IGNORE_MALLOC
object->userList.size = count;
#endif //DLMS_IGNORE_MALLOC
}
}
return ret;
}
#endif //DLMS_IGNORE_ASSOCIATION_SHORT_NAME
#ifndef DLMS_IGNORE_PPP_SETUP
int ser_savePppSetup(
gxSerializerSettings* serializeSettings,
gxPppSetup* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
#ifndef DLMS_IGNORE_OBJECT_POINTER1S
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_set(serializeSettings, obj_getLogicalName(object->phy), 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0))
{
}
#else
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_set(&ba, object->PHYReference, 6)) != 0))
{
}
#endif //DLMS_IGNORE_OBJECT_POINTERS
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 5))
{
if ((ret = ser_saveOctetString(serializeSettings, &object->userName)) != 0 ||
(ret = ser_saveOctetString(serializeSettings, &object->password)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->authentication)) != 0)
{
}
}
return ret;
}
#endif //DLMS_IGNORE_PPP_SETUP
#ifndef DLMS_IGNORE_PROFILE_GENERIC
int ser_saveProfileGeneric(
gxSerializerSettings* serializeSettings,
gxProfileGeneric* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 3) && (ret = saveObjectsInternal(serializeSettings, &object->captureObjects)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveUInt32(serializeSettings, object->capturePeriod)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveUInt8(serializeSettings, object->sortMethod)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_set(serializeSettings, obj_getLogicalName(object->sortObject), 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_saveUInt32(serializeSettings, object->entriesInUse)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_saveUInt32(serializeSettings, object->profileEntries)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_PROFILE_GENERIC
#ifndef DLMS_IGNORE_ACCOUNT
int ser_saveAccount(
gxSerializerSettings* serializeSettings,
gxAccount* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
if ((ret = ser_saveUInt8(serializeSettings, object->paymentMode)) == 0)
{
ret = ser_saveUInt8(serializeSettings, object->accountStatus);
}
}
if (ret == 0)
{
if ((!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveUInt8(serializeSettings, object->currentCreditInUse)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveUInt8(serializeSettings, object->currentCreditStatus)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveInt32(serializeSettings, object->availableCredit)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_saveInt32(serializeSettings, object->amountToClear)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_saveInt32(serializeSettings, object->clearanceThreshold)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_saveInt32(serializeSettings, object->aggregatedDebt)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 13) && (ret = ser_saveDateTime(&object->accountActivationTime, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 14) && (ret = ser_saveDateTime(&object->accountClosureTime, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 16) && (ret = ser_saveInt32(serializeSettings, object->lowCreditThreshold)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 17) && (ret = ser_saveInt32(serializeSettings, object->nextCreditAvailableThreshold)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 18) && (ret = ser_saveUInt16(serializeSettings, object->maxProvision)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 19) && (ret = ser_saveInt32(serializeSettings, object->maxProvisionPeriod)) != 0))
{
}
}
return ret;
}
#endif //DLMS_IGNORE_ACCOUNT
#ifndef DLMS_IGNORE_CREDIT
int ser_saveCredit(
gxSerializerSettings* serializeSettings,
gxCredit* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveInt32(serializeSettings, object->currentCreditAmount)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveUInt8(serializeSettings, object->type)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveUInt8(serializeSettings, object->priority)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveInt32(serializeSettings, object->warningThreshold)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_saveInt32(serializeSettings, object->limit)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_saveUInt8(serializeSettings, object->creditConfiguration)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_saveUInt8(serializeSettings, object->status)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_saveInt32(serializeSettings, object->presetCreditAmount)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 10) && (ret = ser_saveInt32(serializeSettings, object->creditAvailableThreshold)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 11) && (ret = ser_saveDateTime(&object->period, serializeSettings)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_CREDIT
#ifndef DLMS_IGNORE_CHARGE
int ser_saveUnitCharge(gxSerializerSettings* serializeSettings, gxUnitCharge* target)
{
uint16_t pos, count;
int ret = 0;
gxChargeTable* it;
if (//commodity scale
(ret = ser_saveUInt8(serializeSettings, target->chargePerUnitScaling.commodityScale)) != 0 ||
//price scale
(ret = ser_saveUInt8(serializeSettings, target->chargePerUnitScaling.priceScale)) != 0 ||
//-------------
//commodity
//type
#ifndef DLMS_IGNORE_OBJECT_POINTERS
(ret = ser_saveUInt16(serializeSettings, target->commodity.target == NULL ? 0 : target->commodity.target->objectType)) != 0 ||
#else
(ret = ser_saveUInt16(serializeSettings, target->commodity.type)) != 0 ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
//logicalName
#ifndef DLMS_IGNORE_OBJECT_POINTERS
(ret = ser_setOctetString2(serializeSettings, obj_getLogicalName(target->commodity.target), 6, 6)) != 0 ||
#else
(ret = ser_setOctetString2(serializeSettings, target->commodity.logicalName, 6, 6)) != 0 ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
//attributeIndex
(ret = ser_saveUInt8(serializeSettings, target->commodity.attributeIndex)) != 0 ||
//-------------
//chargeTables
(ret = ser_saveArrayCount(serializeSettings, &target->chargeTables, &count)) != 0)
{
return ret;
}
for (pos = 0; pos != target->chargeTables.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(&target->chargeTables, pos, (void**)&it, sizeof(gxChargeTable), 0)) != 0 ||
//index
(ret = ser_setOctetString2(serializeSettings, it->index.data, it->index.size, sizeof(it->index.data))) != 0 ||
//chargePerUnit
(ret = ser_saveInt16(serializeSettings, it != NULL ? it->chargePerUnit : 0)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex3(&target->chargeTables, pos, (void**)&it, 0)) != 0 ||
//index
(ret = ser_setOctetString2(serializeSettings, it->index.data, (uint16_t)it->index.size, (uint16_t)it->index.capacity)) != 0 ||
//chargePerUnit
(ret = ser_saveInt16(serializeSettings, it->chargePerUnit)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
#ifdef DLMS_IGNORE_MALLOC
target->chargeTables.size = count;
#endif //DLMS_IGNORE_MALLOC
return ret;
}
int ser_saveCharge(
gxSerializerSettings* serializeSettings,
gxCharge* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveInt32(serializeSettings, object->totalAmountPaid)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveUInt8(serializeSettings, object->chargeType)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveUInt8(serializeSettings, object->priority)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveUnitCharge(serializeSettings, &object->unitChargeActive)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_saveUnitCharge(serializeSettings, &object->unitChargePassive)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_saveDateTime(&object->unitChargeActivationTime, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_saveUInt32(serializeSettings, object->period)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_saveUInt8(serializeSettings, object->chargeConfiguration)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 10) && (ret = ser_saveDateTime(&object->lastCollectionTime, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 11) && (ret = ser_saveUInt32(serializeSettings, object->lastCollectionAmount)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 12) && (ret = ser_saveUInt32(serializeSettings, object->totalAmountRemaining)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 13) && (ret = ser_saveUInt16(serializeSettings, object->proportion)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_CHARGE
#ifndef DLMS_IGNORE_TOKEN_GATEWAY
int ser_saveTokenGateway(
gxSerializerSettings* serializeSettings,
gxTokenGateway* object)
{
return 0;
}
#endif //DLMS_IGNORE_TOKEN_GATEWAY
#ifndef DLMS_IGNORE_GSM_DIAGNOSTIC
int ser_saveGsmDiagnostic(
gxSerializerSettings* serializeSettings,
gxGsmDiagnostic* object)
{
uint16_t pos, count;
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
gxAdjacentCell* it;
if (!isAttributeSet(serializeSettings, ignored, 2))
{
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
ret = ser_saveOctetString(serializeSettings, &object->operatorName);
#else
ret = ser_saveOctetString2(serializeSettings, object->operatorName, (uint16_t)strlen(object->operatorName));
#endif //DLMS_IGNORE_MALLOC
}
if ((!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveUInt8(serializeSettings, object->status)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveUInt8(serializeSettings, object->circuitSwitchStatus)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveUInt8(serializeSettings, object->packetSwitchStatus)) != 0))
{
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 6))
{
if ((ret = ser_saveUInt32(serializeSettings, object->cellInfo.cellId)) != 0 ||
(ret = ser_saveUInt16(serializeSettings, object->cellInfo.locationId)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->cellInfo.signalQuality)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->cellInfo.ber)) != 0)
{
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 7) &&
(ret = ser_saveArrayCount(serializeSettings, &object->adjacentCells, &count)) == 0)
{
for (pos = 0; pos != object->adjacentCells.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(&object->adjacentCells, pos, (void**)&it, sizeof(gxAdjacentCell), 0)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex3(&object->adjacentCells, pos, (void**)&it, 0)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = ser_saveUInt32(serializeSettings, it != NULL ? it->cellId : 0)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, it != NULL ? it->signalQuality : 0)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
object->adjacentCells.size = count;
#endif //DLMS_IGNORE_MALLOC
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 8))
{
ret = ser_saveDateTime(&object->captureTime, serializeSettings);
}
return ret;
}
#endif //DLMS_IGNORE_GSM_DIAGNOSTIC
#ifndef DLMS_IGNORE_COMPACT_DATA
int ser_saveCompactData(
gxSerializerSettings* serializeSettings,
gxCompactData* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveOctetString(serializeSettings, &object->buffer)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = saveObjectsInternal(serializeSettings, &object->captureObjects)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_saveUInt8(serializeSettings, object->templateId)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_saveOctetString(serializeSettings, &object->templateDescription)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_saveUInt8(serializeSettings, object->captureMethod)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_COMPACT_DATA
#ifndef DLMS_IGNORE_LLC_SSCS_SETUP
int ser_saveLlcSscsSetup(
gxSerializerSettings* serializeSettings,
gxLlcSscsSetup* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_saveUInt16(serializeSettings, object->serviceNodeAddress)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_saveUInt16(serializeSettings, object->baseNodeAddress)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_LLC_SSCS_SETUP
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_PHYSICAL_LAYER_COUNTERS
int ser_savePrimeNbOfdmPlcPhysicalLayerCounters(
gxSerializerSettings* serializeSettings,
gxPrimeNbOfdmPlcPhysicalLayerCounters* object)
{
return 0;
}
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_PHYSICAL_LAYER_COUNTERS
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_SETUP
int ser_savePrimeNbOfdmPlcMacSetup(
gxSerializerSettings* serializeSettings,
gxPrimeNbOfdmPlcMacSetup* object)
{
return 0;
}
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_SETUP
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_FUNCTIONAL_PARAMETERS
int ser_savePrimeNbOfdmPlcMacFunctionalParameters(
gxSerializerSettings* serializeSettings,
gxPrimeNbOfdmPlcMacFunctionalParameters* object)
{
return 0;
}
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_FUNCTIONAL_PARAMETERS
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_COUNTERS
int ser_savePrimeNbOfdmPlcMacCounters(
gxSerializerSettings* serializeSettings,
gxPrimeNbOfdmPlcMacCounters* object)
{
return 0;
}
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_COUNTERS
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_NETWORK_ADMINISTRATION_DATA
int ser_savePrimeNbOfdmPlcMacNetworkAdministrationData(
gxSerializerSettings* serializeSettings,
gxPrimeNbOfdmPlcMacNetworkAdministrationData* object)
{
return 0;
}
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_NETWORK_ADMINISTRATION_DATA
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_APPLICATIONS_IDENTIFICATION
int ser_savePrimeNbOfdmPlcApplicationsIdentification(
gxSerializerSettings* serializeSettings,
gxPrimeNbOfdmPlcApplicationsIdentification* object)
{
return 0;
}
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_APPLICATIONS_IDENTIFICATION
#ifndef DLMS_IGNORE_ARBITRATOR
int ser_saveArbitrator(
gxSerializerSettings* serializeSettings,
gxArbitrator* object)
{
return 0;
}
#endif //DLMS_IGNORE_ARBITRATOR
#ifndef DLMS_IGNORE_IEC_8802_LLC_TYPE1_SETUP
int ser_saveIec8802LlcType1Setup(
gxSerializerSettings* serializeSettings,
gxIec8802LlcType1Setup* object)
{
return 0;
}
#endif //DLMS_IGNORE_IEC_8802_LLC_TYPE1_SETUP
#ifndef DLMS_IGNORE_IEC_8802_LLC_TYPE2_SETUP
int ser_saveIec8802LlcType2Setup(
gxSerializerSettings* serializeSettings,
gxIec8802LlcType2Setup* object)
{
return 0;
}
#endif //DLMS_IGNORE_IEC_8802_LLC_TYPE2_SETUP
#ifndef DLMS_IGNORE_IEC_8802_LLC_TYPE3_SETUP
int ser_saveIec8802LlcType3Setup(
gxSerializerSettings* serializeSettings,
gxIec8802LlcType3Setup* object)
{
return 0;
}
#endif //DLMS_IGNORE_IEC_8802_LLC_TYPE3_SETUP
#ifndef DLMS_IGNORE_SFSK_ACTIVE_INITIATOR
int ser_saveSFSKActiveInitiator(
gxSerializerSettings* serializeSettings,
gxSFSKActiveInitiator* object)
{
return 0;
}
#endif //DLMS_IGNORE_SFSK_ACTIVE_INITIATOR
#ifndef DLMS_IGNORE_SFSK_MAC_COUNTERS
int ser_saveFSKMacCounters(
gxSerializerSettings* serializeSettings,
gxFSKMacCounters* object)
{
return 0;
}
#endif //DLMS_IGNORE_SFSK_MAC_COUNTERS
#ifndef DLMS_IGNORE_SFSK_MAC_SYNCHRONIZATION_TIMEOUTS
int ser_saveSFSKMacSynchronizationTimeouts(
gxSerializerSettings* serializeSettings,
gxSFSKMacSynchronizationTimeouts* object)
{
return 0;
}
#endif //DLMS_IGNORE_SFSK_MAC_SYNCHRONIZATION_TIMEOUTS
#ifndef DLMS_IGNORE_SFSK_PHY_MAC_SETUP
int ser_saveSFSKPhyMacSetUp(
gxSerializerSettings* serializeSettings,
gxSFSKPhyMacSetUp* object)
{
return 0;
}
#endif //DLMS_IGNORE_SFSK_PHY_MAC_SETUP
#ifndef DLMS_IGNORE_SFSK_REPORTING_SYSTEM_LIST
int ser_saveSFSKReportingSystemList(
gxSerializerSettings* serializeSettings,
gxSFSKReportingSystemList* object)
{
return 0;
}
#endif //DLMS_IGNORE_SFSK_REPORTING_SYSTEM_LIST
#ifndef DLMS_IGNORE_SCHEDULE
int ser_saveSchedule(
gxSerializerSettings* serializeSettings,
gxSchedule* object)
{
return 0;
}
#endif //DLMS_IGNORE_SCHEDULE
#ifdef DLMS_ITALIAN_STANDARD
int ser_saveTariffPlan(
gxSerializerSettings* serializeSettings,
gxTariffPlan* object)
{
int ret;
if ((ret = bb_addString(serializeSettings, object->calendarName)) != 0 ||
(ret = ser_saveUInt8(serializeSettings, object->enabled)) != 0 ||
(ret = ser_saveDateTime(&object->activationTime, serializeSettings)) != 0)
{
}
return ret;
}
#endif //DLMS_ITALIAN_STANDARD
void ser_init(gxSerializerSettings* settings)
{
memset(settings, 0, sizeof(gxSerializerSettings));
}
int ser_saveObject(
gxSerializerSettings* serializeSettings,
gxObject* object)
{
int ret = 0;
switch (object->objectType)
{
#ifndef DLMS_IGNORE_DATA
case DLMS_OBJECT_TYPE_DATA:
ret = ser_saveData(serializeSettings, (gxData*)object);
break;
#endif //DLMS_IGNORE_DATA
#ifndef DLMS_IGNORE_REGISTER
case DLMS_OBJECT_TYPE_REGISTER:
ret = ser_saveRegister(serializeSettings, (gxRegister*)object);
break;
#endif //DLMS_IGNORE_REGISTER
#ifndef DLMS_IGNORE_CLOCK
case DLMS_OBJECT_TYPE_CLOCK:
ret = ser_saveClock(serializeSettings, (gxClock*)object);
break;
#endif //DLMS_IGNORE_CLOCK
#ifndef DLMS_IGNORE_ACTION_SCHEDULE
case DLMS_OBJECT_TYPE_ACTION_SCHEDULE:
ret = ser_saveActionSchedule(serializeSettings, (gxActionSchedule*)object);
break;
#endif //DLMS_IGNORE_ACTION_SCHEDULE
#ifndef DLMS_IGNORE_ACTIVITY_CALENDAR
case DLMS_OBJECT_TYPE_ACTIVITY_CALENDAR:
ret = ser_saveActivityCalendar(serializeSettings, (gxActivityCalendar*)object);
break;
#endif //DLMS_IGNORE_ACTIVITY_CALENDAR
#ifndef DLMS_IGNORE_ASSOCIATION_LOGICAL_NAME
case DLMS_OBJECT_TYPE_ASSOCIATION_LOGICAL_NAME:
ret = ser_saveAssociationLogicalName(serializeSettings, (gxAssociationLogicalName*)object);
break;
#endif //DLMS_IGNORE_ASSOCIATION_LOGICAL_NAME
#ifndef DLMS_IGNORE_ASSOCIATION_SHORT_NAME
case DLMS_OBJECT_TYPE_ASSOCIATION_SHORT_NAME:
#ifndef DLMS_IGNORE_ASSOCIATION_SHORT_NAME
ret = ser_saveAssociationShortName(serializeSettings, (gxAssociationShortName*)object);
#else
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
#endif //DLMS_IGNORE_ASSOCIATION_SHORT_NAME
break;
#endif //DLMS_IGNORE_ASSOCIATION_SHORT_NAME
#ifndef DLMS_IGNORE_AUTO_ANSWER
case DLMS_OBJECT_TYPE_AUTO_ANSWER:
ret = ser_saveAutoAnswer(serializeSettings, (gxAutoAnswer*)object);
break;
#endif //DLMS_IGNORE_AUTO_ANSWER
#ifndef DLMS_IGNORE_AUTO_CONNECT
case DLMS_OBJECT_TYPE_AUTO_CONNECT:
ret = ser_saveAutoConnect(serializeSettings, (gxAutoConnect*)object);
break;
#endif //DLMS_IGNORE_AUTO_CONNECT
#ifndef DLMS_IGNORE_DEMAND_REGISTER
case DLMS_OBJECT_TYPE_DEMAND_REGISTER:
ret = ser_saveDemandRegister(serializeSettings, (gxDemandRegister*)object);
break;
#endif //DLMS_IGNORE_DEMAND_REGISTER
#ifndef DLMS_IGNORE_MAC_ADDRESS_SETUP
case DLMS_OBJECT_TYPE_MAC_ADDRESS_SETUP:
ret = ser_saveMacAddressSetup(serializeSettings, (gxMacAddressSetup*)object);
break;
#endif //DLMS_IGNORE_MAC_ADDRESS_SETUP
#ifndef DLMS_IGNORE_EXTENDED_REGISTER
case DLMS_OBJECT_TYPE_EXTENDED_REGISTER:
ret = ser_saveExtendedRegister(serializeSettings, (gxExtendedRegister*)object);
break;
#endif //DLMS_IGNORE_EXTENDED_REGISTER
#ifndef DLMS_IGNORE_GPRS_SETUP
case DLMS_OBJECT_TYPE_GPRS_SETUP:
#ifndef DLMS_IGNORE_GPRS_SETUP
ret = ser_saveGPRSSetup(serializeSettings, (gxGPRSSetup*)object);
#endif //DLMS_IGNORE_GPRS_SETUP
break;
#endif //DLMS_IGNORE_GPRS_SETUP
#ifndef DLMS_IGNORE_SECURITY_SETUP
case DLMS_OBJECT_TYPE_SECURITY_SETUP:
ret = ser_saveSecuritySetup(serializeSettings, (gxSecuritySetup*)object);
break;
#endif //DLMS_IGNORE_SECURITY_SETUP
#ifndef DLMS_IGNORE_IEC_HDLC_SETUP
case DLMS_OBJECT_TYPE_IEC_HDLC_SETUP:
ret = ser_saveHdlcSetup(serializeSettings, (gxIecHdlcSetup*)object);
break;
#endif //DLMS_IGNORE_IEC_HDLC_SETUP
#ifndef DLMS_IGNORE_IEC_LOCAL_PORT_SETUP
case DLMS_OBJECT_TYPE_IEC_LOCAL_PORT_SETUP:
ret = ser_saveLocalPortSetup(serializeSettings, (gxLocalPortSetup*)object);
break;
#endif //DLMS_IGNORE_IEC_LOCAL_PORT_SETUP
#ifndef DLMS_IGNORE_IEC_TWISTED_PAIR_SETUP
case DLMS_OBJECT_TYPE_IEC_TWISTED_PAIR_SETUP:
ret = ser_saveIecTwistedPairSetup(serializeSettings, (gxIecTwistedPairSetup*)object);
break;
#endif //DLMS_IGNORE_IEC_TWISTED_PAIR_SETUP
#ifndef DLMS_IGNORE_IP4_SETUP
case DLMS_OBJECT_TYPE_IP4_SETUP:
ret = ser_saveIp4Setup(serializeSettings, (gxIp4Setup*)object);
break;
#endif //DLMS_IGNORE_IP4_SETUP
#ifndef DLMS_IGNORE_IP6_SETUP
case DLMS_OBJECT_TYPE_IP6_SETUP:
ret = ser_saveIp6Setup(serializeSettings, (gxIp6Setup*)object);
break;
#endif //DLMS_IGNORE_IP6_SETUP
#ifndef DLMS_IGNORE_MBUS_DIAGNOSTIC
case DLMS_OBJECT_TYPE_MBUS_DIAGNOSTIC:
ret = ser_saveMbusDiagnostic(serializeSettings, (gxMbusDiagnostic*)object);
break;
#endif //DLMS_IGNORE_MBUS_DIAGNOSTIC
#ifndef DLMS_IGNORE_MBUS_PORT_SETUP
case DLMS_OBJECT_TYPE_MBUS_PORT_SETUP:
ret = ser_saveMbusPortSetup(serializeSettings, (gxMBusPortSetup*)object);
break;
#endif //DLMS_IGNORE_MBUS_PORT_SETUP
#ifndef DLMS_IGNORE_MBUS_SLAVE_PORT_SETUP
case DLMS_OBJECT_TYPE_MBUS_SLAVE_PORT_SETUP:
ret = ser_saveMbusSlavePortSetup(serializeSettings, (gxMbusSlavePortSetup*)object);
break;
#endif //DLMS_IGNORE_MBUS_SLAVE_PORT_SETUP
#ifndef DLMS_IGNORE_G3_PLC_MAC_LAYER_COUNTERS
case DLMS_OBJECT_TYPE_G3_PLC_MAC_LAYER_COUNTERS:
ret = ser_saveG3PlcMacLayerCounters(serializeSettings, (gxG3PlcMacLayerCounters*)object);
break;
#endif //DLMS_IGNORE_G3_PLC_MAC_LAYER_COUNTERS
#ifndef DLMS_IGNORE_G3_PLC_MAC_SETUP
case DLMS_OBJECT_TYPE_G3_PLC_MAC_SETUP:
ret = ser_saveG3PlcMacSetup(serializeSettings, (gxG3PlcMacSetup*)object);
break;
#endif //DLMS_IGNORE_G3_PLC_MAC_SETUP
#ifndef DLMS_IGNORE_G3_PLC_6LO_WPAN
case DLMS_OBJECT_TYPE_G3_PLC_6LO_WPAN:
ret = ser_saveG3Plc6LoWPAN(serializeSettings, (gxG3Plc6LoWPAN*)object);
break;
#endif //DLMS_IGNORE_G3_PLC_6LO_WPAN
#ifndef DLMS_IGNORE_FUNCTION_CONTROL
case DLMS_OBJECT_TYPE_FUNCTION_CONTROL:
ret = ser_saveFunctionControl(serializeSettings, (gxFunctionControl*)object);
break;
#endif //DLMS_IGNORE_FUNCTION_CONTROL
#ifndef DLMS_IGNORE_ARRAY_MANAGER
case DLMS_OBJECT_TYPE_ARRAY_MANAGER:
ret = ser_saveArrayManager(serializeSettings, (gxArrayManager*)object);
break;
#endif //DLMS_IGNORE_ARRAY_MANAGER
#ifndef DLMS_IGNORE_IMAGE_TRANSFER
case DLMS_OBJECT_TYPE_IMAGE_TRANSFER:
ret = ser_saveImageTransfer(serializeSettings, (gxImageTransfer*)object);
break;
#endif //DLMS_IGNORE_IMAGE_TRANSFER
#ifndef DLMS_IGNORE_DISCONNECT_CONTROL
case DLMS_OBJECT_TYPE_DISCONNECT_CONTROL:
ret = ser_saveDisconnectControl(serializeSettings, (gxDisconnectControl*)object);
break;
#endif //DLMS_IGNORE_DISCONNECT_CONTROL
#ifndef DLMS_IGNORE_LIMITER
case DLMS_OBJECT_TYPE_LIMITER:
ret = ser_saveLimiter(serializeSettings, (gxLimiter*)object);
break;
#endif //DLMS_IGNORE_LIMITER
#ifndef DLMS_IGNORE_MBUS_CLIENT
case DLMS_OBJECT_TYPE_MBUS_CLIENT:
ret = ser_saveMBusClient(serializeSettings, (gxMBusClient*)object);
break;
#endif //DLMS_IGNORE_MBUS_CLIENT
#ifndef DLMS_IGNORE_MODEM_CONFIGURATION
case DLMS_OBJECT_TYPE_MODEM_CONFIGURATION:
ret = ser_saveModemConfiguration(serializeSettings, (gxModemConfiguration*)object);
break;
#endif //DLMS_IGNORE_MODEM_CONFIGURATION
#ifndef DLMS_IGNORE_PPP_SETUP
case DLMS_OBJECT_TYPE_PPP_SETUP:
ret = ser_savePppSetup(serializeSettings, (gxPppSetup*)object);
break;
#endif //DLMS_IGNORE_PPP_SETUP
#ifndef DLMS_IGNORE_PROFILE_GENERIC
case DLMS_OBJECT_TYPE_PROFILE_GENERIC:
ret = ser_saveProfileGeneric(serializeSettings, (gxProfileGeneric*)object);
break;
#endif //DLMS_IGNORE_PROFILE_GENERIC
#ifndef DLMS_IGNORE_REGISTER_ACTIVATION
case DLMS_OBJECT_TYPE_REGISTER_ACTIVATION:
ret = ser_saveRegisterActivation(serializeSettings, (gxRegisterActivation*)object);
break;
#endif //DLMS_IGNORE_REGISTER_ACTIVATION
#ifndef DLMS_IGNORE_REGISTER_MONITOR
case DLMS_OBJECT_TYPE_REGISTER_MONITOR:
ret = ser_saveRegisterMonitor(serializeSettings, (gxRegisterMonitor*)object);
break;
#endif //DLMS_IGNORE_REGISTER_MONITOR
#ifndef DLMS_IGNORE_REGISTER_TABLE
case DLMS_OBJECT_TYPE_REGISTER_TABLE:
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
assert(0);
#endif
break;
#endif //DLMS_IGNORE_REGISTER_TABLE
#ifndef DLMS_IGNORE_ZIG_BEE_SAS_STARTUP
case DLMS_OBJECT_TYPE_ZIG_BEE_SAS_STARTUP:
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
assert(0);
#endif
break;
#endif //DLMS_IGNORE_ZIG_BEE_SAS_STARTUP
#ifndef DLMS_IGNORE_ZIG_BEE_SAS_JOIN
case DLMS_OBJECT_TYPE_ZIG_BEE_SAS_JOIN:
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
assert(0);
#endif
break;
#endif //DLMS_IGNORE_ZIG_BEE_SAS_JOIN
#ifndef DLMS_IGNORE_ZIG_BEE_SAS_APS_FRAGMENTATION
case DLMS_OBJECT_TYPE_ZIG_BEE_SAS_APS_FRAGMENTATION:
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
assert(0);
#endif
break;
#endif //DLMS_IGNORE_ZIG_BEE_SAS_APS_FRAGMENTATION
#ifndef DLMS_IGNORE_ZIG_BEE_NETWORK_CONTROL
case DLMS_OBJECT_TYPE_ZIG_BEE_NETWORK_CONTROL:
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
assert(0);
#endif
break;
#endif //DLMS_IGNORE_ZIG_BEE_NETWORK_CONTROL
#ifndef DLMS_IGNORE_SAP_ASSIGNMENT
case DLMS_OBJECT_TYPE_SAP_ASSIGNMENT:
ret = ser_saveSapAssignment(serializeSettings, (gxSapAssignment*)object);
break;
#endif //DLMS_IGNORE_SAP_ASSIGNMENT
#ifndef DLMS_IGNORE_SCHEDULE
case DLMS_OBJECT_TYPE_SCHEDULE:
ret = ser_saveSchedule(serializeSettings, (gxSchedule*)object);
break;
#endif //DLMS_IGNORE_SCHEDULE
#ifndef DLMS_IGNORE_SCRIPT_TABLE
case DLMS_OBJECT_TYPE_SCRIPT_TABLE:
ret = ser_saveScriptTable(serializeSettings, (gxScriptTable*)object);
break;
#endif //DLMS_IGNORE_SCRIPT_TABLE
#ifndef DLMS_IGNORE_SMTP_SETUP
case DLMS_OBJECT_TYPE_SMTP_SETUP:
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
assert(0);
#endif
break;
#endif //DLMS_IGNORE_SMTP_SETUP
#ifndef DLMS_IGNORE_SPECIAL_DAYS_TABLE
case DLMS_OBJECT_TYPE_SPECIAL_DAYS_TABLE:
ret = ser_saveSpecialDaysTable(serializeSettings, (gxSpecialDaysTable*)object);
break;
#endif //DLMS_IGNORE_SPECIAL_DAYS_TABLE
#ifndef DLMS_IGNORE_STATUS_MAPPING
case DLMS_OBJECT_TYPE_STATUS_MAPPING:
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
assert(0);
#endif
break;
#endif //DLMS_IGNORE_STATUS_MAPPING
#ifndef DLMS_IGNORE_TCP_UDP_SETUP
case DLMS_OBJECT_TYPE_TCP_UDP_SETUP:
ret = ser_saveTcpUdpSetup(serializeSettings, (gxTcpUdpSetup*)object);
break;
#endif //DLMS_IGNORE_TCP_UDP_SETUP
#ifndef DLMS_IGNORE_UTILITY_TABLES
case DLMS_OBJECT_TYPE_UTILITY_TABLES:
ret = ser_saveUtilityTables(serializeSettings, (gxUtilityTables*)object);
break;
#endif //DLMS_IGNORE_UTILITY_TABLES
#ifndef DLMS_IGNORE_MBUS_MASTER_PORT_SETUP
case DLMS_OBJECT_TYPE_MBUS_MASTER_PORT_SETUP:
ret = ser_saveMBusMasterPortSetup(serializeSettings, (gxMBusMasterPortSetup*)object);
break;
#endif //DLMS_IGNORE_MBUS_MASTER_PORT_SETUP
#ifndef DLMS_IGNORE_PUSH_SETUP
case DLMS_OBJECT_TYPE_PUSH_SETUP:
ret = ser_savePushSetup(serializeSettings, (gxPushSetup*)object);
break;
#endif //DLMS_IGNORE_PUSH_SETUP
#ifndef DLMS_IGNORE_DATA_PROTECTION
case DLMS_OBJECT_TYPE_DATA_PROTECTION:
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
assert(0);
#endif
break;
#endif //DLMS_IGNORE_DATA_PROTECTION
#ifndef DLMS_IGNORE_ACCOUNT
case DLMS_OBJECT_TYPE_ACCOUNT:
ret = ser_saveAccount(serializeSettings, (gxAccount*)object);
break;
#endif //DLMS_IGNORE_ACCOUNT
#ifndef DLMS_IGNORE_CREDIT
case DLMS_OBJECT_TYPE_CREDIT:
ret = ser_saveCredit(serializeSettings, (gxCredit*)object);
break;
#endif //DLMS_IGNORE_CREDIT
#ifndef DLMS_IGNORE_CHARGE
case DLMS_OBJECT_TYPE_CHARGE:
ret = ser_saveCharge(serializeSettings, (gxCharge*)object);
break;
#endif //DLMS_IGNORE_CHARGE
#ifndef DLMS_IGNORE_TOKEN_GATEWAY
case DLMS_OBJECT_TYPE_TOKEN_GATEWAY:
ret = ser_saveTokenGateway(serializeSettings, (gxTokenGateway*)object);
break;
#endif //DLMS_IGNORE_TOKEN_GATEWAY
#ifndef DLMS_IGNORE_GSM_DIAGNOSTIC
case DLMS_OBJECT_TYPE_GSM_DIAGNOSTIC:
ret = ser_saveGsmDiagnostic(serializeSettings, (gxGsmDiagnostic*)object);
break;
#endif //DLMS_IGNORE_GSM_DIAGNOSTIC
#ifndef DLMS_IGNORE_COMPACT_DATA
case DLMS_OBJECT_TYPE_COMPACT_DATA:
ret = ser_saveCompactData(serializeSettings, (gxCompactData*)object);
break;
#endif //DLMS_IGNORE_COMPACT_DATA
#ifndef DLMS_IGNORE_LLC_SSCS_SETUP
case DLMS_OBJECT_TYPE_LLC_SSCS_SETUP:
ret = ser_saveLlcSscsSetup(serializeSettings, (gxLlcSscsSetup*)object);
break;
#endif //DLMS_IGNORE_LLC_SSCS_SETUP
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_PHYSICAL_LAYER_COUNTERS
case DLMS_OBJECT_TYPE_PRIME_NB_OFDM_PLC_PHYSICAL_LAYER_COUNTERS:
ret = ser_savePrimeNbOfdmPlcPhysicalLayerCounters(serializeSettings, (gxPrimeNbOfdmPlcPhysicalLayerCounters*)object);
break;
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_PHYSICAL_LAYER_COUNTERS
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_SETUP
case DLMS_OBJECT_TYPE_PRIME_NB_OFDM_PLC_MAC_SETUP:
ret = ser_savePrimeNbOfdmPlcMacSetup(serializeSettings, (gxPrimeNbOfdmPlcMacSetup*)object);
break;
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_SETUP
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_FUNCTIONAL_PARAMETERS
case DLMS_OBJECT_TYPE_PRIME_NB_OFDM_PLC_MAC_FUNCTIONAL_PARAMETERS:
ret = ser_savePrimeNbOfdmPlcMacFunctionalParameters(serializeSettings, (gxPrimeNbOfdmPlcMacFunctionalParameters*)object);
break;
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_FUNCTIONAL_PARAMETERS
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_COUNTERS
case DLMS_OBJECT_TYPE_PRIME_NB_OFDM_PLC_MAC_COUNTERS:
ret = ser_savePrimeNbOfdmPlcMacCounters(serializeSettings, (gxPrimeNbOfdmPlcMacCounters*)object);
break;
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_COUNTERS
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_NETWORK_ADMINISTRATION_DATA
case DLMS_OBJECT_TYPE_PRIME_NB_OFDM_PLC_MAC_NETWORK_ADMINISTRATION_DATA:
ret = ser_savePrimeNbOfdmPlcMacNetworkAdministrationData(serializeSettings, (gxPrimeNbOfdmPlcMacNetworkAdministrationData*)object);
break;
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_NETWORK_ADMINISTRATION_DATA
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_APPLICATIONS_IDENTIFICATION
case DLMS_OBJECT_TYPE_PRIME_NB_OFDM_PLC_APPLICATIONS_IDENTIFICATION:
ret = ser_savePrimeNbOfdmPlcApplicationsIdentification(serializeSettings, (gxPrimeNbOfdmPlcApplicationsIdentification*)object);
break;
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_APPLICATIONS_IDENTIFICATION
#ifndef DLMS_IGNORE_PARAMETER_MONITOR
case DLMS_OBJECT_TYPE_PARAMETER_MONITOR:
break;
#endif //DLMS_IGNORE_PARAMETER_MONITOR
#ifndef DLMS_IGNORE_ARBITRATOR
case DLMS_OBJECT_TYPE_ARBITRATOR:
ret = ser_saveArbitrator(serializeSettings, (gxArbitrator*)object);
break;
#endif //DLMS_IGNORE_ARBITRATOR
#ifndef DLMS_IGNORE_IEC_8802_LLC_TYPE1_SETUP
case DLMS_OBJECT_TYPE_IEC_8802_LLC_TYPE1_SETUP:
ret = ser_saveIec8802LlcType1Setup(serializeSettings, (gxIec8802LlcType1Setup*)object);
break;
#endif //DLMS_IGNORE_IEC_8802_LLC_TYPE1_SETUP
#ifndef DLMS_IGNORE_IEC_8802_LLC_TYPE2_SETUP
case DLMS_OBJECT_TYPE_IEC_8802_LLC_TYPE2_SETUP:
ser_saveIec8802LlcType2Setup(serializeSettings, (gxIec8802LlcType2Setup*)object);
break;
#endif //DLMS_IGNORE_IEC_8802_LLC_TYPE2_SETUP
#ifndef DLMS_IGNORE_IEC_8802_LLC_TYPE3_SETUP
case DLMS_OBJECT_TYPE_IEC_8802_LLC_TYPE3_SETUP:
ser_saveIec8802LlcType3Setup(serializeSettings, (gxIec8802LlcType3Setup*)object);
break;
#endif //DLMS_IGNORE_IEC_8802_LLC_TYPE3_SETUP
#ifndef DLMS_IGNORE_SFSK_ACTIVE_INITIATOR
case DLMS_OBJECT_TYPE_SFSK_ACTIVE_INITIATOR:
ser_saveSFSKActiveInitiator(serializeSettings, (gxSFSKActiveInitiator*)object);
break;
#endif //DLMS_IGNORE_SFSK_ACTIVE_INITIATOR
#ifndef DLMS_IGNORE_SFSK_MAC_COUNTERS
case DLMS_OBJECT_TYPE_SFSK_MAC_COUNTERS:
ser_saveFSKMacCounters(serializeSettings, (gxFSKMacCounters*)object);
break;
#endif //DLMS_IGNORE_SFSK_MAC_COUNTERS
#ifndef DLMS_IGNORE_SFSK_MAC_SYNCHRONIZATION_TIMEOUTS
case DLMS_OBJECT_TYPE_SFSK_MAC_SYNCHRONIZATION_TIMEOUTS:
ser_saveSFSKMacSynchronizationTimeouts(serializeSettings, (gxSFSKMacSynchronizationTimeouts*)object);
break;
#endif //DLMS_IGNORE_SFSK_MAC_SYNCHRONIZATION_TIMEOUTS
#ifndef DLMS_IGNORE_SFSK_PHY_MAC_SETUP
case DLMS_OBJECT_TYPE_SFSK_PHY_MAC_SETUP:
ser_saveSFSKPhyMacSetUp(serializeSettings, (gxSFSKPhyMacSetUp*)object);
break;
#endif //DLMS_IGNORE_SFSK_PHY_MAC_SETUP
#ifndef DLMS_IGNORE_SFSK_REPORTING_SYSTEM_LIST
case DLMS_OBJECT_TYPE_SFSK_REPORTING_SYSTEM_LIST:
ser_saveSFSKReportingSystemList(serializeSettings, (gxSFSKReportingSystemList*)object);
break;
#endif //DLMS_IGNORE_SFSK_REPORTING_SYSTEM_LIST
#ifdef DLMS_ITALIAN_STANDARD
case DLMS_OBJECT_TYPE_TARIFF_PLAN:
ret = ser_saveTariffPlan(serializeSettings, (gxTariffPlan*)object);
break;
#endif //DLMS_ITALIAN_STANDARD
default: //Unknown type.
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#if !(!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
void ResetPosition(gxSerializerSettings* serializeSettings)
{
#ifdef DLMS_IGNORE_MALLOC
serializeSettings->currentObject = NULL;
serializeSettings->currentIndex = 0;
#endif //DLMS_IGNORE_MALLOC
serializeSettings->position = 0;
serializeSettings->updateEnd = 0;
#if defined(GX_DLMS_BYTE_BUFFER_SIZE_32) && !defined(GX_DLMS_MICROCONTROLLER)
serializeSettings->updateStart = 0xFFFFFFFF;
#else
serializeSettings->updateStart = 0xFFFF;
#endif //defined(GX_DLMS_BYTE_BUFFER_SIZE_32) && !defined(GX_DLMS_MICROCONTROLLER)
}
#endif //!(!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
//Serialize objects to bytebuffer.
int ser_saveObjects(
gxSerializerSettings* serializeSettings,
gxObject** objects,
uint16_t count)
{
uint16_t pos;
int ret = 0;
#if !(!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
ResetPosition(serializeSettings);
#endif //!(!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
#ifdef DLMS_IGNORE_MALLOC
if (serializeSettings->savedAttributes == 0)
{
serializeSettings->savedAttributes = 0xFFFF;
}
#endif //DLMS_IGNORE_MALLOC
unsigned char ver = 0;
uint32_t dataSize = 0;
//Serializer version number only if it's changed.
ret = ser_loadUInt8(serializeSettings, &ver);
//If version has changed.
if (ret != 0 || ver != SERIALIZATION_VERSION)
{
if (ret == 0)
{
ret = ser_seek(serializeSettings, -1);
}
if ((ret = ser_saveUInt8(serializeSettings, SERIALIZATION_VERSION)) != 0 ||
//Data size.
(ret = ser_saveUInt32(serializeSettings, 0)) != 0)
{
return ret;
}
#ifdef DLMS_IGNORE_MALLOC
//All objects are saved on the first time.
serializeSettings->savedAttributes = 0xFFFF;
serializeSettings->savedObject = NULL;
#endif //DLMS_IGNORE_MALLOC
#if !(!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
#if defined(GX_DLMS_BYTE_BUFFER_SIZE_32) && !defined(GX_DLMS_MICROCONTROLLER)
serializeSettings->updateStart = 0xFFFFFFFF;
#else
serializeSettings->updateStart = 0xFFFF;
#endif //defined(GX_DLMS_BYTE_BUFFER_SIZE_32) && !defined(GX_DLMS_MICROCONTROLLER)
#endif //!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__))
}
else
{
ret = ser_loadUInt32(serializeSettings, &dataSize);
}
if (ret == 0)
{
for (pos = 0; pos != count; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
serializeSettings->currentObject = objects[pos];
#endif //DLMS_IGNORE_MALLOC
if ((ret = ser_saveObject(serializeSettings, objects[pos])) != DLMS_ERROR_CODE_OK)
{
break;
}
}
}
#ifdef DLMS_IGNORE_MALLOC
serializeSettings->currentObject = NULL;
serializeSettings->currentIndex = 0;
#endif //DLMS_IGNORE_MALLOC
if (ret == 0)
{
#if !defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__))
int index = ftell(serializeSettings->stream);
uint32_t size = (uint32_t)(index - 5);
#else
int index = serializeSettings->position;
uint32_t size = (uint16_t)serializeSettings->position - 5;
#endif //#!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__))
if (dataSize == 0 || dataSize != size)
{
--index;
ret = ser_seek(serializeSettings, -index);
//Data size.
ret = ser_saveUInt32(serializeSettings, size);
//Seek to end.
ret = ser_seek(serializeSettings, size);
}
}
return ret;
}
int ser_saveObjects2(
gxSerializerSettings* serializeSettings,
objectArray* objects)
{
uint16_t pos;
int ret;
gxObject* obj;
#if !(!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
ResetPosition(serializeSettings);
#endif //!(!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
#ifdef DLMS_IGNORE_MALLOC
if (serializeSettings->savedAttributes == 0)
{
serializeSettings->savedAttributes = 0xFFFF;
}
#endif //DLMS_IGNORE_MALLOC
unsigned char ver = 0;
//Serializer version number only if it's changed.
ret = ser_loadUInt8(serializeSettings, &ver);
uint32_t dataSize = 0;
//If version has changed.
if (ret != 0 || ver != SERIALIZATION_VERSION)
{
if (ret == 0)
{
ret = ser_seek(serializeSettings, -1);
}
if ((ret = ser_saveUInt8(serializeSettings, SERIALIZATION_VERSION)) != 0 ||
//Data size.
(ret = ser_saveUInt32(serializeSettings, 0)) != 0)
{
return ret;
}
#ifdef DLMS_IGNORE_MALLOC
//All objects are saved on the first time.
serializeSettings->savedAttributes = 0xFFFF;
serializeSettings->savedObject = NULL;
#endif //DLMS_IGNORE_MALLOC
#if !(!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
#if defined(GX_DLMS_BYTE_BUFFER_SIZE_32) && !defined(GX_DLMS_MICROCONTROLLER)
serializeSettings->updateStart = 0xFFFFFFFF;
#else
serializeSettings->updateStart = 0xFFFF;
#endif //defined(GX_DLMS_BYTE_BUFFER_SIZE_32) && !defined(GX_DLMS_MICROCONTROLLER)
#endif //!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__))
}
else
{
ret = ser_loadUInt32(serializeSettings, &dataSize);
}
if (ret == 0)
{
for (pos = 0; pos != objects->size; ++pos)
{
if ((ret = oa_getByIndex(objects, pos, &obj)) != DLMS_ERROR_CODE_OK)
{
break;
}
#ifdef DLMS_IGNORE_MALLOC
serializeSettings->currentObject = obj;
#endif //DLMS_IGNORE_MALLOC
if ((ret = ser_saveObject(serializeSettings, obj)) != DLMS_ERROR_CODE_OK)
{
break;
}
}
}
#ifdef DLMS_IGNORE_MALLOC
serializeSettings->currentObject = NULL;
serializeSettings->currentIndex = 0;
#endif //DLMS_IGNORE_MALLOC
if (ret == 0)
{
#if !defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__))
int index = ftell(serializeSettings->stream);
uint32_t size = (uint32_t)(index - 5);
#else
int index = serializeSettings->position;
uint32_t size = (uint16_t)serializeSettings->position - 5;
#endif //#!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__))
if (dataSize == 0 || dataSize != size)
{
--index;
ret = ser_seek(serializeSettings, -index);
//Data size.
ret = ser_saveUInt32(serializeSettings, size);
//Seek to end.
ret = ser_seek(serializeSettings, size);
}
}
return ret;
}
// --------------------------------------------------------------------------
//Load functionality.
// Get item from the buffer if DLMS_IGNORE_MALLOC is defined.
// Otherwice create the object dynamically.
int ser_getArrayItem(gxArray* arr, uint16_t index, void** value, uint16_t itemSize)
{
#ifdef DLMS_IGNORE_MALLOC
return arr_getByIndex4(arr, index, value, itemSize, 0);
#else
void* it = gxcalloc(1, itemSize);
if (it == NULL)
{
return DLMS_ERROR_CODE_OUTOFMEMORY;
}
*value = it;
return arr_push(arr, it);
#endif //DLMS_COSEM_EXACT_DATA_TYPES
}
int ser_verifyObjectArray(gxSerializerSettings* serializeSettings, objectArray* arr, uint16_t* count)
{
oa_empty(arr);
int ret = ser_loadObjectCount(serializeSettings, count);
if (ret == 0)
{
#ifdef DLMS_IGNORE_MALLOC
uint16_t capacity;
ret = ser_loadObjectCount(serializeSettings, &capacity);
arr->size = capacity;
#else
ret = oa_capacity(arr, *count);
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
#ifndef DLMS_IGNORE_DATA
int ser_loadData(gxSerializerSettings* serializeSettings, gxData* object)
{
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
return ser_loadVariant(&object->value, serializeSettings);
}
return 0;
}
#endif //DLMS_IGNORE_DATA
#ifndef DLMS_IGNORE_REGISTER
int ser_loadRegister(gxSerializerSettings* serializeSettings, gxRegister* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 3))
{
if ((ret = ser_loadInt8(serializeSettings, &object->scaler)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &object->unit)) != 0)
{
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 2))
{
ret = ser_loadVariant(&object->value, serializeSettings);
}
return ret;
}
#endif //DLMS_IGNORE_REGISTER
#ifndef DLMS_IGNORE_CLOCK
int ser_loadClock(gxSerializerSettings* serializeSettings, gxClock* object)
{
int ret = 0;
unsigned char status = 0, clockBase = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!(!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_loadDateTime(&object->time, serializeSettings, DLMS_DATA_TYPE_DATETIME)) == 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_loadInt16(serializeSettings, &object->timeZone)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_loadUInt8(serializeSettings, &status)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_loadDateTime(&object->begin, serializeSettings, DLMS_DATA_TYPE_DATETIME)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_loadDateTime(&object->end, serializeSettings, DLMS_DATA_TYPE_DATETIME)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_loadInt8(serializeSettings, &object->deviation)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_loadUInt8(serializeSettings, &object->enabled)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_loadUInt8(serializeSettings, &clockBase)) != 0))
{
object->status = status;
object->clockBase = clockBase;
}
return ret;
}
#endif //DLMS_IGNORE_CLOCK
#ifndef DLMS_IGNORE_SCRIPT_TABLE
int ser_loadScriptTable(
gxSerializerSettings* serializeSettings,
dlmsSettings* settings,
gxScriptTable* object)
{
int ret = 0, pos, pos2;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
gxScript* s;
gxScriptAction* sa;
uint16_t count, count2;
if (!isAttributeSet(serializeSettings, ignored, 2))
{
obj_clearScriptTable(&object->scripts);
if ((ret = ser_loadArray(serializeSettings, &object->scripts, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(&object->scripts, pos, (void**)&s, sizeof(gxScript))) != 0)
{
break;
}
if ((ret = ser_loadUInt16(serializeSettings, &s->id)) != 0)
{
break;
}
if ((ret = ser_loadArray(serializeSettings, &s->actions, &count2)) == 0)
{
for (pos2 = 0; pos2 != count2; ++pos2)
{
if ((ret = ser_getArrayItem(&s->actions, pos2, (void**)&sa, sizeof(gxScriptAction))) != 0)
{
break;
}
if ((ret = ser_loadUInt8(serializeSettings, (unsigned char*)&sa->type)) != 0)
{
break;
}
#ifndef DLMS_IGNORE_OBJECT_POINTERS
uint16_t ot;
unsigned char ln[6];
if ((ret = ser_loadUInt16(serializeSettings, &ot)) != 0 ||
(ret = ser_get(serializeSettings, ln, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0)
{
break;
}
if (pos2 < count2)
{
sa->target = NULL;
if ((ret = cosem_findObjectByLN(settings, ot, ln, &sa->target)) != 0)
{
break;
}
if (sa->target == NULL)
{
ret = DLMS_ERROR_CODE_OUTOFMEMORY;
break;
}
}
#else
if ((ret = ser_loadUInt16(serializeSettings, sa->objectType)) != 0 ||
(ret = ser_get(serializeSettings, sa->logicalName, sizeof(sa->logicalName))) != 0)
{
break;
}
#endif //DLMS_IGNORE_OBJECT_POINTERS
if ((ret = ser_loadInt8(serializeSettings, &sa->index)) != 0 ||
(ret = ser_loadVariant(&sa->parameter, serializeSettings)) != 0)
{
break;
}
}
}
if (ret != 0)
{
break;
}
}
}
}
return ret;
}
#endif //DLMS_IGNORE_SCRIPT_TABLE
#ifndef DLMS_IGNORE_SPECIAL_DAYS_TABLE
int ser_loadSpecialDaysTable(
gxSerializerSettings* serializeSettings,
gxSpecialDaysTable* object)
{
int ret = 0, pos;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
gxSpecialDay* sd;
uint16_t count;
if (!isAttributeSet(serializeSettings, ignored, 2))
{
arr_clear(&object->entries);
if ((ret = ser_loadArray(serializeSettings, &object->entries, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(&object->entries, pos, (void**)&sd, sizeof(gxSpecialDay))) != 0)
{
break;
}
if ((ret = ser_loadUInt16(serializeSettings, &sd->index)) != 0 ||
(ret = ser_loadDateTime(&sd->date, serializeSettings, DLMS_DATA_TYPE_DATETIME)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &sd->dayId)) != 0)
{
break;
}
}
}
}
return ret;
}
#endif //DLMS_IGNORE_SPECIAL_DAYS_TABLE
#ifndef DLMS_IGNORE_TCP_UDP_SETUP
int ser_loadTcpUdpSetup(
gxSerializerSettings* serializeSettings,
dlmsSettings* settings,
gxTcpUdpSetup* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
unsigned char ln[6];
if (!isAttributeSet(serializeSettings, ignored, 2))
{
ret = ser_loadUInt16(serializeSettings, &object->port);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3))
{
if ((ret = ser_get(serializeSettings, ln, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) == 0)
{
#ifndef DLMS_IGNORE_OBJECT_POINTERS
if ((ret = cosem_findObjectByLN(settings, DLMS_OBJECT_TYPE_NONE, ln, &object->ipSetup)) != 0)
{
return ret;
}
#else
if (ret = ser_get(&ba, object->ipReference, 6)) != 0 ||
{
return ret;
}
#endif //DLMS_IGNORE_OBJECT_POINTERS
}
}
if (ret == 0)
{
if ((!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_loadUInt16(serializeSettings, &object->maximumSegmentSize)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_loadUInt8(serializeSettings, &object->maximumSimultaneousConnections)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_loadUInt16(serializeSettings, &object->inactivityTimeout)) != 0))
{
}
}
return ret;
}
#endif //DLMS_IGNORE_TCP_UDP_SETUP
#ifndef DLMS_IGNORE_MBUS_MASTER_PORT_SETUP
int ser_loadMBusMasterPortSetup(
gxSerializerSettings* serializeSettings,
gxMBusMasterPortSetup* object)
{
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
return ser_loadUInt8(serializeSettings, (unsigned char*)&object->commSpeed);
}
return 0;
}
#endif //DLMS_IGNORE_MBUS_MASTER_PORT_SETUP
int ser_loadObjectsInternal(
dlmsSettings* settings,
gxSerializerSettings* serializeSettings,
gxArray* objects)
{
uint16_t pos;
int ret;
uint16_t count;
uint16_t ot;
unsigned char ln[6];
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
gxTarget* it;
#else
gxObject* key;
gxTarget* value;
#endif //DLMS_IGNORE_MALLOC
obj_clearProfileGenericCaptureObjects(objects);
if ((ret = ser_loadArray(serializeSettings, objects, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
if ((ret = ser_getArrayItem(objects, pos, (void**)&it, sizeof(gxTarget))) != 0)
{
break;
}
if ((ret = ser_loadUInt16(serializeSettings, &ot)) != 0 ||
(ret = ser_get(serializeSettings, ln, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
(ret = ser_loadInt8(serializeSettings, &it->attributeIndex)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &it->dataIndex)) != 0 ||
(ret = cosem_findObjectByLN(settings, ot, ln, &it->target)) != 0)
{
break;
}
#else
value = (gxTarget*)gxmalloc(sizeof(gxTarget));
if (value == NULL)
{
return DLMS_ERROR_CODE_OUTOFMEMORY;
}
if ((ret = ser_loadUInt16(serializeSettings, &ot)) != 0 ||
(ret = ser_get(serializeSettings, ln, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
(ret = cosem_findObjectByLN(settings, ot, ln, &key)) != 0 ||
(ret = ser_loadInt8(serializeSettings, &value->attributeIndex)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &value->dataIndex)) != 0)
{
gxfree(value);
break;
}
if ((ret = arr_push(objects, key_init(key, value))) != 0)
{
break;
}
#endif //!defined(DLMS_IGNORE_MALLOC) && !defined(DLMS_COSEM_EXACT_DATA_TYPES)
}
}
return ret;
}
#ifndef DLMS_IGNORE_PUSH_SETUP
int ser_loadPushSetup(
gxSerializerSettings* serializeSettings,
dlmsSettings* settings,
gxPushSetup* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
ret = ser_loadObjectsInternal(settings, serializeSettings, &object->pushObjectList);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3))
{
if ((ret = ser_loadUInt8(serializeSettings, (unsigned char*)&object->service)) != 0 ||
(ret = ser_loadOctetString(serializeSettings, &object->destination)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, (unsigned char*)&object->message)) != 0)
{
}
}
if (ret == 0)
{
if ((!isAttributeSet(serializeSettings, ignored, 4) && (ret = loadTimeWindow(serializeSettings, &object->communicationWindow)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_loadUInt16(serializeSettings, &object->randomisationStartInterval)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_loadUInt8(serializeSettings, &object->numberOfRetries)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_loadUInt16(serializeSettings, &object->repetitionDelay)) != 0))
{
}
}
return ret;
}
#endif //DLMS_IGNORE_PUSH_SETUP
#ifndef DLMS_IGNORE_AUTO_CONNECT
int ser_loadAutoConnect(
gxSerializerSettings* serializeSettings,
gxAutoConnect* object)
{
uint16_t count;
#ifdef DLMS_IGNORE_MALLOC
gxDestination* dest;
#else
gxByteBuffer* dest;
#endif //DLMS_IGNORE_MALLOC
int pos, ret = 0;
unsigned char ch;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
if ((ret = ser_loadUInt8(serializeSettings, &ch)) == 0)
{
object->mode = (DLMS_AUTO_CONNECT_MODE)ch;
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3))
{
ret = ser_loadUInt8(serializeSettings, &object->repetitions);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4))
{
ret = ser_loadUInt16(serializeSettings, &object->repetitionDelay);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 5))
{
ret = loadTimeWindow(serializeSettings, &object->callingWindow);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 6))
{
arr_clearStrings(&object->destinations);
if (ret == 0 && (ret = ser_loadArray(serializeSettings, &object->destinations, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(&object->destinations, pos, (void**)&dest, sizeof(gxDestination), 0)) != 0)
{
break;
}
if ((ret = ser_loadOctetString3(serializeSettings, dest->value, &dest->size)) != 0)
{
break;
}
#else
dest = (gxByteBuffer*)gxmalloc(sizeof(gxByteBuffer));
if (dest == NULL)
{
return DLMS_ERROR_CODE_OUTOFMEMORY;
}
BYTE_BUFFER_INIT(dest);
if ((ret = arr_push(&object->destinations, dest)) != 0)
{
break;
}
if ((ret = ser_loadOctetString(serializeSettings, dest)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
}
return ret;
}
#endif //DLMS_IGNORE_AUTO_CONNECT
#ifndef DLMS_IGNORE_ACTIVITY_CALENDAR
int ser_loadSeasonProfile(
gxArray* arr,
gxSerializerSettings* serializeSettings)
{
gxSeasonProfile* it;
int pos, ret;
uint16_t count;
if ((ret = obj_clearSeasonProfile(arr)) == 0 &&
(ret = ser_loadArray(serializeSettings, arr, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(arr, pos, (void**)&it, sizeof(gxSeasonProfile))) != 0)
{
break;
}
#ifdef DLMS_IGNORE_MALLOC
if ((ret = ser_loadOctetString3(serializeSettings, it->name.value, &it->name.size)) != 0 ||
(ret = ser_loadDateTime(&it->start, serializeSettings, DLMS_DATA_TYPE_DATETIME)) != 0 ||
(ret = ser_loadOctetString3(serializeSettings, it->weekName.value, &it->weekName.size)) != 0)
{
break;
}
#else
if ((ret = ser_loadOctetString(serializeSettings, &it->name)) != 0 ||
(ret = ser_loadDateTime(&it->start, serializeSettings, DLMS_DATA_TYPE_DATETIME)) != 0 ||
(ret = ser_loadOctetString(serializeSettings, &it->weekName)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
return ret;
}
int ser_loadweekProfile(
gxArray* arr,
gxSerializerSettings* serializeSettings)
{
gxWeekProfile* it;
int pos, ret;
uint16_t count;
if ((ret = obj_clearWeekProfileTable(arr)) == 0 &&
(ret = ser_loadArray(serializeSettings, arr, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(arr, pos, (void**)&it, sizeof(gxWeekProfile))) != 0)
{
break;
}
#ifdef DLMS_IGNORE_MALLOC
if ((ret = ser_loadOctetString3(serializeSettings, it->name.value, &it->name.size)) != 0)
{
break;
}
#else
if ((ret = ser_loadOctetString(serializeSettings, &it->name)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = ser_loadUInt8(serializeSettings, &it->monday)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->tuesday)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->wednesday)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->thursday)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->friday)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->saturday)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->sunday)) != 0)
{
break;
}
}
}
return ret;
}
int ser_loadDayProfile(
dlmsSettings* settings,
gxArray* arr,
gxSerializerSettings* serializeSettings)
{
gxDayProfile* dp;
gxDayProfileAction* it;
int pos, pos2, ret;
uint16_t count, count2;
#ifndef DLMS_IGNORE_OBJECT_POINTERS
unsigned char ln[6];
#endif //DLMS_IGNORE_OBJECT_POINTERS
if ((ret = obj_clearDayProfileTable(arr)) == 0 &&
(ret = ser_loadArray(serializeSettings, arr, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(arr, pos, (void**)&dp, sizeof(gxDayProfile))) != 0)
{
break;
}
if ((ret = ser_loadUInt8(serializeSettings, &dp->dayId)) != 0 ||
(ret = ser_loadArray(serializeSettings, &dp->daySchedules, &count2)) != 0)
{
break;
}
for (pos2 = 0; pos2 != count2; ++pos2)
{
if ((ret = ser_getArrayItem(&dp->daySchedules, pos2, (void**)&it, sizeof(gxDayProfileAction))) != 0)
{
break;
}
#ifndef DLMS_IGNORE_OBJECT_POINTERS
if ((ret = ser_get(serializeSettings, ln, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0)
{
break;
}
if (pos2 < count2)
{
if ((ret = cosem_findObjectByLN(settings, DLMS_OBJECT_TYPE_NONE, ln, &it->script)) != 0)
{
break;
}
}
else
{
it->script = NULL;
}
#else
if ((ret = ser_get(serializeSettings, it->scriptLogicalName, 6)) != 0)
{
break;
}
#endif //DLMS_IGNORE_OBJECT_POINTERS
if ((ret = ser_loadUInt16(serializeSettings, &it->scriptSelector)) != 0 ||
(ret = ser_loadDateTime(&it->startTime, serializeSettings, DLMS_DATA_TYPE_DATETIME)) != 0)
{
break;
}
}
}
}
return ret;
}
int ser_loadActivityCalendar(
gxSerializerSettings* serializeSettings,
dlmsSettings* settings,
gxActivityCalendar* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_loadOctetString(serializeSettings, &object->calendarNameActive)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_loadSeasonProfile(&object->seasonProfileActive, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_loadweekProfile(&object->weekProfileTableActive, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_loadDayProfile(settings, &object->dayProfileTableActive, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_loadOctetString(serializeSettings, &object->calendarNamePassive)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_loadSeasonProfile(&object->seasonProfilePassive, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_loadweekProfile(&object->weekProfileTablePassive, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_loadDayProfile(settings, &object->dayProfileTablePassive, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 10) && (ret = ser_loadDateTime(&object->time, serializeSettings, DLMS_DATA_TYPE_DATETIME)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_ACTIVITY_CALENDAR
#ifndef DLMS_IGNORE_SECURITY_SETUP
int ser_loadSecuritySetup(
gxSerializerSettings* serializeSettings,
gxSecuritySetup* object)
{
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
unsigned char v;
int ret = 0;
if (!isAttributeSet(serializeSettings, ignored, 2))
{
if ((ret = ser_loadUInt8(serializeSettings, &v)) == 0)
{
object->securityPolicy = (DLMS_SECURITY_POLICY)v;
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3))
{
if ((ret = ser_loadUInt8(serializeSettings, &v)) == 0)
{
object->securitySuite = (DLMS_SECURITY_SUITE)v;
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4))
{
if ((ret = bb_clear(&object->serverSystemTitle)) == 0)
{
ret = ser_loadOctetString(serializeSettings, &object->serverSystemTitle);
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 5))
{
if ((ret = bb_clear(&object->clientSystemTitle)) == 0)
{
ret = ser_loadOctetString(serializeSettings, &object->clientSystemTitle);
}
}
return ret;
}
#endif //DLMS_IGNORE_SECURITY_SETUP
#ifndef DLMS_IGNORE_IEC_HDLC_SETUP
int ser_loadHdlcSetup(
gxSerializerSettings* serializeSettings,
gxIecHdlcSetup* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_loadUInt8(serializeSettings, (unsigned char*)&object->communicationSpeed)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_loadUInt8(serializeSettings, &object->windowSizeTransmit)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_loadUInt8(serializeSettings, &object->windowSizeReceive)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_loadUInt16(serializeSettings, &object->maximumInfoLengthTransmit)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_loadUInt16(serializeSettings, &object->maximumInfoLengthReceive)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_loadUInt16(serializeSettings, &object->interCharachterTimeout)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_loadUInt16(serializeSettings, &object->inactivityTimeout)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_loadUInt16(serializeSettings, &object->deviceAddress)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_IEC_HDLC_SETUP
#ifndef DLMS_IGNORE_IEC_LOCAL_PORT_SETUP
int ser_loadLocalPortSetup(
gxSerializerSettings* serializeSettings,
gxLocalPortSetup* object)
{
int ret = 0;
unsigned char ch;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
if ((ret = ser_loadUInt8(serializeSettings, &ch)) == 0)
{
object->defaultMode = (DLMS_OPTICAL_PROTOCOL_MODE)ch;
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3))
{
if ((ret = ser_loadUInt8(serializeSettings, &ch)) == 0)
{
object->defaultBaudrate = (DLMS_BAUD_RATE)ch;
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4))
{
if ((ret = ser_loadUInt8(serializeSettings, &ch)) == 0)
{
object->proposedBaudrate = (DLMS_BAUD_RATE)ch;
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 5))
{
if ((ret = ser_loadUInt8(serializeSettings, &ch)) == 0)
{
object->responseTime = (DLMS_LOCAL_PORT_RESPONSE_TIME)ch;
}
}
if (ret == 0)
{
if ((!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_loadOctetString(serializeSettings, &object->deviceAddress)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_loadOctetString(serializeSettings, &object->password1)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_loadOctetString(serializeSettings, &object->password2)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_loadOctetString(serializeSettings, &object->password5)) != 0))
{
}
}
return ret;
}
#endif //DLMS_IGNORE_IEC_LOCAL_PORT_SETUP
#ifndef DLMS_IGNORE_IEC_TWISTED_PAIR_SETUP
int ser_loadIecTwistedPairSetup(
gxSerializerSettings* serializeSettings,
gxIecTwistedPairSetup* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_loadUInt8(serializeSettings, (unsigned char*)&object->mode)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_loadUInt8(serializeSettings, (unsigned char*)&object->speed)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_loadOctetString(serializeSettings, &object->primaryAddresses)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_loadOctetString(serializeSettings, &object->tabis)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_IEC_TWISTED_PAIR_SETUP
#ifndef DLMS_IGNORE_DEMAND_REGISTER
int ser_loadDemandRegister(
gxSerializerSettings* serializeSettings,
gxDemandRegister* object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_loadVariant(&object->currentAverageValue, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_loadVariant(&object->lastAverageValue, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_loadInt8(serializeSettings, &object->scaler)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_loadUInt8(serializeSettings, &object->unit)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_loadVariant(&object->status, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_loadDateTime(&object->captureTime, serializeSettings, DLMS_DATA_TYPE_DATETIME)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_loadDateTime(&object->startTimeCurrent, serializeSettings, DLMS_DATA_TYPE_DATETIME)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_loadUInt32(serializeSettings, &object->period)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 10) && (ret = ser_loadUInt16(serializeSettings, &object->numberOfPeriods)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_DEMAND_REGISTER
#ifndef DLMS_IGNORE_REGISTER_ACTIVATION
int ser_loadRegisterActivation(
gxSerializerSettings* serializeSettings,
dlmsSettings* settings,
gxRegisterActivation* object)
{
int pos, ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
unsigned char ln[6];
uint16_t ot;
#ifdef DLMS_IGNORE_OBJECT_POINTERS
gxObjectDefinition* od;
#else
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
gxRegisterActivationMask* it;
#if defined(DLMS_IGNORE_MALLOC)
uint16_t v;
uint16_t size;
#endif //defined(DLMS_IGNORE_MALLOC)
#else
gxByteBuffer* key, * value;
#endif //DLMS_IGNORE_MALLOC
gxObject* od;
#endif //DLMS_IGNORE_OBJECT_POINTERS
uint16_t count;
if (!isAttributeSet(serializeSettings, ignored, 2))
{
obj_clearRegisterActivationAssignment(&object->registerAssignment);
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
if ((ret = ser_loadArray(serializeSettings, &object->registerAssignment, &count)) == 0)
{
size = object->registerAssignment.size;
object->registerAssignment.size = count;
#else
if ((ret = ser_verifyObjectArray(serializeSettings, &object->registerAssignment, &count)) == 0)
{
#endif //defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
for (pos = 0; pos != count; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndexRef(&object->registerAssignment, pos, (void**)&od)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = ser_loadUInt16(serializeSettings, &ot)) != 0 ||
(ret = ser_get(serializeSettings, ln, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
(ot != 0 && (ret = cosem_findObjectByLN(settings, ot, ln, &od)) != 0))
{
break;
}
#if defined(DLMS_COSEM_EXACT_DATA_TYPES)
if ((ret = arr_push(&object->registerAssignment, od)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
#ifndef DLMS_IGNORE_MALLOC
if ((ret = oa_push(&object->registerAssignment, od)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
#ifdef DLMS_IGNORE_MALLOC
object->registerAssignment.size = size;
#endif //DLMS_IGNORE_MALLOC
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3))
{
obj_clearRegisterActivationMaskList(&object->maskList);
if (ret == 0 && (ret = ser_loadArray(serializeSettings, &object->maskList, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
if ((ret = ser_getArrayItem(&object->maskList, pos, (void**)&it, sizeof(gxRegisterActivationMask))) != 0)
{
break;
}
#if defined(DLMS_IGNORE_MALLOC)
if ((ret = ser_loadOctetString3(serializeSettings, it->name, &v)) != 0)
{
break;
}
it->length = (unsigned char)v;
if ((ret = ser_loadOctetString3(serializeSettings, it->indexes, &v)) != 0)
{
break;
}
it->count = (unsigned char)v;
#else
if ((ret = ser_loadOctetString(serializeSettings, &it->name)) != 0 ||
(ret = ser_loadOctetString(serializeSettings, &it->indexes)) != 0)
{
break;
}
#endif //defined(DLMS_IGNORE_MALLOC)
#else
key = (gxByteBuffer*)gxmalloc(sizeof(gxByteBuffer));
if (key == NULL)
{
return DLMS_ERROR_CODE_OUTOFMEMORY;
}
BYTE_BUFFER_INIT(key);
value = (gxByteBuffer*)gxmalloc(sizeof(gxByteBuffer));
if (value == NULL)
{
return DLMS_ERROR_CODE_OUTOFMEMORY;
}
BYTE_BUFFER_INIT(value);
if ((ret = arr_push(&object->maskList, key_init(key, value))) != 0)
{
break;
}
if ((ret = ser_loadOctetString(serializeSettings, key)) != 0 ||
(ret = ser_loadOctetString(serializeSettings, value)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4))
{
ret = ser_loadOctetString(serializeSettings, &object->activeMask);
}
return ret;
}
#endif //DLMS_IGNORE_REGISTER_ACTIVATION
#if !(defined(DLMS_IGNORE_REGISTER_MONITOR) && defined(DLMS_IGNORE_LIMITER))
int ser_loadActionItem(
dlmsSettings * settings,
gxActionItem * item,
gxSerializerSettings * serializeSettings)
{
int ret;
#ifndef DLMS_IGNORE_OBJECT_POINTERS
unsigned char ln[6];
if ((ret = ser_get(serializeSettings, ln, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &item->scriptSelector)) != 0 ||
(ret = cosem_findObjectByLN(settings, DLMS_OBJECT_TYPE_SCRIPT_TABLE, ln, (gxObject**)&item->script)) != 0)
{
}
#else
if ((ret = ser_get(serializeSettings, item->logicalName, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, item->scriptSelector)) != 0)
{
}
#endif //DLMS_IGNORE_OBJECT_POINTERS
return ret;
}
#endif //!(defined(DLMS_IGNORE_REGISTER_MONITOR) && defined(DLMS_IGNORE_LIMITER))
#ifndef DLMS_IGNORE_REGISTER_MONITOR
int ser_loadRegisterMonitor(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxRegisterMonitor * object)
{
int pos, ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
dlmsVARIANT_PTR tmp;
dlmsVARIANT tmp2;
var_init(&tmp2);
gxActionSet* as;
uint16_t count;
if (!isAttributeSet(serializeSettings, ignored, 2))
{
va_clear(&object->thresholds);
if ((ret = ser_loadVariantArray(serializeSettings, &object->thresholds, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if (pos < object->thresholds.size)
{
if ((ret = ser_getVariantArrayItem(&object->thresholds, pos, &tmp)) != 0)
{
break;
}
}
else
{
var_clear(&tmp2);
tmp = &tmp2;
}
if ((ret = ser_loadVariant(tmp, serializeSettings)) != 0)
{
break;
}
}
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3))
{
#ifndef DLMS_IGNORE_OBJECT_POINTERS
uint16_t ot;
unsigned char ln[6];
if ((ret = ser_loadUInt16(serializeSettings, &ot)) != 0 ||
(ret = ser_get(serializeSettings, ln, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
(ret = cosem_findObjectByLN(settings, (DLMS_OBJECT_TYPE)ot, ln, &object->monitoredValue.target)) != 0 ||
(ret = ser_loadInt8(serializeSettings, &object->monitoredValue.attributeIndex)) != 0)
{
}
#else
if ((ret = ser_loadUInt16(serializeSettings, &object->monitoredValue.objectType)) != 0)
(ret = ser_get(serializeSettings, object->monitoredValue.logicalName, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
(ret = ser_loadInt8(serializeSettings, &object->monitoredValue.attributeIndex)) != 0)
{
}
#endif //DLMS_IGNORE_OBJECT_POINTERS
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4))
{
obj_clearRegisterMonitorActions(&object->actions);
if ((ret = ser_loadArray(serializeSettings, &object->actions, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(&object->actions, pos, (void**)&as, sizeof(gxActionSet))) != 0 ||
(ret = ser_loadActionItem(settings, &as->actionUp, serializeSettings)) != 0 ||
(ret = ser_loadActionItem(settings, &as->actionDown, serializeSettings)) != 0)
{
break;
}
}
}
}
return ret;
}
#endif //DLMS_IGNORE_REGISTER_MONITOR
#ifndef DLMS_IGNORE_ACTION_SCHEDULE
int ser_loadActionSchedule(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxActionSchedule * object)
{
int pos, ret = 0;
unsigned char ch;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
gxtime* tm;
uint16_t count;
if (!isAttributeSet(serializeSettings, ignored, 2))
{
#ifndef DLMS_IGNORE_OBJECT_POINTERS
unsigned char ln[6];
if ((ret = ser_get(serializeSettings, ln, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
(ret = cosem_findObjectByLN(settings, DLMS_OBJECT_TYPE_SCRIPT_TABLE, ln, (gxObject**)&object->executedScript)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &object->executedScriptSelector)) != 0)
{
}
#else
if ((ret = ser_get(serializeSettings, object->executedScriptLogicalName
#ifdef DLMS_IGNORE_MALLOC
, capacity
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &object->executedScriptSelector)) == 0)
{
}
#endif //DLMS_IGNORE_OBJECT_POINTERS
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3))
{
if ((ret = ser_loadUInt8(serializeSettings, &ch)) == 0)
{
object->type = ch;
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4))
{
arr_clear(&object->executionTime);
if ((ret = ser_loadArray(serializeSettings, &object->executionTime, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(&object->executionTime, pos, (void**)&tm, sizeof(gxtime))) != 0 ||
(ret = ser_loadDateTime(tm, serializeSettings, DLMS_DATA_TYPE_DATETIME)) != 0)
{
break;
}
}
}
}
return ret;
}
#endif //DLMS_IGNORE_ACTION_SCHEDULE
#ifndef DLMS_IGNORE_SAP_ASSIGNMENT
int ser_loadSapAssignment(
gxSerializerSettings * serializeSettings,
gxSapAssignment * object)
{
int ret = 0, pos;
gxSapItem* it;
uint16_t count;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
obj_clearSapList(&object->sapAssignmentList);
//Add count.
if ((ret = ser_loadArray(serializeSettings, &object->sapAssignmentList, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(&object->sapAssignmentList, pos, (void**)&it, sizeof(gxSapItem))) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &it->id)) != 0)
{
break;
}
#ifdef DLMS_IGNORE_MALLOC
if ((ret = ser_loadOctetString3(serializeSettings, it->name.value, &it->name.size)) != 0)
{
break;
}
#else
if ((ret = ser_loadOctetString(serializeSettings, &it->name)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
}
return ret;
}
#endif //DLMS_IGNORE_SAP_ASSIGNMENT
#ifndef DLMS_IGNORE_AUTO_ANSWER
int ser_loadAutoAnswer(
gxSerializerSettings * serializeSettings,
gxAutoAnswer * object)
{
int ret = 0;
unsigned char ch;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
if ((ret = ser_loadUInt8(serializeSettings, &ch)) == 0)
{
object->mode = ch;
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3))
{
ret = loadTimeWindow(serializeSettings, &object->listeningWindow);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4))
{
if ((ret = ser_loadUInt8(serializeSettings, &ch)) == 0)
{
object->status = ch;
}
}
if (ret == 0)
{
if ((!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_loadUInt8(serializeSettings, &object->numberOfCalls)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_loadUInt8(serializeSettings, &object->numberOfRingsInListeningWindow)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_loadUInt8(serializeSettings, &object->numberOfRingsOutListeningWindow)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_loadUInt8(serializeSettings, &object->numberOfRingsOutListeningWindow)) != 0))
{
}
}
return ret;
}
#endif //DLMS_IGNORE_AUTO_ANSWER
#ifndef DLMS_IGNORE_IP4_SETUP
int ser_loadIp4Setup(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxIp4Setup * object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
uint32_t* tmp;
#else
dlmsVARIANT* tmp;
#endif //DLMS_IGNORE_MALLOC
gxip4SetupIpOption* ip;
uint16_t pos, count;
#ifndef DLMS_IGNORE_OBJECT_POINTERS
unsigned char ln[6];
if (!isAttributeSet(serializeSettings, ignored, 2))
{
if ((ret = ser_get(serializeSettings, ln, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
(ret = cosem_findObjectByLN(settings, DLMS_OBJECT_TYPE_NONE, ln, &object->dataLinkLayer)) != 0)
{
return ret;
}
#else
if ((ret = ser_get(serializeSettings, object->dataLinkLayerReference, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0)
{
return ret;
}
#endif //DLMS_IGNORE_OBJECT_POINTERS
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3))
{
ret = ser_loadUInt32(serializeSettings, &object->ipAddress);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4))
{
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
arr_clear(&object->multicastIPAddress);
#else
va_clear(&object->multicastIPAddress);
#endif //DLMS_IGNORE_MALLOC
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
if ((ret = ser_loadArray(serializeSettings, &object->multicastIPAddress, &count)) == 0)
#else
if ((ret = ser_loadVariantArray(serializeSettings, &object->multicastIPAddress, &count)) == 0)
#endif //defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
{
for (pos = 0; pos != count; ++pos)
{
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
if ((ret = ser_getArrayItem(&object->multicastIPAddress, pos, (void**)&tmp, sizeof(uint32_t))) != 0 ||
(ret = ser_loadUInt32(serializeSettings, tmp)) != 0)
{
break;
}
#else
tmp = (dlmsVARIANT*)gxmalloc(sizeof(dlmsVARIANT));
if (tmp == NULL)
{
ret = DLMS_ERROR_CODE_OUTOFMEMORY;
break;
}
tmp->vt = DLMS_DATA_TYPE_UINT32;
if ((ret = va_push(&object->multicastIPAddress, tmp)) != 0 ||
(ret = ser_loadUInt32(serializeSettings, &tmp->ulVal)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 5))
{
arr_clear(&object->ipOptions);
if ((ret = ser_loadArray(serializeSettings, &object->ipOptions, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(&object->ipOptions, pos, (void**)&ip, sizeof(gxip4SetupIpOption))) != 0 ||
(ret = ser_loadUInt8(serializeSettings, (unsigned char*)&ip->type)) != 0)
{
break;
}
#ifdef DLMS_IGNORE_MALLOC
if ((ret = ser_loadOctetString3(serializeSettings, ip->data.value, &ip->data.size)) != 0)
{
break;
}
#else
if ((ret = ser_loadOctetString(serializeSettings, &ip->data)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
}
}
if (ret == 0)
{
if ((!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_loadUInt32(serializeSettings, &object->subnetMask)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_loadUInt32(serializeSettings, &object->gatewayIPAddress)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_loadUInt8(serializeSettings, &object->useDHCP)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_loadUInt32(serializeSettings, &object->primaryDNSAddress)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 10) && (ret = ser_loadUInt32(serializeSettings, &object->secondaryDNSAddress)) != 0))
{
}
}
return ret;
}
#endif //DLMS_IGNORE_IP4_SETUP
#ifndef DLMS_IGNORE_IP6_SETUP
int ser_loadIp6Setup(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxIp6Setup * object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
IN6_ADDR* ip;
uint16_t pos, count;
unsigned char ch;
if (!isAttributeSet(serializeSettings, ignored, 2))
{
#ifndef DLMS_IGNORE_OBJECT_POINTERS
unsigned char ln[6];
obj_clear((gxObject*)object);
if ((ret = ser_get(serializeSettings, ln, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
(ret = cosem_findObjectByLN(settings, DLMS_OBJECT_TYPE_NONE, ln, &object->dataLinkLayer)) != 0)
{
return ret;
}
#else
if ((ret = ser_get(serializeSettings, object->dataLinkLayerReference, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0)
{
return ret;
}
#endif //DLMS_IGNORE_OBJECT_POINTERS
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3))
{
if ((ret = ser_loadUInt8(serializeSettings, &ch)) == 0)
{
object->addressConfigMode = (DLMS_IP6_ADDRESS_CONFIG_MODE)ch;
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4))
{
arr_clear(&object->unicastIPAddress);
if (ret == 0 && (ret = ser_loadArray(serializeSettings, &object->unicastIPAddress, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(&object->unicastIPAddress, pos, (void**)&ip, sizeof(IN6_ADDR))) != 0 ||
(ret = ser_get(serializeSettings, (unsigned char*)ip, 16
#ifdef DLMS_IGNORE_MALLOC
, 16
#endif //DLMS_IGNORE_MALLOC
)) != 0)
{
break;
}
}
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 5))
{
arr_clear(&object->multicastIPAddress);
if (ret == 0 && (ret = ser_loadArray(serializeSettings, &object->multicastIPAddress, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(&object->multicastIPAddress, pos, (void**)&ip, sizeof(IN6_ADDR))) != 0 ||
(ret = ser_get(serializeSettings, (unsigned char*)ip, 16
#ifdef DLMS_IGNORE_MALLOC
, 16
#endif //DLMS_IGNORE_MALLOC
)) != 0)
{
break;
}
}
#ifdef DLMS_IGNORE_MALLOC
object->multicastIPAddress.size = count;
#endif //DLMS_IGNORE_MALLOC
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 6))
{
arr_clear(&object->gatewayIPAddress);
if (ret == 0 && (ret = ser_loadArray(serializeSettings, &object->gatewayIPAddress, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(&object->gatewayIPAddress, pos, (void**)&ip, sizeof(IN6_ADDR))) != 0 ||
(ret = ser_get(serializeSettings, (unsigned char*)ip, 16
#ifdef DLMS_IGNORE_MALLOC
, 16
#endif //DLMS_IGNORE_MALLOC
)) != 0)
{
break;
}
}
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 7))
{
ret = ser_get(serializeSettings, (unsigned char*)&object->primaryDNSAddress, 16
#ifdef DLMS_IGNORE_MALLOC
, 16
#endif //DLMS_IGNORE_MALLOC
);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 8))
{
ret = ser_get(serializeSettings, (unsigned char*)&object->secondaryDNSAddress, 16
#ifdef DLMS_IGNORE_MALLOC
, 16
#endif //DLMS_IGNORE_MALLOC
);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 9))
{
ret = ser_loadUInt8(serializeSettings, &object->trafficClass);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 10))
{
arr_clear(&object->neighborDiscoverySetup);
gxNeighborDiscoverySetup* it2;
if ((ret = ser_loadArray(serializeSettings, &object->neighborDiscoverySetup, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(&object->neighborDiscoverySetup, pos, (void**)&it2, sizeof(gxNeighborDiscoverySetup))) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it2->maxRetry)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &it2->retryWaitTime)) != 0 ||
(ret = ser_loadUInt32(serializeSettings, &it2->sendPeriod)) != 0)
{
break;
}
}
}
}
return ret;
}
#endif //DLMS_IGNORE_IP6_SETUP
#ifndef DLMS_IGNORE_UTILITY_TABLES
int ser_loadUtilityTables(
gxSerializerSettings * serializeSettings,
gxUtilityTables * object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_loadUInt16(serializeSettings, &object->tableId)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_loadOctetString(serializeSettings, &object->buffer)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_UTILITY_TABLES
#ifndef DLMS_IGNORE_MBUS_SLAVE_PORT_SETUP
int ser_loadMbusSlavePortSetup(
gxSerializerSettings * serializeSettings,
gxMbusSlavePortSetup * object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_loadUInt8(serializeSettings, (unsigned char*)&object->defaultBaud)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_loadUInt8(serializeSettings, (unsigned char*)&object->availableBaud)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_loadUInt8(serializeSettings, (unsigned char*)&object->addressState)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_loadUInt8(serializeSettings, (unsigned char*)&object->busAddress)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_MBUS_SLAVE_PORT_SETUP
#ifndef DLMS_IGNORE_IMAGE_TRANSFER
int ser_loadImageTransfer(
gxSerializerSettings * serializeSettings,
gxImageTransfer * object)
{
uint16_t count;
int pos, ret = 0;
gxImageActivateInfo* it;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
obj_clear((gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_loadUInt32(serializeSettings, &object->imageBlockSize)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_loadBitString(serializeSettings, &object->imageTransferredBlocksStatus)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_loadUInt32(serializeSettings, &object->imageFirstNotTransferredBlockNumber)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_loadUInt8(serializeSettings, &object->imageTransferEnabled)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_loadUInt8(serializeSettings, (unsigned char*)&object->imageTransferStatus)) != 0))
{
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 7))
{
arr_clear(&object->imageActivateInfo);
if ((ret = ser_loadArray(serializeSettings, &object->imageActivateInfo, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(&object->imageActivateInfo, pos, (void**)&it, sizeof(gxImageActivateInfo))) != 0 ||
(ret = ser_loadUInt32(serializeSettings, &it->size)) != 0)
{
break;
}
#ifdef DLMS_IGNORE_MALLOC
if ((ret = ser_loadOctetString3(serializeSettings, it->identification.data, &it->identification.size)) != 0 ||
(ret = ser_loadOctetString3(serializeSettings, it->signature.data, &it->signature.size)) != 0)
{
break;
}
#else
if ((ret = ser_loadOctetString(serializeSettings, &it->identification)) != 0 ||
(ret = ser_loadOctetString(serializeSettings, &it->signature)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
}
return ret;
}
#endif //DLMS_IGNORE_IMAGE_TRANSFER
#ifndef DLMS_IGNORE_DISCONNECT_CONTROL
int ser_loadDisconnectControl(
gxSerializerSettings * serializeSettings,
gxDisconnectControl * object)
{
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
unsigned char v;
int ret = 0;
if (!isAttributeSet(serializeSettings, ignored, 2))
{
ret = ser_loadUInt8(serializeSettings, &object->outputState);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3))
{
if ((ret = ser_loadUInt8(serializeSettings, &v)) == 0)
{
object->controlState = (DLMS_CONTROL_STATE)v;
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4))
{
if ((ret = ser_loadUInt8(serializeSettings, &v)) == 0)
{
object->controlMode = (DLMS_CONTROL_MODE)v;
}
}
return ret;
}
#endif //DLMS_IGNORE_DISCONNECT_CONTROL
#ifndef DLMS_IGNORE_LIMITER
int ser_loadLimiter(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxLimiter * object)
{
int pos, ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
uint16_t* it;
#else
dlmsVARIANT* it;
#endif //DLMS_IGNORE_MALLOC
uint16_t count;
unsigned char ln[6];
if (!isAttributeSet(serializeSettings, ignored, 2))
{
if ((ret = ser_get(serializeSettings, ln, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) == 0 &&
(ret = cosem_findObjectByLN(settings, DLMS_OBJECT_TYPE_NONE, ln, &object->monitoredValue)) == 0 &&
(ret = ser_loadInt8(serializeSettings, &object->selectedAttributeIndex)) == 0)
{
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3))
{
ret = ser_loadVariant(&object->thresholdActive, serializeSettings);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4))
{
ret = ser_loadVariant(&object->thresholdNormal, serializeSettings);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 5))
{
ret = ser_loadVariant(&object->thresholdEmergency, serializeSettings);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 6))
{
ret = ser_loadUInt32(serializeSettings, &object->minOverThresholdDuration);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 7))
{
ret = ser_loadUInt32(serializeSettings, &object->minUnderThresholdDuration);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 8))
{
if ((ret = ser_loadUInt16(serializeSettings, &object->emergencyProfile.id)) == 0 &&
(ret = ser_loadDateTime(&object->emergencyProfile.activationTime, serializeSettings, DLMS_DATA_TYPE_DATETIME)) == 0 &&
(ret = ser_loadUInt32(serializeSettings, &object->emergencyProfile.duration)) == 0)
{
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 9))
{
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
if ((ret = ser_loadArray(serializeSettings, &object->emergencyProfileGroupIDs, &count)) == 0)
#else
if ((ret = ser_loadVariantArray(serializeSettings, &object->emergencyProfileGroupIDs, &count)) == 0)
#endif //defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
{
for (pos = 0; pos != count; ++pos)
{
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
if ((ret = ser_getArrayItem(&object->emergencyProfileGroupIDs, pos, (void**)&it, sizeof(uint16_t))) != 0 ||
(ret = ser_loadUInt16(serializeSettings, it)) != 0)
{
break;
}
#else
it = (dlmsVARIANT*)gxmalloc(sizeof(dlmsVARIANT));
if (it == NULL)
{
return DLMS_ERROR_CODE_OUTOFMEMORY;
}
var_init(it);
if ((ret = va_push(&object->emergencyProfileGroupIDs, it)) != 0 ||
(ret = ser_loadVariant(it, serializeSettings)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 10))
{
ret = ser_loadUInt8(serializeSettings, &object->emergencyProfileActive);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 11))
{
if ((ret = ser_loadActionItem(settings, &object->actionOverThreshold, serializeSettings)) != 0 ||
(ret = ser_loadActionItem(settings, &object->actionUnderThreshold, serializeSettings)) != 0)
{
}
}
}
return ret;
}
#endif //DLMS_IGNORE_LIMITER
#ifndef DLMS_IGNORE_MBUS_DIAGNOSTIC
int ser_loadMBusDiagnostic(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxMbusDiagnostic * object)
{
int ret = 0;
uint16_t pos, count;
unsigned char status = 0;
gxBroadcastFrameCounter* it;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_loadUInt8(serializeSettings, &object->receivedSignalStrength)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_loadUInt8(serializeSettings, &object->channelId)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_loadUInt8(serializeSettings, &status)) != 0))
{
}
if (ret == 0)
{
object->linkStatus = status;
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 5))
{
arr_clear(&object->broadcastFrames);
if ((ret = ser_loadArray(serializeSettings, &object->broadcastFrames, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(&object->broadcastFrames, pos, (void**)&it, sizeof(gxBroadcastFrameCounter))) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->clientId)) != 0 ||
(ret = ser_loadUInt32(serializeSettings, &it->counter)) != 0 ||
(ret = ser_loadDateTime(&it->timeStamp, serializeSettings, DLMS_DATA_TYPE_DATETIME)) != 0)
{
break;
}
}
}
}
if ((!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_loadUInt32(serializeSettings, &object->transmissions)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_loadUInt32(serializeSettings, &object->receivedFrames)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_loadUInt32(serializeSettings, &object->failedReceivedFrames)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_loadUInt8(serializeSettings, &object->captureTime.attributeId)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_loadDateTime(&object->captureTime.timeStamp, serializeSettings, DLMS_DATA_TYPE_DATETIME)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_MBUS_DIAGNOSTIC
#ifndef DLMS_IGNORE_MBUS_PORT_SETUP
int ser_loadMBusPortSetup(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxMBusPortSetup * object)
{
int ret = 0;
unsigned char ht, st, dt;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_get(serializeSettings, object->profileSelection, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_loadUInt8(serializeSettings, &st)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_loadUInt8(serializeSettings, &ht)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_loadUInt8(serializeSettings, &object->primaryAddress)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_loadUInt32(serializeSettings, &object->identificationNumber)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_loadUInt16(serializeSettings, &object->manufacturerId)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_loadUInt8(serializeSettings, &object->mBusVersion)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_loadUInt8(serializeSettings, &dt)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 10) && (ret = ser_loadUInt16(serializeSettings, &object->maxPduSize)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 10) && (ret = loadTimeWindow(serializeSettings, &object->listeningWindow)) != 0))
{
}
if (ret == 0)
{
object->portCommunicationStatus = st;
object->dataHeaderType = ht;
object->deviceType = dt;
}
return ret;
}
#endif //DLMS_IGNORE_MBUS_PORT_SETUP
#ifndef DLMS_IGNORE_MBUS_CLIENT
int ser_loadMBusClient(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxMBusClient * object)
{
int ret = 0;
unsigned char ch;
unsigned char ln[6];
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_loadUInt32(serializeSettings, &object->capturePeriod)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_loadUInt8(serializeSettings, &object->primaryAddress)) != 0))
{
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 2))
{
#ifndef DLMS_IGNORE_OBJECT_POINTERS
if ((ret = ser_get(serializeSettings, ln, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
(ret = cosem_findObjectByLN(settings, DLMS_OBJECT_TYPE_NONE, ln, &object->mBusPort)) != 0)
{
return ret;
}
#else
if ((ret = ser_get(serializeSettings, object->mBusPortReference
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0)
{
return ret;
}
#endif //DLMS_IGNORE_OBJECT_POINTERS
}
if ((!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_loadUInt32(serializeSettings, &object->identificationNumber)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_loadUInt16(serializeSettings, &object->manufacturerID)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_loadUInt8(serializeSettings, &object->dataHeaderVersion)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_loadUInt8(serializeSettings, &object->deviceType)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 10) && (ret = ser_loadUInt8(serializeSettings, &object->accessNumber)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 11) && (ret = ser_loadUInt8(serializeSettings, &object->status)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 12) && (ret = ser_loadUInt8(serializeSettings, &object->alarm)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 13) && (ret = ser_loadUInt16(serializeSettings, &object->configuration)) != 0))
{
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 14) && (ret = ser_loadUInt8(serializeSettings, &ch)) == 0)
{
object->encryptionKeyStatus = (DLMS_MBUS_ENCRYPTION_KEY_STATUS)ch;
}
return ret;
}
#endif //DLMS_IGNORE_MBUS_CLIENT
#ifndef DLMS_IGNORE_G3_PLC_MAC_LAYER_COUNTERS
int ser_loadG3PlcMacLayerCounters(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxG3PlcMacLayerCounters * object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_loadUInt32(serializeSettings, &object->txDataPacketCount)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_loadUInt32(serializeSettings, &object->rxDataPacketCount)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_loadUInt32(serializeSettings, &object->txCmdPacketCount)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_loadUInt32(serializeSettings, &object->rxCmdPacketCount)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_loadUInt32(serializeSettings, &object->cSMAFailCount)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_loadUInt32(serializeSettings, &object->cSMANoAckCount)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_loadUInt32(serializeSettings, &object->badCrcCount)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_loadUInt32(serializeSettings, &object->txDataBroadcastCount)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 10) && (ret = ser_loadUInt32(serializeSettings, &object->rxDataBroadcastCount)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_G3_PLC_MAC_LAYER_COUNTERS
#ifndef DLMS_IGNORE_G3_PLC_MAC_SETUP
int ser_loadkeyTable(gxSerializerSettings * serializeSettings, gxArray * table)
{
int ret;
uint16_t pos, count, size;
gxG3MacKeyTable* it;
arr_clear(table);
if ((ret = ser_loadArray(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(table, pos, (void**)&it, sizeof(gxG3MacKeyTable))) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->id)) != 0 ||
(ret = ser_loadOctetString3(serializeSettings, it->key, &size)) != 0)
{
break;
}
}
}
return ret;
}
int ser_loadNeighbourTable(gxSerializerSettings * serializeSettings, gxArray * table)
{
int ret;
uint16_t pos, count;
#ifdef DLMS_IGNORE_MALLOC
uint16_t toneMapSize, txCoeffSize;
#endif //DLMS_IGNORE_MALLOC
gxNeighbourTable* it;
unsigned char modulation, txRes;
arr_clear(table);
if ((ret = ser_loadArray(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(table, pos, (void**)&it, sizeof(gxNeighbourTable))) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &it->shortAddress)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->payloadModulationScheme)) != 0 ||
#ifdef DLMS_IGNORE_MALLOC
(ret = ser_loadBitString2(serializeSettings, it->toneMap[pos].value, MAX_G3_MAC_NEIGHBOUR_TABLE_TONE_MAP_ITEM_SIZE, &toneMapSize)) != 0 ||
#else
(ret = ser_loadBitString(serializeSettings, &it->toneMap)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = ser_loadUInt8(serializeSettings, &modulation)) != 0 ||
(ret = ser_loadInt8(serializeSettings, &it->txGain)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &txRes)) != 0 ||
#ifdef DLMS_IGNORE_MALLOC
(ret = ser_loadBitString2(serializeSettings, it->txCoeff[pos].value, MAX_G3_MAC_NEIGHBOUR_TABLE_GAIN_ITEM_SIZE, &txCoeffSize)) != 0 ||
#else
(ret = ser_loadBitString(serializeSettings, &it->txCoeff)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = ser_loadUInt8(serializeSettings, &it->lqi)) != 0 ||
(ret = ser_loadInt8(serializeSettings, &it->phaseDifferential)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->tmrValidTime)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->noData)) != 0)
{
break;
}
it->modulation = modulation;
it->txRes = txRes;
#ifdef DLMS_IGNORE_MALLOC
it->toneMap[pos].size = (unsigned char)toneMapSize;
it->txCoeff[pos].size = (unsigned char)txCoeffSize;
#endif //DLMS_IGNORE_MALLOC
}
}
return ret;
}
int ser_loadPosTable(gxSerializerSettings * serializeSettings, gxArray * table)
{
int ret;
uint16_t pos, count;
gxMacPosTable* it;
arr_clear(table);
if ((ret = ser_loadArray(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(table, pos, (void**)&it, sizeof(gxMacPosTable))) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &it->shortAddress)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->lqi)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->validTime)) != 0)
{
break;
}
}
}
return ret;
}
int ser_loadG3PlcMacSetup(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxG3PlcMacSetup * object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_loadUInt16(serializeSettings, &object->shortAddress)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_loadUInt16(serializeSettings, &object->rcCoord)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_loadUInt16(serializeSettings, &object->panId)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_loadkeyTable(serializeSettings, &object->keyTable)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_loadUInt32(serializeSettings, &object->frameCounter)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_loadBitString(serializeSettings, &object->toneMask)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_loadUInt8(serializeSettings, &object->tmrTtl)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_loadUInt8(serializeSettings, &object->maxFrameRetries)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 10) && (ret = ser_loadUInt8(serializeSettings, &object->neighbourTableEntryTtl)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 11) && (ret = ser_loadNeighbourTable(serializeSettings, &object->neighbourTable)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 12) && (ret = ser_loadUInt8(serializeSettings, &object->highPriorityWindowSize)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 13) && (ret = ser_loadUInt8(serializeSettings, &object->cscmFairnessLimit)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 14) && (ret = ser_loadUInt8(serializeSettings, &object->beaconRandomizationWindowLength)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 15) && (ret = ser_loadUInt8(serializeSettings, &object->macA)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 16) && (ret = ser_loadUInt8(serializeSettings, &object->macK)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 17) && (ret = ser_loadUInt8(serializeSettings, &object->minCwAttempts)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 18) && (ret = ser_loadUInt8(serializeSettings, &object->cenelecLegacyMode)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 19) && (ret = ser_loadUInt8(serializeSettings, &object->fccLegacyMode)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 20) && (ret = ser_loadUInt8(serializeSettings, &object->maxBe)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 21) && (ret = ser_loadUInt8(serializeSettings, &object->maxCsmaBackoffs)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 22) && (ret = ser_loadUInt8(serializeSettings, &object->minBe)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 23) && (ret = ser_loadUInt8(serializeSettings, &object->macBroadcastMaxCwEnabled)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 24) && (ret = ser_loadUInt8(serializeSettings, &object->macTransmitAtten)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 25) && (ret = ser_loadPosTable(serializeSettings, &object->macPosTable)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_G3_PLC_MAC_SETUP
#ifndef DLMS_IGNORE_G3_PLC_6LO_WPAN
int ser_loadRoutingConfiguration(gxSerializerSettings * serializeSettings, gxArray * table)
{
int ret;
uint16_t pos, count;
gxRoutingConfiguration* it;
arr_clear(table);
if ((ret = ser_loadArray(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(table, pos, (void**)&it, sizeof(gxRoutingConfiguration))) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->netTraversalTime)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &it->routingTableEntryTtl)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->kr)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->km)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->kc)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->kq)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->kh)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->krt)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->rReqRetries)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->rReqReqWait)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &it->blacklistTableEntryTtl)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->unicastRreqGenEnable)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->rlcEnabled)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->addRevLinkCost)) != 0)
{
break;
}
}
}
return ret;
}
int ser_loadRoutingTable(gxSerializerSettings * serializeSettings, gxArray * table)
{
int ret;
uint16_t pos, count;
gxRoutingTable* it;
arr_clear(table);
if ((ret = ser_loadArray(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(table, pos, (void**)&it, sizeof(gxRoutingTable))) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &it->destinationAddress)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &it->nextHopAddress)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &it->routeCost)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->hopCount)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->weakLinkCount)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &it->validTime)) != 0)
{
break;
}
}
}
return ret;
}
int ser_loadContextInformationTable(gxSerializerSettings * serializeSettings, gxArray * table)
{
int ret;
uint16_t pos, count, count2;
gxContextInformationTable* it;
arr_clear(table);
if ((ret = ser_loadArray(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(table, pos, (void**)&it, sizeof(gxContextInformationTable))) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->cid)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->contextLength)) != 0 ||
(ret = ser_loadOctetString3(serializeSettings, it->context, &count2)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->compression)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &it->validLifetime)) != 0)
{
break;
}
}
}
return ret;
}
int ser_loadBlacklistTable(gxSerializerSettings * serializeSettings, gxArray * table)
{
int ret;
uint16_t pos, count;
gxBlacklistTable* it;
arr_clear(table);
if ((ret = ser_loadArray(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(table, pos, (void**)&it, sizeof(gxBlacklistTable))) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &it->neighbourAddress)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &it->validTime)) != 0)
{
break;
}
}
}
return ret;
}
int ser_loadBroadcastLogTable(gxSerializerSettings * serializeSettings, gxArray * table)
{
int ret;
uint16_t pos, count;
gxBroadcastLogTable* it;
arr_clear(table);
if ((ret = ser_loadArray(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(table, pos, (void**)&it, sizeof(gxBroadcastLogTable))) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &it->sourceAddress)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->sequenceNumber)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &it->validTime)) != 0)
{
break;
}
}
}
return ret;
}
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
int ser_loadUInt16Array(gxSerializerSettings * serializeSettings, gxArray * table)
{
int ret;
uint16_t pos, count;
uint16_t* it;
if ((ret = ser_loadArray(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = arr_getByIndex4(table, pos, (void**)&it, sizeof(uint16_t), 0)) != 0)
{
break;
}
if ((ret = ser_loadUInt16(serializeSettings, it)) != 0)
{
break;
}
}
table->size = count;
}
return ret;
}
#else
int ser_loadUInt16Array(gxSerializerSettings * serializeSettings, variantArray * table)
{
int ret;
uint16_t tmp, pos, count;
dlmsVARIANT* it;
if ((ret = ser_loadVariantArray(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_loadUInt16(serializeSettings, &tmp)) != 0)
{
break;
}
if ((ret = ser_getVariantArrayItem(table, pos, &it)) != 0)
{
break;
}
it->vt = DLMS_DATA_TYPE_UINT16;
it->uiVal = tmp;
}
}
return ret;
}
#endif //defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
int ser_loadG3Plc6LoWPAN(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxG3Plc6LoWPAN * object)
{
int ret = 0;
unsigned char deviceType = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_loadUInt8(serializeSettings, &object->maxHops)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_loadUInt8(serializeSettings, &object->weakLqiValue)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_loadUInt8(serializeSettings, &object->securityLevel)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_loadOctetString(serializeSettings, &object->prefixTable)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_loadRoutingConfiguration(serializeSettings, &object->routingConfiguration)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_loadUInt16(serializeSettings, &object->broadcastLogTableEntryTtl)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_loadRoutingTable(serializeSettings, &object->routingTable)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 9) && (ret = ser_loadContextInformationTable(serializeSettings, &object->contextInformationTable)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 10) && (ret = ser_loadBlacklistTable(serializeSettings, &object->blacklistTable)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 11) && (ret = ser_loadBroadcastLogTable(serializeSettings, &object->broadcastLogTable)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 12) && (ret = ser_loadUInt16Array(serializeSettings, &object->groupTable)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 13) && (ret = ser_loadUInt16(serializeSettings, &object->maxJoinWaitTime)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 14) && (ret = ser_loadUInt8(serializeSettings, &object->pathDiscoveryTime)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 15) && (ret = ser_loadUInt8(serializeSettings, &object->activeKeyIndex)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 16) && (ret = ser_loadUInt8(serializeSettings, &object->metricType)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 17) && (ret = ser_loadUInt16(serializeSettings, &object->coordShortAddress)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 18) && (ret = ser_loadUInt8(serializeSettings, &object->disableDefaultRouting)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 19) && (ret = ser_loadUInt8(serializeSettings, &deviceType)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 20) && (ret = ser_loadUInt8(serializeSettings, &object->defaultCoordRouteEnabled)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 21) && (ret = ser_loadUInt16Array(serializeSettings, &object->destinationAddress)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 22) && (ret = ser_loadUInt8(serializeSettings, &object->lowLQI)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 23) && (ret = ser_loadUInt8(serializeSettings, &object->highLQI)) != 0))
{
}
if (ret == 0)
{
object->deviceType = (DLMS_PAN_DEVICE_TYPE)deviceType;
}
return ret;
}
#endif //DLMS_IGNORE_G3_PLC_6LO_WPAN
#ifndef DLMS_IGNORE_FUNCTION_CONTROL
int ser_loadActivationStatus(
gxSerializerSettings * serializeSettings,
gxArray * table)
{
int ret;
uint16_t pos, count;
functionStatus* it;
arr_clear(table);
if ((ret = ser_loadArray(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(table, pos, (void**)&it, sizeof(functionStatus))) != 0)
{
break;
}
#ifdef DLMS_IGNORE_MALLOC
if ((ret = ser_loadOctetString3(serializeSettings, it->name, &it->size)) != 0)
{
break;
}
#else
if ((ret = ser_loadOctetString(serializeSettings, &it->name)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = ser_loadUInt8(serializeSettings, &it->status)) != 0)
{
break;
}
}
}
return ret;
}
#ifdef DLMS_IGNORE_MALLOC
int ser_loadFunctions(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxArray * table)
{
int ret;
unsigned char ln[6];
uint16_t ot, pos, pos2, count, count2;
functionalBlock* it;
gxObject* obj;
arr_clear(table);
if ((ret = ser_loadArray(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(table, pos, (void**)&it, sizeof(functionalBlock))) != 0)
{
break;
}
if ((ret = ser_loadOctetString3(serializeSettings, it->name, &it->nameSize)) != 0)
{
break;
}
//Load count.
if ((ret = ser_loadObjectCount(serializeSettings, &it->functionSpecificationsSize)) == 0 &&
//Load capacity.
(ret = ser_loadObjectCount(serializeSettings, &count2)) == 0)
{
for (pos2 = 0; pos2 != count2; ++pos2)
{
obj = NULL;
if ((ret = ser_loadUInt16(serializeSettings, &ot)) != 0)
{
break;
}
if ((ret = ser_get(serializeSettings, ln, 6, 6)) != 0)
{
break;
}
if (ot != 0)
{
if ((ret = oa_findByLN(&settings->objects, ot, ln, &obj)) != 0)
{
break;
}
if (obj == NULL)
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
}
}
}
}
}
return ret;
}
#else
int ser_loadFunctions(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxArray * table)
{
int ret;
unsigned char ln[6];
uint16_t ot, pos, pos2, count, count2;
functionalBlock* it;
gxObject* obj;
arr_clear(table);
if ((ret = ser_loadArray(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(table, pos, (void**)&it, sizeof(functionalBlock))) != 0)
{
break;
}
if ((ret = ser_loadOctetString(serializeSettings, &it->name)) != 0)
{
break;
}
oa_empty(&it->functionSpecifications);
if ((ret = ser_loadArray(serializeSettings,
(gxArray*)&it->functionSpecifications, &count2)) == 0)
{
for (pos2 = 0; pos2 != count2; ++pos2)
{
obj = NULL;
if ((ret = ser_loadUInt16(serializeSettings, &ot)) != 0)
{
break;
}
if ((ret = ser_get(serializeSettings, ln, 6)) != 0 ||
(ret = oa_findByLN(&settings->objects, ot, ln, &obj)) != 0)
{
break;
}
if (obj == NULL)
{
if ((ret = cosem_createObject(ot, &obj)) != DLMS_ERROR_CODE_OK)
{
//If unknown object.
if (ret == DLMS_ERROR_CODE_INVALID_PARAMETER)
{
ret = 0;
continue;
}
break;
}
if ((ret = cosem_setLogicalName(obj, ln)) != DLMS_ERROR_CODE_OK)
{
break;
}
oa_push(&it->functionSpecifications, obj);
}
}
}
}
}
return ret;
}
#endif //DLMS_IGNORE_MALLOC
int ser_loadFunctionControl(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxFunctionControl * object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_loadActivationStatus(serializeSettings, &object->activationStatus)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_loadFunctions(serializeSettings, settings, &object->functions)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_G3_PLC_6LO_WPAN
#ifndef DLMS_IGNORE_ARRAY_MANAGER
int ser_loadArrayManagerElements(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxArray * table)
{
int ret;
uint16_t pos, count, ot;
unsigned char ln[6];
gxArrayManagerItem* it;
arr_clear(table);
if ((ret = ser_loadArray(serializeSettings, table, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(table, pos, (void**)&it, sizeof(gxArrayManagerItem))) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->id)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &ot)) != 0 ||
(ret = ser_get(serializeSettings, ln, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
(ret = ser_loadInt8(serializeSettings, &it->element.attributeIndex)) != 0)
{
break;
}
if (pos < table->size)
{
if ((ret = oa_findByLN(&settings->objects, ot, ln, &it->element.target)) != 0)
{
break;
}
if (it->element.target == NULL)
{
#ifdef DLMS_IGNORE_MALLOC
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
#else
if ((ret = cosem_createObject(ot, &it->element.target)) != DLMS_ERROR_CODE_OK)
{
//If unknown object.
break;
}
if ((ret = cosem_setLogicalName(it->element.target, ln)) != DLMS_ERROR_CODE_OK)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
}
}
return ret;
}
int ser_loadArrayManager(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxArrayManager * object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) &&
(ret = ser_loadArrayManagerElements(serializeSettings, settings, &object->elements)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_ARRAY_MANAGER
#ifndef DLMS_IGNORE_MODEM_CONFIGURATION
int ser_loadModemConfiguration(
gxSerializerSettings * serializeSettings,
gxModemConfiguration * object)
{
unsigned char ch;
int pos, ret = 0;
gxModemInitialisation* mi;
#ifdef DLMS_IGNORE_MALLOC
gxModemProfile* it;
#else
gxByteBuffer* it;
#endif //DLMS_IGNORE_MALLOC
uint16_t count;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
if ((ret = ser_loadUInt8(serializeSettings, &ch)) == 0)
{
object->communicationSpeed = (DLMS_BAUD_RATE)ch;
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3))
{
obj_clearModemConfigurationInitialisationStrings(&object->initialisationStrings);
if ((ret = ser_loadArray(serializeSettings, &object->initialisationStrings, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(&object->initialisationStrings, pos, (void**)&mi, sizeof(gxModemInitialisation))) != 0)
{
break;
}
#ifdef DLMS_IGNORE_MALLOC
if ((ret = ser_loadOctetString3(serializeSettings, mi->request.value, &mi->request.size)) != 0 ||
(ret = ser_loadOctetString3(serializeSettings, mi->response.value, &mi->response.size)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &mi->delay)) != 0)
{
break;
}
#else
if ((ret = ser_loadOctetString(serializeSettings, &mi->request)) != 0 ||
(ret = ser_loadOctetString(serializeSettings, &mi->response)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &mi->delay)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4))
{
arr_clearStrings(&object->modemProfile);
if ((ret = ser_loadArray(serializeSettings, &object->modemProfile, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex3(&object->modemProfile, pos, (void**)&it, sizeof(gxModemProfile), 0)) != 0)
{
break;
}
if ((ret = ser_loadOctetString3(serializeSettings, it->value, &it->size)) != 0)
{
break;
}
#else
it = (gxByteBuffer*)gxmalloc(sizeof(gxByteBuffer));
if (it == NULL)
{
return DLMS_ERROR_CODE_OUTOFMEMORY;
}
BYTE_BUFFER_INIT(it);
if ((ret = arr_push(&object->modemProfile, it)) != 0)
{
break;
}
if ((ret = ser_loadOctetString(serializeSettings, it)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
}
return ret;
}
#endif //DLMS_IGNORE_MODEM_CONFIGURATION
#ifndef DLMS_IGNORE_MAC_ADDRESS_SETUP
int ser_loadMacAddressSetup(
gxSerializerSettings * serializeSettings,
gxMacAddressSetup * object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
if ((ret = ser_loadOctetString(serializeSettings, &object->macAddress)) != 0)
{
}
}
return ret;
}
#endif //DLMS_IGNORE_MAC_ADDRESS_SETUP
#ifndef DLMS_IGNORE_GPRS_SETUP
int ser_loadQualityOfService(
gxQualityOfService * object,
gxSerializerSettings * serializeSettings)
{
int ret;
if ((ret = ser_loadUInt8(serializeSettings, &object->precedence)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &object->delay)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &object->reliability)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &object->peakThroughput)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &object->meanThroughput)) != 0)
{
}
return ret;
}
int ser_loadGPRSSetup(
gxSerializerSettings * serializeSettings,
gxGPRSSetup * object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_loadOctetString(serializeSettings, &object->apn)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_loadUInt16(serializeSettings, &object->pinCode)) != 0))
{
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4))
{
if ((ret = ser_loadQualityOfService(&object->defaultQualityOfService, serializeSettings)) != 0 ||
(ret = ser_loadQualityOfService(&object->requestedQualityOfService, serializeSettings)) != 0)
{
}
}
return ret;
}
#endif //DLMS_IGNORE_GPRS_SETUP
#ifndef DLMS_IGNORE_EXTENDED_REGISTER
int ser_loadExtendedRegister(
gxSerializerSettings * serializeSettings,
gxExtendedRegister * object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
ret = ser_loadVariant(&object->value, serializeSettings);
}
if (!isAttributeSet(serializeSettings, ignored, 3))
{
if ((ret = ser_loadInt8(serializeSettings, &object->scaler)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &object->unit)) != 0)
{
}
}
if ((!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_loadVariant(&object->status, serializeSettings)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_loadDateTime(&object->captureTime, serializeSettings, DLMS_DATA_TYPE_DATETIME)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_EXTENDED_REGISTER
#ifndef DLMS_IGNORE_ASSOCIATION_LOGICAL_NAME
int ser_loadApplicationContextName(
gxSerializerSettings * serializeSettings,
gxApplicationContextName * object)
{
int ret;
if ((ret = ser_get(serializeSettings, object->logicalName, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &object->jointIsoCtt)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &object->country)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &object->countryName)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &object->identifiedOrganization)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &object->dlmsUA)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &object->applicationContext)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &object->contextId)) != 0)
{
}
return ret;
}
int ser_loadxDLMSContextType(gxSerializerSettings * serializeSettings, gxXDLMSContextType * object)
{
int ret;
if ((ret = ser_loadUInt32(serializeSettings, (uint32_t*)&object->conformance)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &object->maxReceivePduSize)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &object->maxSendPduSize)) != 0 ||
(ret = ser_loadInt8(serializeSettings, &object->qualityOfService)) != 0 ||
(ret = ser_loadOctetString(serializeSettings, &object->cypheringInfo)) != 0)
{
}
return ret;
}
int ser_loadAuthenticationMechanismName(gxSerializerSettings * serializeSettings, gxAuthenticationMechanismName * object)
{
unsigned char ch;
int ret;
if ((ret = ser_loadUInt8(serializeSettings, &object->jointIsoCtt)) == 0 &&
(ret = ser_loadUInt8(serializeSettings, &object->country)) == 0 &&
(ret = ser_loadUInt16(serializeSettings, &object->countryName)) == 0 &&
(ret = ser_loadUInt8(serializeSettings, &object->identifiedOrganization)) == 0 &&
(ret = ser_loadUInt8(serializeSettings, &object->dlmsUA)) == 0 &&
(ret = ser_loadUInt8(serializeSettings, &object->authenticationMechanismName)) == 0 &&
(ret = ser_loadUInt8(serializeSettings, &ch)) == 0)
{
object->mechanismId = ch;
}
return ret;
}
int ser_loadAssociationLogicalName(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxAssociationLogicalName * object)
{
#ifdef DLMS_IGNORE_MALLOC
gxUser* it;
#endif //DLMS_IGNORE_MALLOC
unsigned char ch;
int pos, ret = 0;
uint16_t count, value;
#ifdef DLMS_IGNORE_MALLOC
uint16_t capacity2;
#endif //DLMS_IGNORE_MALLOC
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
gxObject* obj = NULL;
unsigned char version;
DLMS_OBJECT_TYPE type = DLMS_OBJECT_TYPE_NONE;
unsigned char ln[6];
oa_empty(&object->objectList);
if ((ret = ser_loadArray(serializeSettings, (gxArray*)&object->objectList, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
obj = NULL;
if ((ret = ser_loadUInt8(serializeSettings, &version)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &value)) != 0)
{
break;
}
type = value;
if ((ret = ser_get(serializeSettings, ln, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
(ret = oa_findByLN(&settings->objects, type, ln, &obj)) != 0)
{
break;
}
if (obj == NULL)
{
#ifdef DLMS_IGNORE_MALLOC
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
#else
if ((ret = cosem_createObject(type, &obj)) != DLMS_ERROR_CODE_OK)
{
//If unknown object.
if (ret == DLMS_ERROR_CODE_INVALID_PARAMETER)
{
ret = 0;
continue;
}
break;
}
if ((ret = cosem_setLogicalName(obj, ln)) != DLMS_ERROR_CODE_OK)
{
break;
}
obj->version = version;
oa_push(&object->objectList, obj);
#endif //DLMS_IGNORE_MALLOC
}
}
}
if (ret != 0)
{
return ret;
}
}
if (!isAttributeSet(serializeSettings, ignored, 3))
{
if ((ret = ser_loadInt8(serializeSettings, &object->clientSAP)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &object->serverSAP)) != 0)
{
}
}
if (ret == 0)
{
if ((!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_loadApplicationContextName(serializeSettings, &object->applicationContextName)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_loadxDLMSContextType(serializeSettings, &object->xDLMSContextInfo)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_loadAuthenticationMechanismName(serializeSettings, &object->authenticationMechanismName)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_loadOctetString(serializeSettings, &object->secret)) != 0))
{
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_loadUInt8(serializeSettings, &ch)) == 0)
{
object->associationStatus = ch;
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 9))
{
#ifndef DLMS_IGNORE_SECURITY_SETUP
//Security Setup Reference is from version 1.
if (object->base.version > 0)
{
#ifndef DLMS_IGNORE_OBJECT_POINTERS
unsigned char ln[6];
if ((ret = ser_get(serializeSettings, ln, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
(ret = cosem_findObjectByLN(settings, DLMS_OBJECT_TYPE_SECURITY_SETUP, ln, (gxObject**)&object->securitySetup)) != 0)
{
}
#else
if ((ret = ser_get(&ba, object->securitySetupReference, 6)) != 0)
{
}
#endif //DLMS_IGNORE_OBJECT_POINTERS
}
#endif //DLMS_IGNORE_SECURITY_SETUP
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 10))
{
obj_clearUserList(&object->userList);
if (object->base.version > 1)
{
if ((ret = ser_loadArray(serializeSettings, &object->userList, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = ser_getArrayItem(&object->userList, pos, (void**)&it, sizeof(gxUser))) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->id)) != 0 ||
(ret = ser_loadOctetString3(serializeSettings, (unsigned char*)it->name, &capacity2)) != 0)
{
break;
}
#else
uint8_t id;
gxByteBuffer* value = (gxByteBuffer*)gxmalloc(sizeof(gxByteBuffer));
if (value == NULL)
{
return DLMS_ERROR_CODE_OUTOFMEMORY;
}
if ((ret = ser_loadUInt8(serializeSettings, &id)) != 0 ||
(ret = ser_loadOctetString(serializeSettings, value)) != 0)
{
break;
}
if ((ret = arr_push(&object->userList, key_init2(id, value))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
}
}
return ret;
}
#endif //DLMS_IGNORE_ASSOCIATION_LOGICAL_NAME
#ifndef DLMS_IGNORE_ASSOCIATION_SHORT_NAME
int ser_loadAssociationShortName(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxAssociationShortName * object)
{
#ifdef DLMS_IGNORE_MALLOC
gxUser* it;
#endif //DLMS_IGNORE_MALLOC
int pos, ret = 0;
uint16_t count, value;
#ifdef DLMS_IGNORE_MALLOC
uint16_t capacity2;
#endif //DLMS_IGNORE_MALLOC
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
gxObject* obj = NULL;
unsigned char version;
#ifndef DLMS_IGNORE_MALLOC
DLMS_OBJECT_TYPE type = DLMS_OBJECT_TYPE_NONE;
#endif //DLMS_IGNORE_MALLOC
unsigned char ln[6];
uint16_t shortName;
oa_empty(&object->objectList);
if ((ret = ser_loadArray(serializeSettings, (gxArray*)&object->objectList, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
obj = NULL;
if ((ret = ser_loadUInt16(serializeSettings, &shortName)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &version)) != 0 ||
(ret = ser_loadUInt16(serializeSettings, &value)) != 0)
{
break;
}
#ifndef DLMS_IGNORE_MALLOC
type = value;
#endif //DLMS_IGNORE_MALLOC
if ((ret = ser_get(serializeSettings, ln, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
(ret = oa_findBySN(&settings->objects, shortName, &obj)) != 0)
{
break;
}
if (obj == NULL)
{
#ifdef DLMS_IGNORE_MALLOC
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
#else
if ((ret = cosem_createObject(type, &obj)) != DLMS_ERROR_CODE_OK)
{
//If unknown object.
if (ret == DLMS_ERROR_CODE_INVALID_PARAMETER)
{
ret = 0;
continue;
}
break;
}
if ((ret = cosem_setLogicalName(obj, ln)) != DLMS_ERROR_CODE_OK)
{
break;
}
obj->shortName = shortName;
obj->version = version;
//Add object to released objects list.
ret = oa_push(&settings->releasedObjects, obj);
if (ret != DLMS_ERROR_CODE_OK)
{
return ret;
}
#endif //DLMS_IGNORE_MALLOC
}
#ifndef DLMS_IGNORE_MALLOC
oa_push(&object->objectList, obj);
#endif //DLMS_IGNORE_MALLOC
// obj->version = (unsigned char)version;
}
}
if (ret != 0)
{
return ret;
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 9))
{
#ifndef DLMS_IGNORE_SECURITY_SETUP
//Security Setup Reference is from version 1.
if (object->base.version > 0)
{
#ifndef DLMS_IGNORE_OBJECT_POINTERS
unsigned char ln[6];
if ((ret = ser_get(serializeSettings, ln, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
(ret = cosem_findObjectByLN(settings, DLMS_OBJECT_TYPE_SECURITY_SETUP, ln, (gxObject**)&object->securitySetup)) != 0)
{
}
#else
if ((ret = ser_get(&ba, object->securitySetupReference, 6)) != 0)
{
}
#endif //DLMS_IGNORE_OBJECT_POINTERS
}
#endif //DLMS_IGNORE_SECURITY_SETUP
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 10))
{
obj_clearUserList(&object->userList);
if (object->base.version > 1)
{
if ((ret = ser_loadArray(serializeSettings, &object->userList, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = ser_getArrayItem(&object->userList, pos, (void**)&it, sizeof(gxUser))) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->id)) != 0 ||
(ret = ser_loadOctetString3(serializeSettings, (unsigned char*)it->name, &capacity2)) != 0)
{
break;
}
#else
uint8_t id;
gxByteBuffer* value = (gxByteBuffer*)gxmalloc(sizeof(gxByteBuffer));
if (value == NULL)
{
return DLMS_ERROR_CODE_OUTOFMEMORY;
}
if ((ret = ser_loadUInt8(serializeSettings, &id)) != 0 ||
(ret = ser_loadOctetString(serializeSettings, value)) != 0)
{
break;
}
if ((ret = arr_push(&object->userList, key_init2(id, value))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
}
}
return ret;
}
#endif //DLMS_IGNORE_ASSOCIATION_SHORT_NAME
#ifndef DLMS_IGNORE_PPP_SETUP
int ser_loadPppSetup(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxPppSetup * object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
#ifndef DLMS_IGNORE_OBJECT_POINTERS
unsigned char ln[6];
if ((ret = ser_get(serializeSettings, ln, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0 ||
(ret = cosem_findObjectByLN(settings, DLMS_OBJECT_TYPE_NONE, ln, &object->phy)) != 0)
{
return ret;
}
#else
if ((ret = ser_get(serializeSettings, object->PHYReference, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0)
{
return ret;
}
#endif //DLMS_IGNORE_OBJECT_POINTERS
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 5))
{
if ((ret = ser_loadOctetString(serializeSettings, &object->userName)) != 0 ||
(ret = ser_loadOctetString(serializeSettings, &object->password)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, (unsigned char*)&object->authentication)) != 0)
{
}
}
return ret;
}
#endif //DLMS_IGNORE_PPP_SETUP
#ifndef DLMS_IGNORE_PROFILE_GENERIC
int ser_loadProfileGeneric(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxProfileGeneric * object)
{
unsigned char ch;
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
unsigned char ln[6];
if ((!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_loadObjectsInternal(settings, serializeSettings, &object->captureObjects)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_loadUInt32(serializeSettings, &object->capturePeriod)) != 0))
{
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_loadUInt8(serializeSettings, &ch)) == 0)
{
object->sortMethod = ch;
}
if (ret == 0)
{
if ((!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_get(serializeSettings, ln, 6
#ifdef DLMS_IGNORE_MALLOC
, 6
#endif //DLMS_IGNORE_MALLOC
)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = cosem_findObjectByLN(settings, DLMS_OBJECT_TYPE_NONE, ln, &object->sortObject)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_loadUInt32(serializeSettings, &object->entriesInUse)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_loadUInt32(serializeSettings, &object->profileEntries)) != 0))
{
}
}
return ret;
}
#endif //DLMS_IGNORE_PROFILE_GENERIC
#ifndef DLMS_IGNORE_ACCOUNT
int ser_loadAccount(
gxSerializerSettings * serializeSettings,
gxAccount * object)
{
unsigned char ch;
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
if ((ret = ser_loadUInt8(serializeSettings, &ch)) == 0)
{
object->paymentMode = ch;
if ((ret = ser_loadUInt8(serializeSettings, &ch)) == 0)
{
object->accountStatus = ch;
}
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3))
{
ret = ser_loadUInt8(serializeSettings, &object->currentCreditInUse);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_loadUInt8(serializeSettings, &ch)) == 0)
{
object->currentCreditStatus = ch;
}
if ((!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_loadInt32(serializeSettings, &object->availableCredit)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_loadInt32(serializeSettings, &object->amountToClear)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 7) && (ret = ser_loadInt32(serializeSettings, &object->clearanceThreshold)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 8) && (ret = ser_loadInt32(serializeSettings, &object->aggregatedDebt)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 13) && (ret = ser_loadDateTime(&object->accountActivationTime, serializeSettings, DLMS_DATA_TYPE_DATETIME)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 14) && (ret = ser_loadDateTime(&object->accountClosureTime, serializeSettings, DLMS_DATA_TYPE_DATETIME)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 16) && (ret = ser_loadInt32(serializeSettings, &object->lowCreditThreshold)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 17) && (ret = ser_loadInt32(serializeSettings, &object->nextCreditAvailableThreshold)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 18) && (ret = ser_loadUInt16(serializeSettings, &object->maxProvision)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 19) && (ret = ser_loadInt32(serializeSettings, &object->maxProvisionPeriod)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_ACCOUNT
#ifndef DLMS_IGNORE_CREDIT
int ser_loadCredit(
gxSerializerSettings * serializeSettings,
gxCredit * object)
{
unsigned char ch;
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
ret = ser_loadInt32(serializeSettings, &object->currentCreditAmount);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3))
{
if ((ret = ser_loadUInt8(serializeSettings, &ch)) == 0)
{
object->type = (DLMS_CREDIT_TYPE)ch;
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4))
{
ret = ser_loadUInt8(serializeSettings, &object->priority);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 5))
{
ret = ser_loadInt32(serializeSettings, &object->warningThreshold);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 6))
{
ret = ser_loadInt32(serializeSettings, &object->limit);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 7))
{
if ((ret = ser_loadUInt8(serializeSettings, &ch)) == 0)
{
object->creditConfiguration = (DLMS_CREDIT_CONFIGURATION)ch;
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 8))
{
ret = ser_loadUInt8(serializeSettings, &object->status);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 9))
{
ret = ser_loadInt32(serializeSettings, &object->presetCreditAmount);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 10))
{
ret = ser_loadInt32(serializeSettings, &object->creditAvailableThreshold);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 11))
{
ret = ser_loadDateTime(&object->period, serializeSettings, DLMS_DATA_TYPE_DATETIME);
}
return ret;
}
#endif //DLMS_IGNORE_CREDIT
#ifndef DLMS_IGNORE_CHARGE
int ser_loadUnitCharge(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxUnitCharge * target)
{
gxChargeTable* ct;
int ret, pos;
if ((ret = obj_clearChargeTables(&target->chargeTables)) == 0)
{
#ifndef DLMS_IGNORE_OBJECT_POINTERS
uint16_t type;
#endif //DLMS_IGNORE_OBJECT_POINTERS
#ifndef DLMS_IGNORE_OBJECT_POINTERS
unsigned char ln[6];
#endif //DLMS_IGNORE_OBJECT_POINTERS
uint16_t count;
if (//charge per unit scaling
(ret = ser_loadInt8(serializeSettings, &target->chargePerUnitScaling.commodityScale)) != 0 ||
(ret = ser_loadInt8(serializeSettings, &target->chargePerUnitScaling.priceScale)) != 0 ||
//commodity
#ifndef DLMS_IGNORE_OBJECT_POINTERS
(ret = ser_loadUInt16(serializeSettings, &type)) != 0 ||
(ret = ser_getOctetString2(serializeSettings, ln, NULL)) != 0 ||
#else
(ret = cosem_getInt16(serializeSettings, (short*)&target->commodity.type)) != 0 ||
(ret = ser_getOctetString2(serializeSettings, target->commodity.logicalName, NULL)) != 0 ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
(ret = ser_loadInt8(serializeSettings, &target->commodity.attributeIndex)) != 0 ||
(ret = ser_loadArray(serializeSettings, &target->chargeTables, &count)) != 0)
{
return ret;
}
#ifndef DLMS_IGNORE_OBJECT_POINTERS
if ((ret = cosem_findObjectByLN(settings, type, ln, &target->commodity.target)) != 0)
{
return ret;
}
#endif //DLMS_IGNORE_OBJECT_POINTERS
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(&target->chargeTables, pos, (void**)&ct, sizeof(gxChargeTable))) != 0 ||
#ifdef DLMS_IGNORE_MALLOC
(ret = ser_getOctetString2(serializeSettings, ct->index.data, &ct->index.size)) != 0 ||
#else
(ret = ser_getOctetString(serializeSettings, &ct->index)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = ser_loadInt16(serializeSettings, &ct->chargePerUnit)) != 0)
{
break;
}
}
}
return ret;
}
int ser_loadCharge(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxCharge * object)
{
unsigned char ch;
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
ret = ser_loadInt32(serializeSettings, &object->totalAmountPaid);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 3))
{
if ((ret = ser_loadUInt8(serializeSettings, &ch)) == 0)
{
object->chargeType = (DLMS_CHARGE_TYPE)ch;
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 4))
{
ret = ser_loadUInt8(serializeSettings, &object->priority);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 5))
{
ret = ser_loadUnitCharge(serializeSettings, settings, &object->unitChargeActive);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 6))
{
ret = ser_loadUnitCharge(serializeSettings, settings, &object->unitChargePassive);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 7))
{
ret = ser_loadDateTime(&object->unitChargeActivationTime, serializeSettings, DLMS_DATA_TYPE_DATETIME);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 8))
{
ret = ser_loadUInt32(serializeSettings, &object->period);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 9))
{
if ((ret = ser_loadUInt8(serializeSettings, &ch)) == 0)
{
object->chargeConfiguration = (DLMS_CHARGE_CONFIGURATION)ch;
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 10))
{
ret = ser_loadDateTime(&object->lastCollectionTime, serializeSettings, DLMS_DATA_TYPE_DATETIME);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 11))
{
ret = ser_loadInt32(serializeSettings, &object->lastCollectionAmount);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 12))
{
ret = ser_loadInt32(serializeSettings, &object->totalAmountRemaining);
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 13))
{
ret = ser_loadUInt16(serializeSettings, &object->proportion);
}
return ret;
}
#endif //DLMS_IGNORE_CHARGE
#ifndef DLMS_IGNORE_TOKEN_GATEWAY
int ser_loadTokenGateway(
gxSerializerSettings * serializeSettings,
gxTokenGateway * object)
{
return 0;
}
#endif //DLMS_IGNORE_TOKEN_GATEWAY
#ifndef DLMS_IGNORE_GSM_DIAGNOSTIC
int ser_loadGsmDiagnostic(
gxSerializerSettings * serializeSettings,
gxGsmDiagnostic * object)
{
int ret = 0, pos;
gxAdjacentCell* it;
uint16_t count;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if (!isAttributeSet(serializeSettings, ignored, 2))
{
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
ret = ser_loadOctetString(serializeSettings, &object->operatorName);
#else
ret = ser_loadOctetString2(serializeSettings, &object->operatorName);
#endif //DLMS_IGNORE_MALLOC
}
if (ret == 0)
{
if ((!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_loadUInt8(serializeSettings, (unsigned char*)&object->status)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_loadUInt8(serializeSettings, (unsigned char*)&object->circuitSwitchStatus)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_loadUInt8(serializeSettings, (unsigned char*)&object->packetSwitchStatus)) != 0))
{
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 6))
{
if ((ret = ser_loadUInt32(serializeSettings, &object->cellInfo.cellId)) == 0 &&
(ret = ser_loadUInt16(serializeSettings, &object->cellInfo.locationId)) == 0 &&
(ret = ser_loadUInt8(serializeSettings, &object->cellInfo.signalQuality)) == 0 &&
(ret = ser_loadUInt8(serializeSettings, &object->cellInfo.ber)) == 0)
{
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 7))
{
arr_clear(&object->adjacentCells);
if ((ret = ser_loadArray(serializeSettings, &object->adjacentCells, &count)) == 0)
{
for (pos = 0; pos != count; ++pos)
{
if ((ret = ser_getArrayItem(&object->adjacentCells, pos, (void**)&it, sizeof(gxAdjacentCell))) != 0 ||
(ret = ser_loadUInt32(serializeSettings, &it->cellId)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, &it->signalQuality)) != 0)
{
break;
}
}
}
}
if (ret == 0 && !isAttributeSet(serializeSettings, ignored, 8))
{
ret = ser_loadDateTime(&object->captureTime, serializeSettings, DLMS_DATA_TYPE_DATETIME);
}
return ret;
}
#endif //DLMS_IGNORE_GSM_DIAGNOSTIC
#ifndef DLMS_IGNORE_COMPACT_DATA
int ser_loadCompactData(
gxSerializerSettings * serializeSettings,
dlmsSettings * settings,
gxCompactData * object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_loadOctetString(serializeSettings, &object->buffer)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_loadObjectsInternal(settings, serializeSettings, &object->captureObjects)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 4) && (ret = ser_loadUInt8(serializeSettings, &object->templateId)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 5) && (ret = ser_loadOctetString(serializeSettings, &object->templateDescription)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 6) && (ret = ser_loadUInt8(serializeSettings, (unsigned char*)&object->captureMethod)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_COMPACT_DATA
#ifndef DLMS_IGNORE_LLC_SSCS_SETUP
int ser_loadLlcSscsSetup(
gxSerializerSettings * serializeSettings,
gxLlcSscsSetup * object)
{
int ret = 0;
uint16_t ignored = ser_getIgnoredAttributes(serializeSettings, (gxObject*)object);
if ((!isAttributeSet(serializeSettings, ignored, 2) && (ret = ser_loadUInt16(serializeSettings, &object->serviceNodeAddress)) != 0) ||
(!isAttributeSet(serializeSettings, ignored, 3) && (ret = ser_loadUInt16(serializeSettings, &object->baseNodeAddress)) != 0))
{
}
return ret;
}
#endif //DLMS_IGNORE_LLC_SSCS_SETUP
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_PHYSICAL_LAYER_COUNTERS
int ser_loadPrimeNbOfdmPlcPhysicalLayerCounters(
gxSerializerSettings * serializeSettings,
gxPrimeNbOfdmPlcPhysicalLayerCounters * object)
{
return 0;
}
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_PHYSICAL_LAYER_COUNTERS
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_SETUP
int ser_loadPrimeNbOfdmPlcMacSetup(
gxSerializerSettings * serializeSettings,
gxPrimeNbOfdmPlcMacSetup * object)
{
return 0;
}
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_SETUP
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_FUNCTIONAL_PARAMETERS
int ser_loadPrimeNbOfdmPlcMacFunctionalParameters(
gxSerializerSettings * serializeSettings,
gxPrimeNbOfdmPlcMacFunctionalParameters * object)
{
return 0;
}
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_FUNCTIONAL_PARAMETERS
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_COUNTERS
int ser_loadPrimeNbOfdmPlcMacCounters(
gxSerializerSettings * serializeSettings,
gxPrimeNbOfdmPlcMacCounters * object)
{
return 0;
}
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_COUNTERS
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_NETWORK_ADMINISTRATION_DATA
int ser_loadPrimeNbOfdmPlcMacNetworkAdministrationData(
gxSerializerSettings * serializeSettings,
gxPrimeNbOfdmPlcMacNetworkAdministrationData * object)
{
return 0;
}
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_NETWORK_ADMINISTRATION_DATA
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_APPLICATIONS_IDENTIFICATION
int ser_loadPrimeNbOfdmPlcApplicationsIdentification(
gxSerializerSettings * serializeSettings,
gxPrimeNbOfdmPlcApplicationsIdentification * object)
{
return 0;
}
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_APPLICATIONS_IDENTIFICATION
#ifndef DLMS_IGNORE_ARBITRATOR
int ser_loadArbitrator(
gxSerializerSettings * serializeSettings,
gxArbitrator * object)
{
return 0;
}
#endif //DLMS_IGNORE_ARBITRATOR
#ifndef DLMS_IGNORE_IEC_8802_LLC_TYPE1_SETUP
int ser_loadIec8802LlcType1Setup(
gxSerializerSettings * serializeSettings,
gxIec8802LlcType1Setup * object)
{
return 0;
}
#endif //DLMS_IGNORE_IEC_8802_LLC_TYPE1_SETUP
#ifndef DLMS_IGNORE_IEC_8802_LLC_TYPE2_SETUP
int ser_loadIec8802LlcType2Setup(
gxSerializerSettings * serializeSettings,
gxIec8802LlcType2Setup * object)
{
return 0;
}
#endif //DLMS_IGNORE_IEC_8802_LLC_TYPE2_SETUP
#ifndef DLMS_IGNORE_IEC_8802_LLC_TYPE3_SETUP
int ser_loadIec8802LlcType3Setup(
gxSerializerSettings * serializeSettings,
gxIec8802LlcType3Setup * object)
{
return 0;
}
#endif //DLMS_IGNORE_IEC_8802_LLC_TYPE3_SETUP
#ifndef DLMS_IGNORE_SFSK_ACTIVE_INITIATOR
int ser_loadSFSKActiveInitiator(
gxSerializerSettings * serializeSettings,
gxSFSKActiveInitiator * object)
{
return 0;
}
#endif //DLMS_IGNORE_SFSK_ACTIVE_INITIATOR
#ifndef DLMS_IGNORE_SFSK_MAC_COUNTERS
int ser_loadFSKMacCounters(
gxSerializerSettings * serializeSettings,
gxFSKMacCounters * object)
{
return 0;
}
#endif //DLMS_IGNORE_SFSK_MAC_COUNTERS
#ifndef DLMS_IGNORE_SFSK_MAC_SYNCHRONIZATION_TIMEOUTS
int ser_loadSFSKMacSynchronizationTimeouts(
gxSerializerSettings * serializeSettings,
gxSFSKMacSynchronizationTimeouts * object)
{
return 0;
}
#endif //DLMS_IGNORE_SFSK_MAC_SYNCHRONIZATION_TIMEOUTS
#ifndef DLMS_IGNORE_SFSK_PHY_MAC_SETUP
int ser_loadSFSKPhyMacSetUp(
gxSerializerSettings * serializeSettings,
gxSFSKPhyMacSetUp * object)
{
return 0;
}
#endif //DLMS_IGNORE_SFSK_PHY_MAC_SETUP
#ifndef DLMS_IGNORE_SFSK_REPORTING_SYSTEM_LIST
int ser_loadSFSKReportingSystemList(
gxSerializerSettings * serializeSettings,
gxSFSKReportingSystemList * object)
{
return 0;
}
#endif //DLMS_IGNORE_SFSK_REPORTING_SYSTEM_LIST
#ifndef DLMS_IGNORE_SCHEDULE
int ser_loadSchedule(
gxSerializerSettings * serializeSettings,
gxSchedule * object)
{
return 0;
}
#endif //DLMS_IGNORE_SCHEDULE
#ifdef DLMS_ITALIAN_STANDARD
int ser_loadTariffPlan(
gxSerializerSettings * serializeSettings,
gxTariffPlan * object)
{
int ret;
if ((ret = bb_addString(serializeSettings, object->calendarName)) != 0 ||
(ret = ser_loadUInt8(serializeSettings, object->enabled)) != 0 ||
(ret = ser_loadDateTime(&object->activationTime, serializeSettings, DLMS_DATA_TYPE_DATETIME)) != 0)
{
}
return ret;
}
#endif //DLMS_ITALIAN_STANDARD
int ser_loadObject(
dlmsSettings * settings,
gxSerializerSettings * serializeSettings,
gxObject * object)
{
int ret = 0;
switch (object->objectType)
{
#ifndef DLMS_IGNORE_DATA
case DLMS_OBJECT_TYPE_DATA:
ret = ser_loadData(serializeSettings, (gxData*)object);
break;
#endif //DLMS_IGNORE_DATA
#ifndef DLMS_IGNORE_REGISTER
case DLMS_OBJECT_TYPE_REGISTER:
ret = ser_loadRegister(serializeSettings, (gxRegister*)object);
break;
#endif //DLMS_IGNORE_REGISTER
#ifndef DLMS_IGNORE_CLOCK
case DLMS_OBJECT_TYPE_CLOCK:
ret = ser_loadClock(serializeSettings, (gxClock*)object);
break;
#endif //DLMS_IGNORE_CLOCK
#ifndef DLMS_IGNORE_ACTION_SCHEDULE
case DLMS_OBJECT_TYPE_ACTION_SCHEDULE:
ret = ser_loadActionSchedule(serializeSettings, settings, (gxActionSchedule*)object);
break;
#endif //DLMS_IGNORE_ACTION_SCHEDULE
#ifndef DLMS_IGNORE_ACTIVITY_CALENDAR
case DLMS_OBJECT_TYPE_ACTIVITY_CALENDAR:
ret = ser_loadActivityCalendar(serializeSettings, settings, (gxActivityCalendar*)object);
break;
#endif //DLMS_IGNORE_ACTIVITY_CALENDAR
#ifndef DLMS_IGNORE_ASSOCIATION_LOGICAL_NAME
case DLMS_OBJECT_TYPE_ASSOCIATION_LOGICAL_NAME:
ret = ser_loadAssociationLogicalName(serializeSettings, settings, (gxAssociationLogicalName*)object);
break;
#endif //DLMS_IGNORE_ASSOCIATION_LOGICAL_NAME
#ifndef DLMS_IGNORE_ASSOCIATION_SHORT_NAME
case DLMS_OBJECT_TYPE_ASSOCIATION_SHORT_NAME:
#ifndef DLMS_IGNORE_ASSOCIATION_SHORT_NAME
ret = ser_loadAssociationShortName(serializeSettings, settings, (gxAssociationShortName*)object);
#else
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
#endif //DLMS_IGNORE_ASSOCIATION_SHORT_NAME
break;
#endif //DLMS_IGNORE_ASSOCIATION_SHORT_NAME
#ifndef DLMS_IGNORE_AUTO_ANSWER
case DLMS_OBJECT_TYPE_AUTO_ANSWER:
ret = ser_loadAutoAnswer(serializeSettings, (gxAutoAnswer*)object);
break;
#endif //DLMS_IGNORE_AUTO_ANSWER
#ifndef DLMS_IGNORE_AUTO_CONNECT
case DLMS_OBJECT_TYPE_AUTO_CONNECT:
ret = ser_loadAutoConnect(serializeSettings, (gxAutoConnect*)object);
break;
#endif //DLMS_IGNORE_AUTO_CONNECT
#ifndef DLMS_IGNORE_DEMAND_REGISTER
case DLMS_OBJECT_TYPE_DEMAND_REGISTER:
ret = ser_loadDemandRegister(serializeSettings, (gxDemandRegister*)object);
break;
#endif //DLMS_IGNORE_DEMAND_REGISTER
#ifndef DLMS_IGNORE_MAC_ADDRESS_SETUP
case DLMS_OBJECT_TYPE_MAC_ADDRESS_SETUP:
ret = ser_loadMacAddressSetup(serializeSettings, (gxMacAddressSetup*)object);
break;
#endif //DLMS_IGNORE_MAC_ADDRESS_SETUP
#ifndef DLMS_IGNORE_EXTENDED_REGISTER
case DLMS_OBJECT_TYPE_EXTENDED_REGISTER:
ret = ser_loadExtendedRegister(serializeSettings, (gxExtendedRegister*)object);
break;
#endif //DLMS_IGNORE_EXTENDED_REGISTER
#ifndef DLMS_IGNORE_GPRS_SETUP
case DLMS_OBJECT_TYPE_GPRS_SETUP:
#ifndef DLMS_IGNORE_GPRS_SETUP
ret = ser_loadGPRSSetup(serializeSettings, (gxGPRSSetup*)object);
#endif //DLMS_IGNORE_GPRS_SETUP
break;
#endif //DLMS_IGNORE_GPRS_SETUP
#ifndef DLMS_IGNORE_SECURITY_SETUP
case DLMS_OBJECT_TYPE_SECURITY_SETUP:
ret = ser_loadSecuritySetup(serializeSettings, (gxSecuritySetup*)object);
break;
#endif //DLMS_IGNORE_SECURITY_SETUP
#ifndef DLMS_IGNORE_IEC_HDLC_SETUP
case DLMS_OBJECT_TYPE_IEC_HDLC_SETUP:
ret = ser_loadHdlcSetup(serializeSettings, (gxIecHdlcSetup*)object);
break;
#endif //DLMS_IGNORE_IEC_HDLC_SETUP
#ifndef DLMS_IGNORE_IEC_LOCAL_PORT_SETUP
case DLMS_OBJECT_TYPE_IEC_LOCAL_PORT_SETUP:
ret = ser_loadLocalPortSetup(serializeSettings, (gxLocalPortSetup*)object);
break;
#endif //DLMS_IGNORE_IEC_LOCAL_PORT_SETUP
#ifndef DLMS_IGNORE_IEC_TWISTED_PAIR_SETUP
case DLMS_OBJECT_TYPE_IEC_TWISTED_PAIR_SETUP:
ret = ser_loadIecTwistedPairSetup(serializeSettings, (gxIecTwistedPairSetup*)object);
break;
#endif //DLMS_IGNORE_IEC_TWISTED_PAIR_SETUP
#ifndef DLMS_IGNORE_IP4_SETUP
case DLMS_OBJECT_TYPE_IP4_SETUP:
ret = ser_loadIp4Setup(serializeSettings, settings, (gxIp4Setup*)object);
break;
#endif //DLMS_IGNORE_IP4_SETUP
#ifndef DLMS_IGNORE_IP6_SETUP
case DLMS_OBJECT_TYPE_IP6_SETUP:
ret = ser_loadIp6Setup(serializeSettings, settings, (gxIp6Setup*)object);
break;
#endif //DLMS_IGNORE_IP6_SETUP
#ifndef DLMS_IGNORE_MBUS_SLAVE_PORT_SETUP
case DLMS_OBJECT_TYPE_MBUS_SLAVE_PORT_SETUP:
ret = ser_loadMbusSlavePortSetup(serializeSettings, (gxMbusSlavePortSetup*)object);
break;
#endif //DLMS_IGNORE_MBUS_SLAVE_PORT_SETUP
#ifndef DLMS_IGNORE_IMAGE_TRANSFER
case DLMS_OBJECT_TYPE_IMAGE_TRANSFER:
ret = ser_loadImageTransfer(serializeSettings, (gxImageTransfer*)object);
break;
#endif //DLMS_IGNORE_IMAGE_TRANSFER
#ifndef DLMS_IGNORE_DISCONNECT_CONTROL
case DLMS_OBJECT_TYPE_DISCONNECT_CONTROL:
ret = ser_loadDisconnectControl(serializeSettings, (gxDisconnectControl*)object);
break;
#endif //DLMS_IGNORE_DISCONNECT_CONTROL
#ifndef DLMS_IGNORE_LIMITER
case DLMS_OBJECT_TYPE_LIMITER:
ret = ser_loadLimiter(serializeSettings, settings, (gxLimiter*)object);
break;
#endif //DLMS_IGNORE_LIMITER
#ifndef DLMS_IGNORE_MBUS_DIAGNOSTIC
case DLMS_OBJECT_TYPE_MBUS_DIAGNOSTIC:
ret = ser_loadMBusDiagnostic(serializeSettings, settings, (gxMbusDiagnostic*)object);
break;
#endif //DLMS_IGNORE_MBUS_DIAGNOSTIC
#ifndef DLMS_IGNORE_MBUS_PORT_SETUP
case DLMS_OBJECT_TYPE_MBUS_PORT_SETUP:
ret = ser_loadMBusPortSetup(serializeSettings, settings, (gxMBusPortSetup*)object);
break;
#endif //DLMS_IGNORE_MBUS_PORT_SETUP
#ifndef DLMS_IGNORE_MBUS_CLIENT
case DLMS_OBJECT_TYPE_MBUS_CLIENT:
ret = ser_loadMBusClient(serializeSettings, settings, (gxMBusClient*)object);
break;
#endif //DLMS_IGNORE_MBUS_CLIENT
#ifndef DLMS_IGNORE_G3_PLC_MAC_LAYER_COUNTERS
case DLMS_OBJECT_TYPE_G3_PLC_MAC_LAYER_COUNTERS:
ret = ser_loadG3PlcMacLayerCounters(serializeSettings, settings, (gxG3PlcMacLayerCounters*)object);
break;
#endif //DLMS_IGNORE_G3_PLC_MAC_LAYER_COUNTERS
#ifndef DLMS_IGNORE_G3_PLC_MAC_SETUP
case DLMS_OBJECT_TYPE_G3_PLC_MAC_SETUP:
ret = ser_loadG3PlcMacSetup(serializeSettings, settings, (gxG3PlcMacSetup*)object);
break;
#endif //DLMS_IGNORE_G3_PLC_MAC_SETUP
#ifndef DLMS_IGNORE_G3_PLC_6LO_WPAN
case DLMS_OBJECT_TYPE_G3_PLC_6LO_WPAN:
ret = ser_loadG3Plc6LoWPAN(serializeSettings, settings, (gxG3Plc6LoWPAN*)object);
break;
#endif //DLMS_IGNORE_G3_PLC_6LO_WPAN
#ifndef DLMS_IGNORE_FUNCTION_CONTROL
case DLMS_OBJECT_TYPE_FUNCTION_CONTROL:
ret = ser_loadFunctionControl(serializeSettings, settings, (gxFunctionControl*)object);
break;
#endif //DLMS_IGNORE_FUNCTION_CONTROL
#ifndef DLMS_IGNORE_ARRAY_MANAGER
case DLMS_OBJECT_TYPE_ARRAY_MANAGER:
ret = ser_loadArrayManager(serializeSettings, settings, (gxArrayManager*)object);
break;
#endif //DLMS_IGNORE_ARRAY_MANAGER
#ifndef DLMS_IGNORE_MODEM_CONFIGURATION
case DLMS_OBJECT_TYPE_MODEM_CONFIGURATION:
ret = ser_loadModemConfiguration(serializeSettings, (gxModemConfiguration*)object);
break;
#endif //DLMS_IGNORE_MODEM_CONFIGURATION
#ifndef DLMS_IGNORE_PPP_SETUP
case DLMS_OBJECT_TYPE_PPP_SETUP:
ret = ser_loadPppSetup(serializeSettings, settings, (gxPppSetup*)object);
break;
#endif //DLMS_IGNORE_PPP_SETUP
#ifndef DLMS_IGNORE_PROFILE_GENERIC
case DLMS_OBJECT_TYPE_PROFILE_GENERIC:
ret = ser_loadProfileGeneric(serializeSettings, settings, (gxProfileGeneric*)object);
break;
#endif //DLMS_IGNORE_PROFILE_GENERIC
#ifndef DLMS_IGNORE_REGISTER_ACTIVATION
case DLMS_OBJECT_TYPE_REGISTER_ACTIVATION:
ret = ser_loadRegisterActivation(serializeSettings, settings, (gxRegisterActivation*)object);
break;
#endif //DLMS_IGNORE_REGISTER_ACTIVATION
#ifndef DLMS_IGNORE_REGISTER_MONITOR
case DLMS_OBJECT_TYPE_REGISTER_MONITOR:
ret = ser_loadRegisterMonitor(serializeSettings, settings, (gxRegisterMonitor*)object);
break;
#endif //DLMS_IGNORE_REGISTER_MONITOR
#ifndef DLMS_IGNORE_REGISTER_TABLE
case DLMS_OBJECT_TYPE_REGISTER_TABLE:
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
assert(0);
#endif
break;
#endif //DLMS_IGNORE_REGISTER_TABLE
#ifndef DLMS_IGNORE_ZIG_BEE_SAS_STARTUP
case DLMS_OBJECT_TYPE_ZIG_BEE_SAS_STARTUP:
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
assert(0);
#endif
break;
#endif //DLMS_IGNORE_ZIG_BEE_SAS_STARTUP
#ifndef DLMS_IGNORE_ZIG_BEE_SAS_JOIN
case DLMS_OBJECT_TYPE_ZIG_BEE_SAS_JOIN:
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
assert(0);
#endif
break;
#endif //DLMS_IGNORE_ZIG_BEE_SAS_JOIN
#ifndef DLMS_IGNORE_ZIG_BEE_SAS_APS_FRAGMENTATION
case DLMS_OBJECT_TYPE_ZIG_BEE_SAS_APS_FRAGMENTATION:
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
assert(0);
#endif
break;
#endif //DLMS_IGNORE_ZIG_BEE_SAS_APS_FRAGMENTATION
#ifndef DLMS_IGNORE_ZIG_BEE_NETWORK_CONTROL
case DLMS_OBJECT_TYPE_ZIG_BEE_NETWORK_CONTROL:
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
assert(0);
#endif
break;
#endif //DLMS_IGNORE_ZIG_BEE_NETWORK_CONTROL
#ifndef DLMS_IGNORE_SAP_ASSIGNMENT
case DLMS_OBJECT_TYPE_SAP_ASSIGNMENT:
ret = ser_loadSapAssignment(serializeSettings, (gxSapAssignment*)object);
break;
#endif //DLMS_IGNORE_SAP_ASSIGNMENT
#ifndef DLMS_IGNORE_SCHEDULE
case DLMS_OBJECT_TYPE_SCHEDULE:
ret = ser_loadSchedule(serializeSettings, (gxSchedule*)object);
break;
#endif //DLMS_IGNORE_SCHEDULE
#ifndef DLMS_IGNORE_SCRIPT_TABLE
case DLMS_OBJECT_TYPE_SCRIPT_TABLE:
ret = ser_loadScriptTable(serializeSettings, settings, (gxScriptTable*)object);
break;
#endif //DLMS_IGNORE_SCRIPT_TABLE
#ifndef DLMS_IGNORE_SMTP_SETUP
case DLMS_OBJECT_TYPE_SMTP_SETUP:
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
assert(0);
#endif
break;
#endif //DLMS_IGNORE_SMTP_SETUP
#ifndef DLMS_IGNORE_SPECIAL_DAYS_TABLE
case DLMS_OBJECT_TYPE_SPECIAL_DAYS_TABLE:
ret = ser_loadSpecialDaysTable(serializeSettings, (gxSpecialDaysTable*)object);
break;
#endif //DLMS_IGNORE_SPECIAL_DAYS_TABLE
#ifndef DLMS_IGNORE_STATUS_MAPPING
case DLMS_OBJECT_TYPE_STATUS_MAPPING:
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
assert(0);
#endif
break;
#endif //DLMS_IGNORE_STATUS_MAPPING
#ifndef DLMS_IGNORE_TCP_UDP_SETUP
case DLMS_OBJECT_TYPE_TCP_UDP_SETUP:
ret = ser_loadTcpUdpSetup(serializeSettings, settings, (gxTcpUdpSetup*)object);
break;
#endif //DLMS_IGNORE_TCP_UDP_SETUP
#ifndef DLMS_IGNORE_UTILITY_TABLES
case DLMS_OBJECT_TYPE_UTILITY_TABLES:
ret = ser_loadUtilityTables(serializeSettings, (gxUtilityTables*)object);
break;
#endif //DLMS_IGNORE_UTILITY_TABLES
#ifndef DLMS_IGNORE_MBUS_MASTER_PORT_SETUP
case DLMS_OBJECT_TYPE_MBUS_MASTER_PORT_SETUP:
ret = ser_loadMBusMasterPortSetup(serializeSettings, (gxMBusMasterPortSetup*)object);
break;
#endif //DLMS_IGNORE_MBUS_MASTER_PORT_SETUP
#ifndef DLMS_IGNORE_PUSH_SETUP
case DLMS_OBJECT_TYPE_PUSH_SETUP:
ret = ser_loadPushSetup(serializeSettings, settings, (gxPushSetup*)object);
break;
#endif //DLMS_IGNORE_PUSH_SETUP
#ifndef DLMS_IGNORE_DATA_PROTECTION
case DLMS_OBJECT_TYPE_DATA_PROTECTION:
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
assert(0);
#endif
break;
#endif //DLMS_IGNORE_DATA_PROTECTION
#ifndef DLMS_IGNORE_ACCOUNT
case DLMS_OBJECT_TYPE_ACCOUNT:
ret = ser_loadAccount(serializeSettings, (gxAccount*)object);
break;
#endif //DLMS_IGNORE_ACCOUNT
#ifndef DLMS_IGNORE_CREDIT
case DLMS_OBJECT_TYPE_CREDIT:
ret = ser_loadCredit(serializeSettings, (gxCredit*)object);
break;
#endif //DLMS_IGNORE_CREDIT
#ifndef DLMS_IGNORE_CHARGE
case DLMS_OBJECT_TYPE_CHARGE:
ret = ser_loadCharge(serializeSettings, settings, (gxCharge*)object);
break;
#endif //DLMS_IGNORE_CHARGE
#ifndef DLMS_IGNORE_TOKEN_GATEWAY
case DLMS_OBJECT_TYPE_TOKEN_GATEWAY:
ret = ser_loadTokenGateway(serializeSettings, (gxTokenGateway*)object);
break;
#endif //DLMS_IGNORE_TOKEN_GATEWAY
#ifndef DLMS_IGNORE_GSM_DIAGNOSTIC
case DLMS_OBJECT_TYPE_GSM_DIAGNOSTIC:
ret = ser_loadGsmDiagnostic(serializeSettings, (gxGsmDiagnostic*)object);
break;
#endif //DLMS_IGNORE_GSM_DIAGNOSTIC
#ifndef DLMS_IGNORE_COMPACT_DATA
case DLMS_OBJECT_TYPE_COMPACT_DATA:
ret = ser_loadCompactData(serializeSettings, settings, (gxCompactData*)object);
break;
#endif //DLMS_IGNORE_COMPACT_DATA
#ifndef DLMS_IGNORE_LLC_SSCS_SETUP
case DLMS_OBJECT_TYPE_LLC_SSCS_SETUP:
ret = ser_loadLlcSscsSetup(serializeSettings, (gxLlcSscsSetup*)object);
break;
#endif //DLMS_IGNORE_LLC_SSCS_SETUP
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_PHYSICAL_LAYER_COUNTERS
case DLMS_OBJECT_TYPE_PRIME_NB_OFDM_PLC_PHYSICAL_LAYER_COUNTERS:
ret = ser_loadPrimeNbOfdmPlcPhysicalLayerCounters(serializeSettings, (gxPrimeNbOfdmPlcPhysicalLayerCounters*)object);
break;
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_PHYSICAL_LAYER_COUNTERS
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_SETUP
case DLMS_OBJECT_TYPE_PRIME_NB_OFDM_PLC_MAC_SETUP:
ret = ser_loadPrimeNbOfdmPlcMacSetup(serializeSettings, (gxPrimeNbOfdmPlcMacSetup*)object);
break;
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_SETUP
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_FUNCTIONAL_PARAMETERS
case DLMS_OBJECT_TYPE_PRIME_NB_OFDM_PLC_MAC_FUNCTIONAL_PARAMETERS:
ret = ser_loadPrimeNbOfdmPlcMacFunctionalParameters(serializeSettings, (gxPrimeNbOfdmPlcMacFunctionalParameters*)object);
break;
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_FUNCTIONAL_PARAMETERS
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_COUNTERS
case DLMS_OBJECT_TYPE_PRIME_NB_OFDM_PLC_MAC_COUNTERS:
ret = ser_loadPrimeNbOfdmPlcMacCounters(serializeSettings, (gxPrimeNbOfdmPlcMacCounters*)object);
break;
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_COUNTERS
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_NETWORK_ADMINISTRATION_DATA
case DLMS_OBJECT_TYPE_PRIME_NB_OFDM_PLC_MAC_NETWORK_ADMINISTRATION_DATA:
ret = ser_loadPrimeNbOfdmPlcMacNetworkAdministrationData(serializeSettings, (gxPrimeNbOfdmPlcMacNetworkAdministrationData*)object);
break;
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_NETWORK_ADMINISTRATION_DATA
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_APPLICATIONS_IDENTIFICATION
case DLMS_OBJECT_TYPE_PRIME_NB_OFDM_PLC_APPLICATIONS_IDENTIFICATION:
ret = ser_loadPrimeNbOfdmPlcApplicationsIdentification(serializeSettings, (gxPrimeNbOfdmPlcApplicationsIdentification*)object);
break;
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_APPLICATIONS_IDENTIFICATION
case DLMS_OBJECT_TYPE_PARAMETER_MONITOR:
break;
#ifndef DLMS_IGNORE_ARBITRATOR
case DLMS_OBJECT_TYPE_ARBITRATOR:
ret = ser_loadArbitrator(serializeSettings, (gxArbitrator*)object);
break;
#endif //DLMS_IGNORE_ARBITRATOR
#ifndef DLMS_IGNORE_IEC_8802_LLC_TYPE1_SETUP
case DLMS_OBJECT_TYPE_IEC_8802_LLC_TYPE1_SETUP:
ret = ser_loadIec8802LlcType1Setup(serializeSettings, (gxIec8802LlcType1Setup*)object);
break;
#endif //DLMS_IGNORE_IEC_8802_LLC_TYPE1_SETUP
#ifndef DLMS_IGNORE_IEC_8802_LLC_TYPE2_SETUP
case DLMS_OBJECT_TYPE_IEC_8802_LLC_TYPE2_SETUP:
ser_loadIec8802LlcType2Setup(serializeSettings, (gxIec8802LlcType2Setup*)object);
break;
#endif //DLMS_IGNORE_IEC_8802_LLC_TYPE2_SETUP
#ifndef DLMS_IGNORE_IEC_8802_LLC_TYPE3_SETUP
case DLMS_OBJECT_TYPE_IEC_8802_LLC_TYPE3_SETUP:
ser_loadIec8802LlcType3Setup(serializeSettings, (gxIec8802LlcType3Setup*)object);
break;
#endif //DLMS_IGNORE_IEC_8802_LLC_TYPE3_SETUP
#ifndef DLMS_IGNORE_SFSK_ACTIVE_INITIATOR
case DLMS_OBJECT_TYPE_SFSK_ACTIVE_INITIATOR:
ser_loadSFSKActiveInitiator(serializeSettings, (gxSFSKActiveInitiator*)object);
break;
#endif //DLMS_IGNORE_SFSK_ACTIVE_INITIATOR
#ifndef DLMS_IGNORE_SFSK_MAC_COUNTERS
case DLMS_OBJECT_TYPE_SFSK_MAC_COUNTERS:
ser_loadFSKMacCounters(serializeSettings, (gxFSKMacCounters*)object);
break;
#endif //DLMS_IGNORE_SFSK_MAC_COUNTERS
#ifndef DLMS_IGNORE_SFSK_MAC_SYNCHRONIZATION_TIMEOUTS
case DLMS_OBJECT_TYPE_SFSK_MAC_SYNCHRONIZATION_TIMEOUTS:
ser_loadSFSKMacSynchronizationTimeouts(serializeSettings, (gxSFSKMacSynchronizationTimeouts*)object);
break;
#endif //DLMS_IGNORE_SFSK_MAC_SYNCHRONIZATION_TIMEOUTS
#ifndef DLMS_IGNORE_SFSK_PHY_MAC_SETUP
case DLMS_OBJECT_TYPE_SFSK_PHY_MAC_SETUP:
ser_loadSFSKPhyMacSetUp(serializeSettings, (gxSFSKPhyMacSetUp*)object);
break;
#endif //DLMS_IGNORE_SFSK_PHY_MAC_SETUP
#ifndef DLMS_IGNORE_SFSK_REPORTING_SYSTEM_LIST
case DLMS_OBJECT_TYPE_SFSK_REPORTING_SYSTEM_LIST:
ser_loadSFSKReportingSystemList(serializeSettings, (gxSFSKReportingSystemList*)object);
break;
#endif //DLMS_IGNORE_SFSK_REPORTING_SYSTEM_LIST
#ifdef DLMS_ITALIAN_STANDARD
case DLMS_OBJECT_TYPE_TARIFF_PLAN:
ret = ser_loadTariffPlan(serializeSettings, (gxTariffPlan*)object);
break;
#endif //DLMS_ITALIAN_STANDARD
default: //Unknown type.
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
int ser_getDataSize(gxSerializerSettings * serializeSettings, void* size)
{
int ret;
//Serializer version number.
unsigned char version;
#if !(!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
ResetPosition(serializeSettings);
#endif //!(!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
if ((ret = ser_loadUInt8(serializeSettings, &version)) == 0)
{
if (version == 0 || version > SERIALIZATION_VERSION)
{
#ifdef DLMS_DEBUG
svr_notifyTrace(GET_STR_FROM_EEPROM("ser_loadObject failed. Invalid version,"), version);
#endif //DLMS_DEBUG
return DLMS_ERROR_CODE_INVALID_PARAMETER;
}
ret = ser_loadUInt32(serializeSettings, size);
}
return ret;
}
//Serialize objects to bytebuffer.
int ser_loadObjects(
dlmsSettings * settings,
gxSerializerSettings * serializeSettings,
gxObject * *object,
uint16_t count)
{
uint16_t pos;
int ret = 0;
uint32_t size;
//Serializer version number.
if ((ret = ser_getDataSize(serializeSettings, &size)) == 0 && size != 0)
{
for (pos = 0; pos != count; ++pos)
{
//If all data is read.
if (ser_isEof(serializeSettings))
{
break;
}
#ifdef DLMS_DEBUG
svr_notifyTrace(GET_STR_FROM_EEPROM("ser_loadObject"), pos);
#endif //DLMS_DEBUG
if ((ret = ser_loadObject(settings, serializeSettings, object[pos])) != 0)
{
#ifdef DLMS_DEBUG
svr_notifyTrace(GET_STR_FROM_EEPROM("ser_loadObject failed"), pos);
#endif //DLMS_DEBUG
//If all data is read.
if (ser_isEof(serializeSettings))
{
ret = 0;
}
break;
}
}
#if !(!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
if (ret == 0 && serializeSettings->position - 5 != size)
{
return DLMS_ERROR_CODE_OUTOFMEMORY;
}
#endif //!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__))
}
return ret;
}
//Serialize objects to bytebuffer.
int ser_loadObjects2(
dlmsSettings * settings,
gxSerializerSettings * serializeSettings,
objectArray * objects)
{
gxObject* obj;
uint32_t size;
uint16_t pos;
int ret = 0;
//Serializer version number.
if ((ret = ser_getDataSize(serializeSettings, &size)) == 0)
{
for (pos = 0; pos != objects->size; ++pos)
{
//If all data is read.
if (ser_isEof(serializeSettings))
{
break;
}
#ifdef DLMS_DEBUG
svr_notifyTrace(GET_STR_FROM_EEPROM("ser_loadObject"), pos);
#endif //DLMS_DEBUG
if ((ret = oa_getByIndex(objects, pos, &obj)) != DLMS_ERROR_CODE_OK ||
(ret = ser_loadObject(settings, serializeSettings, obj)) != 0)
{
#ifdef DLMS_DEBUG
svr_notifyTrace(GET_STR_FROM_EEPROM("ser_loadObject failed"), pos);
#endif //DLMS_DEBUG
break;
}
}
#if !(!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
if (serializeSettings->position - 5 != size)
{
return DLMS_ERROR_CODE_OUTOFMEMORY;
}
#endif //!(!defined(GX_DLMS_SERIALIZER) && (defined(_WIN32) || defined(_WIN64) || defined(__linux__)))
}
return ret;
}
#endif //DLMS_IGNORE_SERIALIZER