Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
share/test_object.c@14:ec9e195830ff, 2017-05-06 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |