|
|
@ -528,7 +528,7 @@ mmsClient_createReadRequest(uint32_t invokeId, const char* domainId, const char*
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static AlternateAccess_t*
|
|
|
|
static AlternateAccess_t*
|
|
|
|
createAlternateAccess(uint32_t index, uint32_t elementCount)
|
|
|
|
createAlternateAccessComponent(const char* componentName)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
AlternateAccess_t* alternateAccess = (AlternateAccess_t*) GLOBAL_CALLOC(1, sizeof(AlternateAccess_t));
|
|
|
|
AlternateAccess_t* alternateAccess = (AlternateAccess_t*) GLOBAL_CALLOC(1, sizeof(AlternateAccess_t));
|
|
|
|
alternateAccess->list.count = 1;
|
|
|
|
alternateAccess->list.count = 1;
|
|
|
@ -538,37 +538,114 @@ createAlternateAccess(uint32_t index, uint32_t elementCount)
|
|
|
|
|
|
|
|
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed = (AlternateAccessSelection_t*) GLOBAL_CALLOC(1, sizeof(AlternateAccessSelection_t));
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed = (AlternateAccessSelection_t*) GLOBAL_CALLOC(1, sizeof(AlternateAccessSelection_t));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const char* separator = strchr(componentName, '$');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (separator) {
|
|
|
|
|
|
|
|
int size = separator - componentName;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->present = AlternateAccessSelection_PR_selectAlternateAccess;
|
|
|
|
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.accessSelection.present =
|
|
|
|
|
|
|
|
AlternateAccessSelection__selectAlternateAccess__accessSelection_PR_component;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.accessSelection.choice.component.buf =
|
|
|
|
|
|
|
|
(uint8_t*) StringUtils_copySubString((char*) componentName, (char*) separator);
|
|
|
|
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.accessSelection.choice.component.size = size;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.alternateAccess = createAlternateAccessComponent(separator + 1);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
int size = strlen(componentName);
|
|
|
|
|
|
|
|
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->present = AlternateAccessSelection_PR_selectAccess;
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->present = AlternateAccessSelection_PR_selectAccess;
|
|
|
|
|
|
|
|
|
|
|
|
if (elementCount > 0) {
|
|
|
|
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.present =
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.present =
|
|
|
|
AlternateAccessSelection__selectAccess_PR_indexRange;
|
|
|
|
AlternateAccessSelection__selectAccess_PR_component;
|
|
|
|
|
|
|
|
|
|
|
|
INTEGER_t* asnIndex =
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.component.buf =
|
|
|
|
&(alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.indexRange.lowIndex);
|
|
|
|
(uint8_t*) StringUtils_copyString(componentName);
|
|
|
|
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.component.size = size;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
asn_long2INTEGER(asnIndex, index);
|
|
|
|
return alternateAccess;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
asnIndex =
|
|
|
|
static void
|
|
|
|
&(alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.indexRange.numberOfElements);
|
|
|
|
deleteAlternateAccessComponent(AlternateAccess_t* alternateAccess)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
GLOBAL_FREEMEM(alternateAccess->list.array[0]->choice.unnamed);
|
|
|
|
|
|
|
|
GLOBAL_FREEMEM(alternateAccess->list.array[0]);
|
|
|
|
|
|
|
|
GLOBAL_FREEMEM(alternateAccess->list.array);
|
|
|
|
|
|
|
|
GLOBAL_FREEMEM(alternateAccess);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
asn_long2INTEGER(asnIndex, elementCount);
|
|
|
|
static ListOfVariableSeq_t*
|
|
|
|
|
|
|
|
createNewVariableSpecification(const char* domainId, const char* itemId, const char* componentName, bool associationSpecific)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
ListOfVariableSeq_t* varSpec = (ListOfVariableSeq_t*) GLOBAL_CALLOC(1, sizeof(ListOfVariableSeq_t));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
varSpec->variableSpecification.present = VariableSpecification_PR_name;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (domainId) {
|
|
|
|
|
|
|
|
varSpec->variableSpecification.choice.name.present = ObjectName_PR_domainspecific;
|
|
|
|
|
|
|
|
varSpec->variableSpecification.choice.name.choice.domainspecific.domainId.buf = (uint8_t*) domainId;
|
|
|
|
|
|
|
|
varSpec->variableSpecification.choice.name.choice.domainspecific.domainId.size = strlen(domainId);
|
|
|
|
|
|
|
|
varSpec->variableSpecification.choice.name.choice.domainspecific.itemId.buf = (uint8_t*) itemId;
|
|
|
|
|
|
|
|
varSpec->variableSpecification.choice.name.choice.domainspecific.itemId.size = strlen(itemId);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (associationSpecific) {
|
|
|
|
|
|
|
|
varSpec->variableSpecification.choice.name.present = ObjectName_PR_aaspecific;
|
|
|
|
|
|
|
|
varSpec->variableSpecification.choice.name.choice.aaspecific.buf = (uint8_t*) itemId;
|
|
|
|
|
|
|
|
varSpec->variableSpecification.choice.name.choice.aaspecific.size = strlen(itemId);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
else {
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.present =
|
|
|
|
varSpec->variableSpecification.choice.name.present = ObjectName_PR_vmdspecific;
|
|
|
|
AlternateAccessSelection__selectAccess_PR_index;
|
|
|
|
varSpec->variableSpecification.choice.name.choice.vmdspecific.buf = (uint8_t*) itemId;
|
|
|
|
|
|
|
|
varSpec->variableSpecification.choice.name.choice.vmdspecific.size = strlen(itemId);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
INTEGER_t* asnIndex =
|
|
|
|
if (componentName)
|
|
|
|
&(alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.index);
|
|
|
|
varSpec->alternateAccess = createAlternateAccessComponent(componentName);
|
|
|
|
|
|
|
|
|
|
|
|
asn_long2INTEGER(asnIndex, index);
|
|
|
|
return varSpec;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return alternateAccess;
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Request a single value with optional component
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
int
|
|
|
|
|
|
|
|
mmsClient_createReadRequestComponent(uint32_t invokeId, const char* domainId, const char* itemId, const char* component, ByteBuffer* writeBuffer)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
MmsPdu_t* mmsPdu = mmsClient_createConfirmedRequestPdu(invokeId);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ReadRequest_t* readRequest = createReadRequest(mmsPdu);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
readRequest->specificationWithResult = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
readRequest->variableAccessSpecification.present = VariableAccessSpecification_PR_listOfVariable;
|
|
|
|
|
|
|
|
readRequest->variableAccessSpecification.choice.listOfVariable.list.count = 1;
|
|
|
|
|
|
|
|
readRequest->variableAccessSpecification.choice.listOfVariable.list.size = 1;
|
|
|
|
|
|
|
|
readRequest->variableAccessSpecification.choice.listOfVariable.list.array =
|
|
|
|
|
|
|
|
(ListOfVariableSeq_t**) GLOBAL_CALLOC(1, sizeof(ListOfVariableSeq_t*));
|
|
|
|
|
|
|
|
readRequest->variableAccessSpecification.choice.listOfVariable.list.array[0] = createNewVariableSpecification(domainId, itemId, component, false);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
asn_enc_rval_t rval;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rval = der_encode(&asn_DEF_MmsPdu, mmsPdu,
|
|
|
|
|
|
|
|
(asn_app_consume_bytes_f*) mmsClient_write_out, (void*) writeBuffer);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* clean up data structures */
|
|
|
|
|
|
|
|
deleteAlternateAccessComponent(readRequest->variableAccessSpecification.choice.listOfVariable.list.array[0]->alternateAccess);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GLOBAL_FREEMEM(readRequest->variableAccessSpecification.choice.listOfVariable.list.array);
|
|
|
|
|
|
|
|
readRequest->variableAccessSpecification.choice.listOfVariable.list.array = NULL;
|
|
|
|
|
|
|
|
readRequest->variableAccessSpecification.choice.listOfVariable.list.count = 0;
|
|
|
|
|
|
|
|
asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return rval.encoded;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static AlternateAccess_t*
|
|
|
|
static AlternateAccess_t*
|
|
|
|
createAlternateAccessComponent(const char* componentName)
|
|
|
|
createAlternateAccess(uint32_t index, uint32_t elementCount)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
AlternateAccess_t* alternateAccess = (AlternateAccess_t*) GLOBAL_CALLOC(1, sizeof(AlternateAccess_t));
|
|
|
|
AlternateAccess_t* alternateAccess = (AlternateAccess_t*) GLOBAL_CALLOC(1, sizeof(AlternateAccess_t));
|
|
|
|
alternateAccess->list.count = 1;
|
|
|
|
alternateAccess->list.count = 1;
|
|
|
@ -578,32 +655,30 @@ createAlternateAccessComponent(const char* componentName)
|
|
|
|
|
|
|
|
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed = (AlternateAccessSelection_t*) GLOBAL_CALLOC(1, sizeof(AlternateAccessSelection_t));
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed = (AlternateAccessSelection_t*) GLOBAL_CALLOC(1, sizeof(AlternateAccessSelection_t));
|
|
|
|
|
|
|
|
|
|
|
|
const char* separator = strchr(componentName, '$');
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->present = AlternateAccessSelection_PR_selectAccess;
|
|
|
|
|
|
|
|
|
|
|
|
if (separator) {
|
|
|
|
if (elementCount > 0) {
|
|
|
|
int size = separator - componentName;
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.present =
|
|
|
|
|
|
|
|
AlternateAccessSelection__selectAccess_PR_indexRange;
|
|
|
|
|
|
|
|
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->present = AlternateAccessSelection_PR_selectAlternateAccess;
|
|
|
|
INTEGER_t* asnIndex =
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.accessSelection.present =
|
|
|
|
&(alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.indexRange.lowIndex);
|
|
|
|
AlternateAccessSelection__selectAlternateAccess__accessSelection_PR_component;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.accessSelection.choice.component.buf =
|
|
|
|
asn_long2INTEGER(asnIndex, index);
|
|
|
|
(uint8_t*) StringUtils_copySubString((char*) componentName, (char*) separator);
|
|
|
|
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.accessSelection.choice.component.size = size;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.alternateAccess = createAlternateAccessComponent(separator + 1);
|
|
|
|
asnIndex =
|
|
|
|
|
|
|
|
&(alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.indexRange.numberOfElements);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
asn_long2INTEGER(asnIndex, elementCount);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
else {
|
|
|
|
int size = strlen(componentName);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->present = AlternateAccessSelection_PR_selectAccess;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.present =
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.present =
|
|
|
|
AlternateAccessSelection__selectAccess_PR_component;
|
|
|
|
AlternateAccessSelection__selectAccess_PR_index;
|
|
|
|
|
|
|
|
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.component.buf =
|
|
|
|
INTEGER_t* asnIndex =
|
|
|
|
(uint8_t*) StringUtils_copyString(componentName);
|
|
|
|
&(alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.index);
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.component.size = size;
|
|
|
|
|
|
|
|
|
|
|
|
asn_long2INTEGER(asnIndex, index);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return alternateAccess;
|
|
|
|
return alternateAccess;
|
|
|
|