| /////////////////////////////////////////////////////////////////////////////// |
| // |
| // Copyright (c) 2000-2020 Ericsson Telecom AB |
| // |
| // All rights reserved. This program and the accompanying materials |
| // are made available under the terms of the Eclipse Public License v2.0 |
| // which accompanies this distribution, and is available at |
| // https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html |
| /////////////////////////////////////////////////////////////////////////////// |
| // File: EPTF_LwM2M_Object_Functions.ttcn |
| // Description: |
| // Rev: R1A |
| // Prodnr: CNL 113 859 |
| // Updated: 2020-03-04 |
| // Contact: http://ttcn.ericsson.se |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| /////////////////////////////////////////////////////////// |
| // Module: EPTF_LwM2M_Object_Functions |
| // |
| // Purpose: |
| // This module contains the functions of the smart object definitions for the LWM2M load generator component |
| // |
| // See also: |
| // <EPTF_COAP_LGen_Definitions> |
| /////////////////////////////////////////////////////////////// |
| module EPTF_LwM2M_Object_Functions { |
| |
| import from LightweightM2M_Types all; |
| import from EPTF_LwM2M_Object_Definitions all; |
| import from EPTF_CLL_HashMapInt2Int_Functions all; |
| import from EPTF_CLL_HashMapStr2Int_Functions all; |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_ObjectSpecificationDB_init |
| // |
| // Purpose: |
| // Initializes the <LwM2M_ObjectSpecificationDB> database |
| // |
| // Parameters: |
| // p_db - *inout* <LwM2M_ObjectSpecificationDB> - DB instance |
| // p_id - *in integer* - unique id for the instance |
| // |
| // Related Type: |
| // <LwM2M_ObjectSpecificationDB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_ObjectSpecificationDB_init(inout LwM2M_ObjectSpecificationDB p_db, in integer p_id) |
| { |
| p_db := c_LwM2M_ObjectSpecificationDB_init; |
| p_db.id := p_id; |
| p_db.hashRef := f_EPTF_int2int_HashMap_New("EPTF_LwM2M_ObjectSpecificationDB_"&int2str(p_id)&"_Hash"); |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_ObjectSpecificationDB_cleanUp |
| // |
| // Purpose: |
| // Cleans up the reserved resources of the <LwM2M_ObjectSpecificationDB> database |
| // |
| // Parameters: |
| // p_db - *inout* <LwM2M_ObjectSpecificationDB> - DB instance |
| // |
| // Related Type: |
| // <LwM2M_ObjectSpecificationDB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_ObjectSpecificationDB_cleanUp(inout LwM2M_ObjectSpecificationDB p_db) |
| { |
| f_EPTF_int2int_HashMap_Delete("EPTF_LwM2M_ObjectSpecificationDB_"&int2str(p_db.id)&"_Hash"); |
| p_db := c_LwM2M_ObjectSpecificationDB_init; |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_ObjectSpecificationDB_add |
| // |
| // Purpose: |
| // Adds a new <LwM2M_ObjectSpecification> element to the <LwM2M_ObjectSpecificationDB> database |
| // |
| // Parameters: |
| // p_db - *inout* <LwM2M_ObjectSpecificationDB> - DB instance |
| // p_spec - <LwM2M_ObjectSpecification> - new element |
| // |
| // Related Type: |
| // <LwM2M_ObjectSpecificationDB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_ObjectSpecificationDB_add(inout LwM2M_ObjectSpecificationDB p_db, LwM2M_ObjectSpecification p_spec) |
| return integer |
| { |
| var integer vl_idx := -1; |
| if (not f_EPTF_int2int_HashMap_Find(p_db.hashRef, p_spec.id, vl_idx)) |
| { |
| vl_idx := sizeof(p_db.specs); |
| p_db.specs[vl_idx] := p_spec; |
| f_EPTF_int2int_HashMap_Insert(p_db.hashRef, p_spec.id, vl_idx); |
| } |
| return vl_idx; |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_ObjectSpecificationDB_lookUp |
| // |
| // Purpose: |
| // Gets the index of a <LwM2M_ObjectSpecification> element in the <LwM2M_ObjectSpecificationDB> database |
| // |
| // Parameters: |
| // p_db - *inout* <LwM2M_ObjectSpecificationDB> - DB instance |
| // p_objId - *integer* - obj id of the <LwM2M_ObjectSpecification> to be retrieved |
| // |
| // Returns: |
| // *integer* - the index of the looked up element in the database, or -1 if not found |
| // |
| // Related Type: |
| // <LwM2M_ObjectSpecificationDB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_ObjectSpecificationDB_lookUp(in LwM2M_ObjectSpecificationDB p_db, in integer p_objId) |
| return integer |
| { |
| var integer vl_idx := -1; |
| if (f_EPTF_int2int_HashMap_Find(p_db.hashRef, p_objId, vl_idx)) { |
| return vl_idx; |
| } |
| return -1; |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_ObjectSpecificationDB_getResourceSpecification |
| // |
| // Purpose: |
| // Retrieves a <LwM2M_ResourceSpecification> element in the <LwM2M_ObjectSpecificationDB> database |
| // |
| // Parameters: |
| // p_spec_db - *inout* <LwM2M_ObjectSpecificationDB> - DB instance |
| // p_objId - *integer* - obj id of the <LwM2M_ResourceSpecification> to be retrieved |
| // p_resId - *integer* - resource id of the <LwM2M_ResourceSpecification> to be retrieved |
| // p_spec - *inout* <LwM2M_ResourceSpecification> - the returned specification |
| // |
| // Returns: |
| // *boolean* - true, in case the specification was found |
| // |
| // Related Type: |
| // <LwM2M_ObjectSpecificationDB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_ObjectSpecificationDB_getResourceSpecification( |
| LwM2M_ObjectSpecificationDB p_spec_db, |
| integer p_objId, |
| integer p_resId, |
| inout LwM2M_ResourceSpecification p_spec |
| ) |
| return boolean |
| { |
| if (p_objId >=0 and p_resId >= 0) |
| { |
| var integer p_objSpecIdx := f_LwM2M_ObjectSpecificationDB_lookUp(p_spec_db, p_objId); |
| if (p_objSpecIdx >=0) |
| { |
| for (var integer i:=0; i<sizeof(p_spec_db.specs[p_objSpecIdx].resourcedefs); i:=i+1) |
| { |
| if (p_spec_db.specs[p_objSpecIdx].resourcedefs[i].id == p_resId) |
| { |
| p_spec := p_spec_db.specs[p_objSpecIdx].resourcedefs[i]; |
| return true; |
| } |
| } |
| } |
| } |
| return false; |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_ObjectSpecificationDB_fillInOmaSpecs |
| // |
| // Purpose: |
| // Loads known OMA related <LwM2M_ObjectSpecification> elements into the <LwM2M_ObjectSpecificationDB> database |
| // |
| // Parameters: |
| // p_db - *inout* <LwM2M_ObjectSpecificationDB> - DB instance |
| // |
| // Related Type: |
| // <LwM2M_ObjectSpecificationDB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_ObjectSpecificationDB_fillInOmaSpecs(inout LwM2M_ObjectSpecificationDB p_db) |
| { |
| f_LwM2M_ObjectSpecificationDB_add(p_db, c_LwM2M_Security_spec); |
| f_LwM2M_ObjectSpecificationDB_add(p_db, c_LwM2M_Server_spec); |
| f_LwM2M_ObjectSpecificationDB_add(p_db, c_LwM2M_Device_spec); |
| f_LwM2M_ObjectSpecificationDB_add(p_db, c_LwM2M_Location_spec); |
| f_LwM2M_ObjectSpecificationDB_add(p_db, c_LwM2M_FirmwareUpdate_spec); |
| f_LwM2M_ObjectSpecificationDB_add(p_db, c_LwM2M_IPSO_Temperature_spec); |
| f_LwM2M_ObjectSpecificationDB_add(p_db, c_LwM2M_PowerMeasurement_spec); |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_ObjectDB_init |
| // |
| // Purpose: |
| // Initializes the <LwM2M_ObjectDB> database |
| // |
| // Parameters: |
| // p_db - *inout* <LwM2M_ObjectDB> - DB instance |
| // p_id - *in integer* - unique id for the instance |
| // |
| // Related Type: |
| // <LwM2M_ObjectDB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_ObjectDB_init(inout LwM2M_ObjectDB p_db, in integer p_id) |
| { |
| p_db := c_LwM2M_ObjectDB_init; |
| p_db.id := p_id; |
| p_db.objHashRef := f_EPTF_int2int_HashMap_New("EPTF_LwM2M_ObjectDB_"&int2str(p_db.id)&"_objHash"); |
| p_db.resHashRef := f_EPTF_str2int_HashMap_New("EPTF_LwM2M_ObjectDB_"&int2str(p_db.id)&"_resHash"); |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_ObjectDB_cleanUp |
| // |
| // Purpose: |
| // Cleans up the reserved resources of the <LwM2M_ObjectDB> database |
| // |
| // Parameters: |
| // p_db - *inout* <LwM2M_ObjectDB> - DB instance |
| // |
| // Related Type: |
| // <LwM2M_ObjectDB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_ObjectDB_cleanUp(inout LwM2M_ObjectDB p_db) |
| { |
| if (p_db.id >= 0) |
| { |
| f_EPTF_int2int_HashMap_Delete("EPTF_LwM2M_ObjectDB_"&int2str(p_db.id)&"_objHash"); |
| f_EPTF_str2int_HashMap_Delete("EPTF_LwM2M_ObjectDB_"&int2str(p_db.id)&"_resHash"); |
| p_db := c_LwM2M_ObjectDB_init; |
| } |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_ObjectDB_createObject |
| // |
| // Purpose: |
| // Creates a new instance of a <LwM2M_Object> and adds it to the <LwM2M_ObjectDB> database |
| // |
| // Parameters: |
| // p_db - *inout* <LwM2M_ObjectDB> - DB instance |
| // p_spec - *in* <LwM2M_ObjectSpecification> - specification of the smart object to be instantiated |
| // |
| // Returns: |
| // *integer* - the index of the <LwM2M_Object> instance in the database |
| // |
| // Related Type: |
| // <LwM2M_ObjectDB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_ObjectDB_createObject(inout LwM2M_ObjectDB p_db, in LwM2M_ObjectSpecification p_spec) |
| return integer |
| { |
| var integer vl_idx := -1; |
| if (not f_EPTF_int2int_HashMap_Find(p_db.objHashRef, p_spec.id, vl_idx)) |
| { |
| vl_idx := sizeof(p_db.objs); |
| f_EPTF_int2int_HashMap_Insert(p_db.objHashRef, p_spec.id, vl_idx); |
| p_db.objs[vl_idx] := c_LwM2M_Object_init; |
| p_db.objs[vl_idx].id := p_spec.id; |
| } |
| return vl_idx; |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_ObjectDB_getObject |
| // |
| // Purpose: |
| // Retrieves an instance of a <LwM2M_Object> from a <LwM2M_ObjectDB> database |
| // |
| // Parameters: |
| // p_db - *in* <LwM2M_ObjectDB> - DB instance |
| // p_id - *in integer* - id of the smart object to be retrieved |
| // |
| // Returns: |
| // p_obj - *inout* <LwM2M_Object> - the retrieved <LwM2M_Object> instance |
| // *boolean* - true if the instance was found, false otherwise |
| // |
| // Related Type: |
| // <LwM2M_ObjectDB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_ObjectDB_getObject(in LwM2M_ObjectDB p_db, in integer p_id, inout LwM2M_Object p_obj) |
| return boolean |
| { |
| var integer vl_idx := f_LwM2M_ObjectDB_getObjectIdx(p_db, p_id); |
| if (vl_idx >= 0) |
| { |
| p_obj := p_db.objs[vl_idx]; |
| return true; |
| } |
| return false; |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_ObjectDB_getObjectIdx |
| // |
| // Purpose: |
| // Retrieves the index of an instance of a <LwM2M_Object> from a <LwM2M_ObjectDB> database |
| // |
| // Parameters: |
| // p_db - *in* <LwM2M_ObjectDB> - DB instance |
| // p_id - *in integer* - id of the smart object to be retrieved |
| // |
| // Returns: |
| // integer - index of an instance of a <LwM2M_Object> in a <LwM2M_ObjectDB> database |
| // |
| // Related Type: |
| // <LwM2M_ObjectDB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_ObjectDB_getObjectIdx(in LwM2M_ObjectDB p_db, in integer p_id) |
| return integer |
| { |
| var integer vl_idx := -1; |
| if (f_EPTF_int2int_HashMap_Find(p_db.objHashRef, p_id, vl_idx)) |
| { |
| return vl_idx; |
| } |
| return -1; |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_ObjectDB_createObjectInstance |
| // |
| // Purpose: |
| // Creates an <LwM2M_ObjectInstance> of a <LwM2M_Object> in a <LwM2M_ObjectDB> database |
| // |
| // Parameters: |
| // p_db - *in* <LwM2M_ObjectDB> - DB instance |
| // p_id - *in integer* - id of the smart object to be instantiated |
| // p_spec_db - *in* <LwM2M_ObjectSpecificationDB> - object specification DB |
| // p_createResources - *in boolean* - should the func create the resource instances as well? |
| // |
| // Returns: |
| // integer - index of an instance of a <LwM2M_ObjectInstance> in a <LwM2M_ObjectDB> database |
| // |
| // Related Type: |
| // <LwM2M_ObjectDB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_ObjectDB_createObjectInstance(inout LwM2M_ObjectDB p_db, in LwM2M_ObjectSpecificationDB p_spec_db, in integer p_id, in boolean p_createResources := true) |
| return integer |
| { |
| var integer vl_objIdx := -1 |
| var integer vl_objInstIdx := -1; |
| var integer vl_objSpecIdx := -1; |
| |
| vl_objIdx := f_LwM2M_ObjectDB_getObjectIdx(p_db, p_id); |
| |
| if (vl_objIdx >= 0) |
| { |
| vl_objSpecIdx := f_LwM2M_ObjectSpecificationDB_lookUp(p_spec_db, p_id); |
| if (vl_objSpecIdx >= 0) |
| { |
| vl_objInstIdx := sizeof(p_db.objs[vl_objIdx].instances); |
| p_db.objs[vl_objIdx].instances[vl_objInstIdx] := c_LwM2M_ObjectInstance_init; |
| p_db.objs[vl_objIdx].instances[vl_objInstIdx].id := vl_objInstIdx; |
| p_db.objs[vl_objIdx].instances[vl_objInstIdx].objId := p_spec_db.specs[vl_objSpecIdx].id; |
| |
| // Creating resources according to spec |
| if (p_createResources) { |
| var LwM2M_Resource v_res; |
| for (var integer i:=0; i<sizeof(p_spec_db.specs[vl_objSpecIdx].resourcedefs); i:=i+1) |
| { |
| v_res := f_LwM2M_createResource(p_db.objs[vl_objIdx].instances[vl_objInstIdx], p_spec_db.specs[vl_objSpecIdx].resourcedefs[i]); |
| v_res.spec.objSpecIdx := vl_objSpecIdx; |
| v_res.spec.resSpecIdx := i; |
| f_LwM2M_ObjectDB_addResource(p_db, v_res); |
| } |
| } |
| } |
| } |
| return vl_objInstIdx; |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_ObjectDB_createObjectInstance |
| // |
| // Purpose: |
| // Links in an <LwM2M_Resource> in a <LwM2M_ObjectDB> database |
| // |
| // Parameters: |
| // p_db - *in* <LwM2M_ObjectDB> - DB instance |
| // p_resource - *in* <LwM2M_Resource> - smart resource instance |
| // |
| // Returns: |
| // boolean - true if it was succesful |
| // |
| // Related Type: |
| // <LwM2M_ObjectDB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_ObjectDB_addResource(inout LwM2M_ObjectDB p_db, in LwM2M_Resource p_resource) |
| return boolean |
| { |
| var integer vl_resIdx; |
| if (not f_EPTF_str2int_HashMap_Find(p_db.resHashRef, f_LwM2M_resourceHash_forResource(p_resource), vl_resIdx)) |
| { |
| var integer vl_objIdx := f_LwM2M_ObjectDB_getObjectIdx(p_db, p_resource.objId); |
| if (vl_objIdx >= 0) |
| { |
| // Adding to resource array |
| vl_resIdx := sizeof(p_db.resources); |
| p_db.resources[vl_resIdx] := p_resource; |
| // Linking it under the object instance |
| var integer vl_resIdxInObjInst := sizeof(p_db.objs[vl_objIdx].instances[p_resource.objInstId].resources); |
| p_db.objs[vl_objIdx].instances[p_resource.objInstId].resources[vl_resIdxInObjInst] := vl_resIdx; |
| // Adding it to the hash |
| f_EPTF_str2int_HashMap_Insert(p_db.resHashRef, f_LwM2M_resourceHash_forResource(p_resource), vl_resIdx); |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_ObjectDB_getObjectInstance |
| // |
| // Purpose: |
| // Retrieves an <LwM2M_ObjectInstance> from a <LwM2M_ObjectDB> database |
| // |
| // Parameters: |
| // p_db - *in* <LwM2M_ObjectDB> - DB instance |
| // p_objId - *in integer* - object id |
| // p_objInstId - *in integer* - object instance id |
| // |
| // Returns: |
| // p_objInst - *inout* <LwM2M_ObjectInstance> - object instance |
| // boolean - if the instance was found |
| // |
| // Related Type: |
| // <LwM2M_ObjectDB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_ObjectDB_getObjectInstance(in LwM2M_ObjectDB p_db, |
| in integer p_objId, in integer p_objInstId, inout LwM2M_ObjectInstance p_objInst) |
| return boolean |
| { |
| var integer vl_objIdx := f_LwM2M_ObjectDB_getObjectIdx(p_db, p_objId); |
| if (vl_objIdx >= 0) { |
| if (sizeof(p_db.objs[vl_objIdx].instances) > p_objInstId and p_objInstId >= 0) { |
| p_objInst := p_db.objs[vl_objIdx].instances[p_objInstId]; |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_ObjectDB_getResource |
| // |
| // Purpose: |
| // Retrieves an <LwM2M_Resource> from a <LwM2M_ObjectDB> database |
| // |
| // Parameters: |
| // p_db - *in* <LwM2M_ObjectDB> - DB instance |
| // p_objId - *in integer* - object id |
| // p_objInstId - *in integer* - object instance id |
| // p_resourceId - *in integer* - resource id |
| // |
| // Returns: |
| // p_resource - *inout* <LwM2M_Resource> - object instance |
| // boolean - if the instance was found |
| // |
| // Related Type: |
| // <LwM2M_ObjectDB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_ObjectDB_getResource(in LwM2M_ObjectDB p_db, |
| in integer p_objId, in integer p_objInstId, in integer p_resourceId, inout LwM2M_Resource p_resource) |
| return boolean |
| { |
| var integer vl_resIdx; |
| if (f_EPTF_str2int_HashMap_Find(p_db.resHashRef, f_LwM2M_resourceHash_forIds(p_objId, p_objInstId, p_resourceId), vl_resIdx)) |
| { |
| p_resource := p_db.resources[vl_resIdx]; |
| return true; |
| } |
| return false; |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_ObjectDB_setResource |
| // |
| // Purpose: |
| // Updates the contents of an already linked in <LwM2M_Resource> in a <LwM2M_ObjectDB> database |
| // |
| // Parameters: |
| // p_db - *in* <LwM2M_ObjectDB> - DB instance |
| // p_objId - *in integer* - object id |
| // p_objInstId - *in integer* - object instance id |
| // p_resourceId - *in integer* - resource id |
| // p_resource - *in* <LwM2M_Resource> - resource instance |
| // |
| // Returns: |
| // boolean - if the instance was found |
| // |
| // Related Type: |
| // <LwM2M_ObjectDB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_ObjectDB_setResource(inout LwM2M_ObjectDB p_db, |
| in integer p_objId, in integer p_objInstId, in integer p_resourceId, in LwM2M_Resource p_resource) |
| return boolean |
| { |
| var integer vl_resIdx; |
| if (f_EPTF_str2int_HashMap_Find(p_db.resHashRef, f_LwM2M_resourceHash_forIds(p_objId, p_objInstId, p_resourceId), vl_resIdx)) |
| { |
| p_db.resources[vl_resIdx] := p_resource; |
| return true; |
| } |
| return false; |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_ObjectDB_getResourceValue |
| // |
| // Purpose: |
| // Retrieves the <LwM2M_ResourceValue> of a <LwM2M_Resource> in a <LwM2M_ObjectDB> database |
| // |
| // Parameters: |
| // p_db - *in* <LwM2M_ObjectDB> - DB instance |
| // p_objId - *in integer* - object id |
| // p_objInstId - *in integer* - object instance id |
| // p_resourceId - *in integer* - resource id |
| // |
| // Returns: |
| // p_value - *inout* <LwM2M_ResourceValue> - resource value |
| // boolean - if the instance was found |
| // |
| // Related Type: |
| // <LwM2M_ObjectDB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_ObjectDB_getResourceValue(in LwM2M_ObjectDB p_db, |
| in integer p_objId, in integer p_objInstId, in integer p_resourceId, inout LwM2M_ResourceValue p_value) |
| return boolean |
| { |
| var integer vl_resIdx; |
| if (f_EPTF_str2int_HashMap_Find(p_db.resHashRef, f_LwM2M_resourceHash_forIds(p_objId, p_objInstId, p_resourceId), vl_resIdx)) |
| { |
| p_value := p_db.resources[vl_resIdx].val; |
| return true; |
| } |
| return false; |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_ObjectDB_setResourceValue |
| // |
| // Purpose: |
| // Sets the <LwM2M_ResourceValue> of an already linked in <LwM2M_Resource> in a <LwM2M_ObjectDB> database |
| // |
| // Parameters: |
| // p_db - *in* <LwM2M_ObjectDB> - DB instance |
| // p_objId - *in integer* - object id |
| // p_objInstId - *in integer* - object instance id |
| // p_resourceId - *in integer* - resource id |
| // p_value - *in* <LwM2M_ResourceValue> - resource instance |
| // |
| // Returns: |
| // boolean - if the instance was found |
| // |
| // Related Type: |
| // <LwM2M_ObjectDB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_ObjectDB_setResourceValue(inout LwM2M_ObjectDB p_db, |
| in integer p_objId, in integer p_objInstId, in integer p_resourceId, in LwM2M_ResourceValue p_value) |
| return boolean |
| { |
| var integer vl_resIdx; |
| if (f_EPTF_str2int_HashMap_Find(p_db.resHashRef, f_LwM2M_resourceHash_forIds(p_objId, p_objInstId, p_resourceId), vl_resIdx)) |
| { |
| p_db.resources[vl_resIdx].val := p_value; |
| return true; |
| } |
| return false; |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_ObjectDB_setResourceObserved |
| // |
| // Purpose: |
| // Sets the observation flag of an already linked in <LwM2M_Resource> in a <LwM2M_ObjectDB> database |
| // |
| // Parameters: |
| // p_db - *in* <LwM2M_ObjectDB> - DB instance |
| // p_objId - *in integer* - object id |
| // p_objInstId - *in integer* - object instance id |
| // p_resourceId - *in integer* - resource id |
| // p_observed - *in boolean* - observation flag |
| // p_contentFormat - *in integer optional* - preferred content format |
| // |
| // Returns: |
| // boolean - if the instance was found |
| // |
| // Related Type: |
| // <LwM2M_ObjectDB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_ObjectDB_setResourceObserved(inout LwM2M_ObjectDB p_db, |
| in integer p_objId, in integer p_objInstId, in integer p_resourceId, in boolean p_observed, in template integer p_contentFormat := omit) |
| return boolean |
| { |
| var integer vl_resIdx; |
| if (f_EPTF_str2int_HashMap_Find(p_db.resHashRef, f_LwM2M_resourceHash_forIds(p_objId, p_objInstId, p_resourceId), vl_resIdx)) |
| { |
| p_db.resources[vl_resIdx].observed := p_observed; |
| if (ispresent(p_contentFormat)) |
| { |
| p_db.resources[vl_resIdx].contentFormat := valueof(p_contentFormat); |
| } |
| else |
| { |
| p_db.resources[vl_resIdx].contentFormat := omit; |
| } |
| return true; |
| } |
| return false; |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_ObjectDB_getObjectPaths |
| // |
| // Purpose: |
| // Retrieves all the object paths <ObjectPath_List> that are stored in the <LwM2M_ObjectDB> |
| // |
| // Parameters: |
| // p_db - *in* <LwM2M_ObjectDB> - DB instance |
| // |
| // Returns: |
| // p_paths - *inout* <ObjectPath_List> - the pathes of the objects stored in the DB |
| // |
| // Related Type: |
| // <LwM2M_ObjectDB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_ObjectDB_getObjectPaths(in LwM2M_ObjectDB p_db, inout ObjectPath_List p_paths) |
| { |
| if (p_db.id != -1) { |
| for (var integer i:=0; i<sizeof(p_db.objs); i:=i+1) { |
| // No instances for object |
| if (sizeof(p_db.objs[i].instances)==0) { |
| p_paths[sizeof(p_paths)] := { |
| objectId := p_db.objs[i].id, |
| objectInstanceId := omit, |
| resourceId := omit |
| } |
| } |
| // There are object instances |
| else { |
| for (var integer j:=0; j<sizeof(p_db.objs[i].instances); j:=j+1) { |
| p_paths[sizeof(p_paths)] := { |
| objectId := p_db.objs[i].id, |
| objectInstanceId := p_db.objs[i].instances[j].id, |
| resourceId := omit |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_resourceHash_forResource |
| // |
| // Purpose: |
| // Function to generate a unique key for the <LwM2M_Resource> instance |
| // |
| // Parameters: |
| // p_res - *in* <LwM2M_Resource> - resource instance |
| // |
| // Returns: |
| // charstring - unique hash for the <LwM2M_Resource> |
| // |
| // Related Type: |
| // <LwM2M_Resource> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_resourceHash_forResource(in LwM2M_Resource p_res) |
| return charstring |
| { |
| return int2str(p_res.objId) & "/" & int2str(p_res.objInstId) & "/" & int2str(p_res.id); |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_resourceHash_forIds |
| // |
| // Purpose: |
| // Function to generate a unique key for <LwM2M_Resource> IDs |
| // |
| // Parameters: |
| // p_objId - *in integer* - object id |
| // p_objInstId - *in integer* - object instance id |
| // p_resId - *in integer* - resource id |
| // |
| // Returns: |
| // charstring - unique hash for the reource IDs |
| // |
| // Related Type: |
| // <LwM2M_Resource> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_resourceHash_forIds(in integer p_objId, in integer p_objInstId, in integer p_resId) |
| return charstring |
| { |
| return int2str(p_objId) & "/" & int2str(p_objInstId) & "/" & int2str(p_resId); |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_createResource |
| // |
| // Purpose: |
| // Function to create an <LwM2M_Resource> instance based on a <LwM2M_ResourceSpecification> and link it into an <LwM2M_ObjectInstance> |
| // |
| // Parameters: |
| // p_oi - *inout* <LwM2M_ObjectInstance> - object instance, where the rousrce will be added |
| // p_spec - *in* <LwM2M_ResourceSpecification> - resource specification for the instantiation |
| // |
| // Returns: |
| // <LwM2M_Resource> - the create resource instance |
| // |
| // Related Type: |
| // <LwM2M_Resource> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_createResource(inout LwM2M_ObjectInstance p_oi, in LwM2M_ResourceSpecification p_spec) |
| return LwM2M_Resource |
| { |
| var LwM2M_Resource v_ret := c_LwM2M_Resource_init; |
| |
| v_ret.id := p_spec.id; |
| |
| v_ret.objId := p_oi.objId; |
| v_ret.objInstId := p_oi.id; |
| |
| if (p_spec.type_ == FLOAT or p_spec.type_ == TIME) { |
| v_ret.val.floatValue := 0.0; |
| } |
| else if (p_spec.type_ == INTEGER) { |
| v_ret.val.intValue := 0; |
| } |
| else if (p_spec.type_ == STRING) { |
| v_ret.val.strValue := ""; |
| } |
| else if (p_spec.type_ == OPAQUE) { |
| v_ret.val.opaqueValue := ''O; |
| } |
| else if (p_spec.type_ == BOOLEAN) { |
| v_ret.val.boolValue := false; |
| } |
| |
| return v_ret; |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_Resource_getSpecification |
| // |
| // Purpose: |
| // Function to look up the specification of a <LwM2M_Resource> instance |
| // |
| // Parameters: |
| // p_res - *in* <LwM2M_Resource> - the resource |
| // p_spec_db - *in* <LwM2M_ObjectSpecificationDB> - object specification database |
| // p_spec - *inout* <LwM2M_ResourceSpecification> - resource specification for the instantiation |
| // |
| // Returns: |
| // *boolean* - true if the specification was found |
| // |
| // Related Type: |
| // <LwM2M_Resource> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_Resource_getSpecification(in LwM2M_Resource p_res, in LwM2M_ObjectSpecificationDB p_spec_db, inout LwM2M_ResourceSpecification p_spec) |
| return boolean |
| { |
| if (p_res.spec.objSpecIdx >=0 and sizeof(p_spec_db.specs) > p_res.spec.objSpecIdx) |
| { |
| if (p_res.spec.resSpecIdx >= 0 and sizeof(p_spec_db.specs[p_res.spec.objSpecIdx].resourcedefs) > p_res.spec.resSpecIdx) |
| { |
| p_spec := p_spec_db.specs[p_res.spec.objSpecIdx].resourcedefs[p_res.spec.resSpecIdx] |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_Resource_checkSpecification |
| // |
| // Purpose: |
| // Function to check the specification of a <LwM2M_Resource> instance against a template |
| // |
| // Parameters: |
| // p_res - *in* <LwM2M_Resource> - the resource |
| // p_spec_db - *in* <LwM2M_ObjectSpecificationDB> - object specification database |
| // p_spec - *in* <LwM2M_ResourceSpecification> - resource specification for the instantiation |
| // |
| // Returns: |
| // *boolean* - true if the specifications were matching |
| // |
| // Related Type: |
| // <LwM2M_Resource> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_Resource_checkSpecification(in LwM2M_Resource p_res, in LwM2M_ObjectSpecificationDB p_spec_db, template LwM2M_ResourceSpecification p_spec) |
| return boolean |
| { |
| if (p_res.spec.objSpecIdx >=0 and sizeof(p_spec_db.specs) > p_res.spec.objSpecIdx) |
| { |
| if (p_res.spec.resSpecIdx >= 0 and sizeof(p_spec_db.specs[p_res.spec.objSpecIdx].resourcedefs) > p_res.spec.resSpecIdx) |
| { |
| if (match(p_spec_db.specs[p_res.spec.objSpecIdx].resourcedefs[p_res.spec.resSpecIdx], p_spec)) |
| { |
| return true; |
| } |
| } |
| } |
| return false; |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_Resource_setNextDataSample |
| // |
| // Purpose: |
| // In case the <LwM2M_Resource> instance is associated with a <LwM2M_DataSamples> it will set its value to the next from the samples |
| // |
| // Parameters: |
| // p_res - *inout* <LwM2M_Resource> - resource instance, where the value will be updated |
| // p_db - *in out* <LwM2M_DataSamples_DB> - DB where the samples are stored |
| // |
| // Returns: |
| // <LwM2M_Resource> - with the updated value |
| // |
| // Related Type: |
| // <LwM2M_Resource> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_Resource_setNextDataSample(inout LwM2M_Resource p_res, inout LwM2M_DataSamples_DB p_db) |
| { |
| if (ispresent(p_res.dataSample)) { |
| // Init samplesPointer |
| if (p_res.dataSample.samplesPointer == -1) { |
| p_res.dataSample.samplesPointer := f_LwM2M_DataSamples_DB_lookUp(p_db, p_res.dataSample.samplesName); |
| } |
| // We found the dataSamples |
| if (p_res.dataSample.samplesPointer >=0 and p_res.dataSample.samplesPointer < sizeof(p_db.data)) { |
| // We have values |
| if (sizeof(p_db.data[p_res.dataSample.samplesPointer].values)>0) { |
| // Check value pointer boundaries |
| if (p_res.dataSample.valuePointer < 0 or |
| p_res.dataSample.valuePointer >= sizeof(p_db.data[p_res.dataSample.samplesPointer].values)) |
| { |
| // Outside of boundaries, set it to zero |
| p_res.dataSample.valuePointer := 0; |
| } |
| // Set the value |
| p_res.val := p_db.data[p_res.dataSample.samplesPointer].values[p_res.dataSample.valuePointer]; |
| // Step value pointer |
| p_res.dataSample.valuePointer := p_res.dataSample.valuePointer+1; |
| } |
| } |
| } |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_DataSamples_DB_init |
| // |
| // Purpose: |
| // Initializes a <LwM2M_DataSamples_DB> database |
| // |
| // Parameters: |
| // p_db - *inout* <LwM2M_DataSamples_DB> - DB instance |
| // p_name - *in charstring* - name for the DB instance |
| // |
| // Related Type: |
| // <LwM2M_DataSamples_DB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_DataSamples_DB_init(inout LwM2M_DataSamples_DB p_db, in charstring p_name) |
| { |
| p_db.name := p_name; |
| p_db.data := {}; |
| p_db.hashRef := f_EPTF_str2int_HashMap_New(p_name); |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_DataSamples_DB_add |
| // |
| // Purpose: |
| // Adds a new <LwM2M_DataSamples> element to a <LwM2M_DataSamples_DB> database |
| // |
| // Parameters: |
| // p_db - *inout* <LwM2M_DataSamples_DB> - DB instance |
| // p_samples - *in* <LwM2M_DataSamples> - element to be added |
| // |
| // Related Type: |
| // <LwM2M_DataSamples_DB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_DataSamples_DB_add(inout LwM2M_DataSamples_DB p_db, in LwM2M_DataSamples p_samples) |
| return integer |
| { |
| var integer p_idx := f_LwM2M_DataSamples_DB_lookUp(p_db, p_samples.name); |
| |
| if (p_idx == -1) |
| { |
| p_idx := sizeof(p_db.data); |
| f_EPTF_str2int_HashMap_Insert(p_db.hashRef, p_samples.name, p_idx); |
| p_db.data[p_idx] := p_samples; |
| } |
| |
| return p_idx; |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_DataSamples_DB_lookUp |
| // |
| // Purpose: |
| // Looks up a <LwM2M_DataSamples> element from a <LwM2M_DataSamples_DB> database based on the samples' name |
| // |
| // Parameters: |
| // p_db - *inout* <LwM2M_DataSamples_DB> - DB instance |
| // p_sampleName - *in charstring* - name of the sample to look up |
| // |
| // Related Type: |
| // <LwM2M_DataSamples_DB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_DataSamples_DB_lookUp(inout LwM2M_DataSamples_DB p_db, in charstring p_sampleName) |
| return integer |
| { |
| var integer vl_idx := -1; |
| f_EPTF_str2int_HashMap_Find(p_db.hashRef, p_sampleName, vl_idx); |
| return vl_idx; |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_DataSamples_DB_get |
| // |
| // Purpose: |
| // Retrieves a <LwM2M_DataSamples> element from a <LwM2M_DataSamples_DB> database based on its internal index |
| // |
| // Parameters: |
| // p_db - *inout* <LwM2M_DataSamples_DB> - DB instance |
| // p_idx - *in integer* - index of the sample to be fetched |
| // |
| // Returns: |
| // p_samples - *inout* <LwM2M_DataSamples> - retrieved element |
| // |
| // Related Type: |
| // <LwM2M_DataSamples_DB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_DataSamples_DB_get(inout LwM2M_DataSamples_DB p_db, in integer p_idx, inout LwM2M_DataSamples p_samples) |
| { |
| if (p_idx < sizeof(p_db.data)) |
| { |
| p_samples := p_db.data[p_idx]; |
| } |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Function: f_LwM2M_DataSamples_DB_cleanUp |
| // |
| // Purpose: |
| // Cleans up the reserved resources of a <LwM2M_DataSamples_DB> database |
| // |
| // Parameters: |
| // p_db - *inout* <LwM2M_DataSamples_DB> - DB instance |
| // |
| // Related Type: |
| // <LwM2M_DataSamples_DB> |
| /////////////////////////////////////////////////////////// |
| function f_LwM2M_DataSamples_DB_cleanUp(inout LwM2M_DataSamples_DB p_db) |
| { |
| p_db.data := {}; |
| f_EPTF_str2int_HashMap_Delete(p_db.name); |
| } |
| } |