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/object_mbed_temperature.cpp@16:31c387e94b6d, 2017-05-11 (annotated)
- 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?
User | Revision | Line number | New 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 | } |