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.
Diff: share/object_server.c
- Revision:
- 15:d0f20339c1ad
- Parent:
- 14:ec9e195830ff
--- a/share/object_server.c Sat May 06 11:21:27 2017 +0000 +++ b/share/object_server.c Sun May 07 03:00:16 2017 +0000 @@ -46,6 +46,9 @@ uint16_t instanceId; // matches lwm2m_list_t::id uint16_t shortServerId; uint32_t lifetime; + uint32_t defaultMinPeriod; + uint32_t defaultMaxPeriod; + uint32_t disableTimeout; bool storing; char binding[4]; } server_instance_t; @@ -63,9 +66,21 @@ lwm2m_data_encode_int(targetP->lifetime, dataP); return COAP_205_CONTENT; + case LWM2M_SERVER_MIN_PERIOD_ID: + lwm2m_data_encode_int(targetP->defaultMinPeriod, dataP); + return COAP_205_CONTENT; + + case LWM2M_SERVER_MAX_PERIOD_ID: + lwm2m_data_encode_int(targetP->defaultMaxPeriod, dataP); + return COAP_205_CONTENT; + case LWM2M_SERVER_DISABLE_ID: return COAP_405_METHOD_NOT_ALLOWED; + case LWM2M_SERVER_TIMEOUT_ID: + lwm2m_data_encode_int(targetP->disableTimeout, dataP); + return COAP_205_CONTENT; + case LWM2M_SERVER_STORING_ID: lwm2m_data_encode_bool(targetP->storing, dataP); return COAP_205_CONTENT; @@ -98,10 +113,13 @@ if (*numDataP == 0) { uint16_t resList[] = { - LWM2M_SERVER_SHORT_ID_ID, - LWM2M_SERVER_LIFETIME_ID, - LWM2M_SERVER_STORING_ID, - LWM2M_SERVER_BINDING_ID + LWM2M_SERVER_SHORT_ID_ID, + LWM2M_SERVER_LIFETIME_ID, + LWM2M_SERVER_MIN_PERIOD_ID, + LWM2M_SERVER_MAX_PERIOD_ID, + LWM2M_SERVER_TIMEOUT_ID, + LWM2M_SERVER_STORING_ID, + LWM2M_SERVER_BINDING_ID }; int nbRes = sizeof(resList)/sizeof(uint16_t); @@ -148,12 +166,12 @@ LWM2M_SERVER_BINDING_ID, LWM2M_SERVER_UPDATE_ID }; - int nbRes = sizeof(resList)/sizeof(uint16_t); + int nbRes = sizeof(resList) / sizeof(uint16_t); *dataArrayP = lwm2m_data_new(nbRes); if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; *numDataP = nbRes; - for (i = 0 ; i < nbRes ; i++) + for (i = 0; i < nbRes; i++) { (*dataArrayP)[i].id = resList[i]; } @@ -183,9 +201,7 @@ return result; } -static uint8_t prv_set_int_value(lwm2m_data_t * dataArray, - uint32_t * data) -{ +static uint8_t prv_set_int_value(lwm2m_data_t * dataArray, uint32_t * data) { uint8_t result; int64_t value; @@ -229,32 +245,43 @@ switch (dataArray[i].id) { case LWM2M_SERVER_SHORT_ID_ID: - { - uint32_t value; - - result = prv_set_int_value(dataArray + i, &value); - if (COAP_204_CHANGED == result) { - if (0 < value && value <= 0xFFFF) + uint32_t value = targetP->shortServerId; + result = prv_set_int_value(dataArray + i, &value); + if (COAP_204_CHANGED == result) { - targetP->shortServerId = value; - } - else - { - result = COAP_406_NOT_ACCEPTABLE; + if (0 < value && 0xFFFF >= value) + { + targetP->shortServerId = value; + } + else + { + result = COAP_406_NOT_ACCEPTABLE; + } } } - } - break; + break; case LWM2M_SERVER_LIFETIME_ID: result = prv_set_int_value(dataArray + i, (uint32_t *)&(targetP->lifetime)); break; + case LWM2M_SERVER_MIN_PERIOD_ID: + result = prv_set_int_value(dataArray + i, &(targetP->defaultMinPeriod)); + break; + + case LWM2M_SERVER_MAX_PERIOD_ID: + result = prv_set_int_value(dataArray + i, &(targetP->defaultMaxPeriod)); + break; + case LWM2M_SERVER_DISABLE_ID: result = COAP_405_METHOD_NOT_ALLOWED; break; + case LWM2M_SERVER_TIMEOUT_ID: + result = prv_set_int_value(dataArray + i, &(targetP->disableTimeout)); + break; + case LWM2M_SERVER_STORING_ID: { bool value; @@ -274,11 +301,11 @@ case LWM2M_SERVER_BINDING_ID: if ((dataArray[i].type == LWM2M_TYPE_STRING || dataArray[i].type == LWM2M_TYPE_OPAQUE) && dataArray[i].value.asBuffer.length > 0 && dataArray[i].value.asBuffer.length <= 3 - && (strncmp((char*)dataArray[i].value.asBuffer.buffer, "U", dataArray[i].value.asBuffer.length) == 0 - || strncmp((char*)dataArray[i].value.asBuffer.buffer, "UQ", dataArray[i].value.asBuffer.length) == 0 - || strncmp((char*)dataArray[i].value.asBuffer.buffer, "S", dataArray[i].value.asBuffer.length) == 0 - || strncmp((char*)dataArray[i].value.asBuffer.buffer, "SQ", dataArray[i].value.asBuffer.length) == 0 - || strncmp((char*)dataArray[i].value.asBuffer.buffer, "US", dataArray[i].value.asBuffer.length) == 0 + && (strncmp((char*)dataArray[i].value.asBuffer.buffer, "U", dataArray[i].value.asBuffer.length) == 0 + || strncmp((char*)dataArray[i].value.asBuffer.buffer, "UQ", dataArray[i].value.asBuffer.length) == 0 + || strncmp((char*)dataArray[i].value.asBuffer.buffer, "S", dataArray[i].value.asBuffer.length) == 0 + || strncmp((char*)dataArray[i].value.asBuffer.buffer, "SQ", dataArray[i].value.asBuffer.length) == 0 + || strncmp((char*)dataArray[i].value.asBuffer.buffer, "US", dataArray[i].value.asBuffer.length) == 0 || strncmp((char*)dataArray[i].value.asBuffer.buffer, "UQS", dataArray[i].value.asBuffer.length) == 0)) { strncpy(targetP->binding, (char*)dataArray[i].value.asBuffer.buffer, dataArray[i].value.asBuffer.length); @@ -319,12 +346,11 @@ { case LWM2M_SERVER_DISABLE_ID: // executed in core, if COAP_204_CHANGED is returned - return COAP_204_CHANGED; - + if (0 < targetP->disableTimeout) return COAP_204_CHANGED; + else return COAP_405_METHOD_NOT_ALLOWED; case LWM2M_SERVER_UPDATE_ID: // executed in core, if COAP_204_CHANGED is returned return COAP_204_CHANGED; - default: return COAP_405_METHOD_NOT_ALLOWED; } @@ -372,7 +398,56 @@ return result; } -lwm2m_object_t * get_server_object() +void copy_server_object(lwm2m_object_t * objectDest, lwm2m_object_t * objectSrc) +{ + memcpy(objectDest, objectSrc, sizeof(lwm2m_object_t)); + objectDest->instanceList = NULL; + objectDest->userData = NULL; + server_instance_t * instanceSrc = (server_instance_t *)objectSrc->instanceList; + server_instance_t * previousInstanceDest = NULL; + while (instanceSrc != NULL) + { + server_instance_t * instanceDest = (server_instance_t *)lwm2m_malloc(sizeof(server_instance_t)); + if (NULL == instanceDest) + { + return; + } + memcpy(instanceDest, instanceSrc, sizeof(server_instance_t)); + // not sure it's necessary: + strcpy(instanceDest->binding, instanceSrc->binding); + instanceSrc = (server_instance_t *)instanceSrc->next; + if (previousInstanceDest == NULL) + { + objectDest->instanceList = (lwm2m_list_t *)instanceDest; + } + else + { + previousInstanceDest->next = instanceDest; + } + previousInstanceDest = instanceDest; + } +} + +void display_server_object(lwm2m_object_t * object) +{ +#ifdef WITH_LOGS + fprintf(stdout, " /%u: Server object, instances:\r\n", object->objID); + server_instance_t * serverInstance = (server_instance_t *)object->instanceList; + while (serverInstance != NULL) + { + fprintf(stdout, " /%u/%u: instanceId: %u, shortServerId: %u, lifetime: %u, storing: %s, binding: %s\r\n", + object->objID, serverInstance->instanceId, + serverInstance->instanceId, serverInstance->shortServerId, serverInstance->lifetime, + serverInstance->storing ? "true" : "false", serverInstance->binding); + serverInstance = (server_instance_t *)serverInstance->next; + } +#endif +} + +lwm2m_object_t * get_server_object(int serverId, + const char* binding, + int lifetime, + bool storing) { lwm2m_object_t * serverObj; @@ -396,24 +471,24 @@ memset(serverInstance, 0, sizeof(server_instance_t)); serverInstance->instanceId = 0; - serverInstance->shortServerId = 123; - serverInstance->lifetime = 300; - serverInstance->storing = false; - serverInstance->binding[0] = 'U'; + serverInstance->shortServerId = serverId; + serverInstance->lifetime = lifetime; + serverInstance->storing = storing; + memcpy (serverInstance->binding, binding, strlen(binding)+1); serverObj->instanceList = LWM2M_LIST_ADD(serverObj->instanceList, serverInstance); serverObj->readFunc = prv_server_read; + serverObj->discoverFunc = prv_server_discover; serverObj->writeFunc = prv_server_write; serverObj->createFunc = prv_server_create; serverObj->deleteFunc = prv_server_delete; serverObj->executeFunc = prv_server_execute; - serverObj->discoverFunc = prv_server_discover; } return serverObj; } -void free_server_object(lwm2m_object_t * object) +void clean_server_object(lwm2m_object_t * object) { while (object->instanceList != NULL) { @@ -421,5 +496,4 @@ object->instanceList = object->instanceList->next; lwm2m_free(serverInstance); } - lwm2m_free(object); }