54 #define PRINTF(...) printf(__VA_ARGS__)
59 #if LEDS_ALL & LEDS_BLUE || LEDS_ALL & LEDS_RED || LEDS_ALL & LEDS_BLUE
60 #define LEDS_CONTROL_NUMBER (((LEDS_ALL & LEDS_BLUE) ? 1 : 0) + ((LEDS_ALL & LEDS_RED) ? 1 : 0) + ((LEDS_ALL & LEDS_GREEN) ? 1 : 0))
62 #define LEDS_CONTROL_NUMBER 1
66 unsigned long last_on_time;
67 uint32_t total_on_time;
72 static struct led_state states[LEDS_CONTROL_NUMBER];
73 static lwm2m_instance_t leds_control_instances[LEDS_CONTROL_NUMBER];
76 read_state(lwm2m_context_t *ctx, uint8_t *outbuf,
size_t outsize)
78 uint8_t idx = ctx->object_instance_index;
79 if(idx >= LEDS_CONTROL_NUMBER) {
82 return ctx->writer->write_boolean(ctx, outbuf, outsize,
83 states[idx].is_on ? 1 : 0);
87 write_state(lwm2m_context_t *ctx,
const uint8_t *inbuf,
size_t insize,
88 uint8_t *outbuf,
size_t outsize)
93 uint8_t idx = ctx->object_instance_index;
94 if(idx >= LEDS_CONTROL_NUMBER) {
98 len = ctx->reader->read_boolean(ctx, inbuf, insize, &value);
101 if(!states[idx].is_on) {
102 states[idx].is_on = 1;
104 #if PLATFORM_HAS_LEDS
105 leds_on(states[idx].led_value);
108 }
else if(states[idx].is_on) {
109 states[idx].total_on_time +=
clock_seconds() - states[idx].last_on_time;
110 states[idx].is_on = 0;
111 #if PLATFORM_HAS_LEDS
112 leds_off(states[idx].led_value);
116 PRINTF(
"IPSO leds control - ignored illegal write to on/off\n");
122 get_color(
int value) {
135 read_color(lwm2m_context_t *ctx, uint8_t *outbuf,
size_t outsize)
138 uint8_t idx = ctx->object_instance_index;
139 if(idx >= LEDS_CONTROL_NUMBER) {
142 value = get_color(states[idx].led_value);
143 return ctx->writer->write_string(ctx, outbuf, outsize,
144 value, strlen(value));
148 read_on_time(lwm2m_context_t *ctx, uint8_t *outbuf,
size_t outsize)
151 uint8_t idx = ctx->object_instance_index;
152 if(idx >= LEDS_CONTROL_NUMBER) {
156 if(states[idx].is_on) {
159 states[idx].total_on_time += now - states[idx].last_on_time;
160 states[idx].last_on_time = now;
162 return ctx->writer->write_int(ctx, outbuf, outsize,
163 (int32_t)states[idx].total_on_time);
167 write_on_time(lwm2m_context_t *ctx,
168 const uint8_t *inbuf,
size_t insize,
169 uint8_t *outbuf,
size_t outsize)
173 uint8_t idx = ctx->object_instance_index;
174 if(idx >= LEDS_CONTROL_NUMBER) {
178 len = ctx->reader->read_int(ctx, inbuf, insize, &value);
179 if(len > 0 && value == 0) {
180 PRINTF(
"IPSO leds control - reset On Time\n");
181 states[idx].total_on_time = 0;
182 if(states[idx].is_on) {
186 PRINTF(
"IPSO leds control - ignored illegal write to On Time\n");
191 LWM2M_RESOURCES(leds_control_resources,
192 LWM2M_RESOURCE_CALLBACK(5850, { read_state, write_state,
NULL }),
193 LWM2M_RESOURCE_CALLBACK(5706, { read_color,
NULL, NULL }),
194 LWM2M_RESOURCE_CALLBACK(5852, { read_on_time, write_on_time,
NULL })
196 LWM2M_OBJECT(leds_control, 3311, leds_control_instances);
202 for(i = 0; i < 8; i++) {
203 if(LEDS_ALL & (1 << i)) {
217 ipso_leds_control_init(
void)
219 lwm2m_instance_t
template = LWM2M_INSTANCE(0, leds_control_resources);
223 for(i = 0; i < LEDS_CONTROL_NUMBER; i++) {
224 leds_control_instances[i] =
template;
225 leds_control_instances[i].id = i;
226 states[i].led_value = bit_no(i);
231 lwm2m_engine_register_object(&leds_control);
232 PRINTF(
"IPSO leds control initialized with %u instances\n",
233 LEDS_CONTROL_NUMBER);
Header file for the Contiki OMA LWM2M object API
Header file for the Contiki OMA LWM2M engine
#define NULL
The null pointer.
CCIF unsigned long clock_seconds(void)
Get the current value of the platform seconds.
CoAP implementation for the REST Engine.