terence zhang / Mbed OS mbed-os-example-wakaama

Dependencies:   C12832 LM75B

Committer:
terencez
Date:
Sat May 06 11:21:27 2017 +0000
Revision:
14:ec9e195830ff
Parent:
test_object.c@4:35892233a85d
First compile version, registration success but could not handle request.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
terence zhang 4:35892233a85d 1 /*******************************************************************************
terence zhang 4:35892233a85d 2 *
terence zhang 4:35892233a85d 3 * Copyright (c) 2013, 2014 Intel Corporation and others.
terence zhang 4:35892233a85d 4 * All rights reserved. This program and the accompanying materials
terence zhang 4:35892233a85d 5 * are made available under the terms of the Eclipse Public License v1.0
terence zhang 4:35892233a85d 6 * and Eclipse Distribution License v1.0 which accompany this distribution.
terence zhang 4:35892233a85d 7 *
terence zhang 4:35892233a85d 8 * The Eclipse Public License is available at
terence zhang 4:35892233a85d 9 * http://www.eclipse.org/legal/epl-v10.html
terence zhang 4:35892233a85d 10 * The Eclipse Distribution License is available at
terence zhang 4:35892233a85d 11 * http://www.eclipse.org/org/documents/edl-v10.php.
terence zhang 4:35892233a85d 12 *
terence zhang 4:35892233a85d 13 * Contributors:
terence zhang 4:35892233a85d 14 * David Navarro, Intel Corporation - initial API and implementation
terence zhang 4:35892233a85d 15 * domedambrosio - Please refer to git log
terence zhang 4:35892233a85d 16 * Fabien Fleutot - Please refer to git log
terence zhang 4:35892233a85d 17 * Axel Lorente - Please refer to git log
terence zhang 4:35892233a85d 18 * Achim Kraus, Bosch Software Innovations GmbH - Please refer to git log
terence zhang 4:35892233a85d 19 * Pascal Rieux - Please refer to git log
terence zhang 4:35892233a85d 20 *
terence zhang 4:35892233a85d 21 *******************************************************************************/
terence zhang 4:35892233a85d 22
terence zhang 4:35892233a85d 23 /*
terence zhang 4:35892233a85d 24 Copyright (c) 2013, 2014 Intel Corporation
terence zhang 4:35892233a85d 25
terence zhang 4:35892233a85d 26 Redistribution and use in source and binary forms, with or without modification,
terence zhang 4:35892233a85d 27 are permitted provided that the following conditions are met:
terence zhang 4:35892233a85d 28
terence zhang 4:35892233a85d 29 * Redistributions of source code must retain the above copyright notice,
terence zhang 4:35892233a85d 30 this list of conditions and the following disclaimer.
terence zhang 4:35892233a85d 31 * Redistributions in binary form must reproduce the above copyright notice,
terence zhang 4:35892233a85d 32 this list of conditions and the following disclaimer in the documentation
terence zhang 4:35892233a85d 33 and/or other materials provided with the distribution.
terence zhang 4:35892233a85d 34 * Neither the name of Intel Corporation nor the names of its contributors
terence zhang 4:35892233a85d 35 may be used to endorse or promote products derived from this software
terence zhang 4:35892233a85d 36 without specific prior written permission.
terence zhang 4:35892233a85d 37
terence zhang 4:35892233a85d 38 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
terence zhang 4:35892233a85d 39 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
terence zhang 4:35892233a85d 40 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
terence zhang 4:35892233a85d 41 IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
terence zhang 4:35892233a85d 42 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
terence zhang 4:35892233a85d 43 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
terence zhang 4:35892233a85d 44 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
terence zhang 4:35892233a85d 45 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
terence zhang 4:35892233a85d 46 OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
terence zhang 4:35892233a85d 47 THE POSSIBILITY OF SUCH DAMAGE.
terence zhang 4:35892233a85d 48
terence zhang 4:35892233a85d 49 David Navarro <david.navarro@intel.com>
terence zhang 4:35892233a85d 50
terence zhang 4:35892233a85d 51 */
terence zhang 4:35892233a85d 52
terence zhang 4:35892233a85d 53 /*
terence zhang 4:35892233a85d 54 * Implements an object for testing purpose
terence zhang 4:35892233a85d 55 *
terence zhang 4:35892233a85d 56 * Multiple
terence zhang 4:35892233a85d 57 * Object | ID | Instances | Mandatoty |
terence zhang 4:35892233a85d 58 * Test | 1024 | Yes | No |
terence zhang 4:35892233a85d 59 *
terence zhang 4:35892233a85d 60 * Ressources:
terence zhang 4:35892233a85d 61 * Supported Multiple
terence zhang 4:35892233a85d 62 * Name | ID | Operations | Instances | Mandatory | Type | Range | Units | Description |
terence zhang 4:35892233a85d 63 * test | 1 | R/W | No | Yes | Integer | 0-255 | | |
terence zhang 4:35892233a85d 64 * exec | 2 | E | No | Yes | | | | |
terence zhang 4:35892233a85d 65 * dec | 3 | R/W | No | Yes | Float | | | |
terence zhang 4:35892233a85d 66 * sig | 4 | R/W | No | Yes | Integer | | | 16-bit signed integer |
terence zhang 4:35892233a85d 67 *
terence zhang 4:35892233a85d 68 */
terence zhang 4:35892233a85d 69
terence zhang 4:35892233a85d 70 #include "liblwm2m.h"
terence zhang 4:35892233a85d 71
terence zhang 4:35892233a85d 72 #include <stdio.h>
terence zhang 4:35892233a85d 73 #include <stdlib.h>
terence zhang 4:35892233a85d 74 #include <string.h>
terence zhang 4:35892233a85d 75 #include <ctype.h>
terence zhang 4:35892233a85d 76 #include <limits.h>
terence zhang 4:35892233a85d 77
terence zhang 4:35892233a85d 78 static void prv_output_buffer(uint8_t * buffer,
terence zhang 4:35892233a85d 79 int length)
terence zhang 4:35892233a85d 80 {
terence zhang 4:35892233a85d 81 int i;
terence zhang 4:35892233a85d 82 uint8_t array[16];
terence zhang 4:35892233a85d 83
terence zhang 4:35892233a85d 84 i = 0;
terence zhang 4:35892233a85d 85 while (i < length)
terence zhang 4:35892233a85d 86 {
terence zhang 4:35892233a85d 87 int j;
terence zhang 4:35892233a85d 88 fprintf(stderr, " ");
terence zhang 4:35892233a85d 89
terence zhang 4:35892233a85d 90 memcpy(array, buffer+i, 16);
terence zhang 4:35892233a85d 91
terence zhang 4:35892233a85d 92 for (j = 0 ; j < 16 && i+j < length; j++)
terence zhang 4:35892233a85d 93 {
terence zhang 4:35892233a85d 94 fprintf(stderr, "%02X ", array[j]);
terence zhang 4:35892233a85d 95 }
terence zhang 4:35892233a85d 96 while (j < 16)
terence zhang 4:35892233a85d 97 {
terence zhang 4:35892233a85d 98 fprintf(stderr, " ");
terence zhang 4:35892233a85d 99 j++;
terence zhang 4:35892233a85d 100 }
terence zhang 4:35892233a85d 101 fprintf(stderr, " ");
terence zhang 4:35892233a85d 102 for (j = 0 ; j < 16 && i+j < length; j++)
terence zhang 4:35892233a85d 103 {
terence zhang 4:35892233a85d 104 if (isprint(array[j]))
terence zhang 4:35892233a85d 105 fprintf(stderr, "%c ", array[j]);
terence zhang 4:35892233a85d 106 else
terence zhang 4:35892233a85d 107 fprintf(stderr, ". ");
terence zhang 4:35892233a85d 108 }
terence zhang 4:35892233a85d 109 fprintf(stderr, "\n");
terence zhang 4:35892233a85d 110
terence zhang 4:35892233a85d 111 i += 16;
terence zhang 4:35892233a85d 112 }
terence zhang 4:35892233a85d 113 }
terence zhang 4:35892233a85d 114
terence zhang 4:35892233a85d 115 /*
terence zhang 4:35892233a85d 116 * Multiple instance objects can use userdata to store data that will be shared between the different instances.
terence zhang 4:35892233a85d 117 * The lwm2m_object_t object structure - which represent every object of the liblwm2m as seen in the single instance
terence zhang 4:35892233a85d 118 * object - contain a chained list called instanceList with the object specific structure prv_instance_t:
terence zhang 4:35892233a85d 119 */
terence zhang 4:35892233a85d 120 typedef struct _prv_instance_
terence zhang 4:35892233a85d 121 {
terence zhang 4:35892233a85d 122 /*
terence zhang 4:35892233a85d 123 * The first two are mandatories and represent the pointer to the next instance and the ID of this one. The rest
terence zhang 4:35892233a85d 124 * is the instance scope user data (uint8_t test in this case)
terence zhang 4:35892233a85d 125 */
terence zhang 4:35892233a85d 126 struct _prv_instance_ * next; // matches lwm2m_list_t::next
terence zhang 4:35892233a85d 127 uint16_t shortID; // matches lwm2m_list_t::id
terence zhang 4:35892233a85d 128 uint8_t test;
terence zhang 4:35892233a85d 129 double dec;
terence zhang 4:35892233a85d 130 int16_t sig;
terence zhang 4:35892233a85d 131 } prv_instance_t;
terence zhang 4:35892233a85d 132
terence zhang 4:35892233a85d 133 static uint8_t prv_read(uint16_t instanceId,
terence zhang 4:35892233a85d 134 int * numDataP,
terence zhang 4:35892233a85d 135 lwm2m_data_t ** dataArrayP,
terence zhang 4:35892233a85d 136 lwm2m_object_t * objectP)
terence zhang 4:35892233a85d 137 {
terence zhang 4:35892233a85d 138 prv_instance_t * targetP;
terence zhang 4:35892233a85d 139 int i;
terence zhang 4:35892233a85d 140
terence zhang 4:35892233a85d 141 targetP = (prv_instance_t *)lwm2m_list_find(objectP->instanceList, instanceId);
terence zhang 4:35892233a85d 142 if (NULL == targetP) return COAP_404_NOT_FOUND;
terence zhang 4:35892233a85d 143
terence zhang 4:35892233a85d 144 if (*numDataP == 0)
terence zhang 4:35892233a85d 145 {
terence zhang 4:35892233a85d 146 *dataArrayP = lwm2m_data_new(3);
terence zhang 4:35892233a85d 147 if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;
terence zhang 4:35892233a85d 148 *numDataP = 3;
terence zhang 4:35892233a85d 149 (*dataArrayP)[0].id = 1;
terence zhang 4:35892233a85d 150 (*dataArrayP)[1].id = 3;
terence zhang 4:35892233a85d 151 (*dataArrayP)[2].id = 4;
terence zhang 4:35892233a85d 152 }
terence zhang 4:35892233a85d 153
terence zhang 4:35892233a85d 154 for (i = 0 ; i < *numDataP ; i++)
terence zhang 4:35892233a85d 155 {
terence zhang 4:35892233a85d 156 switch ((*dataArrayP)[i].id)
terence zhang 4:35892233a85d 157 {
terence zhang 4:35892233a85d 158 case 1:
terence zhang 4:35892233a85d 159 lwm2m_data_encode_int(targetP->test, *dataArrayP + i);
terence zhang 4:35892233a85d 160 break;
terence zhang 4:35892233a85d 161 case 2:
terence zhang 4:35892233a85d 162 return COAP_405_METHOD_NOT_ALLOWED;
terence zhang 4:35892233a85d 163 case 3:
terence zhang 4:35892233a85d 164 lwm2m_data_encode_float(targetP->dec, *dataArrayP + i);
terence zhang 4:35892233a85d 165 break;
terence zhang 4:35892233a85d 166 case 4:
terence zhang 4:35892233a85d 167 lwm2m_data_encode_int(targetP->sig, *dataArrayP + i);
terence zhang 4:35892233a85d 168 break;
terence zhang 4:35892233a85d 169 default:
terence zhang 4:35892233a85d 170 return COAP_404_NOT_FOUND;
terence zhang 4:35892233a85d 171 }
terence zhang 4:35892233a85d 172 }
terence zhang 4:35892233a85d 173
terence zhang 4:35892233a85d 174 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 175 }
terence zhang 4:35892233a85d 176
terence zhang 4:35892233a85d 177 static uint8_t prv_discover(uint16_t instanceId,
terence zhang 4:35892233a85d 178 int * numDataP,
terence zhang 4:35892233a85d 179 lwm2m_data_t ** dataArrayP,
terence zhang 4:35892233a85d 180 lwm2m_object_t * objectP)
terence zhang 4:35892233a85d 181 {
terence zhang 4:35892233a85d 182 int i;
terence zhang 4:35892233a85d 183
terence zhang 4:35892233a85d 184 // is the server asking for the full object ?
terence zhang 4:35892233a85d 185 if (*numDataP == 0)
terence zhang 4:35892233a85d 186 {
terence zhang 4:35892233a85d 187 *dataArrayP = lwm2m_data_new(4);
terence zhang 4:35892233a85d 188 if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;
terence zhang 4:35892233a85d 189 *numDataP = 4;
terence zhang 4:35892233a85d 190 (*dataArrayP)[0].id = 1;
terence zhang 4:35892233a85d 191 (*dataArrayP)[1].id = 2;
terence zhang 4:35892233a85d 192 (*dataArrayP)[2].id = 3;
terence zhang 4:35892233a85d 193 (*dataArrayP)[3].id = 4;
terence zhang 4:35892233a85d 194 }
terence zhang 4:35892233a85d 195 else
terence zhang 4:35892233a85d 196 {
terence zhang 4:35892233a85d 197 for (i = 0; i < *numDataP; i++)
terence zhang 4:35892233a85d 198 {
terence zhang 4:35892233a85d 199 switch ((*dataArrayP)[i].id)
terence zhang 4:35892233a85d 200 {
terence zhang 4:35892233a85d 201 case 1:
terence zhang 4:35892233a85d 202 case 2:
terence zhang 4:35892233a85d 203 case 3:
terence zhang 4:35892233a85d 204 case 4:
terence zhang 4:35892233a85d 205 break;
terence zhang 4:35892233a85d 206 default:
terence zhang 4:35892233a85d 207 return COAP_404_NOT_FOUND;
terence zhang 4:35892233a85d 208 }
terence zhang 4:35892233a85d 209 }
terence zhang 4:35892233a85d 210 }
terence zhang 4:35892233a85d 211 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 212 }
terence zhang 4:35892233a85d 213
terence zhang 4:35892233a85d 214 static uint8_t prv_write(uint16_t instanceId,
terence zhang 4:35892233a85d 215 int numData,
terence zhang 4:35892233a85d 216 lwm2m_data_t * dataArray,
terence zhang 4:35892233a85d 217 lwm2m_object_t * objectP)
terence zhang 4:35892233a85d 218 {
terence zhang 4:35892233a85d 219 prv_instance_t * targetP;
terence zhang 4:35892233a85d 220 int i;
terence zhang 4:35892233a85d 221
terence zhang 4:35892233a85d 222 targetP = (prv_instance_t *)lwm2m_list_find(objectP->instanceList, instanceId);
terence zhang 4:35892233a85d 223 if (NULL == targetP) return COAP_404_NOT_FOUND;
terence zhang 4:35892233a85d 224
terence zhang 4:35892233a85d 225 for (i = 0 ; i < numData ; i++)
terence zhang 4:35892233a85d 226 {
terence zhang 4:35892233a85d 227 switch (dataArray[i].id)
terence zhang 4:35892233a85d 228 {
terence zhang 4:35892233a85d 229 case 1:
terence zhang 4:35892233a85d 230 {
terence zhang 4:35892233a85d 231 int64_t value;
terence zhang 4:35892233a85d 232
terence zhang 4:35892233a85d 233 if (1 != lwm2m_data_decode_int(dataArray + i, &value) || value < 0 || value > 0xFF)
terence zhang 4:35892233a85d 234 {
terence zhang 4:35892233a85d 235 return COAP_400_BAD_REQUEST;
terence zhang 4:35892233a85d 236 }
terence zhang 4:35892233a85d 237 targetP->test = (uint8_t)value;
terence zhang 4:35892233a85d 238 }
terence zhang 4:35892233a85d 239 break;
terence zhang 4:35892233a85d 240 case 2:
terence zhang 4:35892233a85d 241 return COAP_405_METHOD_NOT_ALLOWED;
terence zhang 4:35892233a85d 242 case 3:
terence zhang 4:35892233a85d 243 if (1 != lwm2m_data_decode_float(dataArray + i, &(targetP->dec)))
terence zhang 4:35892233a85d 244 {
terence zhang 4:35892233a85d 245 return COAP_400_BAD_REQUEST;
terence zhang 4:35892233a85d 246 }
terence zhang 4:35892233a85d 247 break;
terence zhang 4:35892233a85d 248 case 4:
terence zhang 4:35892233a85d 249 {
terence zhang 4:35892233a85d 250 int64_t value;
terence zhang 4:35892233a85d 251
terence zhang 4:35892233a85d 252 if (1 != lwm2m_data_decode_int(dataArray + i, &value) || value < INT16_MIN || value > INT16_MAX)
terence zhang 4:35892233a85d 253 {
terence zhang 4:35892233a85d 254 return COAP_400_BAD_REQUEST;
terence zhang 4:35892233a85d 255 }
terence zhang 4:35892233a85d 256 targetP->sig = (int16_t)value;
terence zhang 4:35892233a85d 257 }
terence zhang 4:35892233a85d 258 break;
terence zhang 4:35892233a85d 259 default:
terence zhang 4:35892233a85d 260 return COAP_404_NOT_FOUND;
terence zhang 4:35892233a85d 261 }
terence zhang 4:35892233a85d 262 }
terence zhang 4:35892233a85d 263
terence zhang 4:35892233a85d 264 return COAP_204_CHANGED;
terence zhang 4:35892233a85d 265 }
terence zhang 4:35892233a85d 266
terence zhang 4:35892233a85d 267 static uint8_t prv_delete(uint16_t id,
terence zhang 4:35892233a85d 268 lwm2m_object_t * objectP)
terence zhang 4:35892233a85d 269 {
terence zhang 4:35892233a85d 270 prv_instance_t * targetP;
terence zhang 4:35892233a85d 271
terence zhang 4:35892233a85d 272 objectP->instanceList = lwm2m_list_remove(objectP->instanceList, id, (lwm2m_list_t **)&targetP);
terence zhang 4:35892233a85d 273 if (NULL == targetP) return COAP_404_NOT_FOUND;
terence zhang 4:35892233a85d 274
terence zhang 4:35892233a85d 275 lwm2m_free(targetP);
terence zhang 4:35892233a85d 276
terence zhang 4:35892233a85d 277 return COAP_202_DELETED;
terence zhang 4:35892233a85d 278 }
terence zhang 4:35892233a85d 279
terence zhang 4:35892233a85d 280 static uint8_t prv_create(uint16_t instanceId,
terence zhang 4:35892233a85d 281 int numData,
terence zhang 4:35892233a85d 282 lwm2m_data_t * dataArray,
terence zhang 4:35892233a85d 283 lwm2m_object_t * objectP)
terence zhang 4:35892233a85d 284 {
terence zhang 4:35892233a85d 285 prv_instance_t * targetP;
terence zhang 4:35892233a85d 286 uint8_t result;
terence zhang 4:35892233a85d 287
terence zhang 4:35892233a85d 288
terence zhang 4:35892233a85d 289 targetP = (prv_instance_t *)lwm2m_malloc(sizeof(prv_instance_t));
terence zhang 4:35892233a85d 290 if (NULL == targetP) return COAP_500_INTERNAL_SERVER_ERROR;
terence zhang 4:35892233a85d 291 memset(targetP, 0, sizeof(prv_instance_t));
terence zhang 4:35892233a85d 292
terence zhang 4:35892233a85d 293 targetP->shortID = instanceId;
terence zhang 4:35892233a85d 294 objectP->instanceList = LWM2M_LIST_ADD(objectP->instanceList, targetP);
terence zhang 4:35892233a85d 295
terence zhang 4:35892233a85d 296 result = prv_write(instanceId, numData, dataArray, objectP);
terence zhang 4:35892233a85d 297
terence zhang 4:35892233a85d 298 if (result != COAP_204_CHANGED)
terence zhang 4:35892233a85d 299 {
terence zhang 4:35892233a85d 300 (void)prv_delete(instanceId, objectP);
terence zhang 4:35892233a85d 301 }
terence zhang 4:35892233a85d 302 else
terence zhang 4:35892233a85d 303 {
terence zhang 4:35892233a85d 304 result = COAP_201_CREATED;
terence zhang 4:35892233a85d 305 }
terence zhang 4:35892233a85d 306
terence zhang 4:35892233a85d 307 return result;
terence zhang 4:35892233a85d 308 }
terence zhang 4:35892233a85d 309
terence zhang 4:35892233a85d 310 static uint8_t prv_exec(uint16_t instanceId,
terence zhang 4:35892233a85d 311 uint16_t resourceId,
terence zhang 4:35892233a85d 312 uint8_t * buffer,
terence zhang 4:35892233a85d 313 int length,
terence zhang 4:35892233a85d 314 lwm2m_object_t * objectP)
terence zhang 4:35892233a85d 315 {
terence zhang 4:35892233a85d 316
terence zhang 4:35892233a85d 317 if (NULL == lwm2m_list_find(objectP->instanceList, instanceId)) return COAP_404_NOT_FOUND;
terence zhang 4:35892233a85d 318
terence zhang 4:35892233a85d 319 switch (resourceId)
terence zhang 4:35892233a85d 320 {
terence zhang 4:35892233a85d 321 case 1:
terence zhang 4:35892233a85d 322 return COAP_405_METHOD_NOT_ALLOWED;
terence zhang 4:35892233a85d 323 case 2:
terence zhang 4:35892233a85d 324 fprintf(stdout, "\r\n-----------------\r\n"
terence zhang 4:35892233a85d 325 "Execute on %hu/%d/%d\r\n"
terence zhang 4:35892233a85d 326 " Parameter (%d bytes):\r\n",
terence zhang 4:35892233a85d 327 objectP->objID, instanceId, resourceId, length);
terence zhang 4:35892233a85d 328 prv_output_buffer((uint8_t*)buffer, length);
terence zhang 4:35892233a85d 329 fprintf(stdout, "-----------------\r\n\r\n");
terence zhang 4:35892233a85d 330 return COAP_204_CHANGED;
terence zhang 4:35892233a85d 331 case 3:
terence zhang 4:35892233a85d 332 return COAP_405_METHOD_NOT_ALLOWED;
terence zhang 4:35892233a85d 333 default:
terence zhang 4:35892233a85d 334 return COAP_404_NOT_FOUND;
terence zhang 4:35892233a85d 335 }
terence zhang 4:35892233a85d 336 }
terence zhang 4:35892233a85d 337
terence zhang 4:35892233a85d 338 lwm2m_object_t * get_test_object(void)
terence zhang 4:35892233a85d 339 {
terence zhang 4:35892233a85d 340 lwm2m_object_t * testObj;
terence zhang 4:35892233a85d 341
terence zhang 4:35892233a85d 342 testObj = (lwm2m_object_t *)lwm2m_malloc(sizeof(lwm2m_object_t));
terence zhang 4:35892233a85d 343
terence zhang 4:35892233a85d 344 if (NULL != testObj)
terence zhang 4:35892233a85d 345 {
terence zhang 4:35892233a85d 346 int i;
terence zhang 4:35892233a85d 347 prv_instance_t * targetP;
terence zhang 4:35892233a85d 348
terence zhang 4:35892233a85d 349 memset(testObj, 0, sizeof(lwm2m_object_t));
terence zhang 4:35892233a85d 350
terence zhang 4:35892233a85d 351 testObj->objID = 1024;
terence zhang 4:35892233a85d 352 for (i=0 ; i < 3 ; i++)
terence zhang 4:35892233a85d 353 {
terence zhang 4:35892233a85d 354 targetP = (prv_instance_t *)lwm2m_malloc(sizeof(prv_instance_t));
terence zhang 4:35892233a85d 355 if (NULL == targetP) return NULL;
terence zhang 4:35892233a85d 356 memset(targetP, 0, sizeof(prv_instance_t));
terence zhang 4:35892233a85d 357 targetP->shortID = 10 + i;
terence zhang 4:35892233a85d 358 targetP->test = 20 + i;
terence zhang 4:35892233a85d 359 targetP->dec = -30 + i + (double)i/100.0;
terence zhang 4:35892233a85d 360 targetP->sig = 0 - i;
terence zhang 4:35892233a85d 361 testObj->instanceList = LWM2M_LIST_ADD(testObj->instanceList, targetP);
terence zhang 4:35892233a85d 362 }
terence zhang 4:35892233a85d 363 /*
terence zhang 4:35892233a85d 364 * From a single instance object, two more functions are available.
terence zhang 4:35892233a85d 365 * - The first one (createFunc) create a new instance and filled it with the provided informations. If an ID is
terence zhang 4:35892233a85d 366 * provided a check is done for verifying his disponibility, or a new one is generated.
terence zhang 4:35892233a85d 367 * - The other one (deleteFunc) delete an instance by removing it from the instance list (and freeing the memory
terence zhang 4:35892233a85d 368 * allocated to it)
terence zhang 4:35892233a85d 369 */
terence zhang 4:35892233a85d 370 testObj->readFunc = prv_read;
terence zhang 4:35892233a85d 371 testObj->writeFunc = prv_write;
terence zhang 4:35892233a85d 372 testObj->executeFunc = prv_exec;
terence zhang 4:35892233a85d 373 testObj->createFunc = prv_create;
terence zhang 4:35892233a85d 374 testObj->deleteFunc = prv_delete;
terence zhang 4:35892233a85d 375 testObj->discoverFunc = prv_discover;
terence zhang 4:35892233a85d 376 }
terence zhang 4:35892233a85d 377
terence zhang 4:35892233a85d 378 return testObj;
terence zhang 4:35892233a85d 379 }
terence zhang 4:35892233a85d 380
terence zhang 4:35892233a85d 381 void free_test_object(lwm2m_object_t * object)
terence zhang 4:35892233a85d 382 {
terence zhang 4:35892233a85d 383 LWM2M_LIST_FREE(object->instanceList);
terence zhang 4:35892233a85d 384 if (object->userData != NULL)
terence zhang 4:35892233a85d 385 {
terence zhang 4:35892233a85d 386 lwm2m_free(object->userData);
terence zhang 4:35892233a85d 387 object->userData = NULL;
terence zhang 4:35892233a85d 388 }
terence zhang 4:35892233a85d 389 lwm2m_free(object);
terence zhang 4:35892233a85d 390 }