/** implementation for all read-able resources */ static uint8_t prv_res2tlv(lwm2m_data_t* dataP, location_data_t* locDataP) { //-------------------------------------------------------------------- JH -- uint8_t ret = COAP_205_CONTENT; switch (dataP->id) // location resourceId { case RES_M_LATITUDE: lwm2m_data_encode_float(locDataP->latitude, dataP); break; case RES_M_LONGITUDE: lwm2m_data_encode_float(locDataP->longitude, dataP); break; case RES_O_ALTITUDE: lwm2m_data_encode_float(locDataP->altitude, dataP); break; case RES_O_RADIUS: lwm2m_data_encode_float(locDataP->radius, dataP); break; case RES_O_VELOCITY: lwm2m_data_encode_string((const char*)locDataP->velocity, dataP); break; case RES_M_TIMESTAMP: lwm2m_data_encode_int(locDataP->timestamp, dataP); break; case RES_O_SPEED: lwm2m_data_encode_float(locDataP->speed, dataP); break; default: ret = COAP_404_NOT_FOUND; break; } return ret; }
static uint8_t prv_read(uint16_t instanceId, int * numDataP, lwm2m_data_t ** dataArrayP, lwm2m_object_t * objectP) { prv_instance_t * targetP; int i; targetP = (prv_instance_t *)lwm2m_list_find(objectP->instanceList, instanceId); if (NULL == targetP) return COAP_404_NOT_FOUND; if (*numDataP == 0) { *dataArrayP = lwm2m_data_new(3); if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; *numDataP = 3; (*dataArrayP)[0].id = 1; (*dataArrayP)[1].id = 3; (*dataArrayP)[2].id = 4; } for (i = 0 ; i < *numDataP ; i++) { switch ((*dataArrayP)[i].id) { case 1: (*dataArrayP)[i].type = LWM2M_TYPE_RESOURCE; lwm2m_data_encode_int(targetP->test, *dataArrayP + i); break; case 2: return COAP_405_METHOD_NOT_ALLOWED; case 3: (*dataArrayP)[i].type = LWM2M_TYPE_RESOURCE; lwm2m_data_encode_float(targetP->dec, *dataArrayP + i); break; case 4: (*dataArrayP)[i].type = LWM2M_TYPE_RESOURCE; lwm2m_data_encode_int(targetP->sig, *dataArrayP + i); break; default: return COAP_404_NOT_FOUND; } if ((*dataArrayP)[i].length == 0) return COAP_500_INTERNAL_SERVER_ERROR; } return COAP_205_CONTENT; }
static int prv_convertRecord(_record_t * recordArray, int count, lwm2m_data_t ** dataP) { int index; int tlvIndex; lwm2m_data_t * tlvP; // may be overkill tlvP = lwm2m_data_new(count); if (NULL == tlvP) return -1; tlvIndex = 0; for (index = 0 ; index < count ; index++) { lwm2m_data_t * targetP; if (recordArray[index].resInstId == LWM2M_MAX_ID) { targetP = tlvP + tlvIndex; targetP->type = LWM2M_TYPE_RESOURCE; targetP->id = recordArray[index].resId; tlvIndex++; } else { int resIndex; resIndex = 0; while (resIndex < tlvIndex && tlvP[resIndex].id != recordArray[index].resId) { resIndex++; } if (resIndex == tlvIndex) { targetP = lwm2m_data_new(1); if (NULL == targetP) goto error; tlvP[resIndex].type = LWM2M_TYPE_MULTIPLE_RESOURCE; tlvP[resIndex].id = recordArray[index].resId; tlvP[resIndex].length = 1; tlvP[resIndex].value = (uint8_t *)targetP; tlvIndex++; } else { targetP = lwm2m_data_new(tlvP[resIndex].length + 1); if (NULL == targetP) goto error; memcpy(targetP + 1, tlvP[resIndex].value, tlvP[resIndex].length * sizeof(lwm2m_data_t)); lwm2m_free(tlvP[resIndex].value); // do not use lwm2m_data_free() to preserve value pointers tlvP[resIndex].value = (uint8_t *)targetP; tlvP[resIndex].length++; } targetP->type = LWM2M_TYPE_RESOURCE_INSTANCE; targetP->id = recordArray[index].resInstId; } switch (recordArray[index].type) { case _TYPE_FALSE: lwm2m_data_encode_bool(false, targetP); break; case _TYPE_TRUE: lwm2m_data_encode_bool(true, targetP); break; case _TYPE_FLOAT: { size_t i; i = 0; while (i < recordArray[index].valueLen && recordArray[index].value[i] != '.') { i++; } if (i == recordArray[index].valueLen) { int64_t value; if ( 1 != lwm2m_PlainTextToInt64(recordArray[index].value, recordArray[index].valueLen, &value)) { goto error; } lwm2m_data_encode_int(value, targetP); } else { double value; if ( 1 != lwm2m_PlainTextToFloat64(recordArray[index].value, recordArray[index].valueLen, &value)) { goto error; } lwm2m_data_encode_float(value, targetP); } } break; // TODO: Copy string instead of pointing to it case _TYPE_STRING: targetP->flags = LWM2M_TLV_FLAG_STATIC_DATA | LWM2M_TLV_FLAG_TEXT_FORMAT; targetP->dataType = LWM2M_TYPE_STRING; // or opaque ? targetP->length = recordArray[index].valueLen; targetP->value = recordArray[index].value; break; case _TYPE_UNSET: default: goto error; } } *dataP = tlvP; return tlvIndex; error: lwm2m_data_free(count, tlvP); return -1; }
static bool prv_convertValue(_record_t * recordP, lwm2m_data_t * targetP) { switch (recordP->type) { case _TYPE_FALSE: lwm2m_data_encode_bool(false, targetP); break; case _TYPE_TRUE: lwm2m_data_encode_bool(true, targetP); break; case _TYPE_FLOAT: { size_t i; i = 0; while (i < recordP->valueLen && recordP->value[i] != '.') { i++; } if (i == recordP->valueLen) { int64_t value; if ( 1 != utils_textToInt(recordP->value, recordP->valueLen, &value)) { return false; } lwm2m_data_encode_int(value, targetP); } else { double value; if ( 1 != utils_textToFloat(recordP->value, recordP->valueLen, &value)) { return false; } lwm2m_data_encode_float(value, targetP); } } break; case _TYPE_STRING: lwm2m_data_encode_opaque(recordP->value, recordP->valueLen, targetP); targetP->type = LWM2M_TYPE_STRING; break; case _TYPE_UNSET: default: return false; } return true; }