49 #define IPSO_SENSOR_VALUE 5700 50 #define IPSO_SENSOR_UNIT 5701 51 #define IPSO_SENSOR_MIN_VALUE 5601 52 #define IPSO_SENSOR_MAX_VALUE 5602 53 #define IPSO_SENSOR_MIN_RANGE 5603 54 #define IPSO_SENSOR_MAX_RANGE 5604 56 #define IPSO_SENSOR_RESET_MINMAX 5605 58 static const lwm2m_resource_id_t resources[] =
60 RO(IPSO_SENSOR_VALUE), RO(IPSO_SENSOR_UNIT),
61 RO(IPSO_SENSOR_MIN_VALUE), RO(IPSO_SENSOR_MAX_VALUE),
62 RO(IPSO_SENSOR_MIN_RANGE), RO(IPSO_SENSOR_MAX_RANGE),
63 EX(IPSO_SENSOR_RESET_MINMAX)
67 static void update_last_value(ipso_sensor_value_t *sval, int32_t value,
71 static coap_timer_t nt;
74 #define MAX_PERIODIC 4 75 struct periodic_sensor {
76 ipso_sensor_value_t *value;
78 } periodics[MAX_PERIODIC];
81 timer_callback(coap_timer_t *
timer)
86 for(i = 0; i < MAX_PERIODIC; i++) {
87 if(periodics[i].value != NULL) {
88 if(periodics[i].ticks_left > 0) {
89 periodics[i].ticks_left--;
92 periodics[i].ticks_left = periodics[i].value->sensor->update_interval;
93 if(periodics[i].value->sensor->get_value_in_millis(periodics[i].value->sensor, &value) == LWM2M_STATUS_OK) {
94 update_last_value(periodics[i].value, value, 1);
102 add_periodic(
const ipso_sensor_t *sensor)
105 for(i = 0; i < MAX_PERIODIC; i++) {
106 if(periodics[i].value == NULL) {
107 periodics[i].value = sensor->sensor_value;
108 periodics[i].ticks_left = sensor->update_interval;
115 update_last_value(ipso_sensor_value_t *sval, int32_t value, uint8_t notify)
118 if(sval->last_value != value && notify) {
119 lwm2m_notify_object_observers(&sval->reg_object, IPSO_SENSOR_VALUE);
121 sval->last_value = value;
122 if(sval->min_value > value) {
123 sval->min_value = value;
124 lwm2m_notify_object_observers(&sval->reg_object, IPSO_SENSOR_MIN_VALUE);
126 if(sval->max_value < value) {
127 sval->max_value = value;
128 lwm2m_notify_object_observers(&sval->reg_object, IPSO_SENSOR_MAX_VALUE);
133 write_float32fix(lwm2m_context_t *ctx, int32_t value)
136 tmp = (tmp * 1024) / 1000;
137 return lwm2m_object_write_float32fix(ctx, (int32_t)tmp, 10);
140 static lwm2m_status_t
141 lwm2m_callback(lwm2m_object_instance_t *
object,
142 lwm2m_context_t *ctx)
145 const ipso_sensor_t *sensor;
146 ipso_sensor_value_t *value;
147 value = (ipso_sensor_value_t *)
object;
148 sensor = value->sensor;
151 if(ctx->level == 1) {
153 return LWM2M_STATUS_ERROR;
155 if(ctx->level == 2) {
157 return LWM2M_STATUS_ERROR;
159 if(ctx->level == 3) {
162 if(ctx->operation == LWM2M_OP_READ) {
163 switch(ctx->resource_id) {
164 case IPSO_SENSOR_UNIT:
165 if(sensor->unit != NULL) {
166 lwm2m_object_write_string(ctx, sensor->unit, strlen(sensor->unit));
169 case IPSO_SENSOR_MAX_RANGE:
170 write_float32fix(ctx, sensor->max_range);
172 case IPSO_SENSOR_MIN_RANGE:
173 write_float32fix(ctx, sensor->min_range);
175 case IPSO_SENSOR_MAX_VALUE:
176 write_float32fix(ctx, value->max_value);
178 case IPSO_SENSOR_MIN_VALUE:
179 write_float32fix(ctx, value->min_value);
181 case IPSO_SENSOR_VALUE:
182 if(sensor->get_value_in_millis != NULL) {
184 if(sensor->get_value_in_millis(sensor, &v) == LWM2M_STATUS_OK) {
185 update_last_value(value, v, 0);
186 write_float32fix(ctx, value->last_value);
191 return LWM2M_STATUS_ERROR;
193 }
else if(ctx->operation == LWM2M_OP_EXECUTE) {
194 if(ctx->resource_id == IPSO_SENSOR_RESET_MINMAX) {
195 value->min_value = value->last_value;
196 value->max_value = value->last_value;
200 return LWM2M_STATUS_OK;
204 ipso_sensor_add(
const ipso_sensor_t *sensor)
206 if(sensor->update_interval > 0) {
212 add_periodic(sensor);
215 if(sensor->sensor_value == NULL) {
218 sensor->sensor_value->reg_object.object_id = sensor->object_id;
219 sensor->sensor_value->sensor = sensor;
220 if(sensor->instance_id == 0) {
221 sensor->sensor_value->reg_object.instance_id = LWM2M_OBJECT_INSTANCE_NONE;
223 sensor->sensor_value->reg_object.instance_id = sensor->instance_id;
225 sensor->sensor_value->reg_object.callback = lwm2m_callback;
226 sensor->sensor_value->reg_object.resource_ids = resources;
227 sensor->sensor_value->reg_object.resource_count =
228 sizeof(resources) /
sizeof(lwm2m_resource_id_t);
229 return lwm2m_engine_add_object(&sensor->sensor_value->reg_object);
233 ipso_sensor_remove(
const ipso_sensor_t *sensor)
235 lwm2m_engine_remove_object(&sensor->sensor_value->reg_object);
Implementation of OMA LWM2M / IPSO sensor template.
static void coap_timer_set_callback(coap_timer_t *timer, void(*callback)(coap_timer_t *))
Set a callback function to be called when a CoAP timer expires.
void coap_timer_reset(coap_timer_t *timer, uint64_t time)
Reset a CoAP timer to expire a specified time after the last expiration time.
Header file for the Contiki OMA LWM2M engine
void coap_timer_set(coap_timer_t *timer, uint64_t time)
Set a CoAP timer to expire after the specified time.