esphome_elektromer_han/components/xt211/gxget.c

6948 lines
224 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
//---------------------------------------------------------------------------
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
#include <assert.h>
#endif
#include "gxignore.h"
#include "gxmem.h"
#if _MSC_VER > 1400
#include <crtdbg.h>
#endif
#include <string.h>
#include <math.h>
#include "gxget.h"
#include "gxarray.h"
#include "bitarray.h"
#include "cosem.h"
#include "dlms.h"
#include "gxkey.h"
#include "helpers.h"
#include "serverevents.h"
#ifdef DLMS_IGNORE_OBJECT_POINTERS
#define OBJECT_TYPE it->objectType
#define SCRIPT_LOGICAL_NAME action->scriptLogicalName
#else
#define OBJECT_TYPE it->target->objectType
#define SCRIPT_LOGICAL_NAME action->script == NULL ? EMPTY_LN : action->script->logicalName
#endif //DLMS_IGNORE_OBJECT_POINTERS
int cosem_getByteBuffer(gxValueEventArg* e)
{
if (e->value.vt != DLMS_DATA_TYPE_OCTET_STRING)
{
e->value.vt = DLMS_DATA_TYPE_OCTET_STRING;
#ifndef DLMS_IGNORE_MALLOC
if (e->value.byteArr == NULL)
{
e->value.byteArr = (gxByteBuffer*)gxmalloc(sizeof(gxByteBuffer));
if (e->value.byteArr == NULL)
{
return DLMS_ERROR_CODE_OUTOFMEMORY;
}
BYTE_BUFFER_INIT(e->value.byteArr);
}
#endif //DLMS_IGNORE_MALLOC
}
e->byteArray = 1;
return 0;
}
#ifndef DLMS_IGNORE_DATA
int cosem_getData(gxValueEventArg* e)
{
int ret;
if (e->index == 2)
{
//Return plain value if request is coming from action.
if (e->action)
{
ret = var_copy(&e->value, &((gxData*)e->target)->value);
}
else
{
ret = cosem_setVariant(e->value.byteArr, &((gxData*)e->target)->value);
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_DATA
#ifndef DLMS_IGNORE_REGISTER
int cosem_getRegister(
gxValueEventArg* e)
{
int ret;
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
//Return plain value if request is coming from action.
if (e->action)
{
ret = var_copy(&e->value, &((gxRegister*)e->target)->value);
}
else
{
ret = cosem_setVariant(e->value.byteArr, &((gxRegister*)e->target)->value);
}
}
else if (e->index == 3)
{
if ((ret = cosem_setStructure(data, 2)) != 0 ||
(ret = cosem_setInt8(data, ((gxRegister*)e->target)->scaler)) != 0 ||
(ret = cosem_setEnum(data, ((gxRegister*)e->target)->unit)) != 0)
{
//Error code is returned at the end of the function.
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_REGISTER
#ifndef DLMS_IGNORE_REGISTER_TABLE
int cosem_getRegisterTable(
gxValueEventArg* e)
{
int ret;
if (e->index == 2)
{
//TODO: ret = cosem_setVariant(e->value.byteArr, &((gxRegisterTable*)e->target)->value);
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
else if (e->index == 4)
{
gxByteBuffer* data = e->value.byteArr;
if ((ret = cosem_setStructure(data, 2)) != 0 ||
(ret = cosem_setInt8(data, ((gxRegisterTable*)e->target)->scaler)) != 0 ||
(ret = cosem_setEnum(data, ((gxRegisterTable*)e->target)->unit)) != 0)
{
//Error code is returned at the end of the function.
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_REGISTER_TABLE
#ifndef DLMS_IGNORE_CLOCK
int cosem_getClock(
gxValueEventArg* e)
{
int ret;
if (e->index == 2)
{
ret = cosem_setDateTimeAsOctetString(e->value.byteArr, &((gxClock*)e->target)->time);
}
else if (e->index == 3)
{
ret = cosem_setInt16(e->value.byteArr, ((gxClock*)e->target)->timeZone);
}
else if (e->index == 4)
{
ret = cosem_setUInt8(e->value.byteArr, ((gxClock*)e->target)->status);
}
else if (e->index == 5)
{
ret = cosem_setDateTimeAsOctetString(e->value.byteArr, &((gxClock*)e->target)->begin);
}
else if (e->index == 6)
{
ret = cosem_setDateTimeAsOctetString(e->value.byteArr, &((gxClock*)e->target)->end);
}
else if (e->index == 7)
{
ret = cosem_setInt8(e->value.byteArr, ((gxClock*)e->target)->deviation);
}
else if (e->index == 8)
{
ret = cosem_setBoolean(e->value.byteArr, ((gxClock*)e->target)->enabled);
}
else if (e->index == 9)
{
ret = cosem_setEnum(e->value.byteArr, ((gxClock*)e->target)->clockBase);
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_CLOCK
#ifndef DLMS_IGNORE_ACTION_SCHEDULE
int cosem_getActionSchedule(
gxValueEventArg* e)
{
int ret = DLMS_ERROR_CODE_OK;
uint16_t pos;
gxtime* tm;
gxActionSchedule* object = (gxActionSchedule*)e->target;
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
if ((ret = cosem_setStructure(data, 2)) != 0 ||
//Add LN.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = hlp_setObjectCount(6, data)) != 0 ||
#ifndef DLMS_IGNORE_OBJECT_POINTERS
(ret = bb_set(data, obj_getLogicalName((gxObject*)object->executedScript), 6)) != 0 ||
#else
(ret = bb_set(data, object->executedScriptLogicalName, 6)) != 0 ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
//Add executed script selector.
(ret = cosem_setUInt16(data, object->executedScriptSelector)) != 0)
{
//Error code is returned at the end of the function.
}
}
else if (e->index == 3)
{
ret = cosem_setEnum(e->value.byteArr, object->type);
}
else if (e->index == 4)
{
if ((ret = cosem_setArray(data, object->executionTime.size)) == 0)
{
for (pos = 0; pos != object->executionTime.size; ++pos)
{
if ((ret = cosem_setStructure(data, 2)) != 0)
{
break;
}
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->executionTime, pos, (void**)&tm)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->executionTime, pos, (void**)&tm, sizeof(gxtime))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setTimeAsOctetString(data, tm)) != 0 ||
(ret = cosem_setDateAsOctetString(data, tm)) != 0)
{
break;
}
}
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_ACTION_SCHEDULE
#ifndef DLMS_IGNORE_ACTIVITY_CALENDAR
int getActivityCalendarDayProfileTable(gxArray* list, gxByteBuffer* ba)
{
gxDayProfile* dp;
gxDayProfileAction* action;
int ret;
uint16_t pos, pos2;
if ((ret = cosem_setArray(ba, list->size)) != 0)
{
return ret;
}
for (pos = 0; pos != list->size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(list, pos, (void**)&dp)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(list, pos, (void**)&dp, sizeof(gxDayProfile))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setStructure(ba, 2)) != 0 ||
(ret = cosem_setUInt8(ba, dp->dayId)) != 0 ||
//Add count
(ret = cosem_setArray(ba, dp->daySchedules.size)) != 0)
{
break;
}
for (pos2 = 0; pos2 != dp->daySchedules.size; ++pos2)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&dp->daySchedules, pos2, (void**)&action)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&dp->daySchedules, pos2, (void**)&action, sizeof(gxDayProfileAction))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setStructure(ba, 3)) != 0 ||
(ret = cosem_setTimeAsOctetString(ba, &action->startTime)) != 0 ||
(ret = cosem_setOctetString2(ba, SCRIPT_LOGICAL_NAME, 6)) != 0 ||
(ret = cosem_setUInt16(ba, action->scriptSelector)) != 0)
{
break;
}
}
}
return ret;
}
int getActivityCalendarWeekProfileTable(gxArray* list, gxByteBuffer* ba)
{
int ret = 0;
uint16_t pos;
gxWeekProfile* wp;
//Add count
if ((ret = cosem_setArray(ba, list->size)) != 0)
{
return ret;
}
for (pos = 0; pos != list->size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = cosem_setStructure(ba, 8)) != 0 ||
(ret = arr_getByIndex(list, pos, (void**)&wp, sizeof(gxWeekProfile))) != 0 ||
(ret = cosem_setOctetString2(ba, wp->name.value, wp->name.size)) != 0 ||
(ret = cosem_setUInt8(ba, wp->monday)) != 0 ||
(ret = cosem_setUInt8(ba, wp->tuesday)) != 0 ||
(ret = cosem_setUInt8(ba, wp->wednesday)) != 0 ||
(ret = cosem_setUInt8(ba, wp->thursday)) != 0 ||
(ret = cosem_setUInt8(ba, wp->friday)) != 0 ||
(ret = cosem_setUInt8(ba, wp->saturday)) != 0 ||
(ret = cosem_setUInt8(ba, wp->sunday)) != 0)
{
break;
}
#else
if ((ret = cosem_setStructure(ba, 8)) != 0 ||
(ret = arr_getByIndex(list, pos, (void**)&wp)) != 0 ||
(ret = cosem_setOctetString(ba, &wp->name)) != 0 ||
(ret = cosem_setUInt8(ba, wp->monday)) != 0 ||
(ret = cosem_setUInt8(ba, wp->tuesday)) != 0 ||
(ret = cosem_setUInt8(ba, wp->wednesday)) != 0 ||
(ret = cosem_setUInt8(ba, wp->thursday)) != 0 ||
(ret = cosem_setUInt8(ba, wp->friday)) != 0 ||
(ret = cosem_setUInt8(ba, wp->saturday)) != 0 ||
(ret = cosem_setUInt8(ba, wp->sunday)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
int getActivityCalendarSeasonProfile(gxArray* list, gxByteBuffer* ba)
{
int ret = 0;
uint16_t pos;
gxSeasonProfile* sp;
//Add count
if ((ret = cosem_setArray(ba, list->size)) != 0)
{
return ret;
}
for (pos = 0; pos != list->size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(list, pos, (void**)&sp, sizeof(gxSeasonProfile))) != 0)
{
break;
}
if ((ret = cosem_setStructure(ba, 3)) != 0 ||
//Add name.
(ret = cosem_setOctetString2(ba, sp->name.value, sp->name.size)) != 0 ||
//Add start time.
(ret = cosem_setDateTimeAsOctetString(ba, &sp->start)) != 0 ||
//Add week day.
(ret = cosem_setOctetString2(ba, sp->weekName.value, sp->weekName.size)) != 0)
{
break;
}
#else
if ((ret = cosem_setStructure(ba, 3)) != 0 ||
(ret = arr_getByIndex(list, pos, (void**)&sp)) != 0 ||
//Add name.
(ret = cosem_setOctetString(ba, &sp->name)) != 0 ||
//Add start time.
(ret = cosem_setDateTimeAsOctetString(ba, &sp->start)) != 0 ||
//Add week day.
(ret = cosem_setOctetString(ba, &sp->weekName)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
int getActivityCalendarName(
gxByteBuffer* name,
gxByteBuffer* ba)
{
return cosem_setOctetString(ba, name);
}
int cosem_getActivityCalendar(
gxValueEventArg* e)
{
int ret;
gxByteBuffer* data = e->value.byteArr;
gxActivityCalendar* object = (gxActivityCalendar*)e->target;
if (e->index == 2)
{
ret = getActivityCalendarName(&object->calendarNameActive, data);
}
else if (e->index == 3)
{
ret = getActivityCalendarSeasonProfile(&object->seasonProfileActive, data);
}
else if (e->index == 4)
{
ret = getActivityCalendarWeekProfileTable(&object->weekProfileTableActive, data);
}
else if (e->index == 5)
{
ret = getActivityCalendarDayProfileTable(&object->dayProfileTableActive, data);
}
else if (e->index == 6)
{
ret = getActivityCalendarName(&object->calendarNamePassive, data);
}
else if (e->index == 7)
{
ret = getActivityCalendarSeasonProfile(&object->seasonProfilePassive, data);
}
else if (e->index == 8)
{
ret = getActivityCalendarWeekProfileTable(&object->weekProfileTablePassive, data);
}
else if (e->index == 9)
{
ret = getActivityCalendarDayProfileTable(&object->dayProfileTablePassive, data);
}
else if (e->index == 10)
{
ret = cosem_setDateTimeAsOctetString(data, &object->time);
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_ACTIVITY_CALENDAR
#ifndef DLMS_IGNORE_SERVER
int getLNAccessRights(
dlmsSettings* settings,
gxObject* object,
gxByteBuffer* data)
{
unsigned char pos, cnt;
int ret;
unsigned char ch;
cnt = obj_attributeCount(object);
if ((ret = cosem_setStructure(data, 2)) != 0 ||
(ret = cosem_setArray(data, cnt)) != 0)
{
return ret;
}
for (pos = 1; pos != cnt + 1; ++pos)
{
ch = (unsigned char)svr_getAttributeAccess(settings, object, pos);
//attribute_access_item
if ((ret = cosem_setStructure(data, 3)) != 0 ||
//Add index.
(ret = cosem_setInt8(data, pos)) != 0 ||
//Add value.
(ret = cosem_setEnum(data, ch)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_NONE)) != 0)
{
return ret;
}
}
#ifdef INDIAN_STANDARD
if ((ret = cosem_setArray(data, 0)) != 0)
{
return ret;
}
#else
cnt = obj_methodCount(object);
if ((ret = cosem_setArray(data, cnt)) != 0)
{
return ret;
}
for (pos = 1; pos != cnt + 1; ++pos)
{
ch = (unsigned char)svr_getMethodAccess(settings, object, pos);
//attribute_access_item
if ((ret = cosem_setStructure(data, 2)) != 0 ||
//Add index.
(ret = cosem_setInt8(data, pos)) != 0 ||
//Add value.
(ret = cosem_setEnum(data, ch)) != 0)
{
return ret;
}
}
#endif //INDIAN_STANDARD
return 0;
}
#endif //DLMS_IGNORE_SERVER
#ifndef DLMS_IGNORE_SERVER
#ifndef DLMS_IGNORE_ASSOCIATION_LOGICAL_NAME
// Returns LN Association View.
int getLNObjects(
dlmsSettings* settings,
gxValueEventArg* e,
gxByteBuffer* data)
{
uint16_t pduSize = 0;
gxAssociationLogicalName* object = (gxAssociationLogicalName*)e->target;
int ret;
uint16_t pos;
unsigned char found = 0;
gxObject* it, * it2;
static const unsigned char ln[] = { 0, 0, 40, 0, 0, 255 };
if ((ret = bb_capacity(data, settings->maxPduSize)) != 0)
{
return ret;
}
//Add count only for first time.
if (!e->transaction)
{
uint16_t count = object->objectList.size;
//Find current association and if nout found add it.
for (pos = 0; pos != object->objectList.size; ++pos)
{
if ((ret = oa_getByIndex(&object->objectList, pos, &it)) != 0)
{
return ret;
}
if (e->target != it && it->objectType == DLMS_OBJECT_TYPE_ASSOCIATION_LOGICAL_NAME)
{
if (memcmp(ln, it->logicalName, 6) == 0)
{
found = 1;
}
else
{
//Remove extra association view.
--count;
}
}
}
//Remove objects that are only internal use.
for (pos = 0; pos != settings->internalObjects.size; ++pos)
{
if ((ret = oa_getByIndex(&settings->internalObjects, pos, &it)) != 0)
{
return ret;
}
oa_findByLN(&object->objectList, it->objectType, it->logicalName, &it2);
if (it2 != NULL)
{
--count;
}
}
if (!found)
{
++count;
}
e->transactionEndIndex = count;
if ((ret = cosem_setArray(data, count)) != 0)
{
return ret;
}
if (!found)
{
//Count
if ((ret = cosem_setStructure(data, 4)) != 0 ||
//ClassID
(ret = cosem_setUInt16(data, DLMS_OBJECT_TYPE_ASSOCIATION_LOGICAL_NAME)) != 0 ||
//Version
(ret = cosem_setUInt8(data, object->base.version)) != 0 ||
//LN.
(ret = cosem_setOctetString2(data, ln, 6)) != 0)
{
return ret;
}
//Access rights.
ret = getLNAccessRights(settings, &object->base, data);
if (ret != 0)
{
return ret;
}
}
}
uint16_t pos2 = 0;
for (pos = 0; pos != object->objectList.size; ++pos)
{
ret = oa_getByIndex(&object->objectList, pos, &it);
if (ret != 0)
{
return ret;
}
//Remove objects that are only for internal use.
if ((ret = oa_findByLN(&settings->internalObjects, it->objectType, it->logicalName, &it2)) != 0)
{
break;
}
//If this is not ignored.
if (it2 == NULL)
{
if (it->objectType == DLMS_OBJECT_TYPE_ASSOCIATION_LOGICAL_NAME)
{
if (!(it == e->target || memcmp(ln, it->logicalName, 6) == 0))
{
continue;
}
}
if (!(pos2 < (uint16_t)e->transactionStartIndex))
{
pduSize = (uint16_t)data->size;
//Count
if ((ret = cosem_setStructure(data, 4)) != 0 ||
//ClassID
(ret = cosem_setUInt16(data, it->objectType)) != 0 ||
//Version
(ret = cosem_setUInt8(data, (unsigned char)it->version)) != 0 ||
//LN.
(ret = cosem_setOctetString2(data, it->logicalName, 6)) != 0)
{
break;
}
//Access rights.
ret = getLNAccessRights(settings, it, data);
if (ret != 0)
{
break;
}
if (settings->server)
{
//If PDU is full.
if (!e->skipMaxPduSize && dlms_isPduFull(settings, data, NULL))
{
ret = DLMS_ERROR_CODE_OUTOFMEMORY;
break;
}
}
++e->transactionStartIndex;
}
++pos2;
}
}
if (ret == DLMS_ERROR_CODE_OUTOFMEMORY)
{
data->size = pduSize;
ret = 0;
}
else if (pos == object->objectList.size)
{
//If all objects fit to one PDU.
e->transactionEndIndex = e->transactionStartIndex = 0;
}
return ret;
}
#endif //DLMS_IGNORE_ASSOCIATION_LOGICAL_NAME
#endif //DLMS_IGNORE_SERVER
#ifndef DLMS_IGNORE_ASSOCIATION_LOGICAL_NAME
/*
* Returns User list.
*/
int getUserList(
dlmsSettings* settings,
gxValueEventArg* e,
gxByteBuffer* data)
{
unsigned char len;
uint16_t pos = 0;
int ret;
#ifndef DLMS_IGNORE_MALLOC
gxKey2* it;
#else
gxUser* it;
#endif //DLMS_IGNORE_MALLOC
unsigned id;
char* name;
gxAssociationLogicalName* target = (gxAssociationLogicalName*)e->target;
// Add count only for first time.
if (e->transactionStartIndex == 0)
{
e->transactionEndIndex = target->userList.size;
if ((ret = cosem_setArray(data, target->userList.size)) != 0)
{
return ret;
}
}
for (pos = (uint16_t)e->transactionStartIndex; pos < target->userList.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&target->userList, pos, (void**)&it)) != 0)
{
break;
}
id = it->key;
name = it->value;
len = (unsigned char)strlen(name);
#else
if ((ret = arr_getByIndex(&target->userList, pos, (void**)&it, sizeof(gxUser))) != 0)
{
break;
}
id = it->id;
name = it->name;
len = (unsigned char)strlen(it->name);
#endif //DLMS_IGNORE_MALLOC
// Count
if ((ret = cosem_setStructure(data, 2)) != 0 ||
// Id
(ret = cosem_setUInt8(data, (unsigned char)id)) != 0 ||
// Name
(ret = cosem_setOctetString2(data, (unsigned char*)name, len)) != 0)
{
return ret;
}
++e->transactionStartIndex;
}
return 0;
}
int cosem_getAssociationLogicalName(
dlmsSettings* settings,
gxValueEventArg* e)
{
int ret = 0;
gxAssociationLogicalName* object = ((gxAssociationLogicalName*)e->target);
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
#ifndef DLMS_IGNORE_SERVER
ret = getLNObjects(settings, e, data);
#endif //DLMS_IGNORE_SERVER
}
else if (e->index == 3)
{
//Add count
if ((ret = cosem_setStructure(data, 2)) != 0 ||
(ret = cosem_setInt8(data, object->clientSAP)) != 0 ||
(ret = cosem_setUInt16(data, object->serverSAP)) != 0)
{
}
}
else if (e->index == 4)
{
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
//Add count
(ret = bb_setUInt8(data, 0x7)) != 0 ||
(ret = bb_setUInt8(data, 0x60)) != 0 ||
(ret = bb_setUInt8(data, 0x85)) != 0 ||
(ret = bb_setUInt8(data, 0x74)) != 0 ||
//Add data.
(ret = bb_setUInt8(data, object->applicationContextName.identifiedOrganization)) != 0 ||
(ret = bb_setUInt8(data, object->applicationContextName.dlmsUA)) != 0 ||
(ret = bb_setUInt8(data, object->applicationContextName.applicationContext)) != 0 ||
(ret = bb_setUInt8(data, object->applicationContextName.contextId)) != 0)
{
}
}
else if (e->index == 5)
{
unsigned char buff[4];
gxByteBuffer tmp;
bb_attach(&tmp, buff, 0, sizeof(buff));
//Add count
if ((ret = cosem_setStructure(data, 6)) != 0 ||
//Add data.
(ret = cosem_setBitString(data, object->xDLMSContextInfo.conformance, 24)) != 0 ||
(ret = cosem_setUInt16(data, object->xDLMSContextInfo.maxReceivePduSize)) != 0 ||
(ret = cosem_setUInt16(data, object->xDLMSContextInfo.maxSendPduSize)) != 0 ||
(ret = cosem_setUInt8(data, object->xDLMSContextInfo.dlmsVersionNumber)) != 0 ||
(ret = cosem_setInt8(data, object->xDLMSContextInfo.qualityOfService)) != 0 ||
(ret = cosem_setOctetString(data, &object->xDLMSContextInfo.cypheringInfo)) != 0)
{
}
}
else if (e->index == 6)
{
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
//Add count
(ret = bb_setUInt8(data, 0x7)) != 0 ||
//Add data.
(ret = bb_setUInt8(data, 0x60)) != 0 ||
(ret = bb_setUInt8(data, 0x85)) != 0 ||
(ret = bb_setUInt8(data, 0x74)) != 0 ||
(ret = bb_setUInt8(data, object->authenticationMechanismName.identifiedOrganization)) != 0 ||
(ret = bb_setUInt8(data, object->authenticationMechanismName.dlmsUA)) != 0 ||
(ret = bb_setUInt8(data, object->authenticationMechanismName.authenticationMechanismName)) != 0 ||
(ret = bb_setUInt8(data, (unsigned char)object->authenticationMechanismName.mechanismId)) != 0)
{
return ret;
}
}
else if (e->index == 7)
{
ret = cosem_setOctetString(e->value.byteArr, &object->secret);
}
else if (e->index == 8)
{
ret = cosem_setEnum(e->value.byteArr, object->associationStatus);
}
else if (e->index == 9)
{
#if !(defined(DLMS_IGNORE_OBJECT_POINTERS) || defined(DLMS_IGNORE_SECURITY_SETUP))
ret = cosem_setOctetString2(e->value.byteArr, obj_getLogicalName((gxObject*)object->securitySetup), 6);
#else
ret = cosem_setOctetString2(e->value.byteArr, object->securitySetupReference, 6);
#endif //DLMS_IGNORE_OBJECT_POINTERS
}
else if (e->index == 10)
{
ret = getUserList(settings, e, e->value.byteArr);
}
else if (e->index == 11)
{
// Add structure size.
if ((ret = cosem_setStructure(data, 2)) != 0)
{
return ret;
}
#ifdef DLMS_IGNORE_MALLOC
char* str = (char*)object->currentUser.name;
unsigned char len = (unsigned char)strlen(str);
if ((ret = cosem_setUInt8(data, object->currentUser.id)) != 0 ||
(ret = cosem_setOctetString2(data, (unsigned char*)str, len)) != 0)
{
return ret;
}
#else
if (object->currentUser.value == NULL)
{
if ((ret = cosem_setUInt8(data, 0)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRING)) != 0 ||
(ret = bb_setUInt8(data, 0)) != 0)
{
return ret;
}
}
else
{
char* str = (char*)object->currentUser.value;
unsigned char len = (unsigned char)strlen(str);
if ((ret = cosem_setUInt8(data, object->currentUser.key)) != 0 ||
(ret = cosem_setOctetString2(data, (unsigned char*)str, len)) != 0)
{
return ret;
}
}
#endif //DLMS_IGNORE_MALLOC
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_ASSOCIATION_LOGICAL_NAME
#ifndef DLMS_IGNORE_ASSOCIATION_SHORT_NAME
// Returns SN Association View.
int getSNObjects(
dlmsSettings* settings,
gxValueEventArg* e,
gxByteBuffer* ba)
{
uint16_t pduSize = 0;
objectArray* list = &((gxAssociationShortName*)e->target)->objectList;
uint16_t pos;
int ret = DLMS_ERROR_CODE_OK;
gxObject* it;
if ((ret = bb_capacity(ba, settings->maxPduSize)) != 0)
{
return ret;
}
//Add count only for first time.
if (!e->transaction)
{
e->transactionEndIndex = list->size;
//Add count
if ((ret = cosem_setArray(ba, list->size)) != 0)
{
return ret;
}
}
for (pos = (uint16_t)e->transactionStartIndex; pos != list->size; ++pos)
{
pduSize = (uint16_t)ba->size;
if ((ret = oa_getByIndex(list, pos, &it)) != 0 ||
//Count
(ret = cosem_setStructure(ba, 4)) != 0 ||
//Base address.
(ret = cosem_setInt16(ba, it->shortName)) != 0 ||
//ClassID.
(ret = cosem_setUInt16(ba, it->objectType)) != 0 ||
//Version.
(ret = cosem_setUInt8(ba, (unsigned char)it->version)) != 0 ||
//LN.
(ret = cosem_setOctetString2(ba, it->logicalName, 6)) != 0)
{
break;
}
if (settings->server)
{
//If PDU is full.
if (dlms_isPduFull(settings, ba, NULL))
{
ret = DLMS_ERROR_CODE_OUTOFMEMORY;
break;
}
}
++e->transactionStartIndex;
}
if (ret == DLMS_ERROR_CODE_OUTOFMEMORY)
{
ba->size = pduSize;
ret = 0;
}
return ret;
}
#ifndef DLMS_IGNORE_SERVER
int getSNAccessRights(
dlmsSettings* settings,
gxObject* object,
gxByteBuffer* ba)
{
int ret;
unsigned char ch, pos, cnt;
cnt = obj_attributeCount(object);
if ((ret = cosem_setStructure(ba, 3)) != 0 ||
//Add SN.
(ret = cosem_setUInt16(ba, object->shortName)) != 0 ||
//Add attribute access modes.
(ret = cosem_setArray(ba, cnt)) != 0)
{
return ret;
}
for (pos = 1; pos != cnt + 1; ++pos)
{
ch = (unsigned char)svr_getAttributeAccess(settings, object, pos);
if ((ret = cosem_setStructure(ba, 3)) != 0 ||
//Add index.
(ret = cosem_setInt8(ba, pos)) != 0 ||
//Add access.
(ret = cosem_setEnum(ba, ch)) != 0 ||
//Add None.
(ret = bb_setUInt8(ba, DLMS_DATA_TYPE_NONE)) != 0)
{
return ret;
}
}
//Add mthod access modes.
cnt = obj_methodCount(object);
if ((ret = cosem_setArray(ba, cnt)) == 0)
{
for (pos = 1; pos != cnt + 1; ++pos)
{
ch = (unsigned char)svr_getMethodAccess(settings, object, pos);
if ((ret = cosem_setStructure(ba, 3)) != 0 ||
//Add index.
(ret = cosem_setInt8(ba, pos)) != 0 ||
//Add access.
(ret = cosem_setEnum(ba, ch)) != 0)
{
return ret;
}
}
}
return ret;
}
int cosem_getAssociationShortName(
dlmsSettings* settings,
gxValueEventArg* e)
{
int ret = DLMS_ERROR_CODE_OK;
uint16_t pos;
gxObject* it;
gxAssociationShortName* object = (gxAssociationShortName*)e->target;
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
ret = getSNObjects(settings, e, data);
}
else if (e->index == 3)
{
if ((ret = cosem_setArray(data, object->objectList.size)) == 0)
{
for (pos = 0; pos != object->objectList.size; ++pos)
{
if ((ret = oa_getByIndex(&object->objectList, pos, &it)) != 0 ||
(ret = getSNAccessRights(settings, it, data)) != 0)
{
break;
}
}
}
}
else if (e->index == 4)
{
#if !(defined(DLMS_IGNORE_OBJECT_POINTERS) || defined(DLMS_IGNORE_SECURITY_SETUP))
ret = cosem_setOctetString2(e->value.byteArr, obj_getLogicalName((gxObject*)object->securitySetup), 6);
#else
ret = cosem_setOctetString2(e->value.byteArr, object->securitySetupReference, 6);
#endif //!(defined(DLMS_IGNORE_OBJECT_POINTERS) || defined(DLMS_IGNORE_SECURITY_SETUP))
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_SERVER
#endif //DLMS_IGNORE_ASSOCIATION_SHORT_NAME
#ifndef DLMS_IGNORE_AUTO_ANSWER
int cosem_getAutoAnswer(
gxValueEventArg* e)
{
int ret = 0;
uint16_t pos;
gxAutoAnswer* object = (gxAutoAnswer*)e->target;
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
ret = cosem_setEnum(data, object->mode);
}
else if (e->index == 3)
{
#ifndef DLMS_IGNORE_MALLOC
gxKey* kv;
#else
gxTimePair* kv;
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setArray(data, object->listeningWindow.size)) == 0)
{
for (pos = 0; pos != object->listeningWindow.size; ++pos)
{
if ((ret = cosem_setStructure(data, 2)) != 0)
{
break;
}
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->listeningWindow, pos, (void**)&kv)) != 0 ||
(ret = cosem_setDateTimeAsOctetString(data, (gxtime*)kv->key)) != 0 ||
(ret = cosem_setDateTimeAsOctetString(data, (gxtime*)kv->value)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->listeningWindow, pos, (void**)&kv, sizeof(gxTimePair))) != 0 ||
//start_time
(ret = cosem_setDateTimeAsOctetString(data, &kv->first)) != 0 ||
//end_time
(ret = cosem_setDateTimeAsOctetString(data, &kv->second)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
}
else if (e->index == 4)
{
ret = cosem_setEnum(data, object->status);
}
else if (e->index == 5)
{
ret = cosem_setUInt8(data, object->numberOfCalls);
}
else if (e->index == 6)
{
if ((ret = cosem_setStructure(data, 2)) != 0 ||
(ret = cosem_setUInt8(data, object->numberOfRingsInListeningWindow)) != 0 ||
(ret = cosem_setUInt8(data, object->numberOfRingsOutListeningWindow)) != 0)
{
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_AUTO_ANSWER
#ifndef DLMS_IGNORE_AUTO_CONNECT
int cosem_getAutoConnect(
gxValueEventArg* e)
{
int ret = DLMS_ERROR_CODE_OK;
uint16_t pos;
#ifndef DLMS_IGNORE_MALLOC
gxKey* k;
gxByteBuffer* it;
#else
gxTimePair* k;
gxDestination* it;
#endif //DLMS_IGNORE_MALLOC
gxAutoConnect* object = (gxAutoConnect*)e->target;
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
ret = cosem_setEnum(data, object->mode);
}
else if (e->index == 3)
{
ret = cosem_setUInt8(data, object->repetitions);
}
else if (e->index == 4)
{
ret = cosem_setUInt16(data, object->repetitionDelay);
}
else if (e->index == 5)
{
//Add count
if ((ret = cosem_setArray(data, object->callingWindow.size)) != 0)
{
return ret;
}
for (pos = 0; pos != object->callingWindow.size; ++pos)
{
if ((ret = cosem_setStructure(data, 2)) != 0)
{
break;
}
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->callingWindow, pos, (void**)&k)) != 0 ||
(ret = cosem_setDateTimeAsOctetString(data, (gxtime*)k->key)) != 0 ||
(ret = cosem_setDateTimeAsOctetString(data, (gxtime*)k->value)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->callingWindow, pos, (void**)&k, sizeof(gxTimePair))) != 0)
{
break;
}
if ((ret = cosem_setDateTimeAsOctetString(data, &k->first)) != 0 ||
(ret = cosem_setDateTimeAsOctetString(data, &k->second)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
else if (e->index == 6)
{
//Add count
if ((ret = cosem_setArray(data, object->destinations.size)) != 0)
{
return ret;
}
for (pos = 0; pos != object->destinations.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->destinations, pos, (void**)&it)) != 0 ||
(ret = cosem_setOctetString(data, it)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->destinations, pos, (void**)&it, sizeof(gxDestination))) != 0 ||
(ret = cosem_setOctetString2(data, it->value, it->size)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_AUTO_CONNECT
#ifndef DLMS_IGNORE_DEMAND_REGISTER
int cosem_getDemandRegister(
gxValueEventArg* e)
{
int ret;
gxByteBuffer* data = e->value.byteArr;
gxDemandRegister* object = (gxDemandRegister*)e->target;
switch (e->index)
{
case 2:
//Return plain value if request is coming from action.
if (e->action)
{
ret = var_copy(&e->value, &object->currentAverageValue);
}
else
{
ret = cosem_setVariant(data, &object->currentAverageValue);
}
break;
case 3:
//Return plain value if request is coming from action.
if (e->action)
{
ret = var_copy(&e->value, &object->lastAverageValue);
}
else
{
ret = cosem_setVariant(data, &object->lastAverageValue);
}
break;
case 4:
if ((ret = cosem_setStructure(data, 2)) != 0 ||
(ret = cosem_setInt8(data, object->scaler)) != 0 ||
(ret = cosem_setEnum(data, object->unit)) != 0)
{
}
break;
case 5:
//Return plain value if request is coming from action.
if (e->action)
{
ret = var_copy(&e->value, &object->status);
}
else
{
ret = cosem_setVariant(data, &object->status);
}
break;
case 6:
ret = cosem_setDateTimeAsOctetString(data, &object->captureTime);
break;
case 7:
ret = cosem_setDateTimeAsOctetString(data, &object->startTimeCurrent);
break;
case 8:
ret = cosem_setUInt32(data, object->period);
break;
case 9:
ret = cosem_setUInt16(data, object->numberOfPeriods);
break;
default:
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
}
return ret;
}
#endif //DLMS_IGNORE_DEMAND_REGISTER
#ifndef DLMS_IGNORE_MAC_ADDRESS_SETUP
int cosem_getMacAddressSetup(
gxValueEventArg* e)
{
int ret = 0;
if (e->index == 2)
{
gxMacAddressSetup* object = (gxMacAddressSetup*)e->target;
ret = cosem_setOctetString(e->value.byteArr, &object->macAddress);
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_MAC_ADDRESS_SETUP
#ifndef DLMS_IGNORE_EXTENDED_REGISTER
int cosem_getExtendedRegister(
gxValueEventArg* e)
{
int ret = DLMS_ERROR_CODE_OK;
gxExtendedRegister* object = (gxExtendedRegister*)e->target;
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
//Return plain value if request is coming from action.
if (e->action)
{
ret = var_copy(&e->value, &object->value);
}
else
{
ret = cosem_setVariant(data, &object->value);
}
}
else if (e->index == 3)
{
if ((ret = cosem_setStructure(data, 2)) != 0 ||
(ret = cosem_setInt8(data, object->scaler)) != 0 ||
(ret = cosem_setUInt8(data, object->unit)) != 0)
{
return ret;
}
}
else if (e->index == 4)
{
//Return plain value if request is coming from action.
if (e->action)
{
ret = var_copy(&e->value, &object->status);
}
else
{
ret = cosem_setVariant(data, &object->status);
}
}
else if (e->index == 5)
{
ret = cosem_setDateTimeAsOctetString(data, &object->captureTime);
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_EXTENDED_REGISTER
#ifndef DLMS_IGNORE_GPRS_SETUP
int cosem_getQualityOfService(gxQualityOfService* service, gxByteBuffer* ba)
{
int ret;
if ((ret = cosem_setStructure(ba, 5)) != 0 ||
//Precedence
(ret = cosem_setUInt8(ba, service->precedence)) != 0 ||
//Delay
(ret = cosem_setUInt8(ba, service->delay)) != 0 ||
//Reliability
(ret = cosem_setUInt8(ba, service->reliability)) != 0 ||
//PeakThroughput
(ret = cosem_setUInt8(ba, service->peakThroughput)) != 0 ||
//MeanThroughput
(ret = cosem_setUInt8(ba, service->meanThroughput)) != 0)
{
}
return ret;
}
int cosem_getGprsSetup(
gxValueEventArg* e)
{
int ret;
gxGPRSSetup* object = (gxGPRSSetup*)e->target;
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
ret = cosem_setOctetString(data, &object->apn);
}
else if (e->index == 3)
{
ret = cosem_setUInt16(data, object->pinCode);
}
else if (e->index == 4)
{
if ((ret = cosem_setStructure(data, 2)) != 0 ||
(ret = cosem_getQualityOfService(&object->defaultQualityOfService, data)) != 0 ||
(ret = cosem_getQualityOfService(&object->requestedQualityOfService, data)) != 0)
{
return ret;
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_GPRS_SETUP
#ifndef DLMS_IGNORE_SECURITY_SETUP
int cosem_getSecuritySetup(
gxValueEventArg* e)
{
int ret;
gxSecuritySetup* object = (gxSecuritySetup*)e->target;
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
ret = cosem_setEnum(data, object->securityPolicy);
}
else if (e->index == 3)
{
ret = cosem_setEnum(data, object->securitySuite);
}
else if (e->index == 4)
{
ret = cosem_setOctetString(data, &object->clientSystemTitle);
}
else if (e->index == 5)
{
ret = cosem_setOctetString(data, &object->serverSystemTitle);
}
else if (e->index == 6)
{
gxCertificateInfo* it;
uint16_t pos, len;
if ((ret = cosem_setArray(data, object->certificates.size)) == 0)
{
for (pos = 0; pos != object->certificates.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->certificates, pos, (void**)&it, sizeof(gxCertificateInfo))) != 0 ||
#else
if ((ret = arr_getByIndex(&object->certificates, pos, (void**)&it)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = cosem_setStructure(data, 6)) != 0 ||
(ret = cosem_setEnum(data, it->entity)) != 0 ||
(ret = cosem_setEnum(data, it->type)) != 0)
{
break;
}
len = (uint16_t)strlen(it->serialNumber);
if ((ret = cosem_setOctetString2(data, (unsigned char*)it->serialNumber, len)) != 0)
{
break;
}
len = (uint16_t)strlen(it->issuer);
if ((ret = cosem_setOctetString2(data, (unsigned char*)it->issuer, len)) != 0)
{
break;
}
len = (uint16_t)strlen(it->subject);
if ((ret = cosem_setOctetString2(data, (unsigned char*)it->subject, len)) != 0)
{
break;
}
len = (uint16_t)strlen(it->subjectAltName);
if ((ret = cosem_setOctetString2(data, (unsigned char*)it->subjectAltName, len)) != 0)
{
break;
}
}
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_SECURITY_SETUP
#ifndef DLMS_IGNORE_IEC_HDLC_SETUP
int cosem_getIecHdlcSetup(
gxValueEventArg* e)
{
int ret;
gxIecHdlcSetup* object = (gxIecHdlcSetup*)e->target;
switch (e->index)
{
case 2:
ret = cosem_setEnum(e->value.byteArr, object->communicationSpeed);
break;
case 3:
ret = cosem_setUInt8(e->value.byteArr, object->windowSizeTransmit);
break;
case 4:
ret = cosem_setUInt8(e->value.byteArr, object->windowSizeReceive);
break;
case 5:
ret = cosem_setUInt16(e->value.byteArr, object->maximumInfoLengthTransmit);
break;
case 6:
ret = cosem_setUInt16(e->value.byteArr, object->maximumInfoLengthReceive);
break;
case 7:
ret = cosem_setUInt16(e->value.byteArr, object->interCharachterTimeout);
break;
case 8:
ret = cosem_setUInt16(e->value.byteArr, object->inactivityTimeout);
break;
case 9:
ret = cosem_setUInt16(e->value.byteArr, object->deviceAddress);
break;
default:
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
}
return ret;
}
#endif //DLMS_IGNORE_IEC_HDLC_SETUP
#ifndef DLMS_IGNORE_IEC_LOCAL_PORT_SETUP
int cosem_getIecLocalPortSetup(
gxValueEventArg* e)
{
int ret;
gxLocalPortSetup* object = (gxLocalPortSetup*)e->target;
if (e->index == 2)
{
ret = cosem_setEnum(e->value.byteArr, object->defaultMode);
}
else if (e->index == 3)
{
ret = cosem_setEnum(e->value.byteArr, object->defaultBaudrate);
}
else if (e->index == 4)
{
ret = cosem_setEnum(e->value.byteArr, object->proposedBaudrate);
}
else if (e->index == 5)
{
ret = cosem_setEnum(e->value.byteArr, object->responseTime);
}
else if (e->index == 6)
{
ret = cosem_setOctetString(e->value.byteArr, &object->deviceAddress);
}
else if (e->index == 7)
{
ret = cosem_setOctetString(e->value.byteArr, &object->password1);
}
else if (e->index == 8)
{
ret = cosem_setOctetString(e->value.byteArr, &object->password2);
}
else if (e->index == 9)
{
ret = cosem_setOctetString(e->value.byteArr, &object->password5);
}
else
{
return DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif // DLMS_IGNORE_IEC_LOCAL_PORT_SETUP
#ifndef DLMS_IGNORE_IEC_TWISTED_PAIR_SETUP
int cosem_getIecTwistedPairSetup(
gxValueEventArg* e)
{
unsigned char ch;
int pos, ret = 0;
gxIecTwistedPairSetup* object = (gxIecTwistedPairSetup*)e->target;
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
ret = cosem_setEnum(e->value.byteArr, object->mode);
}
else if (e->index == 3)
{
ret = cosem_setEnum(e->value.byteArr, object->speed);
}
else if (e->index == 4)
{
if ((ret = cosem_setArray(data, (unsigned short)object->primaryAddresses.size)) == 0)
{
for (pos = 0; pos != object->primaryAddresses.size; ++pos)
{
if ((ret = bb_getUInt8ByIndex(&object->primaryAddresses, pos, &ch)) != 0 ||
(ret = cosem_setUInt8(data, ch)) != 0)
{
break;
}
}
}
}
else if (e->index == 5)
{
if ((ret = cosem_setArray(data, (unsigned short)object->tabis.size)) == 0)
{
for (pos = 0; pos != object->tabis.size; ++pos)
{
if ((ret = bb_getUInt8ByIndex(&object->tabis, pos, &ch)) != 0 ||
(ret = cosem_setInt8(data, (char)ch)) != 0)
{
break;
}
}
}
}
else
{
return DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_IEC_TWISTED_PAIR_SETUP
#ifndef DLMS_IGNORE_IP4_SETUP
int cosem_getIP4Setup(
gxValueEventArg* e)
{
int ret = 0;
uint16_t pos;
#if !defined(DLMS_IGNORE_MALLOC) && !defined(DLMS_COSEM_EXACT_DATA_TYPES)
dlmsVARIANT* tmp;
#endif //!defined(DLMS_IGNORE_MALLOC) && !defined(DLMS_COSEM_EXACT_DATA_TYPES)
gxip4SetupIpOption* it;
gxIp4Setup* object = (gxIp4Setup*)e->target;
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
#ifndef DLMS_IGNORE_OBJECT_POINTERS
if (object->dataLinkLayer == NULL)
{
ret = cosem_setOctetString2(data, EMPTY_LN, 6);
}
else
{
ret = cosem_setOctetString2(data, object->dataLinkLayer->logicalName, 6);
//Error code is returned at the end of the function.
}
#else
ret = cosem_setOctetString2(e->value.byteArr, object->dataLinkLayerReference, 6);
{
//Error code is returned at the end of the function.
}
#endif //DLMS_IGNORE_OBJECT_POINTERS
}
else if (e->index == 3)
{
ret = cosem_setUInt32(data, object->ipAddress);
}
else if (e->index == 4)
{
if ((ret = cosem_setArray(data, object->multicastIPAddress.size)) == 0)
{
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
uint32_t* v;
for (pos = 0; pos != object->multicastIPAddress.size; ++pos)
{
if ((ret = arr_getByIndex2(&object->multicastIPAddress, pos, (void**)&v, sizeof(uint32_t))) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT32)) != 0 ||
(ret = bb_setUInt32(data, *v)) != 0)
{
break;
}
}
#else
for (pos = 0; pos != object->multicastIPAddress.size; ++pos)
{
if ((ret = va_getByIndex(&object->multicastIPAddress, pos, &tmp)) != 0 ||
(ret = var_getBytes(tmp, data)) != 0)
{
break;
}
}
#endif //DLMS_IGNORE_MALLOC
}
}
else if (e->index == 5)
{
if ((ret = cosem_setArray(data, object->ipOptions.size)) == 0)
{
for (pos = 0; pos != object->ipOptions.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->ipOptions, pos, (void**)&it, sizeof(gxip4SetupIpOption))) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 3)) != 0 ||
//Type
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT8)) != 0 ||
(ret = bb_setUInt8(data, it->type)) != 0 ||
//Len
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT8)) != 0 ||
(ret = bb_setUInt8(data, (unsigned char)it->length)) != 0 ||
//Data
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = bb_setUInt8(data, (unsigned char)it->data.size)) != 0 ||
(ret = bb_set(data, it->data.value, it->data.size)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->ipOptions, pos, (void**)&it)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 3)) != 0 ||
//Type
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT8)) != 0 ||
(ret = bb_setUInt8(data, it->type)) != 0 ||
//Len
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT8)) != 0 ||
(ret = bb_setUInt8(data, (unsigned char)it->length)) != 0 ||
//Data
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = bb_setUInt8(data, (unsigned char)bb_size(&it->data))) != 0 ||
(ret = bb_set2(data, &it->data, 0, bb_size(&it->data))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
}
else if (e->index == 6)
{
ret = cosem_setUInt32(e->value.byteArr, object->subnetMask);
}
else if (e->index == 7)
{
ret = cosem_setUInt32(e->value.byteArr, object->gatewayIPAddress);
}
else if (e->index == 8)
{
ret = cosem_setBoolean(e->value.byteArr, object->useDHCP);
}
else if (e->index == 9)
{
ret = cosem_setUInt32(e->value.byteArr, object->primaryDNSAddress);
}
else if (e->index == 10)
{
ret = cosem_setUInt32(e->value.byteArr, object->secondaryDNSAddress);
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_IP4_SETUP
#ifndef DLMS_IGNORE_IP6_SETUP
int getIpv6Address(IN6_ADDR* address, gxValueEventArg* e)
{
unsigned char* tmp;
#if defined(_WIN32) || defined(_WIN64)//Windows includes
tmp = address->u.Byte;
#else //Linux includes.
tmp = address->s6_addr;
#endif
return cosem_setOctetString2(e->value.byteArr, tmp, 16);
}
int getAddressList(gxArray* list, gxValueEventArg* e)
{
IN6_ADDR* it;
int ret = 0;
uint16_t pos;
if ((ret = cosem_setArray(e->value.byteArr, list->size)) == 0)
{
for (pos = 0; pos != list->size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(list, pos, (void**)&it, sizeof(IN6_ADDR))) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(list, pos, (void**)&it)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = getIpv6Address(it, e)) != 0)
{
break;
}
}
}
return ret;
}
int cosem_getIP6Setup(
gxValueEventArg* e)
{
int ret = 0;
gxIp6Setup* object = (gxIp6Setup*)e->target;
switch (e->index)
{
case 2:
{
#ifndef DLMS_IGNORE_OBJECT_POINTERS
if (object->dataLinkLayer == NULL)
{
ret = cosem_setOctetString2(e->value.byteArr, EMPTY_LN, 6);
}
else
{
ret = cosem_setOctetString2(e->value.byteArr, object->dataLinkLayer->logicalName, 6);
//Error code is returned at the end of the function.
}
#else
ret = cosem_setOctetString2(e->value.byteArr, object->dataLinkLayerReference, 6);
{
//Error code is returned at the end of the function.
}
#endif //DLMS_IGNORE_OBJECT_POINTERS
}
break;
case 3:
ret = cosem_setEnum(e->value.byteArr, object->addressConfigMode);
break;
case 4:
ret = getAddressList(&object->unicastIPAddress, e);
break;
case 5:
ret = getAddressList(&object->multicastIPAddress, e);
break;
case 6:
ret = getAddressList(&object->gatewayIPAddress, e);
break;
case 7:
ret = getIpv6Address(&object->primaryDNSAddress, e);
break;
case 8:
ret = getIpv6Address(&object->secondaryDNSAddress, e);
break;
case 9:
ret = cosem_setUInt8(e->value.byteArr, object->trafficClass);
break;
case 10:
{
gxNeighborDiscoverySetup* it;
uint16_t pos;
if ((ret = cosem_setArray(e->value.byteArr, object->neighborDiscoverySetup.size)) == 0)
{
for (pos = 0; pos != object->neighborDiscoverySetup.size; ++pos)
{
if ((ret = arr_getByIndex2(&object->neighborDiscoverySetup, pos, (void**)&it, sizeof(gxNeighborDiscoverySetup))) != 0)
{
break;
}
if ((ret = cosem_setStructure(e->value.byteArr, 3)) != 0 ||
(ret = cosem_setUInt8(e->value.byteArr, it->maxRetry)) != 0 ||
(ret = cosem_setUInt16(e->value.byteArr, it->retryWaitTime)) != 0 ||
(ret = cosem_setUInt32(e->value.byteArr, it->sendPeriod)) != 0)
{
break;
}
}
}
}
break;
default:
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
}
return ret;
}
#endif //DLMS_IGNORE_IP6_SETUP
#ifndef DLMS_IGNORE_MBUS_SLAVE_PORT_SETUP
int cosem_getMbusSlavePortSetup(
gxValueEventArg* e)
{
int ret;
gxMbusSlavePortSetup* object = (gxMbusSlavePortSetup*)e->target;
if (e->index == 2)
{
ret = cosem_setEnum(e->value.byteArr, object->defaultBaud);
}
else if (e->index == 3)
{
ret = cosem_setEnum(e->value.byteArr, object->availableBaud);
}
else if (e->index == 4)
{
ret = cosem_setEnum(e->value.byteArr, object->addressState);
}
else if (e->index == 5)
{
ret = cosem_setUInt8(e->value.byteArr, object->busAddress);
}
else
{
return DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_MBUS_SLAVE_PORT_SETUP
#ifndef DLMS_IGNORE_IMAGE_TRANSFER
int cosem_getImageTransfer(
gxValueEventArg* e)
{
int ret = 0;
uint16_t pos;
gxImageActivateInfo* ai;
gxImageTransfer* object = (gxImageTransfer*)e->target;
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
ret = cosem_setUInt32(e->value.byteArr, object->imageBlockSize);
}
else if (e->index == 3)
{
if ((ret = bb_setUInt8(e->value.byteArr, DLMS_DATA_TYPE_BIT_STRING)) != 0 ||
(ret = hlp_setObjectCount(object->imageTransferredBlocksStatus.size, e->value.byteArr)) != 0)
{
return ret;
}
if (object->imageTransferredBlocksStatus.size != 0)
{
ret = bb_set(e->value.byteArr, object->imageTransferredBlocksStatus.data,
ba_getByteCount(object->imageTransferredBlocksStatus.size));
}
}
else if (e->index == 4)
{
ret = cosem_setUInt32(e->value.byteArr, object->imageFirstNotTransferredBlockNumber);
}
else if (e->index == 5)
{
ret = cosem_setBoolean(e->value.byteArr, object->imageTransferEnabled);
}
else if (e->index == 6)
{
ret = cosem_setEnum(e->value.byteArr, object->imageTransferStatus);
}
else if (e->index == 7)
{
//ImageActivateInfo is returned only after verification is succeeded.
if (object->imageTransferStatus != DLMS_IMAGE_TRANSFER_STATUS_VERIFICATION_SUCCESSFUL)
{
if ((ret = cosem_setArray(data, 0)) != 0)
{
return ret;
}
}
else
{
if ((ret = cosem_setArray(data, object->imageActivateInfo.size)) == 0)
{
for (pos = 0; pos != object->imageActivateInfo.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->imageActivateInfo, pos, (void**)&ai, sizeof(gxImageActivateInfo))) != 0 ||
#else
if ((ret = arr_getByIndex(&object->imageActivateInfo, pos, (void**)&ai)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 3)) != 0 ||
//Size
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT32)) != 0 ||
(ret = bb_setUInt32(data, ai->size)) != 0 ||
//Add identification.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = hlp_setObjectCount(ai->identification.size, data)) != 0 ||
(ret = bb_set(data, ai->identification.data, ai->identification.size)) != 0 ||
//Add signature.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = hlp_setObjectCount(ai->signature.size, data)) != 0 ||
(ret = bb_set(data, ai->signature.data, ai->signature.size)) != 0)
{
break;
}
}
}
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_IMAGE_TRANSFER
#if !(defined(DLMS_IGNORE_PROFILE_GENERIC) && defined(DLMS_IGNORE_COMPACT_DATA))
int getColumns(
dlmsSettings* settings,
gxArray* list,
gxByteBuffer* ba,
gxValueEventArg* e)
{
uint16_t pduSize = 0;
int ret = 0;
uint32_t pos;
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
gxTarget* it;
#else
gxKey* it;
if ((ret = bb_capacity(ba, (list->size * 19) + 2)) != 0)
{
return ret;
}
#endif //DLMS_IGNORE_MALLOC
//Add count only for first time.
if (!e->transaction)
{
e->transactionEndIndex = list->size;
if ((ret = cosem_setArray(ba, list->size)) != 0)
{
return ret;
}
}
for (pos = e->transactionStartIndex; pos != list->size; ++pos)
{
pduSize = (uint16_t)ba->size;
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(list, (uint16_t)pos, (void**)&it, sizeof(gxTarget))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
#ifdef DLMS_COSEM_EXACT_DATA_TYPES
if ((ret = arr_getByIndex(list, pos, (void**)&it)) != 0)
{
break;
}
#endif //DLMS_COSEM_EXACT_DATA_TYPES
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
if ((ret = bb_setUInt8(ba, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(ba, 4)) != 0 ||
//ClassID
(ret = bb_setUInt8(ba, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(ba, OBJECT_TYPE)) != 0 ||
//LN
(ret = bb_setUInt8(ba, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = bb_setUInt8(ba, 6)) != 0 ||
#ifdef DLMS_IGNORE_OBJECT_POINTERS
(ret = bb_set(ba, it->logicalName, 6)) != 0 ||
#else
(ret = bb_set(ba, it->target->logicalName, 6)) != 0 ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
//Attribute Index
(ret = bb_setUInt8(ba, DLMS_DATA_TYPE_INT8)) != 0 ||
(ret = bb_setInt8(ba, it->attributeIndex)) != 0 ||
//Data Index
(ret = bb_setUInt8(ba, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(ba, it->dataIndex)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(list, (uint16_t)pos, (void**)&it)) != 0 ||
(ret = bb_setUInt8(ba, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(ba, 4)) != 0 ||
//ClassID
(ret = bb_setUInt8(ba, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(ba, ((gxObject*)it->key)->objectType)) != 0 ||
//LN
(ret = bb_setUInt8(ba, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = bb_setUInt8(ba, 6)) != 0 ||
(ret = bb_set(ba, ((gxObject*)it->key)->logicalName, 6)) != 0 ||
//Attribute Index
(ret = bb_setUInt8(ba, DLMS_DATA_TYPE_INT8)) != 0 ||
(ret = bb_setInt8(ba, ((gxTarget*)it->value)->attributeIndex)) != 0 ||
//Data Index
(ret = bb_setUInt8(ba, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(ba, ((gxTarget*)it->value)->dataIndex)) != 0)
{
break;
}
#endif //defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
if (settings->server)
{
//If PDU is full.
if (dlms_isPduFull(settings, ba, NULL))
{
ret = DLMS_ERROR_CODE_OUTOFMEMORY;
break;
}
}
++e->transactionStartIndex;
}
if (ret == DLMS_ERROR_CODE_OUTOFMEMORY)
{
ba->size = pduSize;
ret = 0;
}
return ret;
}
#endif //!(defined(DLMS_IGNORE_PROFILE_GENERIC) && defined(DLMS_IGNORE_COMPACT_DATA))
#ifndef DLMS_IGNORE_PROFILE_GENERIC
#ifndef DLMS_IGNORE_MALLOC
int cosem_getRow(
gxArray* table,
int index,
gxArray* captureObjects,
gxArray* columns,
gxByteBuffer* data)
{
int ret, pos;
dlmsVARIANT* col;
variantArray* row;
if ((ret = arr_getByIndex(table, (uint16_t)index, (void**)&row)) != 0)
{
return ret;
}
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0)
{
return ret;
}
if (columns->size != 0)
{
if ((ret = hlp_setObjectCount(columns->size, data)) != 0)
{
return ret;
}
}
else
{
if ((ret = hlp_setObjectCount(captureObjects->size, data)) != 0)
{
return ret;
}
}
int colPos = 0;
for (pos = 0; pos != captureObjects->size; ++pos)
{
if (columns->size != 0)
{
if (captureObjects->data[pos] != columns->data[colPos])
{
continue;
}
++colPos;
}
if ((ret = va_getByIndex(row, pos, &col)) != 0)
{
return ret;
}
if (col->vt == DLMS_DATA_TYPE_DATETIME)
{
if ((ret = var_getBytes2(col, DLMS_DATA_TYPE_OCTET_STRING, data)) != 0)
{
return ret;
}
}
else
{
if ((ret = dlms_setData(data, col->vt, col)) != 0)
{
return ret;
}
}
}
return 0;
}
int profileGeneric_getData(
dlmsSettings* settings,
gxValueEventArg* e,
gxArray* table,
gxArray* captureObjects,
gxByteBuffer* data)
{
gxArray columns;
uint16_t pduSize = 0;
int ret = 0, pos;
//Add count only for first time.
if (!e->transaction)
{
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_ARRAY)) != 0)
{
return ret;
}
if (e->transactionEndIndex != 0)
{
if ((ret = hlp_setObjectCount(e->transactionEndIndex - e->transactionStartIndex, data)) != 0)
{
return ret;
}
}
else
{
e->transactionEndIndex = table->size;
if ((ret = hlp_setObjectCount(e->transactionEndIndex, data)) != 0)
{
return ret;
}
}
}
arr_init(&columns);
if (e->selector == 2)
{
if ((ret = cosem_getColumns(captureObjects, e->selector, &e->parameters, &columns)) != 0)
{
return ret;
}
}
for (pos = 0; pos != table->size; ++pos)
{
pduSize = (uint16_t)data->size;
if ((ret = cosem_getRow(table, pos, captureObjects, &columns, data)) != 0)
{
break;
}
//If PDU is full.
if (data->size > (uint16_t)(settings->maxPduSize - PDU_MAX_HEADER_SIZE))
{
ret = DLMS_ERROR_CODE_OUTOFMEMORY;
break;
}
++e->transactionStartIndex;
}
arr_empty(&columns);
if (ret == DLMS_ERROR_CODE_OUTOFMEMORY)
{
data->size = pduSize;
ret = 0;
}
return ret;
}
int getProfileGenericData(
dlmsSettings* settings,
gxProfileGeneric* object,
gxValueEventArg* e,
gxByteBuffer* reply)
{
int ret;
gxArray items;
variantArray* row;
dlmsVARIANT* it;
gxArray captureObjects;
//If all data is read.
if (e->selector == 0 || e->parameters.vt == DLMS_DATA_TYPE_NONE || e->transactionEndIndex != 0)
{
return profileGeneric_getData(settings, e, &object->buffer, &object->captureObjects, reply);
}
arr_init(&captureObjects);
if ((ret = cosem_getColumns(&object->captureObjects, e->selector, &e->parameters, &captureObjects)) == 0)
{
//Do not clear items.
arr_init(&items);
if (e->selector == 1) //Read by range
{
uint16_t cnt = 0;
gxtime start, end;
dlmsVARIANT value;
var_init(&value);
if ((ret = va_getByIndex(e->parameters.Arr, 1, &it)) == 0)
{
if (it->vt == DLMS_DATA_TYPE_UINT32)
{
time_initUnix(&start, it->ulVal);
}
else
{
if ((ret = dlms_changeType(it->byteArr, DLMS_DATA_TYPE_DATETIME, &value)) != 0)
{
arr_empty(&items);
var_clear(&value);
return ret;
}
start = *value.dateTime;
var_clear(&value);
}
if ((ret = va_getByIndex(e->parameters.Arr, 2, &it)) != 0)
{
return ret;
}
if (it->vt == DLMS_DATA_TYPE_UINT32)
{
time_initUnix(&end, it->ulVal);
}
else
{
if ((ret = dlms_changeType(it->byteArr, DLMS_DATA_TYPE_DATETIME, &value)) != 0)
{
arr_empty(&items);
var_clear(&value);
return ret;
}
end = *value.dateTime;
var_clear(&value);
}
gxtime* t;
uint16_t pos;
for (pos = 0; pos != object->buffer.size; ++pos)
{
if ((ret = arr_getByIndex(&object->buffer, pos, (void**)&row)) != 0 ||
(ret = va_getByIndex(row, 0, &it)) != 0)
{
break;
}
t = it->dateTime;
if (time_compare(&start, t) != -1 && time_compare(t, &end) != -1)
{
++cnt;
//If Size of PDU is full.
if (reply->size < settings->maxPduSize)
{
++e->transactionEndIndex;
if ((ret = cosem_getRow(&object->buffer, pos, &captureObjects, &object->captureObjects, reply)) != 0)
{
break;
}
}
else if (e->transactionEndIndex != 0)
{
++e->transactionStartIndex;
//We must loop items throught if count is unknown.
break;
}
}
}
//Update count if items are read first time.
if (ret == 0 && bb_size(e->value.byteArr) == 0)
{
if ((ret = cosem_setArray(e->value.byteArr, cnt)) != 0 ||
(ret = bb_set(e->value.byteArr, reply->data, reply->size)) != 0)
{
return ret;
}
reply->position = reply->size = 0;
if ((ret = bb_set(reply, e->value.byteArr->data, e->value.byteArr->size)) != 0)
{
return ret;
}
}
}
}
else if (e->selector == 2) //Read by entry.
{
if ((ret = va_getByIndex(e->parameters.Arr, 0, &it)) == 0)
{
e->transactionStartIndex = (uint16_t)var_toInteger(it);
if (e->transactionStartIndex == 0)
{
e->transactionStartIndex = 1;
}
if ((ret = va_getByIndex(e->parameters.Arr, 1, &it)) == 0)
{
e->transactionEndIndex = (uint16_t)var_toInteger(it);
if (e->transactionEndIndex == 0)
{
e->transactionEndIndex = object->buffer.size;
}
if (e->transactionStartIndex + e->transactionEndIndex > (uint32_t)(object->buffer.size + 1))
{
e->transactionEndIndex = object->buffer.size;
}
if (e->transactionStartIndex == 0)
{
e->transactionEndIndex = (uint16_t)object->buffer.size;
if ((ret = bb_setUInt8(reply, DLMS_DATA_TYPE_ARRAY)) != 0 ||
(ret = hlp_setObjectCount(e->transactionEndIndex, reply)) != 0)
{
return ret;
}
}
for (; e->transactionStartIndex < e->transactionEndIndex; ++e->transactionStartIndex)
{
if ((ret = arr_getByIndex(&object->buffer, (uint16_t)e->transactionStartIndex, (void**)&row)) != 0 ||
(ret = cosem_getRow(&object->buffer, e->transactionStartIndex, &captureObjects, &object->captureObjects, reply)) != 0)
{
break;
}
}
}
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
}
arr_empty(&captureObjects);
arr_empty(&items);
return ret;
}
#endif //DLMS_IGNORE_MALLOC
int cosem_getProfileGeneric(
dlmsSettings* settings,
gxValueEventArg* e)
{
unsigned char empty[6] = { 0 };
int ret = 0;
gxProfileGeneric* object = (gxProfileGeneric*)e->target;
if (e->index == 2)
{
#ifndef DLMS_IGNORE_MALLOC
ret = getProfileGenericData(settings, object, e, e->value.byteArr);
#else
ret = DLMS_ERROR_CODE_NOT_IMPLEMENTED;
#endif //DLMS_IGNORE_MALLOC
}
else if (e->index == 3)
{
ret = getColumns(settings, &object->captureObjects, e->value.byteArr, e);
}
else if (e->index == 4)
{
ret = cosem_setUInt32(e->value.byteArr, object->capturePeriod);
}
else if (e->index == 5)
{
ret = cosem_setEnum(e->value.byteArr, object->sortMethod);
}
else if (e->index == 6)
{
gxByteBuffer* data = e->value.byteArr;
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 4)) != 0)
{
return ret;
}
if (object->sortObject == NULL)
{
//ClassID
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(data, 0)) != 0 ||
//LN
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = bb_setUInt8(data, 6)) != 0 ||
(ret = bb_set(data, empty, 6)) != 0 ||
//Selected Attribute Index
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_INT8)) != 0 ||
(ret = bb_setUInt8(data, 0)) != 0 ||
//Selected Data Index
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(data, 0)) != 0)
{
return ret;
}
}
else
{
//ClassID
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(data, object->sortObject->objectType)) != 0 ||
//LN
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = bb_setUInt8(data, 6)) != 0 ||
(ret = bb_set(data, object->sortObject->logicalName, 6)) != 0 ||
//Selected Attribute Index
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_INT8)) != 0 ||
(ret = bb_setUInt8(data, object->sortObjectAttributeIndex)) != 0 ||
//Selected Data Index
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(data, object->sortObjectDataIndex)) != 0)
{
return ret;
}
}
}
else if (e->index == 7)
{
ret = cosem_setUInt32(e->value.byteArr, object->entriesInUse);
}
else if (e->index == 8)
{
ret = cosem_setUInt32(e->value.byteArr, object->profileEntries);
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_PROFILE_GENERIC
#ifndef DLMS_IGNORE_DISCONNECT_CONTROL
int cosem_getDisconnectControl(
gxValueEventArg* e)
{
int ret = 0;
gxDisconnectControl* object = (gxDisconnectControl*)e->target;
if (e->index == 2)
{
ret = cosem_setBoolean(e->value.byteArr, object->outputState);
}
else if (e->index == 3)
{
ret = cosem_setEnum(e->value.byteArr, object->controlState);
}
else if (e->index == 4)
{
ret = cosem_setEnum(e->value.byteArr, object->controlMode);
}
else
{
return DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_DISCONNECT_CONTROL
#ifndef DLMS_IGNORE_LIMITER
int cosem_getLimiter(
gxValueEventArg* e)
{
int ret = 0, pos;
gxLimiter* object = (gxLimiter*)e->target;
gxByteBuffer* data = e->value.byteArr;
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
uint16_t* it;
#else
dlmsVARIANT* it;
#endif //defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
if (e->index == 2)
{
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 3)) != 0 ||
//objectType
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT16)) != 0)
{
return ret;
}
if (object->monitoredValue == NULL)
{
if ((ret = bb_setUInt16(data, 0)) != 0 ||
//LN.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = bb_setUInt8(data, 6)) != 0 ||
(ret = bb_set(data, EMPTY_LN, 6)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_INT8)) != 0 ||
(ret = bb_setUInt8(data, 0)) != 0)
{
return ret;
}
}
else
{
if ((ret = bb_setUInt16(data, object->monitoredValue->objectType)) != 0 ||
//LN.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = bb_setUInt8(data, 6)) != 0 ||
(ret = bb_set(data, object->monitoredValue->logicalName, 6)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_INT8)) != 0 ||
(ret = bb_setUInt8(data, object->selectedAttributeIndex)) != 0)
{
return ret;
}
}
}
else if (e->index == 3)
{
ret = cosem_setVariant(e->value.byteArr, &object->thresholdActive);
}
else if (e->index == 4)
{
ret = cosem_setVariant(e->value.byteArr, &object->thresholdNormal);
}
else if (e->index == 5)
{
ret = cosem_setVariant(e->value.byteArr, &object->thresholdEmergency);
}
else if (e->index == 6)
{
ret = cosem_setUInt32(e->value.byteArr, object->minOverThresholdDuration);
}
else if (e->index == 7)
{
ret = cosem_setUInt32(e->value.byteArr, object->minUnderThresholdDuration);
}
else if (e->index == 8)
{
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 3)) != 0 ||
//Id
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(data, object->emergencyProfile.id)) != 0 ||
//Datetime
(ret = cosem_setDateTimeAsOctetString(data, &object->emergencyProfile.activationTime)) != 0 ||
//Duration
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT32)) != 0 ||
(ret = bb_setUInt32(data, object->emergencyProfile.duration)) != 0)
{
//Error code is returned at the end of the function.
}
}
else if (e->index == 9)
{
if ((ret = cosem_setArray(data, object->emergencyProfileGroupIDs.size)) == 0)
{
for (pos = 0; pos != object->emergencyProfileGroupIDs.size; ++pos)
{
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
if ((ret = arr_getByIndex2(&object->emergencyProfileGroupIDs, pos, (void**)&it, sizeof(uint16_t))) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(data, *it)) != 0)
{
break;
}
#else
if ((ret = va_getByIndex(&object->emergencyProfileGroupIDs, pos, &it)) != 0 ||
(ret = var_getBytes(it, data)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
}
else if (e->index == 10)
{
ret = cosem_setBoolean(e->value.byteArr, object->emergencyProfileActive);
}
else if (e->index == 11)
{
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 2)) != 0 ||
//Action over threshold
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 2)) != 0 ||
//LN
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = bb_setUInt8(data, 6)) != 0 ||
#ifndef DLMS_IGNORE_OBJECT_POINTERS
(ret = bb_set(data, obj_getLogicalName((gxObject*)object->actionOverThreshold.script), 6)) != 0 ||
#else
(ret = bb_set(data, object->actionOverThreshold.logicalName, 6)) != 0 ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
//Script selector
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(data, object->actionOverThreshold.scriptSelector)) != 0 ||
//Action under threshold
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 2)) != 0 ||
//LN
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = bb_setUInt8(data, 6)) != 0 ||
#ifndef DLMS_IGNORE_OBJECT_POINTERS
(ret = bb_set(data, obj_getLogicalName((gxObject*)object->actionUnderThreshold.script), 6)) != 0 ||
#else
(ret = bb_set(data, object->actionUnderThreshold.logicalName, 6)) != 0 ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
//Script selector
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(data, object->actionUnderThreshold.scriptSelector)) != 0)
{
//Error code is returned at the end of the function.
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_LIMITER
#ifndef DLMS_IGNORE_MBUS_CLIENT
int cosem_getmMbusClient(
gxValueEventArg* e)
{
int ret = 0;
uint16_t pos;
gxMBusClient* object = (gxMBusClient*)e->target;
gxByteBuffer* data = e->value.byteArr;
#ifdef DLMS_IGNORE_MALLOC
gxCaptureDefinition* it;
#else
gxKey* it;
#endif //DLMS_IGNORE_MALLOC
if (e->index == 2)
{
#ifndef DLMS_IGNORE_OBJECT_POINTERS
if (object->mBusPort == NULL)
{
ret = cosem_setOctetString2(e->value.byteArr, EMPTY_LN, 6);
}
else
{
ret = cosem_setOctetString2(e->value.byteArr, object->mBusPort->logicalName, 6);
}
#else
ret = cosem_setOctetString2(e->value.byteArr, object->mBusPortReference, 6);
#endif //DLMS_IGNORE_OBJECT_POINTERS
}
else if (e->index == 3)
{
if ((ret = cosem_setArray(data, object->captureDefinition.size)) == 0)
{
for (pos = 0; pos != object->captureDefinition.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->captureDefinition, pos, (void**)&it, sizeof(gxCaptureDefinition))) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 2)) != 0 ||
//
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = hlp_setObjectCount(it->data.size, data)) != 0 ||
(ret = bb_set(data, it->data.value, it->data.size)) != 0 ||
//
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = hlp_setObjectCount(it->value.size, data)) != 0 ||
(ret = bb_set(data, it->value.value, it->value.size)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->captureDefinition, pos, (void**)&it)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 2)) != 0 ||
//
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = hlp_setObjectCount(((gxByteBuffer*)it->key)->size, data)) != 0 ||
(ret = bb_set2(data, (gxByteBuffer*)it->key, 0, bb_size((gxByteBuffer*)it->key))) != 0 ||
//
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = hlp_setObjectCount(((gxByteBuffer*)it->value)->size, data)) != 0 ||
(ret = bb_set2(data, (gxByteBuffer*)it->value, 0, bb_size((gxByteBuffer*)it->value))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
}
else if (e->index == 4)
{
ret = cosem_setUInt32(e->value.byteArr, object->capturePeriod);
}
else if (e->index == 5)
{
ret = cosem_setUInt8(e->value.byteArr, object->primaryAddress);
}
else if (e->index == 6)
{
ret = cosem_setUInt32(e->value.byteArr, object->identificationNumber);
}
else if (e->index == 7)
{
ret = cosem_setUInt16(e->value.byteArr, object->manufacturerID);
}
else if (e->index == 8)
{
ret = cosem_setUInt8(e->value.byteArr, object->dataHeaderVersion);
}
else if (e->index == 9)
{
ret = cosem_setUInt8(e->value.byteArr, object->deviceType);
}
else if (e->index == 10)
{
ret = cosem_setUInt8(e->value.byteArr, object->accessNumber);
}
else if (e->index == 11)
{
ret = cosem_setUInt8(e->value.byteArr, object->status);
}
else if (e->index == 12)
{
ret = cosem_setUInt8(e->value.byteArr, object->alarm);
}
else if (e->index == 13 && object->base.version != 0)
{
ret = cosem_setUInt16(e->value.byteArr, object->configuration);
}
else if (e->index == 14 && object->base.version != 0)
{
ret = cosem_setEnum(e->value.byteArr, object->encryptionKeyStatus);
}
else
{
return DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_MBUS_CLIENT
#ifndef DLMS_IGNORE_MODEM_CONFIGURATION
int cosem_add(gxByteBuffer* data, const char* value, unsigned char len)
{
int ret;
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = hlp_setObjectCount(len, data)) != 0 ||
(ret = bb_set(data, (unsigned char*)value, len)) != 0)
{
return ret;
}
return 0;
}
int cosem_getModemConfiguration(
dlmsSettings* settings,
gxValueEventArg* e)
{
int ret = 0;
uint16_t pos;
gxModemInitialisation* mi;
#ifdef DLMS_IGNORE_MALLOC
gxModemProfile* ba;
#else
gxByteBuffer* ba;
#endif //DLMS_IGNORE_MALLOC
gxModemConfiguration* target = ((gxModemConfiguration*)e->target);
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
ret = cosem_setEnum(e->value.byteArr, target->communicationSpeed);
}
else if (e->index == 3)
{
if ((ret = cosem_setArray(data, target->initialisationStrings.size)) == 0)
{
for (pos = 0; pos != target->initialisationStrings.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&target->initialisationStrings, pos, (void**)&mi, sizeof(gxModemInitialisation))) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 3)) != 0 ||
//Add request.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = hlp_setObjectCount(mi->request.size, data)) != 0 ||
(ret = bb_set(data, mi->request.value, mi->request.size)) != 0 ||
//Add response.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = hlp_setObjectCount(mi->response.size, data)) != 0 ||
(ret = bb_set(data, mi->response.value, mi->response.size)) != 0 ||
//Add delay.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(data, mi->delay)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&target->initialisationStrings, pos, (void**)&mi)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 3)) != 0 ||
//Add request.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = hlp_setObjectCount(mi->request.size, data)) != 0 ||
(ret = bb_set(data, mi->request.data, mi->request.size)) != 0 ||
//Add response.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = hlp_setObjectCount(mi->response.size, data)) != 0 ||
(ret = bb_set(data, mi->response.data, mi->response.size)) != 0 ||
//Add delay.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(data, mi->delay)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
}
else if (e->index == 4)
{
//Modem profile is defined on DLMS standard. Add default values.
if (settings->server && target->modemProfile.size == 0)
{
if ((ret = cosem_setArray(data, 17)) != 0 ||
(ret = cosem_add(data, "OK", 2) != 0) ||
(ret = cosem_add(data, "CONNECT", 7) != 0) ||
(ret = cosem_add(data, "RING", 4) != 0) ||
(ret = cosem_add(data, "NO CARRIER", 10) != 0) ||
(ret = cosem_add(data, "ERROR", 5) != 0) ||
(ret = cosem_add(data, "CONNECT 1200", 12) != 0) ||
(ret = cosem_add(data, "NO DIAL TONE", 12) != 0) ||
(ret = cosem_add(data, "BUSY", 4) != 0) ||
(ret = cosem_add(data, "NO ANSWER", 9) != 0) ||
(ret = cosem_add(data, "CONNECT 600", 11) != 0) ||
(ret = cosem_add(data, "CONNECT 2400", 12) != 0) ||
(ret = cosem_add(data, "CONNECT 4800", 12) != 0) ||
(ret = cosem_add(data, "CONNECT 9600", 12) != 0) ||
(ret = cosem_add(data, "CONNECT 14 400", 14) != 0) ||
(ret = cosem_add(data, "CONNECT 28 800", 14) != 0) ||
(ret = cosem_add(data, "CONNECT 33 600", 14) != 0) ||
(ret = cosem_add(data, "CONNECT 56 000", 14) != 0))
{
return ret;
}
}
else
{
if ((ret = cosem_setArray(data, target->modemProfile.size)) == 0)
{
for (pos = 0; pos != target->modemProfile.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&target->modemProfile, pos, (void**)&ba, sizeof(gxModemProfile))) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = hlp_setObjectCount(ba->size, data)) != 0 ||
(ret = bb_set(data, ba->value, ba->size)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&target->modemProfile, pos, (void**)&ba)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = hlp_setObjectCount(ba->size, data)) != 0 ||
(ret = bb_set(data, ba->data, ba->size)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_MODEM_CONFIGURATION
#ifndef DLMS_IGNORE_PPP_SETUP
int cosem_getPppSetup(
gxValueEventArg* e)
{
int ret = 0;
uint16_t pos;
gxpppSetupLcpOption* lcpItem;
gxpppSetupIPCPOption* ipcpItem;
gxPppSetup* object = (gxPppSetup*)e->target;
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
#ifdef DLMS_IGNORE_MALLOC
#ifndef DLMS_IGNORE_OBJECT_POINTERS
if (object->phy == NULL)
{
ret = cosem_setOctetString2(e->value.byteArr, EMPTY_LN, 6);
}
else
{
ret = cosem_setOctetString2(e->value.byteArr, object->phy->logicalName, 6);
}
#else
ret = cosem_setOctetString2(e->value.byteArr, object->PHYReference, sizeof(object->PHYReference));
#endif //DLMS_IGNORE_OBJECT_POINTERS
#else
#ifndef DLMS_IGNORE_OBJECT_POINTERS
if (object->phy == NULL)
{
ret = cosem_setOctetString2(e->value.byteArr, EMPTY_LN, 6);
}
else
{
ret = cosem_setOctetString2(e->value.byteArr, object->phy->logicalName, 6);
}
#else
ret = cosem_setOctetString2(e->value.byteArr, object->PHYReference, 6);
#endif //DLMS_IGNORE_OBJECT_POINTERS
#endif //DLMS_IGNORE_MALLOC
}
else if (e->index == 3)
{
if ((ret = cosem_setArray(data, object->lcpOptions.size)) == 0)
{
for (pos = 0; pos != object->lcpOptions.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->lcpOptions, pos, (void**)&lcpItem, sizeof(gxpppSetupLcpOption))) != 0 ||
#else
if ((ret = arr_getByIndex(&object->lcpOptions, pos, (void**)&lcpItem)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 3)) != 0 ||
//Add type.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT8)) != 0 ||
(ret = bb_setUInt8(data, lcpItem->type)) != 0 ||
//Add length.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT8)) != 0 ||
(ret = bb_setUInt8(data, (unsigned char)lcpItem->length)) != 0 ||
(ret = var_getBytes(&lcpItem->data, data)) != 0)
{
break;
}
}
}
}
else if (e->index == 4)
{
if ((ret = cosem_setArray(data, object->ipcpOptions.size)) == 0)
{
for (pos = 0; pos != object->ipcpOptions.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->ipcpOptions, pos, (void**)&ipcpItem, sizeof(gxpppSetupIPCPOption))) != 0 ||
#else
if ((ret = arr_getByIndex(&object->ipcpOptions, pos, (void**)&ipcpItem)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 3)) != 0 ||
//Add type.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT8)) != 0 ||
(ret = bb_setUInt8(data, ipcpItem->type)) != 0 ||
//Add length.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT8)) != 0 ||
(ret = bb_setUInt8(data, (unsigned char)ipcpItem->length)) != 0 ||
(ret = var_getBytes(&ipcpItem->data, data)) != 0)
{
break;
}
}
}
}
else if (e->index == 5)
{
if (bb_size(&object->userName) == 0)
{
ret = bb_setUInt8(data, DLMS_DATA_TYPE_NONE);
}
else
{
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 2)) != 0 ||
//Add user name.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = hlp_setObjectCount(object->userName.size, data)) != 0 ||
(ret = bb_set2(data, &object->userName, 0, bb_size(&object->userName))) != 0 ||
//Add pw.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = hlp_setObjectCount(object->password.size, data)) != 0 ||
(ret = bb_set2(data, &object->password, 0, bb_size(&object->password))) != 0)
{
return ret;
}
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_PPP_SETUP
#ifndef DLMS_IGNORE_REGISTER_ACTIVATION
int cosem_getRegisterActivation(
dlmsSettings* settings,
gxValueEventArg* e)
{
int ret;
uint16_t pos;
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
gxObject* od;
#else
#ifdef DLMS_IGNORE_OBJECT_POINTERS
gxObjectDefinition* od;
#else
gxObject* od;
#endif //DLMS_IGNORE_OBJECT_POINTERS
#endif //DLMS_IGNORE_MALLOC
gxRegisterActivation* object = (gxRegisterActivation*)e->target;
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
//Add count only for first time.
uint16_t pduSize = 0;
if (!e->transaction)
{
e->transactionEndIndex = object->registerAssignment.size;
ret = cosem_setArray(data, object->registerAssignment.size);
}
else
{
ret = 0;
}
if (ret == 0)
{
for (pos = (uint16_t)e->transactionStartIndex; pos != object->registerAssignment.size; ++pos)
{
pduSize = (uint16_t)data->size;
#if !(defined(DLMS_IGNORE_OBJECT_POINTERS) || defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES))
if ((ret = oa_getByIndex(&object->registerAssignment, pos, &od)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 2)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(data, od->objectType)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = bb_setUInt8(data, 6)) != 0 ||
(ret = bb_set(data, od->logicalName, 6)) != 0)
{
break;
}
#else
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndexRef(&object->registerAssignment, pos, (void**)&od)) != 0 ||
#else
if ((ret = arr_getByIndex(&object->registerAssignment, pos, (void**)&od)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 2)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(data, od->objectType)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = bb_setUInt8(data, 6)) != 0 ||
(ret = bb_set(data, od->logicalName, 6)) != 0)
{
break;
}
#endif //!(defined(DLMS_IGNORE_OBJECT_POINTERS) || defined(DLMS_IGNORE_MALLOC))
if (settings->server)
{
//If PDU is full.
if (!e->skipMaxPduSize && dlms_isPduFull(settings, data, NULL))
{
ret = DLMS_ERROR_CODE_OUTOFMEMORY;
break;
}
}
++e->transactionStartIndex;
}
if (ret == DLMS_ERROR_CODE_OUTOFMEMORY)
{
data->size = pduSize;
ret = 0;
}
}
}
else if (e->index == 3)
{
#ifdef DLMS_IGNORE_MALLOC
gxRegisterActivationMask* a;
#else
gxKey* a;
#endif //DLMS_IGNORE_MALLOC
uint32_t pos2;
if ((ret = cosem_setArray(data, object->maskList.size)) == 0)
{
for (pos = 0; pos != object->maskList.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->maskList, pos, (void**)&a, sizeof(gxRegisterActivationMask))) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 2)) != 0)
{
break;
}
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = bb_setUInt8(data, a->length)) != 0 ||
(ret = bb_set(data, a->name, a->length)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_ARRAY)) != 0 ||
(ret = bb_setUInt8(data, a->count)) != 0)
{
break;
}
for (pos2 = 0; pos2 != a->count; ++pos2)
{
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT8)) != 0 ||
(ret = bb_setUInt8(data, a->indexes[pos2])) != 0)
{
return ret;
}
}
#else
if ((ret = arr_getByIndex(&object->maskList, pos, (void**)&a)) != 0 ||
(ret = cosem_setStructure(data, 2)) != 0 ||
(ret = cosem_setOctetString(data, ((gxByteBuffer*)a->key))) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_ARRAY)) != 0 ||
(ret = bb_setUInt8(data, (unsigned char)bb_size((gxByteBuffer*)a->value))) != 0)
{
break;
}
for (pos2 = 0; pos2 != bb_size((gxByteBuffer*)a->value); ++pos2)
{
if ((ret = cosem_setUInt8(data, ((gxByteBuffer*)a->value)->data[pos2])) != 0)
{
break;
}
}
if (ret != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
}
else if (e->index == 4)
{
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = hlp_setObjectCount(object->activeMask.size, data)) != 0 ||
(ret = bb_set2(data, &object->activeMask, 0, bb_size(&object->activeMask))) != 0)
{
return ret;
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_REGISTER_ACTIVATION
#ifndef DLMS_IGNORE_REGISTER_MONITOR
int cosem_getRegisterMonitor(
gxValueEventArg* e)
{
int ret = DLMS_ERROR_CODE_OK;
uint16_t pos;
dlmsVARIANT_PTR tmp;
gxActionSet* actionSet;
gxRegisterMonitor* object = (gxRegisterMonitor*)e->target;
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
//Add count
if ((ret = cosem_setArray(data, object->thresholds.size)) == 0)
{
for (pos = 0; pos != object->thresholds.size; ++pos)
{
if ((ret = va_getByIndex(&object->thresholds, pos, &tmp)) != 0 ||
(ret = var_getBytes(tmp, data)) != 0)
{
break;
}
}
}
}
else if (e->index == 3)
{
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 3)) != 0 ||
#ifndef DLMS_IGNORE_OBJECT_POINTERS
//Object type
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(data, object->monitoredValue.target != NULL ? object->monitoredValue.target->objectType : 0)) != 0 ||
//LN
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = hlp_setObjectCount(6, data)) != 0 ||
(ret = bb_set(data, obj_getLogicalName(object->monitoredValue.target), 6)) != 0 ||
#else
//Object type
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(data, object->monitoredValue.objectType)) != 0 ||
//LN
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = hlp_setObjectCount(6, data)) != 0 ||
(ret = bb_set(data, object->monitoredValue.logicalName, 6)) != 0 ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
//attribute index.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_INT8)) != 0 ||
(ret = bb_setUInt8(data, object->monitoredValue.attributeIndex)) != 0)
{
//Error code is returned at the end of the function.
}
}
else if (e->index == 4)
{
//Add count
if ((ret = cosem_setArray(data, object->actions.size)) == 0)
{
for (pos = 0; pos != object->actions.size; ++pos)
{
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 2)) != 0 ||
#ifdef DLMS_IGNORE_MALLOC
(ret = arr_getByIndex(&object->actions, pos, (void**)&actionSet, sizeof(gxActionSet))) != 0 ||
#else
(ret = arr_getByIndex(&object->actions, pos, (void**)&actionSet)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 2)) != 0 ||
//Add LN.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = bb_setUInt8(data, 6)) != 0 ||
#ifndef DLMS_IGNORE_OBJECT_POINTERS
(ret = bb_set(data, obj_getLogicalName((gxObject*)actionSet->actionUp.script), 6)) != 0 ||
#else
(ret = bb_set(data, actionSet->actionUp.logicalName, 6)) != 0 ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
//Add script selector.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(data, actionSet->actionUp.scriptSelector)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 2)) != 0 ||
//Add LN.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = bb_setUInt8(data, 6)) != 0 ||
#ifndef DLMS_IGNORE_OBJECT_POINTERS
(ret = bb_set(data, obj_getLogicalName((gxObject*)actionSet->actionDown.script), 6)) != 0 ||
#else
(ret = bb_set(data, actionSet->actionDown.logicalName, 6)) != 0 ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
//Add script selector.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(data, actionSet->actionDown.scriptSelector)) != 0)
{
break;
}
}
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_REGISTER_MONITOR
#ifndef DLMS_IGNORE_SAP_ASSIGNMENT
int cosem_getSapAssignment(
gxValueEventArg* e)
{
int ret;
uint16_t pos;
gxSapItem* it;
gxSapAssignment* object = (gxSapAssignment*)e->target;
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
if ((ret = cosem_setArray(data, object->sapAssignmentList.size)) == 0)
{
for (pos = 0; pos != object->sapAssignmentList.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 2)) != 0 ||
(ret = arr_getByIndex(&object->sapAssignmentList, pos, (void**)&it, sizeof(gxSapItem))) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(data, it->id)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = hlp_setObjectCount(it->name.size, data)) != 0 ||
(ret = bb_set(data, it->name.value, it->name.size)) != 0)
{
break;
}
#else
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 2)) != 0 ||
(ret = arr_getByIndex(&object->sapAssignmentList, pos, (void**)&it)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(data, it->id)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = hlp_setObjectCount(it->name.size, data)) != 0 ||
(ret = bb_set2(data, &it->name, 0, bb_size(&it->name))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_SAP_ASSIGNMENT
#ifndef DLMS_IGNORE_SCHEDULE
int cosem_getSchedule(
gxValueEventArg* e)
{
int ret = DLMS_ERROR_CODE_OK;
uint16_t pos;
gxScheduleEntry* se;
gxSchedule* object = (gxSchedule*)e->target;
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
if ((ret = cosem_setArray(data, object->entries.size)) != 0)
{
return ret;
}
bitArray ba;
ba_init(&ba);
for (pos = 0; pos != object->entries.size; ++pos)
{
if ((ret = cosem_setStructure(data, 10)) != 0 ||
#ifdef DLMS_IGNORE_MALLOC
(ret = arr_getByIndex(&object->entries, pos, (void**)&se, sizeof(gxScheduleEntry))) != 0 ||
#else
(ret = arr_getByIndex(&object->entries, pos, (void**)&se)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
//Add index.
(ret = cosem_setUInt16(data, se->index)) != 0 ||
//Add enable.
(ret = cosem_setBoolean(data, se->enable)) != 0 ||
//Add logical Name.
#ifndef DLMS_IGNORE_OBJECT_POINTERS
(ret = cosem_setOctetString2(data, obj_getLogicalName((gxObject*)se->scriptTable), 6)) != 0 ||
#else
(ret = cosem_setOctetString2(data, se->logicalName, 6)) != 0 ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
//Add script selector.
(ret = cosem_setUInt16(data, se->scriptSelector)) != 0 ||
//Add switch time.
(ret = cosem_setTimeAsOctetString(data, &se->switchTime)) != 0 ||
//Add validity window.
(ret = cosem_setUInt16(data, se->validityWindow)) != 0 ||
//Add exec week days.
(ret = cosem_setBitString(data, se->execWeekdays, 7)) != 0 ||
//Add exec spec days.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_BIT_STRING)) != 0 ||
(ret = hlp_setObjectCount(se->execSpecDays.size, data)) != 0 ||
(ret = bb_set(data, se->execSpecDays.data, ba_getByteCount(se->execSpecDays.size))) != 0 ||
//Add begin date.
(ret = cosem_setDateTimeAsOctetString(data, &se->beginDate)) != 0 ||
//Add end date.
(ret = cosem_setDateTimeAsOctetString(data, &se->endDate)) != 0)
{
break;
}
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_SCHEDULE
#ifndef DLMS_IGNORE_SCRIPT_TABLE
int cosem_getScriptTable(
gxValueEventArg* e)
{
int ret;
uint16_t pos, pos2;
gxScript* it;
gxScriptAction* a;
gxScriptTable* object = (gxScriptTable*)e->target;
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
if ((ret = cosem_setArray(data, object->scripts.size)) == 0)
{
for (pos = 0; pos != object->scripts.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->scripts, pos, (void**)&it, sizeof(gxScript))) != 0 ||
#else
if ((ret = arr_getByIndex(&object->scripts, pos, (void**)&it)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = cosem_setStructure(data, 2)) != 0 ||
//Script_identifier:
(ret = cosem_setUInt16(data, it->id)) != 0 ||
(ret = cosem_setArray(data, it->actions.size)) != 0)
{
break;
}
for (pos2 = 0; pos2 != it->actions.size; ++pos2)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&it->actions, pos2, (void**)&a, sizeof(gxScriptAction))) != 0 ||
#else
if ((ret = arr_getByIndex(&it->actions, pos2, (void**)&a)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = cosem_setStructure(data, 5)) != 0 ||
//service_id
(ret = cosem_setEnum(data, a->type)) != 0 ||
//class_id
#ifndef DLMS_IGNORE_OBJECT_POINTERS
(ret = cosem_setUInt16(data, a->target == NULL ? 0 : a->target->objectType)) != 0 ||
#else
(ret = cosem_setUInt16(data, a->objectType)) != 0 ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
//logical_name
#ifndef DLMS_IGNORE_OBJECT_POINTERS
(ret = cosem_setOctetString2(data, obj_getLogicalName(a->target), 6)) != 0 ||
#else
(ret = cosem_setOctetString2(data, a->logicalName, 6)) != 0 ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
//index
(ret = cosem_setInt8(data, a->index)) != 0 ||
//parameter
(ret = cosem_setVariant(data, &a->parameter)) != 0)
{
break;
}
}
}
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_SCRIPT_TABLE
#ifndef DLMS_IGNORE_SPECIAL_DAYS_TABLE
int cosem_getSpecialDaysTable(
gxValueEventArg* e)
{
int ret;
uint16_t pos;
dlmsVARIANT tmp;
gxSpecialDay* sd;
gxSpecialDaysTable* object = (gxSpecialDaysTable*)e->target;
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
if ((ret = var_init(&tmp)) != 0 ||
(ret = cosem_setArray(data, object->entries.size)) == 0)
{
for (pos = 0; pos != object->entries.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->entries, pos, (void**)&sd, sizeof(gxSpecialDay))) != 0 ||
#else
if ((ret = arr_getByIndex(&object->entries, pos, (void**)&sd)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = cosem_setStructure(data, 3)) != 0 ||
//Index
(ret = cosem_setUInt16(data, sd->index)) != 0 ||
//Date
(ret = cosem_setDateAsOctetString(data, &sd->date)) != 0 ||
//DayId
(ret = cosem_setUInt8(data, sd->dayId)) != 0)
{
break;
}
}
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_SPECIAL_DAYS_TABLE
#ifndef DLMS_IGNORE_TCP_UDP_SETUP
int cosem_getTcpUdpSetup(
gxValueEventArg* e)
{
int ret;
gxTcpUdpSetup* object = (gxTcpUdpSetup*)e->target;
if (e->index == 2)
{
ret = cosem_setUInt16(e->value.byteArr, object->port);
}
else if (e->index == 3)
{
#ifndef DLMS_IGNORE_OBJECT_POINTERS
ret = cosem_setOctetString2(e->value.byteArr, obj_getLogicalName(object->ipSetup), 6);
#else
ret = cosem_setOctetString2(e->value.byteArr, object->ipReference, 6);
#endif //DLMS_IGNORE_OBJECT_POINTERS
}
else if (e->index == 4)
{
ret = cosem_setUInt16(e->value.byteArr, object->maximumSegmentSize);
}
else if (e->index == 5)
{
ret = cosem_setUInt8(e->value.byteArr, object->maximumSimultaneousConnections);
}
else if (e->index == 6)
{
ret = cosem_setUInt16(e->value.byteArr, object->inactivityTimeout);
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_TCP_UDP_SETUP
#ifndef DLMS_IGNORE_MBUS_DIAGNOSTIC
int cosem_getMbusDiagnostic(
gxValueEventArg* e)
{
int pos, ret;
dlmsVARIANT tmp;
gxBroadcastFrameCounter* item;
gxMbusDiagnostic* object = (gxMbusDiagnostic*)e->target;
if (e->index == 2)
{
ret = cosem_setUInt8(e->value.byteArr, object->receivedSignalStrength);
}
else if (e->index == 3)
{
ret = cosem_setUInt8(e->value.byteArr, object->channelId);
}
else if (e->index == 4)
{
ret = cosem_setEnum(e->value.byteArr, object->linkStatus);
}
else if (e->index == 5)
{
if ((ret = var_init(&tmp)) != 0 ||
(ret = cosem_setArray(e->value.byteArr, object->broadcastFrames.size)) == 0)
{
for (pos = 0; pos != object->broadcastFrames.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->broadcastFrames, pos, (void**)&item, sizeof(gxBroadcastFrameCounter))) != 0 ||
#else
if ((ret = arr_getByIndex(&object->broadcastFrames, pos, (void**)&item)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = cosem_setStructure(e->value.byteArr, 3)) != 0 ||
(ret = cosem_setUInt8(e->value.byteArr, item->clientId)) != 0 ||
(ret = cosem_setUInt32(e->value.byteArr, item->counter)) != 0 ||
(ret = cosem_setDateTime(e->value.byteArr, &item->timeStamp)) != 0)
{
break;
}
}
}
}
else if (e->index == 6)
{
ret = cosem_setUInt32(e->value.byteArr, object->transmissions);
}
else if (e->index == 7)
{
ret = cosem_setUInt32(e->value.byteArr, object->receivedFrames);
}
else if (e->index == 8)
{
ret = cosem_setUInt32(e->value.byteArr, object->failedReceivedFrames);
}
else if (e->index == 9)
{
if ((ret = cosem_setStructure(e->value.byteArr, 2)) != 0 ||
(ret = cosem_setUInt8(e->value.byteArr, object->captureTime.attributeId)) != 0 ||
(ret = cosem_setDateTime(e->value.byteArr, &object->captureTime.timeStamp)) != 0)
{
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_MBUS_DIAGNOSTIC
#ifndef DLMS_IGNORE_MBUS_PORT_SETUP
int cosem_getMbusPortSetup(
gxValueEventArg* e)
{
int pos, ret;
gxMBusPortSetup* object = (gxMBusPortSetup*)e->target;
if (e->index == 2)
{
ret = cosem_setOctetString2(e->value.byteArr, object->profileSelection, 6);
}
else if (e->index == 3)
{
ret = cosem_setEnum(e->value.byteArr, object->portCommunicationStatus);
}
else if (e->index == 4)
{
ret = cosem_setEnum(e->value.byteArr, object->dataHeaderType);
}
else if (e->index == 5)
{
ret = cosem_setUInt8(e->value.byteArr, object->primaryAddress);
}
else if (e->index == 6)
{
ret = cosem_setUInt32(e->value.byteArr, object->identificationNumber);
}
else if (e->index == 7)
{
ret = cosem_setUInt16(e->value.byteArr, object->manufacturerId);
}
else if (e->index == 8)
{
ret = cosem_setUInt8(e->value.byteArr, object->mBusVersion);
}
else if (e->index == 9)
{
ret = cosem_setUInt8(e->value.byteArr, object->deviceType);
}
else if (e->index == 10)
{
ret = cosem_setUInt16(e->value.byteArr, object->maxPduSize);
}
else if (e->index == 11)
{
#ifndef DLMS_IGNORE_MALLOC
gxKey* kv;
#else
gxTimePair* kv;
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setArray(e->value.byteArr, object->listeningWindow.size)) == 0)
{
for (pos = 0; pos != object->listeningWindow.size; ++pos)
{
if ((ret = cosem_setStructure(e->value.byteArr, 2)) != 0)
{
break;
}
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->listeningWindow, pos, (void**)&kv)) != 0 ||
(ret = cosem_setDateTimeAsOctetString(e->value.byteArr, (gxtime*)kv->key)) != 0 ||
(ret = cosem_setDateTimeAsOctetString(e->value.byteArr, (gxtime*)kv->value)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->listeningWindow, pos, (void**)&kv, sizeof(gxTimePair))) != 0 ||
//start_time
(ret = cosem_setDateTimeAsOctetString(e->value.byteArr, &kv->first)) != 0 ||
//end_time
(ret = cosem_setDateTimeAsOctetString(e->value.byteArr, &kv->second)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_MBUS_PORT_SETUP
#ifndef DLMS_IGNORE_G3_PLC_MAC_LAYER_COUNTERS
int cosem_getG3PlcMacLayerCounters(
gxValueEventArg* e)
{
int ret;
gxG3PlcMacLayerCounters* object = (gxG3PlcMacLayerCounters*)e->target;
if (e->index == 2)
{
ret = cosem_setUInt32(e->value.byteArr, object->txDataPacketCount);
}
else if (e->index == 3)
{
ret = cosem_setUInt32(e->value.byteArr, object->rxDataPacketCount);
}
else if (e->index == 4)
{
ret = cosem_setUInt32(e->value.byteArr, object->txCmdPacketCount);
}
else if (e->index == 5)
{
ret = cosem_setUInt32(e->value.byteArr, object->rxCmdPacketCount);
}
else if (e->index == 6)
{
ret = cosem_setUInt32(e->value.byteArr, object->cSMAFailCount);
}
else if (e->index == 7)
{
ret = cosem_setUInt32(e->value.byteArr, object->cSMANoAckCount);
}
else if (e->index == 8)
{
ret = cosem_setUInt32(e->value.byteArr, object->badCrcCount);
}
else if (e->index == 9)
{
ret = cosem_setUInt32(e->value.byteArr, object->txDataBroadcastCount);
}
else if (e->index == 10)
{
ret = cosem_setUInt32(e->value.byteArr, object->rxDataBroadcastCount);
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_G3_PLC_MAC_LAYER_COUNTERS
#ifndef DLMS_IGNORE_G3_PLC_MAC_SETUP
int cosem_getG3PlcMacSetupNeighbourTables(
gxArray* tables,
uint16_t address,
uint16_t count,
gxValueEventArg* e)
{
int ret;
uint16_t pos;
gxNeighbourTable* it;
if ((ret = cosem_setArray(e->value.byteArr, count)) != 0)
{
return ret;
}
for (pos = 0; pos < tables->size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(tables, pos, (void**)&it)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(tables, pos, (void**)&it, sizeof(gxNeighbourTable))) != 0)
{
break;
}
gxNeighbourTableTransmitterGain* txCoeff = &it->txCoeff[pos];
gxNeighbourTableToneMap* toneMap = &it->toneMap[pos];
#endif //DLMS_IGNORE_MALLOC
if (address != 0 && it->shortAddress != address)
{
//If values are read using the filter.
continue;
}
// Count
if ((ret = cosem_setStructure(e->value.byteArr, 11)) != 0 ||
(ret = cosem_setUInt16(e->value.byteArr, it->shortAddress)) != 0 ||
(ret = cosem_setBoolean(e->value.byteArr, it->payloadModulationScheme)) != 0 ||
(ret = bb_setUInt8(e->value.byteArr, DLMS_DATA_TYPE_BIT_STRING)) != 0 ||
#ifndef DLMS_IGNORE_MALLOC
(ret = hlp_setObjectCount(it->toneMap.size, e->value.byteArr)) != 0 ||
(ret = bb_set(e->value.byteArr, it->toneMap.data, ba_getByteCount(it->toneMap.size))) != 0 ||
#else
(ret = hlp_setObjectCount(toneMap->size, e->value.byteArr)) != 0 ||
(ret = bb_set(e->value.byteArr, toneMap->value, ba_getByteCount(toneMap->size))) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = cosem_setEnum(e->value.byteArr, it->modulation)) != 0 ||
(ret = cosem_setInt8(e->value.byteArr, it->txGain)) != 0 ||
(ret = cosem_setEnum(e->value.byteArr, it->txRes)) != 0 ||
(ret = bb_setUInt8(e->value.byteArr, DLMS_DATA_TYPE_BIT_STRING)) != 0 ||
#ifndef DLMS_IGNORE_MALLOC
(ret = hlp_setObjectCount(it->txCoeff.size, e->value.byteArr)) != 0 ||
(ret = bb_set(e->value.byteArr, it->txCoeff.data, ba_getByteCount(it->txCoeff.size))) != 0 ||
#else
(ret = hlp_setObjectCount(txCoeff->size, e->value.byteArr)) != 0 ||
(ret = bb_set(e->value.byteArr, txCoeff->value, ba_getByteCount(txCoeff->size))) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = cosem_setUInt8(e->value.byteArr, it->lqi)) != 0 ||
(ret = cosem_setInt8(e->value.byteArr, it->phaseDifferential)) != 0 ||
(ret = cosem_setUInt8(e->value.byteArr, it->tmrValidTime)) != 0 ||
(ret = cosem_setUInt8(e->value.byteArr, it->noData)) != 0)
{
break;
}
}
return ret;
}
int cosem_getG3PlcMacSetupPosTables(
gxArray* tables,
uint16_t address,
uint16_t count,
gxValueEventArg* e)
{
int ret;
uint16_t pos;
gxMacPosTable* it;
if ((ret = cosem_setArray(e->value.byteArr, count)) != 0)
{
return ret;
}
for (pos = 0; pos < tables->size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(tables, pos, (void**)&it)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(tables, pos, (void**)&it, sizeof(gxMacPosTable))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if (address != 0 && it->shortAddress != address)
{
//If values are read using the filter.
continue;
}
// Count
if ((ret = cosem_setStructure(e->value.byteArr, 3)) != 0 ||
// Id
(ret = cosem_setUInt16(e->value.byteArr, it->shortAddress)) != 0 ||
(ret = cosem_setUInt8(e->value.byteArr, it->lqi)) != 0 ||
(ret = cosem_setUInt8(e->value.byteArr, it->validTime)) != 0)
{
break;
}
}
return ret;
}
int cosem_getG3PlcMacSetup(
gxValueEventArg* e)
{
int ret;
uint16_t pos;
gxG3PlcMacSetup* object = (gxG3PlcMacSetup*)e->target;
if (e->index == 2)
{
ret = cosem_setUInt16(e->value.byteArr, object->shortAddress);
}
else if (e->index == 3)
{
ret = cosem_setUInt16(e->value.byteArr, object->rcCoord);
}
else if (e->index == 4)
{
ret = cosem_setUInt16(e->value.byteArr, object->panId);
}
else if (e->index == 5)
{
gxG3MacKeyTable* it;
if ((ret = cosem_setArray(e->value.byteArr, object->keyTable.size)) != 0)
{
return ret;
}
for (pos = 0; pos < object->keyTable.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->keyTable, pos, (void**)&it)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->keyTable, pos, (void**)&it, sizeof(gxG3MacKeyTable))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
// Count
if ((ret = cosem_setStructure(e->value.byteArr, 2)) != 0 ||
// Id
(ret = cosem_setUInt8(e->value.byteArr, (unsigned char)it->id)) != 0 ||
// Key
(ret = cosem_setOctetString2(e->value.byteArr, it->key, MAX_G3_MAC_KEY_TABLE_KEY_SIZE)) != 0)
{
break;
}
}
}
else if (e->index == 6)
{
ret = cosem_setUInt32(e->value.byteArr, object->frameCounter);
}
else if (e->index == 7)
{
if ((ret = bb_setUInt8(e->value.byteArr, DLMS_DATA_TYPE_BIT_STRING)) == 0 &&
(ret = hlp_setObjectCount(ba_size(&object->toneMask), e->value.byteArr)) == 0 &&
(ret = bb_set(e->value.byteArr, object->toneMask.data, ba_getByteCount(object->toneMask.size))) == 0)
{
}
}
else if (e->index == 8)
{
ret = cosem_setUInt8(e->value.byteArr, object->tmrTtl);
}
else if (e->index == 9)
{
ret = cosem_setUInt8(e->value.byteArr, object->maxFrameRetries);
}
else if (e->index == 10)
{
ret = cosem_setUInt8(e->value.byteArr, object->neighbourTableEntryTtl);
}
else if (e->index == 11)
{
ret = cosem_getG3PlcMacSetupNeighbourTables(&object->neighbourTable,
0, object->neighbourTable.size, e);
}
else if (e->index == 12)
{
ret = cosem_setUInt8(e->value.byteArr, object->highPriorityWindowSize);
}
else if (e->index == 13)
{
ret = cosem_setUInt8(e->value.byteArr, object->cscmFairnessLimit);
}
else if (e->index == 14)
{
ret = cosem_setUInt8(e->value.byteArr, object->beaconRandomizationWindowLength);
}
else if (e->index == 15)
{
ret = cosem_setUInt8(e->value.byteArr, object->macA);
}
else if (e->index == 16)
{
ret = cosem_setUInt8(e->value.byteArr, object->macK);
}
else if (e->index == 17)
{
ret = cosem_setUInt8(e->value.byteArr, object->minCwAttempts);
}
else if (e->index == 18)
{
ret = cosem_setUInt8(e->value.byteArr, object->cenelecLegacyMode);
}
else if (e->index == 19)
{
ret = cosem_setUInt8(e->value.byteArr, object->fccLegacyMode);
}
else if (e->index == 20)
{
ret = cosem_setUInt8(e->value.byteArr, object->maxBe);
}
else if (e->index == 21)
{
ret = cosem_setUInt8(e->value.byteArr, object->maxCsmaBackoffs);
}
else if (e->index == 22)
{
ret = cosem_setUInt8(e->value.byteArr, object->minBe);
}
else if (e->index == 23)
{
ret = cosem_setBoolean(e->value.byteArr, object->macBroadcastMaxCwEnabled);
}
else if (e->index == 24)
{
ret = cosem_setUInt8(e->value.byteArr, object->macTransmitAtten);
}
else if (e->index == 25)
{
ret = cosem_getG3PlcMacSetupPosTables(&object->macPosTable,
0, object->macPosTable.size, e);
}
else if (object->base.version > 2 && e->index == 26)
{
//macDuplicateDetectionTTL is added in version 3.
ret = cosem_setUInt8(e->value.byteArr, object->macDuplicateDetectionTTL);
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_G3_PLC_MAC_SETUP
#ifndef DLMS_IGNORE_G3_PLC_6LO_WPAN
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
int cosem_getUInt16Array(gxArray* arr, gxByteBuffer* byteArr)
{
int ret;
uint16_t pos;
uint16_t* it;
if ((ret = cosem_setArray(byteArr, arr->size)) != 0)
{
return ret;
}
for (pos = 0; pos < arr->size; ++pos)
{
if ((ret = arr_getByIndex(arr, pos, (void**)&it, sizeof(uint16_t))) != 0)
{
break;
}
if ((ret = cosem_setUInt16(byteArr, *it)) != 0)
{
break;
}
}
return ret;
}
#else
int cosem_getUInt16Array(variantArray* arr, gxByteBuffer* byteArr)
{
int ret;
uint16_t pos;
dlmsVARIANT* it;
if ((ret = cosem_setArray(byteArr, arr->size)) != 0)
{
return ret;
}
for (pos = 0; pos < arr->size; ++pos)
{
if ((ret = va_getByIndex(arr, pos, &it)) != 0)
{
break;
}
if ((ret = cosem_setUInt16(byteArr, it->uiVal)) != 0)
{
break;
}
}
return ret;
}
#endif //DLMS_IGNORE_MALLOC
int cosem_getG3Plc6LoWPAN(
gxValueEventArg* e)
{
uint16_t pos;
int ret = 0;
gxG3Plc6LoWPAN* object = (gxG3Plc6LoWPAN*)e->target;
if (e->index == 2)
{
ret = cosem_setUInt8(e->value.byteArr, object->maxHops);
}
else if (e->index == 3)
{
ret = cosem_setUInt8(e->value.byteArr, object->weakLqiValue);
}
else if (e->index == 4)
{
ret = cosem_setUInt8(e->value.byteArr, object->securityLevel);
}
else if (e->index == 5)
{
unsigned char ch;
if ((ret = cosem_setArray(e->value.byteArr, (uint16_t)object->prefixTable.size)) != 0)
{
return ret;
}
for (pos = 0; pos < object->prefixTable.size; ++pos)
{
if ((ret = bb_getUInt8ByIndex(&object->prefixTable, pos, &ch)) != 0)
{
break;
}
if ((ret = cosem_setUInt8(e->value.byteArr, ch)) != 0)
{
break;
}
}
}
else if (e->index == 6)
{
gxRoutingConfiguration* it;
if ((ret = cosem_setArray(e->value.byteArr, object->routingConfiguration.size)) != 0)
{
return ret;
}
for (pos = 0; pos < object->routingConfiguration.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->routingConfiguration, pos, (void**)&it)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->routingConfiguration, pos, (void**)&it, sizeof(gxRoutingConfiguration))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setStructure(e->value.byteArr, 14)) != 0 ||
(ret = cosem_setUInt8(e->value.byteArr, it->netTraversalTime)) != 0 ||
(ret = cosem_setUInt16(e->value.byteArr, it->routingTableEntryTtl)) != 0 ||
(ret = cosem_setUInt8(e->value.byteArr, it->kr)) != 0 ||
(ret = cosem_setUInt8(e->value.byteArr, it->km)) != 0 ||
(ret = cosem_setUInt8(e->value.byteArr, it->kc)) != 0 ||
(ret = cosem_setUInt8(e->value.byteArr, it->kq)) != 0 ||
(ret = cosem_setUInt8(e->value.byteArr, it->kh)) != 0 ||
(ret = cosem_setUInt8(e->value.byteArr, it->krt)) != 0 ||
(ret = cosem_setUInt8(e->value.byteArr, it->rReqRetries)) != 0 ||
(ret = cosem_setUInt8(e->value.byteArr, it->rReqReqWait)) != 0 ||
(ret = cosem_setUInt16(e->value.byteArr, it->blacklistTableEntryTtl)) != 0 ||
(ret = cosem_setBoolean(e->value.byteArr, it->unicastRreqGenEnable)) != 0 ||
(ret = cosem_setBoolean(e->value.byteArr, it->rlcEnabled)) != 0 ||
(ret = cosem_setUInt8(e->value.byteArr, it->addRevLinkCost)) != 0)
{
break;
}
}
}
else if (e->index == 7)
{
ret = cosem_setUInt16(e->value.byteArr, object->broadcastLogTableEntryTtl);
}
else if (e->index == 8)
{
gxRoutingTable* it;
if ((ret = cosem_setArray(e->value.byteArr, object->routingTable.size)) != 0)
{
return ret;
}
for (pos = 0; pos < object->routingTable.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->routingTable, pos, (void**)&it)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->routingTable, pos, (void**)&it, sizeof(gxRoutingTable))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setStructure(e->value.byteArr, 6)) != 0 ||
(ret = cosem_setUInt16(e->value.byteArr, it->destinationAddress)) != 0 ||
(ret = cosem_setUInt16(e->value.byteArr, it->nextHopAddress)) != 0 ||
(ret = cosem_setUInt16(e->value.byteArr, it->routeCost)) != 0 ||
(ret = cosem_setUInt8(e->value.byteArr, it->hopCount)) != 0 ||
(ret = cosem_setUInt8(e->value.byteArr, it->weakLinkCount)) != 0 ||
(ret = cosem_setUInt16(e->value.byteArr, it->validTime)) != 0)
{
break;
}
}
}
else if (e->index == 9)
{
gxContextInformationTable* it;
if ((ret = cosem_setArray(e->value.byteArr, object->contextInformationTable.size)) != 0)
{
return ret;
}
for (pos = 0; pos < object->contextInformationTable.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->contextInformationTable, pos, (void**)&it)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->contextInformationTable, pos, (void**)&it, sizeof(gxContextInformationTable))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setStructure(e->value.byteArr, 5)) != 0 ||
(ret = cosem_setBitString(e->value.byteArr, it->cid, 4)) != 0 ||
(ret = cosem_setUInt8(e->value.byteArr, it->contextLength)) != 0 ||
(ret = cosem_setOctetString2(e->value.byteArr, it->context, 16)) != 0 ||
(ret = cosem_setBoolean(e->value.byteArr, it->compression)) != 0 ||
(ret = cosem_setUInt16(e->value.byteArr, it->validLifetime)) != 0)
{
break;
}
}
}
else if (e->index == 10)
{
gxBlacklistTable* it;
if ((ret = cosem_setArray(e->value.byteArr, object->blacklistTable.size)) != 0)
{
return ret;
}
for (pos = 0; pos < object->blacklistTable.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->blacklistTable, pos, (void**)&it)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->blacklistTable, pos, (void**)&it, sizeof(gxBlacklistTable))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setStructure(e->value.byteArr, 2)) != 0 ||
(ret = cosem_setUInt16(e->value.byteArr, it->neighbourAddress)) != 0 ||
(ret = cosem_setUInt16(e->value.byteArr, it->validTime)) != 0)
{
break;
}
}
}
else if (e->index == 11)
{
gxBroadcastLogTable* it;
if ((ret = cosem_setArray(e->value.byteArr, object->broadcastLogTable.size)) != 0)
{
return ret;
}
for (pos = 0; pos < object->broadcastLogTable.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->broadcastLogTable, pos, (void**)&it)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->broadcastLogTable, pos, (void**)&it, sizeof(gxBroadcastLogTable))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setStructure(e->value.byteArr, 3)) != 0 ||
(ret = cosem_setUInt16(e->value.byteArr, it->sourceAddress)) != 0 ||
(ret = cosem_setUInt8(e->value.byteArr, it->sequenceNumber)) != 0 ||
(ret = cosem_setUInt16(e->value.byteArr, it->validTime)) != 0)
{
break;
}
}
}
else if (e->index == 12)
{
ret = cosem_getUInt16Array(&object->groupTable, e->value.byteArr);
}
else if (e->index == 13)
{
ret = cosem_setUInt16(e->value.byteArr, object->maxJoinWaitTime);
}
else if (e->index == 14)
{
ret = cosem_setUInt8(e->value.byteArr, object->pathDiscoveryTime);
}
else if (e->index == 15)
{
ret = cosem_setUInt8(e->value.byteArr, object->activeKeyIndex);
}
else if (e->index == 16)
{
ret = cosem_setUInt8(e->value.byteArr, object->metricType);
}
else if (e->index == 17)
{
ret = cosem_setUInt16(e->value.byteArr, object->coordShortAddress);
}
else if (e->index == 18)
{
ret = cosem_setBoolean(e->value.byteArr, object->disableDefaultRouting);
}
else if (e->index == 19)
{
ret = cosem_setEnum(e->value.byteArr, object->deviceType);
}
else if (e->index == 20)
{
ret = cosem_setBoolean(e->value.byteArr, object->defaultCoordRouteEnabled);
}
else if (e->index == 21)
{
ret = cosem_getUInt16Array(&object->destinationAddress, e->value.byteArr);
}
else if (e->index == 22)
{
ret = cosem_setUInt8(e->value.byteArr, object->lowLQI);
}
else if (e->index == 23)
{
ret = cosem_setUInt8(e->value.byteArr, object->highLQI);
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_G3_PLC_6LO_WPAN
#ifndef DLMS_IGNORE_FUNCTION_CONTROL
int cosem_getFunctionControl(
gxValueEventArg* e)
{
uint16_t pos, pos2, count;
int ret = 0;
gxFunctionControl* object = (gxFunctionControl*)e->target;
if (e->index == 2)
{
functionStatus* status;
if ((ret = cosem_setArray(e->value.byteArr, (uint16_t)object->activationStatus.size)) == 0)
{
for (pos = 0; pos < object->activationStatus.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->activationStatus, pos, (void**)&status)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->activationStatus, pos, (void**)&status, sizeof(functionStatus))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setStructure(e->value.byteArr, 2)) != 0)
{
break;
}
#ifndef DLMS_IGNORE_MALLOC
if ((ret = cosem_setOctetString(e->value.byteArr, &status->name)) != 0)
{
break;
}
#else
if ((ret = cosem_setOctetString2(e->value.byteArr, status->name, status->size)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setBoolean(e->value.byteArr, status->status)) != 0)
{
break;
}
}
}
}
else if (e->index == 3)
{
functionalBlock* block;
gxObject* target;
if ((ret = cosem_setArray(e->value.byteArr, (uint16_t)object->functions.size)) == 0)
{
for (pos = 0; pos < object->functions.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->functions, pos, (void**)&block)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->functions, pos, (void**)&block, sizeof(functionalBlock))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setStructure(e->value.byteArr, 2)) != 0)
{
break;
}
#ifndef DLMS_IGNORE_MALLOC
if ((ret = cosem_setOctetString(e->value.byteArr, &block->name)) != 0 ||
(ret = cosem_setArray(e->value.byteArr, (uint16_t)block->functionSpecifications.size)) != 0)
{
break;
}
count = (uint16_t)block->functionSpecifications.size;
#else
if ((ret = cosem_setOctetString2(e->value.byteArr, block->name, block->nameSize)) != 0 ||
(ret = cosem_setArray(e->value.byteArr, (uint16_t)block->functionSpecificationsSize)) != 0)
{
break;
}
count = (uint16_t)block->functionSpecificationsSize;
#endif //DLMS_IGNORE_MALLOC
for (pos2 = 0; pos2 < count; ++pos2)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = oa_getByIndex(&block->functionSpecifications, pos2, &target)) != 0)
{
break;
}
#else
target = block->functionSpecifications[pos2];
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setStructure(e->value.byteArr, 2)) != 0)
{
break;
}
if ((ret = cosem_setUInt16(e->value.byteArr, target->objectType)) != 0 ||
(ret = cosem_setOctetString2(e->value.byteArr, target->logicalName, 6)) != 0)
{
break;
}
}
}
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_FUNCTION_CONTROL
#ifndef DLMS_IGNORE_ARRAY_MANAGER
int cosem_getArrayManager(
gxValueEventArg* e)
{
uint16_t pos;
int ret = 0;
gxArrayManager* object = (gxArrayManager*)e->target;
if (e->index == 2)
{
gxArrayManagerItem* it;
if ((ret = cosem_setArray(e->value.byteArr, object->elements.size)) != 0)
{
return ret;
}
for (pos = 0; pos < object->elements.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->elements, pos, (void**)&it)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->elements, pos, (void**)&it, sizeof(gxArrayManagerItem))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setStructure(e->value.byteArr, 2)) != 0 ||
(ret = cosem_setUInt8(e->value.byteArr, it->id)) != 0 ||
(ret = cosem_setStructure(e->value.byteArr, 3)) != 0 ||
(ret = cosem_setUInt16(e->value.byteArr, it->element.target->objectType)) != 0 ||
(ret = cosem_setOctetString2(e->value.byteArr, it->element.target->logicalName, 6)) != 0 ||
(ret = cosem_setInt8(e->value.byteArr, it->element.attributeIndex)) != 0)
{
break;
}
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_ARRAY_MANAGER
#ifndef DLMS_IGNORE_UTILITY_TABLES
int cosem_getUtilityTables(
gxValueEventArg* e)
{
int ret = 0;
gxUtilityTables* object = (gxUtilityTables*)e->target;
if (e->index == 2)
{
ret = cosem_setUInt16(e->value.byteArr, object->tableId);
}
else if (e->index == 3)
{
//Skip length.
}
else if (e->index == 4)
{
ret = cosem_setOctetString(e->value.byteArr, &object->buffer);
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_UTILITY_TABLES
#ifndef DLMS_IGNORE_MBUS_MASTER_PORT_SETUP
int cosem_getMbusMasterPortSetup(
gxValueEventArg* e)
{
int ret;
gxMBusMasterPortSetup* object = (gxMBusMasterPortSetup*)e->target;
if (e->index == 2)
{
ret = cosem_setEnum(e->value.byteArr, object->commSpeed);
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_MBUS_MASTER_PORT_SETUP
#ifndef DLMS_IGNORE_PUSH_SETUP
int cosem_getPushSetup(
gxValueEventArg* e)
{
int ret = 0;
uint16_t pos;
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
gxTarget* it;
gxTimePair* d;
#else
gxKey* it;
#endif //DLMS_IGNORE_MALLOC
gxPushSetup* object = (gxPushSetup*)e->target;
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
if ((ret = cosem_setArray(data, object->pushObjectList.size)) == 0)
{
for (pos = 0; pos != object->pushObjectList.size; ++pos)
{
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->pushObjectList, pos, (void**)&it, sizeof(gxTarget))) != 0 ||
#else
if ((ret = arr_getByIndex(&object->pushObjectList, pos, (void**)&it)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = cosem_setStructure(data, 4)) != 0 ||
//Type.
(ret = cosem_setUInt16(data, OBJECT_TYPE)) != 0 ||
//LN
#ifdef DLMS_IGNORE_OBJECT_POINTERS
(ret = cosem_setOctetString2(data, it->logicalName, 6)) != 0 ||
#else
(ret = cosem_setOctetString2(data, it->target->logicalName, 6)) != 0 ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
//attributeIndex
(ret = cosem_setInt8(data, it->attributeIndex)) != 0 ||
//dataIndex
(ret = cosem_setUInt16(data, it->dataIndex)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->pushObjectList, pos, (void**)&it)) != 0 ||
(ret = cosem_setStructure(data, 4)) != 0 ||
//Type.
(ret = cosem_setUInt16(data, ((gxObject*)it->key)->objectType)) != 0 ||
//LN
(ret = cosem_setOctetString2(data, ((gxObject*)it->key)->logicalName, 6)) != 0 ||
//attributeIndex
(ret = cosem_setInt8(data, ((gxTarget*)it->value)->attributeIndex)) != 0 ||
//dataIndex
(ret = cosem_setUInt16(data, ((gxTarget*)it->value)->dataIndex)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
}
else if (e->index == 3)
{
if ((ret = cosem_setStructure(data, 3)) != 0 ||
//Service
(ret = cosem_setEnum(data, object->service)) != 0 ||
(ret = cosem_setOctetString(data, &object->destination)) != 0 ||
//Message
(ret = cosem_setEnum(data, object->message)) != 0)
{
}
}
else if (e->index == 4)
{
if ((ret = cosem_setArray(data, object->communicationWindow.size)) == 0)
{
for (pos = 0; pos != object->communicationWindow.size; ++pos)
{
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->communicationWindow, pos, (void**)&d, sizeof(gxTimePair))) != 0 ||
#else
if ((ret = arr_getByIndex(&object->communicationWindow, pos, (void**)&d)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = cosem_setStructure(data, 2)) != 0 ||
//Start date time.
(ret = cosem_setDateTimeAsOctetString(data, &d->first)) != 0 ||
//End date time.
(ret = cosem_setDateTimeAsOctetString(data, &d->second)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->communicationWindow, pos, (void**)&it)) != 0 ||
(ret = cosem_setStructure(data, 2)) != 0 ||
//Start date time.
(ret = cosem_setDateTimeAsOctetString(data, (gxtime*)it->key)) != 0 ||
//End date time.
(ret = cosem_setDateTimeAsOctetString(data, (gxtime*)it->value)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
}
else if (e->index == 5)
{
ret = cosem_setUInt16(e->value.byteArr, object->randomisationStartInterval);
}
else if (e->index == 6)
{
ret = cosem_setUInt8(e->value.byteArr, object->numberOfRetries);
}
else if (e->index == 7)
{
ret = cosem_setUInt16(e->value.byteArr, object->repetitionDelay);
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_PUSH_SETUP
#ifndef DLMS_IGNORE_ZIG_BEE_NETWORK_CONTROL
int cosem_getZigbeeNetworkControl(
gxValueEventArg* e)
{
gxZigBeeNetworkControl* object = (gxZigBeeNetworkControl*)e->target;
int ret = 0;
uint16_t pos;
gxActiveDevice* it;
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
ret = cosem_setUInt8(e->value.byteArr, object->enableDisableJoining);
}
else if (e->index == 3)
{
ret = cosem_setUInt16(e->value.byteArr, object->joinTimeout);
}
else if (e->index == 4)
{
if ((ret = cosem_setArray(data, object->activeDevices.size)) != 0)
{
return ret;
}
for (pos = 0; pos != object->activeDevices.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->activeDevices, pos, (void**)&it, sizeof(gxActiveDevice))) != 0 ||
#else
if ((ret = arr_getByIndex(&object->activeDevices, pos, (void**)&it)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = cosem_setStructure(data, 14)) != 0 ||
//mac address.
(ret = cosem_setOctetString(data, &it->macAddress)) != 0 ||
//status
(ret = cosem_setBitString(data, it->status, 5)) != 0 ||
//max RSSI
(ret = cosem_setInt8(data, it->maxRSSI)) != 0 ||
//average RSSI
(ret = cosem_setInt8(data, it->averageRSSI)) != 0 ||
//min RSSI
(ret = cosem_setInt8(data, it->minRSSI)) != 0 ||
//max LQI
(ret = cosem_setUInt8(data, it->maxLQI)) != 0 ||
//average LQI
(ret = cosem_setUInt8(data, it->averageLQI)) != 0 ||
//min LQI
(ret = cosem_setUInt8(data, it->minLQI)) != 0 ||
//last communication date time
(ret = cosem_setDateTimeAsOctetString(data, &it->lastCommunicationDateTime)) != 0 ||
//number of hops
(ret = cosem_setUInt8(data, it->numberOfHops)) != 0 ||
//transmission failures
(ret = cosem_setUInt8(data, it->transmissionFailures)) != 0 ||
//transmission successes
(ret = cosem_setUInt8(data, it->transmissionSuccesses)) != 0 ||
//application version
(ret = cosem_setUInt8(data, it->applicationVersion)) != 0 ||
//stack version
(ret = cosem_setUInt8(data, it->stackVersion)) != 0)
{
break;
}
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_ZIG_BEE_NETWORK_CONTROL
#ifndef DLMS_IGNORE_CHARGE
int getUnitCharge(gxUnitCharge* target, gxValueEventArg* e)
{
int ret = 0;
uint16_t pos;
gxChargeTable* it;
gxByteBuffer* data = e->value.byteArr;
if ((ret = cosem_setStructure(data, 3)) != 0 ||
//-------------
//charge per unit scaling
(ret = cosem_setStructure(data, 2)) != 0 ||
//commodity scale
(ret = cosem_setInt8(data, target->chargePerUnitScaling.commodityScale)) != 0 ||
//price scale
(ret = cosem_setInt8(data, target->chargePerUnitScaling.priceScale)) != 0 ||
//-------------
//commodity
(ret = cosem_setStructure(data, 3)) != 0 ||
//type
#ifndef DLMS_IGNORE_OBJECT_POINTERS
(ret = cosem_setUInt16(data, target->commodity.target == 0 ? 0 : target->commodity.target->objectType)) != 0 ||
#else
(ret = cosem_setUInt16(data, target->commodity.type)) != 0 ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
//logicalName
#ifndef DLMS_IGNORE_OBJECT_POINTERS
(ret = cosem_setOctetString2(data, obj_getLogicalName(target->commodity.target), 6)) != 0 ||
#else
(ret = cosem_setOctetString2(data, target->commodity.logicalName, 6)) != 0 ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
//attributeIndex
(ret = cosem_setInt8(data, target->commodity.attributeIndex)) != 0 ||
//-------------
//chargeTables
(ret = cosem_setArray(data, target->chargeTables.size)) != 0)
{
return ret;
}
for (pos = 0; pos != target->chargeTables.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&target->chargeTables, pos, (void**)&it, sizeof(gxChargeTable))) != 0 ||
(ret = cosem_setStructure(data, 2)) != 0 ||
//index
(ret = cosem_setOctetString2(data, it->index.data, it->index.size)) != 0 ||
//chargePerUnit
(ret = cosem_setInt16(data, it->chargePerUnit)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&target->chargeTables, pos, (void**)&it)) != 0 ||
(ret = cosem_setStructure(data, 2)) != 0 ||
//index
(ret = cosem_setOctetString(data, &it->index)) != 0 ||
//chargePerUnit
(ret = cosem_setInt16(data, it->chargePerUnit)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
return ret;
}
int cosem_getCharge(
gxValueEventArg* e)
{
gxCharge* object = (gxCharge*)e->target;
int ret = 0;
if (e->index == 2)
{
ret = cosem_setInt32(e->value.byteArr, object->totalAmountPaid);
}
else if (e->index == 3)
{
ret = cosem_setEnum(e->value.byteArr, object->chargeType);
}
else if (e->index == 4)
{
ret = cosem_setUInt8(e->value.byteArr, object->priority);
}
else if (e->index == 5)
{
ret = getUnitCharge(&object->unitChargeActive, e);
}
else if (e->index == 6)
{
ret = getUnitCharge(&object->unitChargePassive, e);
}
else if (e->index == 7)
{
ret = cosem_setDateTimeAsOctetString(e->value.byteArr, &object->unitChargeActivationTime);
}
else if (e->index == 8)
{
ret = cosem_setUInt32(e->value.byteArr, object->period);
}
else if (e->index == 9)
{
ret = cosem_setBitString(e->value.byteArr, object->chargeConfiguration, 2);
}
else if (e->index == 10)
{
ret = cosem_setDateTime(e->value.byteArr, &object->lastCollectionTime);
}
else if (e->index == 11)
{
ret = cosem_setInt32(e->value.byteArr, object->lastCollectionAmount);
}
else if (e->index == 12)
{
ret = cosem_setInt32(e->value.byteArr, object->totalAmountRemaining);
}
else if (e->index == 13)
{
ret = cosem_setUInt16(e->value.byteArr, object->proportion);
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_CHARGE
#ifndef DLMS_IGNORE_TOKEN_GATEWAY
int cosem_getTokenGateway(
gxValueEventArg* e)
{
int ret = 0;
uint16_t pos;
gxByteBuffer* data = e->value.byteArr;
#ifdef DLMS_IGNORE_MALLOC
gxTokenGatewayDescription* it;
#else
gxByteBuffer* it;
#endif //DLMS_IGNORE_MALLOC
gxTokenGateway* object = (gxTokenGateway*)e->target;
switch (e->index)
{
case 2:
ret = cosem_setOctetString2(data, object->token.data, (uint16_t)object->token.size);
break;
case 3:
ret = cosem_setDateTimeAsOctetString(data, &object->time);
break;
case 4:
if ((ret = cosem_setArray(data, object->descriptions.size)) == 0)
{
for (pos = 0; pos != object->descriptions.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->descriptions, pos, (void**)&it, sizeof(gxTokenGatewayDescription))) != 0)
{
break;
}
if ((ret = cosem_setOctetString2(data, it->value, it->size)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->descriptions, pos, (void**)&it)) != 0 ||
(ret = cosem_setOctetString(data, it)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
break;
case 5:
ret = cosem_setEnum(e->value.byteArr, object->deliveryMethod);
break;
case 6:
if ((ret = cosem_setStructure(data, 2)) != 0 ||
(ret = cosem_setEnum(data, object->status)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_BIT_STRING)) != 0 ||
(ret = hlp_setObjectCount(object->dataValue.size, data)) != 0 ||
(ret = bb_set(data, object->dataValue.data, ba_getByteCount(object->dataValue.size))) != 0)
{
}
break;
default:
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
}
return ret;
}
#endif //DLMS_IGNORE_TOKEN_GATEWAY
#ifndef DLMS_IGNORE_CREDIT
int cosem_getCredit(
gxValueEventArg* e)
{
gxCredit* object = (gxCredit*)e->target;
int ret = 0;
if (e->index == 2)
{
ret = cosem_setInt32(e->value.byteArr, object->currentCreditAmount);
}
else if (e->index == 3)
{
ret = cosem_setEnum(e->value.byteArr, object->type);
}
else if (e->index == 4)
{
ret = cosem_setUInt8(e->value.byteArr, object->priority);
}
else if (e->index == 5)
{
ret = cosem_setInt32(e->value.byteArr, object->warningThreshold);
}
else if (e->index == 6)
{
ret = cosem_setInt32(e->value.byteArr, object->limit);
}
else if (e->index == 7)
{
ret = cosem_setBitString(e->value.byteArr, object->creditConfiguration, 5);
}
else if (e->index == 8)
{
ret = cosem_setEnum(e->value.byteArr, object->status);
}
else if (e->index == 9)
{
ret = cosem_setInt32(e->value.byteArr, object->presetCreditAmount);
}
else if (e->index == 10)
{
ret = cosem_setInt32(e->value.byteArr, object->creditAvailableThreshold);
}
else if (e->index == 11)
{
ret = cosem_setDateTimeAsOctetString(e->value.byteArr, &object->period);
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_CREDIT
#ifndef DLMS_IGNORE_ACCOUNT
int cosem_getAccount(
gxValueEventArg* e)
{
int ret = 0;
uint16_t pos;
unsigned char* it;
gxCreditChargeConfiguration* ccc;
gxTokenGatewayConfiguration* gwc;
gxAccount* object = (gxAccount*)e->target;
gxByteBuffer* data = e->value.byteArr;
if (e->index == 2)
{
if ((ret = cosem_setStructure(data, 2)) != 0 ||
//payment mode
(ret = cosem_setEnum(data, object->paymentMode & 0x3)) != 0 ||
//account status
(ret = cosem_setEnum(data, object->accountStatus & 0x3)) != 0)
{
}
}
else if (e->index == 3)
{
ret = cosem_setUInt8(e->value.byteArr, object->currentCreditInUse);
}
else if (e->index == 4)
{
ret = cosem_setBitString(e->value.byteArr, object->currentCreditStatus, 7);
}
else if (e->index == 5)
{
ret = cosem_setInt32(e->value.byteArr, object->availableCredit);
}
else if (e->index == 6)
{
ret = cosem_setInt32(e->value.byteArr, object->amountToClear);
}
else if (e->index == 7)
{
ret = cosem_setInt32(e->value.byteArr, object->clearanceThreshold);
}
else if (e->index == 8)
{
ret = cosem_setInt32(e->value.byteArr, object->aggregatedDebt);
}
else if (e->index == 9)
{
if ((ret = cosem_setArray(data, object->creditReferences.size)) == 0)
{
for (pos = 0; pos != object->creditReferences.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->creditReferences, pos, (void**)&it, 6)) != 0 ||
#else
if ((ret = arr_getByIndex(&object->creditReferences, pos, (void**)&it)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = cosem_setOctetString2(data, it, 6)) != 0)
{
break;
}
}
}
}
else if (e->index == 10)
{
if ((ret = cosem_setArray(data, object->chargeReferences.size)) == 0)
{
for (pos = 0; pos != object->chargeReferences.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->chargeReferences, pos, (void**)&it, 6)) != 0 ||
#else
if ((ret = arr_getByIndex(&object->chargeReferences, pos, (void**)&it)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = cosem_setOctetString2(data, it, 6)) != 0)
{
break;
}
}
}
}
else if (e->index == 11)
{
if ((ret = cosem_setArray(data, object->creditChargeConfigurations.size)) == 0)
{
for (pos = 0; pos != object->creditChargeConfigurations.size; ++pos)
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->creditChargeConfigurations, pos, (void**)&ccc, sizeof(gxCreditChargeConfiguration))) != 0 ||
#else
if ((ret = arr_getByIndex(&object->creditChargeConfigurations, pos, (void**)&ccc)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = cosem_setStructure(data, 3)) != 0 ||
//credit reference
(ret = cosem_setOctetString2(data, ccc->creditReference, 6)) != 0 ||
//charge reference
(ret = cosem_setOctetString2(data, ccc->chargeReference, 6)) != 0 ||
//collection configuration
(ret = cosem_setBitString(data, ccc->collectionConfiguration, 3)) != 0)
{
break;
}
}
}
else if (e->index == 12)
{
if ((ret = cosem_setArray(data, object->tokenGatewayConfigurations.size)) == 0)
{
for (pos = 0; pos != object->tokenGatewayConfigurations.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->tokenGatewayConfigurations, pos, (void**)&gwc, sizeof(gxTokenGatewayConfiguration))) != 0 ||
#else
if ((ret = arr_getByIndex(&object->tokenGatewayConfigurations, pos, (void**)&gwc)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = cosem_setStructure(data, 2)) != 0 ||
//credit reference
(ret = cosem_setOctetString2(data, gwc->creditReference, 6)) != 0 ||
//token proportion
(ret = cosem_setUInt8(data, gwc->tokenProportion)) != 0)
{
break;
}
}
}
}
else if (e->index == 13)
{
ret = cosem_setDateTimeAsOctetString(e->value.byteArr, &object->accountActivationTime);
}
else if (e->index == 14)
{
ret = cosem_setDateTimeAsOctetString(e->value.byteArr, &object->accountClosureTime);
}
else if (e->index == 15)
{
if ((ret = cosem_setStructure(data, 3)) != 0 ||
//Name
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRING_UTF8)) != 0)
{
return ret;
}
#ifndef DLMS_IGNORE_MALLOC
if ((ret = hlp_setObjectCount(object->currency.name.size, data)) != 0 ||
(ret = bb_set(data, object->currency.name.data, object->currency.name.size)) != 0)
{
return ret;
}
#else
if ((ret = hlp_setObjectCount(object->currency.name.size, data)) != 0 ||
(ret = bb_set(data, (unsigned char*)object->currency.name.value, object->currency.name.size)) != 0)
{
return ret;
}
#endif //DLMS_IGNORE_MALLOC
//scale
if ((ret = cosem_setInt8(data, object->currency.scale)) != 0 ||
//unit
(ret = cosem_setEnum(data, object->currency.unit)) != 0)
{
return ret;
}
}
else if (e->index == 16)
{
ret = cosem_setInt32(e->value.byteArr, object->lowCreditThreshold);
}
else if (e->index == 17)
{
ret = cosem_setInt32(e->value.byteArr, object->nextCreditAvailableThreshold);
}
else if (e->index == 18)
{
ret = cosem_setUInt16(e->value.byteArr, object->maxProvision);
}
else if (e->index == 19)
{
ret = cosem_setInt32(e->value.byteArr, object->maxProvisionPeriod);
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_ACCOUNT
#ifndef DLMS_IGNORE_COMPACT_DATA
//Convert compact data buffer to array of values.
int compactData_getValues2(
dlmsSettings* settings,
gxByteBuffer* templateDescription,
gxByteBuffer* buffer,
variantArray* values,
unsigned char appendAA)
{
int ret;
gxDataInfo info;
dlmsVARIANT tmp;
gxByteBuffer data;
//If templateDescription or buffer is not given.
if (values == NULL || bb_size(templateDescription) == 0 || bb_size(buffer) == 0)
{
return DLMS_ERROR_CODE_INVALID_PARAMETER;
}
va_clear(values);
BYTE_BUFFER_INIT(&data);
bb_set(&data, templateDescription->data, templateDescription->size);
hlp_setObjectCount(buffer->size, &data);
bb_set(&data, buffer->data, buffer->size);
var_init(&tmp);
di_init(&info);
#ifdef DLMS_ITALIAN_STANDARD
info.appendAA = appendAA;
#endif //DLMS_ITALIAN_STANDARD
info.type = DLMS_DATA_TYPE_COMPACT_ARRAY;
if ((ret = dlms_getData(&data, &info, &tmp)) == 0 && tmp.Arr != NULL)
{
va_attach2(values, tmp.Arr);
}
var_clear(&tmp);
bb_clear(&data);
return ret;
}
//Convert compact data buffer to array of values.
int compactData_getValues(
dlmsSettings* settings,
gxByteBuffer* templateDescription,
gxByteBuffer* buffer,
variantArray* values)
{
return compactData_getValues2(settings, templateDescription, buffer, values, 0);
}
int cosem_getCompactData(
dlmsSettings* settings,
gxValueEventArg* e)
{
gxByteBuffer* data = data = e->value.byteArr;
gxCompactData* object = (gxCompactData*)e->target;
int ret;
switch (e->index)
{
case 2:
ret = cosem_setOctetString(data, &object->buffer);
break;
case 3:
ret = getColumns(settings, &object->captureObjects, data, e);
break;
case 4:
ret = cosem_setUInt8(e->value.byteArr, object->templateId);
break;
case 5:
ret = cosem_setOctetString(data, &object->templateDescription);
break;
case 6:
ret = cosem_setEnum(e->value.byteArr, object->captureMethod);
break;
default:
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
}
return ret;
}
#endif //DLMS_IGNORE_COMPACT_DATA
int cosem_getValue(
dlmsSettings* settings,
gxValueEventArg* e)
{
int ret;
if ((ret = cosem_getByteBuffer(e)) != 0)
{
return ret;
}
if (e->index == 1)
{
if ((ret = bb_setUInt8(e->value.byteArr, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = bb_setUInt8(e->value.byteArr, 6)) != 0 ||
(ret = bb_set(e->value.byteArr, e->target->logicalName, 6)) != 0)
{
}
return ret;
}
switch (e->target->objectType)
{
#ifndef DLMS_IGNORE_DATA
case DLMS_OBJECT_TYPE_DATA:
ret = cosem_getData(e);
break;
#endif //DLMS_IGNORE_DATA
#ifndef DLMS_IGNORE_REGISTER
case DLMS_OBJECT_TYPE_REGISTER:
ret = cosem_getRegister(e);
break;
#endif //DLMS_IGNORE_REGISTER
#ifndef DLMS_IGNORE_CLOCK
case DLMS_OBJECT_TYPE_CLOCK:
ret = cosem_getClock(e);
break;
#endif //DLMS_IGNORE_CLOCK
#ifndef DLMS_IGNORE_ACTION_SCHEDULE
case DLMS_OBJECT_TYPE_ACTION_SCHEDULE:
ret = cosem_getActionSchedule(e);
break;
#endif //DLMS_IGNORE_ACTION_SCHEDULE
#ifndef DLMS_IGNORE_ACTIVITY_CALENDAR
case DLMS_OBJECT_TYPE_ACTIVITY_CALENDAR:
ret = cosem_getActivityCalendar(e);
break;
#endif //DLMS_IGNORE_ACTIVITY_CALENDAR
#ifndef DLMS_IGNORE_ASSOCIATION_LOGICAL_NAME
case DLMS_OBJECT_TYPE_ASSOCIATION_LOGICAL_NAME:
ret = cosem_getAssociationLogicalName(settings, e);
break;
#endif //DLMS_IGNORE_ASSOCIATION_LOGICAL_NAME
#ifndef DLMS_IGNORE_ASSOCIATION_SHORT_NAME
#ifndef DLMS_IGNORE_SERVER
case DLMS_OBJECT_TYPE_ASSOCIATION_SHORT_NAME:
ret = cosem_getAssociationShortName(settings, e);
break;
#endif //DLMS_IGNORE_SERVER
#endif //DLMS_IGNORE_ASSOCIATION_SHORT_NAME
#ifndef DLMS_IGNORE_AUTO_ANSWER
case DLMS_OBJECT_TYPE_AUTO_ANSWER:
ret = cosem_getAutoAnswer(e);
break;
#endif //DLMS_IGNORE_AUTO_ANSWER
#ifndef DLMS_IGNORE_AUTO_CONNECT
case DLMS_OBJECT_TYPE_AUTO_CONNECT:
ret = cosem_getAutoConnect(e);
break;
#endif //DLMS_IGNORE_AUTO_CONNECT
#ifndef DLMS_IGNORE_DEMAND_REGISTER
case DLMS_OBJECT_TYPE_DEMAND_REGISTER:
ret = cosem_getDemandRegister(e);
break;
#endif //DLMS_IGNORE_DEMAND_REGISTER
#ifndef DLMS_IGNORE_MAC_ADDRESS_SETUP
case DLMS_OBJECT_TYPE_MAC_ADDRESS_SETUP:
ret = cosem_getMacAddressSetup(e);
break;
#endif //DLMS_IGNORE_MAC_ADDRESS_SETUP
#ifndef DLMS_IGNORE_EXTENDED_REGISTER
case DLMS_OBJECT_TYPE_EXTENDED_REGISTER:
ret = cosem_getExtendedRegister(e);
break;
#endif //DLMS_IGNORE_EXTENDED_REGISTER
#ifndef DLMS_IGNORE_GPRS_SETUP
case DLMS_OBJECT_TYPE_GPRS_SETUP:
ret = cosem_getGprsSetup(e);
break;
#endif //DLMS_IGNORE_GPRS_SETUP
#ifndef DLMS_IGNORE_SECURITY_SETUP
case DLMS_OBJECT_TYPE_SECURITY_SETUP:
ret = cosem_getSecuritySetup(e);
break;
#endif //DLMS_IGNORE_SECURITY_SETUP
#ifndef DLMS_IGNORE_IEC_HDLC_SETUP
case DLMS_OBJECT_TYPE_IEC_HDLC_SETUP:
ret = cosem_getIecHdlcSetup(e);
break;
#endif //DLMS_IGNORE_IEC_HDLC_SETUP
#ifndef DLMS_IGNORE_IEC_LOCAL_PORT_SETUP
case DLMS_OBJECT_TYPE_IEC_LOCAL_PORT_SETUP:
ret = cosem_getIecLocalPortSetup(e);
break;
#endif //DLMS_IGNORE_IEC_LOCAL_PORT_SETUP
#ifndef DLMS_IGNORE_IEC_TWISTED_PAIR_SETUP
case DLMS_OBJECT_TYPE_IEC_TWISTED_PAIR_SETUP:
ret = cosem_getIecTwistedPairSetup(e);
break;
#endif //DLMS_IGNORE_IEC_TWISTED_PAIR_SETUP
#ifndef DLMS_IGNORE_IP4_SETUP
case DLMS_OBJECT_TYPE_IP4_SETUP:
ret = cosem_getIP4Setup(e);
break;
#endif //DLMS_IGNORE_IP4_SETUP
#ifndef DLMS_IGNORE_IP6_SETUP
case DLMS_OBJECT_TYPE_IP6_SETUP:
ret = cosem_getIP6Setup(e);
break;
#endif //DLMS_IGNORE_IP6_SETUP
#ifndef DLMS_IGNORE_MBUS_SLAVE_PORT_SETUP
case DLMS_OBJECT_TYPE_MBUS_SLAVE_PORT_SETUP:
ret = cosem_getMbusSlavePortSetup(e);
break;
#endif //DLMS_IGNORE_MBUS_SLAVE_PORT_SETUP
#ifndef DLMS_IGNORE_IMAGE_TRANSFER
case DLMS_OBJECT_TYPE_IMAGE_TRANSFER:
ret = cosem_getImageTransfer(e);
break;
#endif //DLMS_IGNORE_IMAGE_TRANSFER
#ifndef DLMS_IGNORE_DISCONNECT_CONTROL
case DLMS_OBJECT_TYPE_DISCONNECT_CONTROL:
ret = cosem_getDisconnectControl(e);
break;
#endif //DLMS_IGNORE_DISCONNECT_CONTROL
#ifndef DLMS_IGNORE_LIMITER
case DLMS_OBJECT_TYPE_LIMITER:
ret = cosem_getLimiter(e);
break;
#endif //DLMS_IGNORE_LIMITER
#ifndef DLMS_IGNORE_MBUS_CLIENT
case DLMS_OBJECT_TYPE_MBUS_CLIENT:
ret = cosem_getmMbusClient(e);
break;
#endif //DLMS_IGNORE_MBUS_CLIENT
#ifndef DLMS_IGNORE_MODEM_CONFIGURATION
case DLMS_OBJECT_TYPE_MODEM_CONFIGURATION:
ret = cosem_getModemConfiguration(settings, e);
break;
#endif //DLMS_IGNORE_MODEM_CONFIGURATION
#ifndef DLMS_IGNORE_PPP_SETUP
case DLMS_OBJECT_TYPE_PPP_SETUP:
ret = cosem_getPppSetup(e);
break;
#endif //DLMS_IGNORE_PPP_SETUP
#ifndef DLMS_IGNORE_PROFILE_GENERIC
case DLMS_OBJECT_TYPE_PROFILE_GENERIC:
ret = cosem_getProfileGeneric(settings, e);
break;
#endif //DLMS_IGNORE_PROFILE_GENERIC
#ifndef DLMS_IGNORE_REGISTER_ACTIVATION
case DLMS_OBJECT_TYPE_REGISTER_ACTIVATION:
ret = cosem_getRegisterActivation(settings, e);
break;
#endif //DLMS_IGNORE_REGISTER_ACTIVATION
#ifndef DLMS_IGNORE_REGISTER_MONITOR
case DLMS_OBJECT_TYPE_REGISTER_MONITOR:
ret = cosem_getRegisterMonitor(e);
break;
#endif //DLMS_IGNORE_REGISTER_MONITOR
#ifndef DLMS_IGNORE_REGISTER_TABLE
case DLMS_OBJECT_TYPE_REGISTER_TABLE:
ret = cosem_getRegisterTable(e);
break;
#endif //DLMS_IGNORE_REGISTER_TABLE
#ifndef DLMS_IGNORE_ZIG_BEE_SAS_STARTUP
case DLMS_OBJECT_TYPE_ZIG_BEE_SAS_STARTUP:
//TODO:
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
assert(0);
#endif
ret = DLMS_ERROR_CODE_NOT_IMPLEMENTED;
break;
#endif //DLMS_IGNORE_ZIG_BEE_SAS_STARTUP
#ifndef DLMS_IGNORE_ZIG_BEE_SAS_JOIN
case DLMS_OBJECT_TYPE_ZIG_BEE_SAS_JOIN:
//TODO:
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
assert(0);
#endif
ret = DLMS_ERROR_CODE_NOT_IMPLEMENTED;
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:
//TODO:
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
assert(0);
#endif
ret = DLMS_ERROR_CODE_NOT_IMPLEMENTED;
break;
#endif //DLMS_IGNORE_ZIG_BEE_SAS_APS_FRAGMENTATION
#ifndef DLMS_IGNORE_ZIG_BEE_NETWORK_CONTROL
case DLMS_OBJECT_TYPE_ZIG_BEE_NETWORK_CONTROL:
ret = cosem_getZigbeeNetworkControl(e);
break;
#endif //DLMS_IGNORE_ZIG_BEE_NETWORK_CONTROL
#ifndef DLMS_IGNORE_SAP_ASSIGNMENT
case DLMS_OBJECT_TYPE_SAP_ASSIGNMENT:
ret = cosem_getSapAssignment(e);
break;
#endif //DLMS_IGNORE_SAP_ASSIGNMENT
#ifndef DLMS_IGNORE_SCHEDULE
case DLMS_OBJECT_TYPE_SCHEDULE:
ret = cosem_getSchedule(e);
break;
#endif //DLMS_IGNORE_SCHEDULE
#ifndef DLMS_IGNORE_SCRIPT_TABLE
case DLMS_OBJECT_TYPE_SCRIPT_TABLE:
ret = cosem_getScriptTable(e);
break;
#endif //DLMS_IGNORE_SCRIPT_TABLE
#ifndef DLMS_IGNORE_SPECIAL_DAYS_TABLE
case DLMS_OBJECT_TYPE_SPECIAL_DAYS_TABLE:
ret = cosem_getSpecialDaysTable(e);
break;
#endif //DLMS_IGNORE_SPECIAL_DAYS_TABLE
#ifndef DLMS_IGNORE_STATUS_MAPPING
case DLMS_OBJECT_TYPE_STATUS_MAPPING:
//TODO:
#if defined(_WIN32) || defined(_WIN64) || defined(__linux__)
assert(0);
#endif
ret = DLMS_ERROR_CODE_NOT_IMPLEMENTED;
break;
#endif //DLMS_IGNORE_STATUS_MAPPING
#ifndef DLMS_IGNORE_TCP_UDP_SETUP
case DLMS_OBJECT_TYPE_TCP_UDP_SETUP:
ret = cosem_getTcpUdpSetup(e);
break;
#endif //DLMS_IGNORE_TCP_UDP_SETUP
#ifndef DLMS_IGNORE_MBUS_DIAGNOSTIC
case DLMS_OBJECT_TYPE_MBUS_DIAGNOSTIC:
ret = cosem_getMbusDiagnostic(e);
break;
#endif //DLMS_IGNORE_MBUS_DIAGNOSTIC
#ifndef DLMS_IGNORE_MBUS_PORT_SETUP
case DLMS_OBJECT_TYPE_MBUS_PORT_SETUP:
ret = cosem_getMbusPortSetup(e);
break;
#endif //DLMS_IGNORE_MBUS_PORT_SETUP
#ifndef DLMS_IGNORE_G3_PLC_MAC_LAYER_COUNTERS
case DLMS_OBJECT_TYPE_G3_PLC_MAC_LAYER_COUNTERS:
ret = cosem_getG3PlcMacLayerCounters(e);
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 = cosem_getG3PlcMacSetup(e);
break;
#endif //DLMS_IGNORE_G3_PLC_MAC_SETUP
#ifndef DLMS_IGNORE_G3_PLC_6LO_WPAN
case DLMS_OBJECT_TYPE_G3_PLC_6LO_WPAN:
ret = cosem_getG3Plc6LoWPAN(e);
break;
#endif //DLMS_IGNORE_G3_PLC_6LO_WPAN
#ifndef DLMS_IGNORE_FUNCTION_CONTROL
case DLMS_OBJECT_TYPE_FUNCTION_CONTROL:
ret = cosem_getFunctionControl(e);
break;
#endif //DLMS_IGNORE_FUNCTION_CONTROL
#ifndef DLMS_IGNORE_ARRAY_MANAGER
case DLMS_OBJECT_TYPE_ARRAY_MANAGER:
ret = cosem_getArrayManager(e);
break;
#endif //DLMS_IGNORE_ARRAY_MANAGER
#ifndef DLMS_IGNORE_UTILITY_TABLES
case DLMS_OBJECT_TYPE_UTILITY_TABLES:
ret = cosem_getUtilityTables(e);
break;
#endif //DLMS_IGNORE_UTILITY_TABLES
#ifndef DLMS_IGNORE_MBUS_MASTER_PORT_SETUP
case DLMS_OBJECT_TYPE_MBUS_MASTER_PORT_SETUP:
ret = cosem_getMbusMasterPortSetup(e);
break;
#endif //
#ifndef DLMS_IGNORE_PUSH_SETUP
case DLMS_OBJECT_TYPE_PUSH_SETUP:
ret = cosem_getPushSetup(e);
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
ret = DLMS_ERROR_CODE_NOT_IMPLEMENTED;
break;
#endif //DLMS_IGNORE_DATA_PROTECTION
#ifndef DLMS_IGNORE_ACCOUNT
case DLMS_OBJECT_TYPE_ACCOUNT:
ret = cosem_getAccount(e);
break;
#endif //DLMS_IGNORE_ACCOUNT
#ifndef DLMS_IGNORE_CREDIT
case DLMS_OBJECT_TYPE_CREDIT:
ret = cosem_getCredit(e);
break;
#endif //DLMS_IGNORE_CREDIT
#ifndef DLMS_IGNORE_CHARGE
case DLMS_OBJECT_TYPE_CHARGE:
ret = cosem_getCharge(e);
break;
#endif //DLMS_IGNORE_CHARGE
#ifndef DLMS_IGNORE_TOKEN_GATEWAY
case DLMS_OBJECT_TYPE_TOKEN_GATEWAY:
ret = cosem_getTokenGateway(e);
break;
#endif //DLMS_IGNORE_TOKEN_GATEWAY
#ifndef DLMS_IGNORE_GSM_DIAGNOSTIC
case DLMS_OBJECT_TYPE_GSM_DIAGNOSTIC:
ret = cosem_getGsmDiagnostic(e);
break;
#endif //DLMS_IGNORE_GSM_DIAGNOSTIC
#ifndef DLMS_IGNORE_COMPACT_DATA
case DLMS_OBJECT_TYPE_COMPACT_DATA:
ret = cosem_getCompactData(settings, e);
break;
#endif //DLMS_IGNORE_COMPACT_DATA
#ifndef DLMS_IGNORE_PARAMETER_MONITOR
case DLMS_OBJECT_TYPE_PARAMETER_MONITOR:
ret = cosem_getParameterMonitor(e);
break;
#endif //DLMS_IGNORE_PARAMETER_MONITOR
#ifndef DLMS_IGNORE_LLC_SSCS_SETUP
case DLMS_OBJECT_TYPE_LLC_SSCS_SETUP:
ret = cosem_getLlcSscsSetup(e);
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 = cosem_getPrimeNbOfdmPlcPhysicalLayerCounters(e);
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 = cosem_getPrimeNbOfdmPlcMacSetup(e);
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 = cosem_getPrimeNbOfdmPlcMacFunctionalParameters(e);
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 = cosem_getPrimeNbOfdmPlcMacCounters(e);
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 = cosem_getPrimeNbOfdmPlcMacNetworkAdministrationData(e);
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 = cosem_getPrimeNbOfdmPlcApplicationsIdentification(e);
break;
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_APPLICATIONS_IDENTIFICATION
#ifndef DLMS_IGNORE_ARBITRATOR
case DLMS_OBJECT_TYPE_ARBITRATOR:
ret = cosem_getArbitrator(e);
break;
#endif //DLMS_IGNORE_ARBITRATOR
#ifndef DLMS_IGNORE_IEC_8802_LLC_TYPE1_SETUP
case DLMS_OBJECT_TYPE_IEC_8802_LLC_TYPE1_SETUP:
ret = cosem_getIec8802LlcType1Setup(e);
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:
ret = cosem_getIec8802LlcType2Setup(e);
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:
ret = cosem_getIec8802LlcType3Setup(e);
break;
#endif //DLMS_IGNORE_IEC_8802_LLC_TYPE3_SETUP
#ifndef DLMS_IGNORE_SFSK_ACTIVE_INITIATOR
case DLMS_OBJECT_TYPE_SFSK_ACTIVE_INITIATOR:
ret = cosem_getSFSKActiveInitiator(e);
break;
#endif //DLMS_IGNORE_SFSK_ACTIVE_INITIATOR
#ifndef DLMS_IGNORE_SFSK_MAC_COUNTERS
case DLMS_OBJECT_TYPE_SFSK_MAC_COUNTERS:
ret = cosem_getFSKMacCounters(e);
break;
#endif //DLMS_IGNORE_SFSK_MAC_COUNTERS
#ifndef DLMS_IGNORE_SFSK_MAC_SYNCHRONIZATION_TIMEOUTS
case DLMS_OBJECT_TYPE_SFSK_MAC_SYNCHRONIZATION_TIMEOUTS:
ret = cosem_getSFSKMacSynchronizationTimeouts(e);
break;
#endif //DLMS_IGNORE_SFSK_MAC_SYNCHRONIZATION_TIMEOUTS
#ifndef DLMS_IGNORE_SFSK_PHY_MAC_SETUP
case DLMS_OBJECT_TYPE_SFSK_PHY_MAC_SETUP:
ret = cosem_getSFSKPhyMacSetUp(e);
break;
#endif //DLMS_IGNORE_SFSK_PHY_MAC_SETUP
#ifndef DLMS_IGNORE_SFSK_REPORTING_SYSTEM_LIST
case DLMS_OBJECT_TYPE_SFSK_REPORTING_SYSTEM_LIST:
ret = cosem_getSFSKReportingSystemList(e);
break;
#endif //DLMS_IGNORE_SFSK_REPORTING_SYSTEM_LIST
#ifdef DLMS_ITALIAN_STANDARD
case DLMS_OBJECT_TYPE_TARIFF_PLAN:
ret = cosem_getTariffPlan(e);
break;
#endif //DLMS_ITALIAN_STANDARD
default:
//Unknown type.
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#ifdef DLMS_ITALIAN_STANDARD
unsigned char getInterval(gxInterval* interval)
{
unsigned char b = (unsigned char)(interval->useInterval ? 1 : 0);
b |= (unsigned char)(interval->intervalTariff << 1);
b |= (unsigned char)(interval->startHour << 3);
return b;
}
int getIntervals(gxInterval* interval, gxByteBuffer* data)
{
int ret;
if ((ret = cosem_setArray(data, 5)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT8)) != 0 ||
(ret = bb_setUInt8(data, getInterval(interval))) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT8)) != 0 ||
(ret = bb_setUInt8(data, getInterval(interval + 1))) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT8)) != 0 ||
(ret = bb_setUInt8(data, getInterval(interval + 2))) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT8)) != 0 ||
(ret = bb_setUInt8(data, getInterval(interval + 3))) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT8)) != 0 ||
(ret = bb_setUInt8(data, getInterval(interval + 4))) != 0)
{
return ret;
}
return ret;
}
int getSeason(gxBandDescriptor* season, gxByteBuffer* data)
{
int ret;
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 5)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT8)) != 0 ||
(ret = bb_setUInt8(data, season->dayOfMonth)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT8)) != 0 ||
(ret = bb_setUInt8(data, season->month)) != 0 ||
(ret = getIntervals(season->workingDayIntervals, data)) != 0 ||
(ret = getIntervals(season->saturdayIntervals, data)) != 0 ||
(ret = getIntervals(season->holidayIntervals, data)) != 0)
{
return ret;
}
return ret;
}
int cosem_getTariffPlan(gxValueEventArg* e)
{
uint16_t it;
int pos, ret;
gxByteBuffer* data;
gxTariffPlan* object = (gxTariffPlan*)e->target;
switch (e->index)
{
case 2:
if (object->calendarName == NULL)
{
ret = cosem_setString(e->value.byteArr, object->calendarName, 0);
}
else
{
ret = cosem_setString(e->value.byteArr, object->calendarName, (uint16_t)strlen(object->calendarName));
}
break;
case 3:
ret = cosem_setBoolean(e->value.byteArr, object->enabled);
break;
case 4:
{
data = e->value.byteArr;
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 4)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT8)) != 0 ||
(ret = bb_setUInt8(data, object->plan.defaultTariffBand)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_ARRAY)) != 0 ||
(ret = bb_setUInt8(data, 2)) != 0 ||
(ret = getSeason(&object->plan.winterSeason, data)) != 0 ||
(ret = getSeason(&object->plan.summerSeason, data)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_BIT_STRING)) != 0 ||
(ret = hlp_setObjectCount(object->plan.weeklyActivation.size, data)) != 0 ||
(ret = bb_set(data, object->plan.weeklyActivation.data, ba_getByteCount(object->plan.weeklyActivation.size))) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_ARRAY)) != 0 ||
(ret = bb_setUInt8(data, (unsigned char)object->plan.specialDays.size)) != 0)
{
return ret;
}
for (pos = 0; pos != object->plan.specialDays.size; ++pos)
{
if ((ret = arr_getByIndex(&object->plan.specialDays, pos, (void**)&it)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(data, it)) != 0)
{
return ret;
}
}
}
break;
case 5:
{
data = e->value.byteArr;
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
//Count
(ret = bb_setUInt8(data, 2)) != 0 ||
//Time
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = bb_setUInt8(data, 4)) != 0 ||
(ret = var_getTime(&object->activationTime, data)) != 0 ||
//Date
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = bb_setUInt8(data, 5)) != 0 ||
(ret = var_getDate(&object->activationTime, data)) != 0)
{
return ret;
}
}
break;
default:
ret = DLMS_ERROR_CODE_READ_WRITE_DENIED;
}
return ret;
}
#endif //DLMS_ITALIAN_STANDARD
#ifndef DLMS_IGNORE_GSM_DIAGNOSTIC
int cosem_getGsmDiagnostic(
gxValueEventArg* e)
{
gxAdjacentCell* it;
gxByteBuffer* data = e->value.byteArr;
gxGsmDiagnostic* object = (gxGsmDiagnostic*)e->target;
int ret;
uint16_t pos;
switch (e->index)
{
case 2:
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
ret = cosem_setString2(e->value.byteArr, &object->operatorName);
#else
ret = cosem_setString(e->value.byteArr, object->operatorName,
object->operatorName != NULL ? (uint16_t)strlen(object->operatorName) : 0);
#endif //DLMS_IGNORE_MALLOC
break;
case 3:
ret = cosem_setEnum(e->value.byteArr, object->status);
break;
case 4:
ret = cosem_setEnum(e->value.byteArr, object->circuitSwitchStatus);
break;
case 5:
ret = cosem_setEnum(e->value.byteArr, object->packetSwitchStatus);
break;
case 6:
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) == 0)
{
if (object->base.version == 0)
{
if ((ret = bb_setUInt8(data, 4)) != 0 ||
//cellId.
(ret = cosem_setUInt16(data, (uint16_t)object->cellInfo.cellId)) != 0)
{
return ret;
}
}
else
{
if ((ret = bb_setUInt8(data, 7)) != 0 ||
//cellId.
(ret = cosem_setUInt32(data, object->cellInfo.cellId)) != 0)
{
return ret;
}
}
//LocationId.
if ((ret = cosem_setUInt16(data, object->cellInfo.locationId)) != 0 ||
//SignalQuality.
(ret = cosem_setUInt8(data, object->cellInfo.signalQuality)) != 0 ||
//Ber.
(ret = cosem_setUInt8(data, object->cellInfo.ber)) != 0)
{
return ret;
}
if (object->base.version > 0)
{
if (//mobileCountryCode.
(ret = cosem_setUInt16(data, object->cellInfo.mobileCountryCode)) != 0 ||
//MobileNetworkCode.
(ret = cosem_setUInt16(data, object->cellInfo.mobileNetworkCode)) != 0 ||
//ChannelNumber.
(ret = cosem_setUInt32(data, object->cellInfo.channelNumber)) != 0)
{
}
}
}
break;
case 7:
if ((ret = cosem_setArray(data, object->adjacentCells.size)) == 0)
{
for (pos = 0; pos != object->adjacentCells.size; ++pos)
{
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->adjacentCells, pos, (void**)&it, sizeof(gxAdjacentCell))) != 0 ||
#else
if ((ret = arr_getByIndex(&object->adjacentCells, pos, (void**)&it)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = cosem_setStructure(data, 2)) != 0)
{
break;
}
if (object->base.version == 0)
{
//cellId.
if ((ret = cosem_setUInt16(data, (uint16_t)it->cellId)) != 0)
{
break;
}
}
else
{
//cellId.
if ((ret = cosem_setUInt32(data, it->cellId)) != 0)
{
break;
}
}
//SignalQuality.
if ((ret = cosem_setUInt8(data, it->signalQuality)) != 0)
{
break;
}
}
}
break;
case 8:
ret = cosem_setDateTime(e->value.byteArr, &object->captureTime);
break;
default:
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_GSM_DIAGNOSTIC
#ifndef DLMS_IGNORE_PARAMETER_MONITOR
int cosem_getParameterMonitor(
gxValueEventArg* e)
{
int ret = 0;
uint16_t pos;
gxByteBuffer* data = e->value.byteArr;
gxParameterMonitor* object = (gxParameterMonitor*)e->target;
switch (e->index)
{
case 2:
{
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 4)) != 0)
{
return ret;
}
#ifndef DLMS_IGNORE_OBJECT_POINTERS
if (object->changedParameter.target == NULL)
{
if ((ret = cosem_setUInt16(data, 0)) != 0 ||
(ret = cosem_setOctetString2(data, EMPTY_LN, 6)) != 0 ||
(ret = cosem_setInt8(data, 0)) != 0 ||
(ret = bb_setUInt8(data, 0)) != 0)
{
//Error code is returned at the end of the function.
}
}
else
{
if ((ret = cosem_setUInt16(data, object->changedParameter.target->objectType)) != 0 ||
(ret = cosem_setOctetString2(data, object->changedParameter.target->logicalName, 6)) != 0 ||
(ret = cosem_setInt8(data, object->changedParameter.attributeIndex)) != 0 ||
(ret = cosem_setVariant(data, &object->changedParameter.value)) != 0)
{
//Error code is returned at the end of the function.
}
}
#else
if ((ret = cosem_setUInt16(data, object->changedParameter.type)) != 0 ||
(ret = cosem_setOctetString2(data, object->changedParameter.logicalName, 6)) != 0 ||
(ret = cosem_setInt8(data, object->changedParameter.attributeIndex)) != 0 ||
(ret = cosem_setVariant(data, &object->changedParameter.value)) != 0)
{
//Error code is returned at the end of the function.
}
#endif //DLMS_IGNORE_OBJECT_POINTERS
}
break;
case 3:
ret = cosem_setDateTimeAsOctetString(e->value.byteArr, &object->captureTime);
break;
case 4:
{
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
gxTarget* it;
#else
gxKey* it;
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setArray(data, object->parameters.size)) == 0)
{
for (pos = 0; pos != object->parameters.size; ++pos)
{
#if defined(DLMS_IGNORE_MALLOC) || defined(DLMS_COSEM_EXACT_DATA_TYPES)
#ifdef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->parameters, pos, (void**)&it, sizeof(gxTarget))) != 0 ||
#else
if ((ret = arr_getByIndex(&object->parameters, pos, (void**)&it)) != 0 ||
#endif //DLMS_IGNORE_MALLOC
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
(ret = bb_setUInt8(data, 3)) != 0 ||
//Type.
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_UINT16)) != 0 ||
(ret = bb_setUInt16(data, OBJECT_TYPE)) != 0 ||
//LN
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = bb_setUInt8(data, 6)) != 0 ||
#ifdef DLMS_IGNORE_OBJECT_POINTERS
(ret = bb_set(data, it->logicalName, 6)) != 0 ||
#else
(ret = bb_set(data, it->target->logicalName, 6)) != 0 ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
//attributeIndex
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_INT8)) != 0 ||
(ret = bb_setUInt8(data, it->attributeIndex)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->parameters, pos, (void**)&it)) != 0 ||
(ret = cosem_setStructure(data, 3)) != 0 ||
//Type.
(ret = cosem_setUInt16(data, ((gxObject*)it->key)->objectType)) != 0 ||
//LN
(ret = cosem_setOctetString2(data, ((gxObject*)it->key)->logicalName, 6)) != 0 ||
//attributeIndex
(ret = cosem_setInt8(data, ((gxTarget*)it->value)->attributeIndex)) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
}
}
}
break;
default:
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
}
return ret;
}
#endif //DLMS_IGNORE_PARAMETER_MONITOR
#ifndef DLMS_IGNORE_LLC_SSCS_SETUP
int cosem_getLlcSscsSetup(
gxValueEventArg* e)
{
int ret;
gxLlcSscsSetup* object = (gxLlcSscsSetup*)e->target;
switch (e->index)
{
case 2:
ret = cosem_setUInt16(e->value.byteArr, object->serviceNodeAddress);
break;
case 3:
ret = cosem_setUInt16(e->value.byteArr, object->baseNodeAddress);
break;
default:
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
}
return ret;
}
#endif //DLMS_IGNORE_LLC_SSCS_SETUP
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_PHYSICAL_LAYER_COUNTERS
int cosem_getPrimeNbOfdmPlcPhysicalLayerCounters(
gxValueEventArg* e)
{
int ret;
gxPrimeNbOfdmPlcPhysicalLayerCounters* object = (gxPrimeNbOfdmPlcPhysicalLayerCounters*)e->target;
switch (e->index)
{
case 2:
ret = cosem_setUInt16(e->value.byteArr, object->crcIncorrectCount);
break;
case 3:
ret = cosem_setUInt16(e->value.byteArr, object->crcFailedCount);
break;
case 4:
ret = cosem_setUInt16(e->value.byteArr, object->txDropCount);
break;
case 5:
ret = cosem_setUInt16(e->value.byteArr, object->rxDropCount);
break;
default:
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
}
return ret;
}
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_PHYSICAL_LAYER_COUNTERS
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_SETUP
int cosem_getPrimeNbOfdmPlcMacSetup(
gxValueEventArg* e)
{
int ret;
gxPrimeNbOfdmPlcMacSetup* object = (gxPrimeNbOfdmPlcMacSetup*)e->target;
switch (e->index)
{
case 2:
ret = cosem_setUInt8(e->value.byteArr, object->macMinSwitchSearchTime);
break;
case 3:
ret = cosem_setUInt8(e->value.byteArr, object->macMaxPromotionPdu);
break;
case 4:
ret = cosem_setUInt8(e->value.byteArr, object->macPromotionPduTxPeriod);
break;
case 5:
ret = cosem_setUInt8(e->value.byteArr, object->macBeaconsPerFrame);
break;
case 6:
ret = cosem_setUInt8(e->value.byteArr, object->macScpMaxTxAttempts);
break;
case 7:
ret = cosem_setUInt8(e->value.byteArr, object->macCtlReTxTimer);
break;
case 8:
ret = cosem_setUInt8(e->value.byteArr, object->macMaxCtlReTx);
break;
default:
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
}
return ret;
}
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_SETUP
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_FUNCTIONAL_PARAMETERS
int cosem_getPrimeNbOfdmPlcMacFunctionalParameters(
gxValueEventArg* e)
{
int ret;
gxPrimeNbOfdmPlcMacFunctionalParameters* object = (gxPrimeNbOfdmPlcMacFunctionalParameters*)e->target;
switch (e->index)
{
case 2:
ret = cosem_setInt16(e->value.byteArr, object->lnId);
break;
case 3:
ret = cosem_setUInt8(e->value.byteArr, object->lsId);
break;
case 4:
ret = cosem_setUInt8(e->value.byteArr, object->sId);
break;
case 5:
{
ret = cosem_setOctetString(e->value.byteArr, &object->sna);
}
break;
case 6:
ret = cosem_setEnum(e->value.byteArr, object->state);
break;
case 7:
ret = cosem_setUInt16(e->value.byteArr, object->scpLength);
break;
case 8:
ret = cosem_setUInt8(e->value.byteArr, object->nodeHierarchyLevel);
break;
case 9:
ret = cosem_setUInt8(e->value.byteArr, object->beaconSlotCount);
break;
case 10:
ret = cosem_setUInt8(e->value.byteArr, object->beaconRxSlot);
break;
case 11:
ret = cosem_setUInt8(e->value.byteArr, object->beaconTxSlot);
break;
case 12:
ret = cosem_setUInt8(e->value.byteArr, object->beaconRxFrequency);
break;
case 13:
ret = cosem_setUInt8(e->value.byteArr, object->beaconTxFrequency);
break;
case 14:
ret = cosem_setEnum(e->value.byteArr, (unsigned char)object->capabilities);
break;
default:
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
}
return ret;
}
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_FUNCTIONAL_PARAMETERS
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_COUNTERS
int cosem_getPrimeNbOfdmPlcMacCounters(
gxValueEventArg* e)
{
int ret;
gxPrimeNbOfdmPlcMacCounters* object = (gxPrimeNbOfdmPlcMacCounters*)e->target;
switch (e->index)
{
case 2:
ret = cosem_setUInt32(e->value.byteArr, object->txDataPktCount);
break;
case 3:
ret = cosem_setUInt32(e->value.byteArr, object->rxDataPktCount);
break;
case 4:
ret = cosem_setUInt32(e->value.byteArr, object->txCtrlPktCount);
break;
case 5:
ret = cosem_setUInt32(e->value.byteArr, object->rxCtrlPktCount);
break;
case 6:
ret = cosem_setUInt32(e->value.byteArr, object->csmaFailCount);
break;
case 7:
ret = cosem_setUInt32(e->value.byteArr, object->csmaChBusyCount);
break;
default:
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
}
return ret;
}
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_COUNTERS
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_NETWORK_ADMINISTRATION_DATA
int cosem_getMulticastEntries(gxValueEventArg* e)
{
gxMacMulticastEntry* it;
int ret;
uint16_t pos;
gxPrimeNbOfdmPlcMacNetworkAdministrationData* object = (gxPrimeNbOfdmPlcMacNetworkAdministrationData*)e->target;
gxByteBuffer* data = e->value.byteArr;
if ((ret = cosem_setArray(data, object->multicastEntries.size)) == 0)
{
for (pos = 0; pos != object->multicastEntries.size; ++pos)
{
if ((ret = cosem_setStructure(data, 2)) != 0)
{
break;
}
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->multicastEntries, pos, (void**)&it)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->multicastEntries, pos, (void**)&it, sizeof(gxMacMulticastEntry))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setInt8(data, it->id)) != 0 ||
(ret = cosem_setInt16(data, it->members)) != 0)
{
break;
}
}
}
return ret;
}
int cosem_getSwitchTable(gxValueEventArg* e)
{
uint16_t* it;
int ret;
uint16_t pos;
gxPrimeNbOfdmPlcMacNetworkAdministrationData* object = (gxPrimeNbOfdmPlcMacNetworkAdministrationData*)e->target;
gxByteBuffer* data = e->value.byteArr;
if ((ret = cosem_setArray(data, object->switchTable.size)) == 0)
{
for (pos = 0; pos != object->switchTable.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->switchTable, pos, (void**)&it)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->switchTable, pos, (void**)&it, sizeof(short))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setInt16(data, *it)) != 0)
{
break;
}
}
}
return ret;
}
int cosem_getDirectTable(gxValueEventArg* e)
{
gxMacDirectTable* it;
int ret;
uint16_t pos;
gxPrimeNbOfdmPlcMacNetworkAdministrationData* object = (gxPrimeNbOfdmPlcMacNetworkAdministrationData*)e->target;
gxByteBuffer* data = e->value.byteArr;
if ((ret = cosem_setArray(data, object->directTable.size)) == 0)
{
for (pos = 0; pos != object->directTable.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->directTable, pos, (void**)&it)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->directTable, pos, (void**)&it, sizeof(gxMacDirectTable))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setStructure(data, 7)) != 0 ||
(ret = cosem_setInt16(data, it->sourceSId)) != 0 ||
(ret = cosem_setInt16(data, it->sourceLnId)) != 0 ||
(ret = cosem_setInt16(data, it->sourceLcId)) != 0 ||
(ret = cosem_setInt16(data, it->destinationSId)) != 0 ||
(ret = cosem_setInt16(data, it->destinationLnId)) != 0 ||
(ret = cosem_setInt16(data, it->destinationLcId)) != 0 ||
(ret = cosem_setOctetString2(data, it->did, sizeof(it->did))) != 0)
{
break;
}
}
}
return ret;
}
int cosem_getAvailableSwitches(gxValueEventArg* e)
{
gxMacAvailableSwitch* it;
int ret;
uint16_t pos;
gxPrimeNbOfdmPlcMacNetworkAdministrationData* object = (gxPrimeNbOfdmPlcMacNetworkAdministrationData*)e->target;
gxByteBuffer* data = e->value.byteArr;
if ((ret = cosem_setArray(data, object->availableSwitches.size)) == 0)
{
for (pos = 0; pos != object->availableSwitches.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->availableSwitches, pos, (void**)&it)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->availableSwitches, pos, (void**)&it, sizeof(gxMacAvailableSwitch))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setStructure(data, 5)) != 0 ||
(ret = cosem_setOctetString2(data, it->sna.data, (uint16_t)it->sna.size)) != 0 ||
(ret = cosem_setInt16(data, it->lsId)) != 0 ||
(ret = cosem_setInt8(data, it->level)) != 0 ||
(ret = cosem_setInt8(data, it->rxLevel)) != 0 ||
(ret = cosem_setInt8(data, it->rxSnr)) != 0)
{
break;
}
}
}
return ret;
}
int cosem_getCommunications(gxValueEventArg* e)
{
gxMacPhyCommunication* it;
int ret;
uint16_t pos;
gxPrimeNbOfdmPlcMacNetworkAdministrationData* object = (gxPrimeNbOfdmPlcMacNetworkAdministrationData*)e->target;
gxByteBuffer* data = e->value.byteArr;
if ((ret = cosem_setArray(data, object->communications.size)) == 0)
{
for (pos = 0; pos != object->communications.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->communications, pos, (void**)&it)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->communications, pos, (void**)&it, sizeof(gxMacPhyCommunication))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setStructure(data, 9)) != 0 ||
(ret = cosem_setOctetString2(data, it->eui, sizeof(it->eui))) != 0 ||
(ret = cosem_setInt8(data, it->txPower)) != 0 ||
(ret = cosem_setInt8(data, it->txCoding)) != 0 ||
(ret = cosem_setInt8(data, it->rxCoding)) != 0 ||
(ret = cosem_setInt8(data, it->rxLvl)) != 0 ||
(ret = cosem_setInt8(data, it->snr)) != 0 ||
(ret = cosem_setInt8(data, it->txPowerModified)) != 0 ||
(ret = cosem_setInt8(data, it->txCodingModified)) != 0 ||
(ret = cosem_setInt8(data, it->rxCodingModified)) != 0)
{
break;
}
}
}
return ret;
}
int cosem_getPrimeNbOfdmPlcMacNetworkAdministrationData(
gxValueEventArg* e)
{
int ret;
switch (e->index)
{
case 2:
ret = cosem_getMulticastEntries(e);
break;
case 3:
ret = cosem_getSwitchTable(e);
break;
case 4:
ret = cosem_getDirectTable(e);
break;
case 5:
ret = cosem_getAvailableSwitches(e);
break;
case 6:
ret = cosem_getCommunications(e);
break;
default:
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
}
return ret;
}
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_MAC_NETWORK_ADMINISTRATION_DATA
#ifndef DLMS_IGNORE_PRIME_NB_OFDM_PLC_APPLICATIONS_IDENTIFICATION
int cosem_getPrimeNbOfdmPlcApplicationsIdentification(
gxValueEventArg* e)
{
int ret;
gxPrimeNbOfdmPlcApplicationsIdentification* object = (gxPrimeNbOfdmPlcApplicationsIdentification*)e->target;
switch (e->index)
{
case 2:
{
ret = cosem_setOctetString2(e->value.byteArr, object->firmwareVersion.data, (uint16_t)object->firmwareVersion.size);
}
break;
case 3:
ret = cosem_setUInt16(e->value.byteArr, object->vendorId);
break;
case 4:
ret = cosem_setUInt16(e->value.byteArr, object->productId);
break;
default:
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
}
return ret;
}
#endif //DLMS_IGNORE_PRIME_NB_OFDM_PLC_APPLICATIONS_IDENTIFICATION
#ifndef DLMS_IGNORE_ARBITRATOR
int cosem_getArbitrator(gxValueEventArg* e)
{
int ret;
uint16_t pos;
gxActionItem* it;
gxByteBuffer* data = e->value.byteArr;
gxArbitrator* object = (gxArbitrator*)e->target;
switch (e->index)
{
case 2:
{
if ((ret = cosem_setArray(data, object->actions.size)) == 0)
{
for (pos = 0; pos != object->actions.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->actions, pos, (void**)&it)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->actions, pos, (void**)&it, sizeof(gxMacAvailableSwitch))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_STRUCTURE)) != 0 ||
//Count
(ret = bb_setUInt8(data, 2)) != 0 ||
(ret = bb_setUInt8(data, DLMS_DATA_TYPE_OCTET_STRING)) != 0 ||
(ret = bb_setUInt8(data, 6)) != 0 ||
#ifndef DLMS_IGNORE_OBJECT_POINTERS
(ret = bb_set(data, obj_getLogicalName((gxObject*)it->script), 6)) != 0 ||
#else
(ret = bb_set(data, it->script->executedScriptLogicalName, 6)) != 0 ||
#endif //DLMS_IGNORE_OBJECT_POINTERS
(ret = cosem_setUInt16(data, it->scriptSelector)) != 0)
{
break;
}
}
}
}
break;
case 3:
{
bitArray* a;
if ((ret = cosem_setArray(data, object->permissionsTable.size)) == 0)
{
for (pos = 0; pos != object->permissionsTable.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->permissionsTable, pos, (void**)&a)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->permissionsTable, pos, (void**)&a, sizeof(bitArray))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_BIT_STRING)) != 0 ||
(ret = hlp_setObjectCount(a->size, data)) != 0)
{
break;
}
ret = bb_set(e->value.byteArr, a->data, ba_getByteCount(a->size));
}
}
}
break;
case 4:
{
dlmsVARIANT* v;
if ((ret = cosem_setArray(data, object->weightingsTable.size)) == 0)
{
for (pos = 0; pos != object->weightingsTable.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->weightingsTable, pos, (void**)&v)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->weightingsTable, pos, (void**)&v, sizeof(dlmsVARIANT))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setVariant(data, v)) != 0)
{
break;
}
}
}
}
break;
case 5:
{
bitArray* a;
if ((ret = cosem_setArray(data, object->mostRecentRequestsTable.size)) == 0)
{
for (pos = 0; pos != object->mostRecentRequestsTable.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->mostRecentRequestsTable, pos, (void**)&a)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->mostRecentRequestsTable, pos, (void**)&a, sizeof(bitArray))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = bb_setUInt8(data, DLMS_DATA_TYPE_BIT_STRING)) != 0 ||
(ret = hlp_setObjectCount(a->size, data)) != 0)
{
break;
}
ret = bb_set(e->value.byteArr, a->data, ba_getByteCount(a->size));
}
}
}
break;
case 6:
ret = cosem_setUInt8(data, object->lastOutcome);
break;
default:
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
}
return ret;
}
#endif //DLMS_IGNORE_ARBITRATOR
#ifndef DLMS_IGNORE_IEC_8802_LLC_TYPE1_SETUP
int cosem_getIec8802LlcType1Setup(
gxValueEventArg* e)
{
int ret = 0;
gxByteBuffer* data = e->value.byteArr;
gxIec8802LlcType1Setup* object = (gxIec8802LlcType1Setup*)e->target;
if (e->index == 2)
{
ret = cosem_setUInt16(data, object->maximumOctetsUiPdu);
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_IEC_8802_LLC_TYPE1_SETUP
#ifndef DLMS_IGNORE_IEC_8802_LLC_TYPE2_SETUP
int cosem_getIec8802LlcType2Setup(
gxValueEventArg* e)
{
int ret = 0;
gxByteBuffer* data = e->value.byteArr;
gxIec8802LlcType2Setup* object = (gxIec8802LlcType2Setup*)e->target;
switch (e->index)
{
case 2:
ret = cosem_setUInt8(data, object->transmitWindowSizeK);
break;
case 3:
ret = cosem_setUInt8(data, object->transmitWindowSizeRW);
break;
case 4:
ret = cosem_setUInt16(data, object->maximumOctetsPdu);
break;
case 5:
ret = cosem_setUInt8(data, object->maximumNumberTransmissions);
break;
case 6:
ret = cosem_setUInt16(data, object->acknowledgementTimer);
break;
case 7:
ret = cosem_setUInt16(data, object->bitTimer);
break;
case 8:
ret = cosem_setUInt16(data, object->rejectTimer);
break;
case 9:
ret = cosem_setUInt16(data, object->busyStateTimer);
break;
default:
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
}
return ret;
}
#endif //DLMS_IGNORE_IEC_8802_LLC_TYPE2_SETUP
#ifndef DLMS_IGNORE_IEC_8802_LLC_TYPE3_SETUP
int cosem_getIec8802LlcType3Setup(
gxValueEventArg* e)
{
int ret = 0;
gxByteBuffer* data = e->value.byteArr;
gxIec8802LlcType3Setup* object = (gxIec8802LlcType3Setup*)e->target;
switch (e->index)
{
case 2:
ret = cosem_setUInt16(data, object->maximumOctetsACnPdu);
break;
case 3:
ret = cosem_setUInt8(data, object->maximumTransmissions);
break;
case 4:
ret = cosem_setUInt16(data, object->acknowledgementTime);
break;
case 5:
ret = cosem_setUInt16(data, object->receiveLifetime);
break;
case 6:
ret = cosem_setUInt16(data, object->transmitLifetime);
break;
default:
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
}
return ret;
}
#endif //DLMS_IGNORE_IEC_8802_LLC_TYPE3_SETUP
#ifndef DLMS_IGNORE_SFSK_ACTIVE_INITIATOR
int cosem_getSFSKActiveInitiator(
gxValueEventArg* e)
{
int ret;
gxByteBuffer* data = e->value.byteArr;
gxSFSKActiveInitiator* object = (gxSFSKActiveInitiator*)e->target;
if (e->index == 2)
{
if ((ret = cosem_setStructure(data, 3)) == 0 &&
(ret = cosem_setOctetString(data, &object->systemTitle)) == 0 &&
(ret = cosem_setUInt16(data, object->macAddress)) == 0 &&
(ret = cosem_setUInt8(data, object->lSapSelector)) == 0)
{
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_SFSK_ACTIVE_INITIATOR
#ifndef DLMS_IGNORE_SFSK_MAC_COUNTERS
int cosem_getFSKMacCounters(
gxValueEventArg* e)
{
int ret = 0;
uint16_t pos;
gxByteBuffer* data = e->value.byteArr;
gxFSKMacCounters* object = (gxFSKMacCounters*)e->target;
switch (e->index)
{
case 2:
{
gxUint16PairUint32* it;
if ((ret = cosem_setArray(data, object->synchronizationRegister.size)) == 0)
{
for (pos = 0; pos != object->synchronizationRegister.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->synchronizationRegister, pos, (void**)&it)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->synchronizationRegister, pos, (void**)&it, sizeof(gxFSKMacCounters))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setStructure(data, 2)) != 0 ||
(ret = cosem_setUInt16(data, it->first)) != 0 ||
(ret = cosem_setUInt32(data, it->second)) != 0)
{
break;
}
}
}
}
break;
case 3:
{
if ((ret = cosem_setStructure(data, 5)) == 0 &&
(ret = cosem_setUInt32(data, object->physicalLayerDesynchronization)) == 0 &&
(ret = cosem_setUInt32(data, object->timeOutNotAddressedDesynchronization)) == 0 &&
(ret = cosem_setUInt32(data, object->timeOutFrameNotOkDesynchronization)) == 0 &&
(ret = cosem_setUInt32(data, object->writeRequestDesynchronization)) == 0 &&
(ret = cosem_setUInt32(data, object->wrongInitiatorDesynchronization)) == 0)
{
}
}
break;
case 4:
{
gxUint16PairUint32* it;
if ((ret = cosem_setArray(data, object->broadcastFramesCounter.size)) == 0)
{
for (pos = 0; pos != object->broadcastFramesCounter.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->broadcastFramesCounter, pos, (void**)&it)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->broadcastFramesCounter, pos, (void**)&it, sizeof(gxFSKMacCounters))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setStructure(data, 2)) != 0 ||
(ret = cosem_setUInt16(data, it->first)) != 0 ||
(ret = cosem_setUInt32(data, it->second)) != 0)
{
break;
}
}
}
}
break;
case 5:
ret = cosem_setUInt32(data, object->repetitionsCounter);
break;
case 6:
ret = cosem_setUInt32(data, object->transmissionsCounter);
break;
case 7:
ret = cosem_setUInt32(data, object->crcOkFramesCounter);
break;
case 8:
ret = cosem_setUInt32(data, object->crcNOkFramesCounter);
break;
default:
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_SFSK_MAC_COUNTERS
#ifndef DLMS_IGNORE_SFSK_MAC_SYNCHRONIZATION_TIMEOUTS
int cosem_getSFSKMacSynchronizationTimeouts(
gxValueEventArg* e)
{
int ret = 0;
gxByteBuffer* data = e->value.byteArr;
gxSFSKMacSynchronizationTimeouts* object = (gxSFSKMacSynchronizationTimeouts*)e->target;
switch (e->index)
{
case 2:
ret = cosem_setUInt16(data, object->searchInitiatorTimeout);
break;
case 3:
ret = cosem_setUInt16(data, object->synchronizationConfirmationTimeout);
break;
case 4:
ret = cosem_setUInt16(data, object->timeOutNotAddressed);
break;
case 5:
ret = cosem_setUInt16(data, object->timeOutFrameNotOK);
break;
default:
return DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_SFSK_MAC_SYNCHRONIZATION_TIMEOUTS
#ifndef DLMS_IGNORE_SFSK_PHY_MAC_SETUP
int cosem_getSFSKPhyMacSetUp(
gxValueEventArg* e)
{
int ret = 0;
gxByteBuffer* data = e->value.byteArr;
gxSFSKPhyMacSetUp* object = (gxSFSKPhyMacSetUp*)e->target;
switch (e->index)
{
case 2:
ret = cosem_setEnum(data, object->initiatorElectricalPhase);
break;
case 3:
ret = cosem_setEnum(data, object->deltaElectricalPhase);
break;
case 4:
ret = cosem_setUInt8(data, object->maxReceivingGain);
break;
case 5:
ret = cosem_setUInt8(data, object->maxTransmittingGain);
break;
case 6:
ret = cosem_setUInt8(data, object->searchInitiatorThreshold);
break;
case 7:
{
if ((ret = cosem_setStructure(data, 2)) == 0 &&
(ret = cosem_setUInt32(data, object->markFrequency)) == 0 &&
(ret = cosem_setUInt32(data, object->spaceFrequency)) == 0)
{
}
break;
}
case 8:
ret = cosem_setUInt16(data, object->macAddress);
break;
case 9:
{
uint16_t pos;
uint16_t* it;
if ((ret = cosem_setArray(data, object->macGroupAddresses.size)) == 0)
{
for (pos = 0; pos != object->macGroupAddresses.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->macGroupAddresses, pos, (void**)&it)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->macGroupAddresses, pos, (void**)&it, sizeof(uint16_t))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setUInt16(data, *it)) != 0)
{
break;
}
}
}
}
break;
case 10:
ret = cosem_setEnum(data, object->repeater);
break;
case 11:
ret = cosem_setBoolean(data, object->repeaterStatus);
break;
case 12:
ret = cosem_setUInt8(data, object->minDeltaCredit);
break;
case 13:
ret = cosem_setUInt16(data, object->initiatorMacAddress);
break;
case 14:
ret = cosem_setBoolean(data, object->synchronizationLocked);
break;
case 15:
ret = cosem_setEnum(data, object->transmissionSpeed);
break;
default:
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
break;
}
return ret;
}
#endif //DLMS_IGNORE_SFSK_PHY_MAC_SETUP
#ifndef DLMS_IGNORE_SFSK_REPORTING_SYSTEM_LIST
int cosem_getSFSKReportingSystemList(
gxValueEventArg* e)
{
int ret = DLMS_ERROR_CODE_OK;
gxByteBuffer* data = e->value.byteArr;
gxSFSKReportingSystemList* object = (gxSFSKReportingSystemList*)e->target;
if (e->index == 2)
{
uint16_t pos;
gxByteBuffer* it;
if ((ret = cosem_setArray(data, object->reportingSystemList.size)) == 0)
{
for (pos = 0; pos != object->reportingSystemList.size; ++pos)
{
#ifndef DLMS_IGNORE_MALLOC
if ((ret = arr_getByIndex(&object->reportingSystemList, pos, (void**)&it)) != 0)
{
break;
}
#else
if ((ret = arr_getByIndex(&object->reportingSystemList, pos, (void**)&it, sizeof(uint16_t))) != 0)
{
break;
}
#endif //DLMS_IGNORE_MALLOC
if ((ret = cosem_setOctetString(data, it)) != 0)
{
break;
}
}
}
}
else
{
ret = DLMS_ERROR_CODE_INVALID_PARAMETER;
}
return ret;
}
#endif //DLMS_IGNORE_SFSK_REPORTING_SYSTEM_LIST