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

Dependencies:   C12832 LM75B

Committer:
terencez
Date:
Thu May 11 12:40:25 2017 +0000
Revision:
16:31c387e94b6d
Added a demo temperature object based on sensor LM75B.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
terencez 16:31c387e94b6d 1 #include "liblwm2m.h"
terencez 16:31c387e94b6d 2
terencez 16:31c387e94b6d 3 #include <stdio.h>
terencez 16:31c387e94b6d 4 #include <stdlib.h>
terencez 16:31c387e94b6d 5 #include <string.h>
terencez 16:31c387e94b6d 6 #include <ctype.h>
terencez 16:31c387e94b6d 7
terencez 16:31c387e94b6d 8 #define LWM2M_TEMPERATURE_OBJECT_ID 3303
terencez 16:31c387e94b6d 9 #define LWM2M_TEMPERATURE_SENSOR_UNITS "Celsius"
terencez 16:31c387e94b6d 10 #define LWM2M_TEMPERATURE_LOCATION "Shenzhen,China"
terencez 16:31c387e94b6d 11
terencez 16:31c387e94b6d 12
terencez 16:31c387e94b6d 13 #define RES_SENSOR_MIN 5601
terencez 16:31c387e94b6d 14 #define RES_SENSOR_MAX 5602
terencez 16:31c387e94b6d 15 #define RES_SENSOR_MIN_RANGE 5603
terencez 16:31c387e94b6d 16 #define RES_SENSOR_MAX_RANGE 5604
terencez 16:31c387e94b6d 17 #define RES_SENSOR_RESET 5605
terencez 16:31c387e94b6d 18 #define RES_SENSOR_VALUE 5700
terencez 16:31c387e94b6d 19 #define RES_SENSOR_UNITS 5701
terencez 16:31c387e94b6d 20 #define RES_SENSOR_LOCATION 5702
terencez 16:31c387e94b6d 21
terencez 16:31c387e94b6d 22 void get_temperature(float *temp);
terencez 16:31c387e94b6d 23
terencez 16:31c387e94b6d 24 static uint8_t prv_set_value(lwm2m_data_t * dataP)
terencez 16:31c387e94b6d 25 {
terencez 16:31c387e94b6d 26 float temp =0;
terencez 16:31c387e94b6d 27 // a simple switch structure is used to respond at the specified resource asked
terencez 16:31c387e94b6d 28 switch (dataP->id) {
terencez 16:31c387e94b6d 29 case RES_SENSOR_VALUE:
terencez 16:31c387e94b6d 30 get_temperature(&temp);
terencez 16:31c387e94b6d 31 lwm2m_data_encode_float(temp, dataP);
terencez 16:31c387e94b6d 32 return COAP_205_CONTENT ;
terencez 16:31c387e94b6d 33
terencez 16:31c387e94b6d 34 case RES_SENSOR_UNITS:
terencez 16:31c387e94b6d 35 lwm2m_data_encode_string(LWM2M_TEMPERATURE_SENSOR_UNITS, dataP);
terencez 16:31c387e94b6d 36 return COAP_205_CONTENT ;
terencez 16:31c387e94b6d 37
terencez 16:31c387e94b6d 38 case RES_SENSOR_MIN:
terencez 16:31c387e94b6d 39 case RES_SENSOR_MAX:
terencez 16:31c387e94b6d 40 case RES_SENSOR_RESET:
terencez 16:31c387e94b6d 41 lwm2m_data_encode_string("Not Support!", dataP);
terencez 16:31c387e94b6d 42 return COAP_205_CONTENT ;
terencez 16:31c387e94b6d 43 case RES_SENSOR_MIN_RANGE:
terencez 16:31c387e94b6d 44 lwm2m_data_encode_float(-55, dataP);
terencez 16:31c387e94b6d 45 return COAP_205_CONTENT ;
terencez 16:31c387e94b6d 46 case RES_SENSOR_MAX_RANGE:
terencez 16:31c387e94b6d 47 lwm2m_data_encode_float(125, dataP);
terencez 16:31c387e94b6d 48 return COAP_205_CONTENT ;
terencez 16:31c387e94b6d 49 //case RES_SENSOR_LOCATION:
terencez 16:31c387e94b6d 50 // lwm2m_data_encode_string(LWM2M_TEMPERATURE_LOCATION, dataP);
terencez 16:31c387e94b6d 51 // return COAP_205_CONTENT ;
terencez 16:31c387e94b6d 52 default:
terencez 16:31c387e94b6d 53 return COAP_404_NOT_FOUND ;
terencez 16:31c387e94b6d 54 }
terencez 16:31c387e94b6d 55 }
terencez 16:31c387e94b6d 56
terencez 16:31c387e94b6d 57 static uint8_t prv_temperature_read(uint16_t instanceId, int * numDataP, lwm2m_data_t ** dataArrayP, lwm2m_object_t * objectP) {
terencez 16:31c387e94b6d 58 uint8_t result;
terencez 16:31c387e94b6d 59 int i;
terencez 16:31c387e94b6d 60
terencez 16:31c387e94b6d 61 // this is a single instance object
terencez 16:31c387e94b6d 62 if (instanceId != 0) {
terencez 16:31c387e94b6d 63 return COAP_404_NOT_FOUND ;
terencez 16:31c387e94b6d 64 }
terencez 16:31c387e94b6d 65
terencez 16:31c387e94b6d 66 // is the server asking for the full object ?
terencez 16:31c387e94b6d 67 if (*numDataP == 0) {
terencez 16:31c387e94b6d 68
terencez 16:31c387e94b6d 69 uint16_t resList[] = { RES_SENSOR_VALUE, RES_SENSOR_UNITS, };
terencez 16:31c387e94b6d 70
terencez 16:31c387e94b6d 71 int nbRes = sizeof(resList) / sizeof(uint16_t);
terencez 16:31c387e94b6d 72
terencez 16:31c387e94b6d 73 *dataArrayP = lwm2m_data_new(nbRes);
terencez 16:31c387e94b6d 74 if (*dataArrayP == NULL)
terencez 16:31c387e94b6d 75 return COAP_500_INTERNAL_SERVER_ERROR ;
terencez 16:31c387e94b6d 76
terencez 16:31c387e94b6d 77 *numDataP = nbRes;
terencez 16:31c387e94b6d 78 for (i = 0; i < nbRes; i++) {
terencez 16:31c387e94b6d 79 (*dataArrayP)[i].id = resList[i];
terencez 16:31c387e94b6d 80 }
terencez 16:31c387e94b6d 81 }
terencez 16:31c387e94b6d 82
terencez 16:31c387e94b6d 83 i = 0;
terencez 16:31c387e94b6d 84 do {
terencez 16:31c387e94b6d 85 result = prv_set_value((*dataArrayP) + i);
terencez 16:31c387e94b6d 86 i++;
terencez 16:31c387e94b6d 87 } while (i < *numDataP && result == COAP_205_CONTENT );
terencez 16:31c387e94b6d 88
terencez 16:31c387e94b6d 89 return result;
terencez 16:31c387e94b6d 90 }
terencez 16:31c387e94b6d 91
terencez 16:31c387e94b6d 92
terencez 16:31c387e94b6d 93 lwm2m_object_t * get_object_temperature() {
terencez 16:31c387e94b6d 94 /*
terencez 16:31c387e94b6d 95 * The get_object_tem function create the object itself and return a pointer to the structure that represent it.
terencez 16:31c387e94b6d 96 */
terencez 16:31c387e94b6d 97 lwm2m_object_t * temperatureObj = (lwm2m_object_t *) lwm2m_malloc(sizeof(lwm2m_object_t));
terencez 16:31c387e94b6d 98
terencez 16:31c387e94b6d 99 if (NULL != temperatureObj) {
terencez 16:31c387e94b6d 100 memset(temperatureObj, 0, sizeof(lwm2m_object_t));
terencez 16:31c387e94b6d 101
terencez 16:31c387e94b6d 102 /*
terencez 16:31c387e94b6d 103 * It assigns his unique ID
terencez 16:31c387e94b6d 104 * The 3313 is the standard ID for the mandatory object "IPSO Accelerometer".
terencez 16:31c387e94b6d 105 */
terencez 16:31c387e94b6d 106 temperatureObj->objID = LWM2M_TEMPERATURE_OBJECT_ID;
terencez 16:31c387e94b6d 107
terencez 16:31c387e94b6d 108 /*
terencez 16:31c387e94b6d 109 * there is only one instance of accelerometer on the Application Board for mbed NXP LPC1768.
terencez 16:31c387e94b6d 110 *
terencez 16:31c387e94b6d 111 */
terencez 16:31c387e94b6d 112 temperatureObj->instanceList = (lwm2m_list_t *) lwm2m_malloc(sizeof(lwm2m_list_t));
terencez 16:31c387e94b6d 113 if (NULL != temperatureObj->instanceList) {
terencez 16:31c387e94b6d 114 memset(temperatureObj->instanceList, 0, sizeof(lwm2m_list_t));
terencez 16:31c387e94b6d 115 } else {
terencez 16:31c387e94b6d 116 lwm2m_free(temperatureObj);
terencez 16:31c387e94b6d 117 return NULL;
terencez 16:31c387e94b6d 118 }
terencez 16:31c387e94b6d 119
terencez 16:31c387e94b6d 120 /*
terencez 16:31c387e94b6d 121 * And the private function that will access the object.
terencez 16:31c387e94b6d 122 * Those function will be called when a read/write/execute query is made by the server. In fact the library don't need to
terencez 16:31c387e94b6d 123 * know the resources of the object, only the server does.
terencez 16:31c387e94b6d 124 */
terencez 16:31c387e94b6d 125 temperatureObj->readFunc = prv_temperature_read;
terencez 16:31c387e94b6d 126 temperatureObj->writeFunc = NULL;
terencez 16:31c387e94b6d 127 temperatureObj->executeFunc = NULL;
terencez 16:31c387e94b6d 128 temperatureObj->userData = NULL;
terencez 16:31c387e94b6d 129
terencez 16:31c387e94b6d 130
terencez 16:31c387e94b6d 131 }
terencez 16:31c387e94b6d 132
terencez 16:31c387e94b6d 133 return temperatureObj;
terencez 16:31c387e94b6d 134 }