| /////////////////////////////////////////////////////////////////////////////// |
| // |
| // Copyright (c) 2000-2017 Ericsson Telecom AB |
| // |
| // All rights reserved. This program and the accompanying materials |
| // are made available under the terms of the Eclipse Public License v1.0 |
| // which accompanies this distribution, and is available at |
| // http://www.eclipse.org/legal/epl-v10.html |
| /////////////////////////////////////////////////////////////////////////////// |
| // File: EPTF_LwM2M_Object_Functions.ttcn |
| // Description: |
| // Rev: R1A |
| // Prodnr: CNL 113 859 |
| // Updated: 2017-09-01 |
| // Contact: http://ttcn.ericsson.se |
| /////////////////////////////////////////////////////////////////////////////// |
| 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(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(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(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(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_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_IPSO_Temperature_spec); |
| } |
| |
| 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(inout LwM2M_ObjectDB p_db) |
| { |
| 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(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(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(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(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) { |
| for (var integer i:=0; i<sizeof(p_spec_db.specs[vl_objSpecIdx].resourcedefs); i:=i+1) |
| { |
| var LwM2M_Resource v_res := f_LwM2M_createResource(p_db.objs[vl_objIdx].instances[vl_objInstIdx], p_spec_db.specs[vl_objSpecIdx].resourcedefs[i]); |
| f_LwM2M_ObjectDB_addResource(p_db, v_res); |
| } |
| } |
| } |
| } |
| return vl_objInstIdx; |
| } |
| |
| 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(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(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(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(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(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_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(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(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(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) { |
| 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_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(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(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(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(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(inout LwM2M_DataSamples_DB p_db) |
| { |
| p_db.data := {}; |
| f_EPTF_str2int_HashMap_Delete(p_db.name); |
| } |
| } |