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

Dependencies:   C12832 LM75B

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);
 }