static int light_method_get(const struct sol_coap_resource *resource, struct sol_coap_packet *req, const struct sol_network_link_addr *cliaddr, void *data) { struct sol_coap_server *server = (void *)data; struct sol_coap_packet *resp; uint8_t *payload; uint16_t len; resp = sol_coap_packet_new(req); if (!resp) { SOL_WRN("Could not build response packet"); return -1; } sol_coap_header_set_type(resp, SOL_COAP_TYPE_ACK); sol_coap_header_set_code(resp, SOL_COAP_RSPCODE_CONTENT); sol_coap_packet_get_payload(resp, &payload, &len); len = light_resource_to_rep(resource, get_scrolllock_led(), (char *)payload, len); sol_coap_packet_set_payload_used(resp, len); return sol_coap_send_packet(server, resp, cliaddr); }
static bool update_light(void *data) { struct light_context *context = data; struct sol_coap_server *server = context->server; struct sol_coap_resource *resource = context->resource; struct sol_coap_packet *pkt; uint8_t *payload; uint16_t len; SOL_INF("Emitting notification"); pkt = sol_coap_packet_notification_new(server, resource); SOL_NULL_CHECK(pkt, false); sol_coap_header_set_code(pkt, SOL_COAP_RSPCODE_CONTENT); sol_coap_packet_get_payload(pkt, &payload, &len); len = light_resource_to_rep(resource, get_scrolllock_led(), (char *)payload, len); sol_coap_packet_set_payload_used(pkt, len); return !sol_coap_packet_send_notification(server, resource, pkt); }
CborError sol_oic_encode_cbor_repr(struct sol_coap_packet *pkt, const char *href, const struct sol_vector *repr_vec) { CborEncoder encoder, rep_map, array, map; CborError err; uint8_t *payload; uint16_t size; if (!repr_vec) return CborNoError; if (sol_coap_packet_get_payload(pkt, &payload, &size) < 0) { SOL_WRN("Could not get CoAP payload"); return CborUnknownError; } cbor_encoder_init(&encoder, payload, size, 0); err = cbor_encoder_create_array(&encoder, &array, CborIndefiniteLength); err |= cbor_encode_uint(&array, SOL_OIC_PAYLOAD_REPRESENTATION); err |= cbor_encoder_create_map(&array, &map, CborIndefiniteLength); err |= cbor_encode_text_stringz(&map, SOL_OIC_KEY_HREF); err |= cbor_encode_text_stringz(&map, href); err |= cbor_encode_text_stringz(&map, SOL_OIC_KEY_REPRESENTATION); err |= cbor_encoder_create_map(&map, &rep_map, CborIndefiniteLength); if (repr_vec) { struct sol_oic_repr_field *repr; uint16_t idx; SOL_VECTOR_FOREACH_IDX (repr_vec, repr, idx) { if (err != CborNoError) break; err |= cbor_encode_text_stringz(&rep_map, repr->key); switch (repr->type) { case SOL_OIC_REPR_TYPE_UINT: err |= cbor_encode_uint(&rep_map, repr->v_uint); break; case SOL_OIC_REPR_TYPE_INT: err |= cbor_encode_int(&rep_map, repr->v_int); break; case SOL_OIC_REPR_TYPE_SIMPLE: err |= cbor_encode_simple_value(&rep_map, repr->v_simple); break; case SOL_OIC_REPR_TYPE_TEXT_STRING: { const char *p = repr->v_slice.data ? repr->v_slice.data : ""; err |= cbor_encode_text_string(&rep_map, p, repr->v_slice.len); break; } case SOL_OIC_REPR_TYPE_BYTE_STRING: { const uint8_t *empty = (const uint8_t *)""; const uint8_t *p = repr->v_slice.data ? (const uint8_t *)repr->v_slice.data : empty; err |= cbor_encode_byte_string(&rep_map, p, repr->v_slice.len); break; } case SOL_OIC_REPR_TYPE_HALF_FLOAT: err |= cbor_encode_half_float(&rep_map, repr->v_voidptr); break; case SOL_OIC_REPR_TYPE_FLOAT: err |= cbor_encode_float(&rep_map, repr->v_float); break; case SOL_OIC_REPR_TYPE_DOUBLE: err |= cbor_encode_double(&rep_map, repr->v_double); break; case SOL_OIC_REPR_TYPE_BOOLEAN: err |= cbor_encode_boolean(&rep_map, repr->v_boolean); break; default: if (err == CborNoError) err = CborErrorUnknownType; } } } err |= cbor_encoder_close_container(&map, &rep_map); err |= cbor_encoder_close_container(&array, &map); err |= cbor_encoder_close_container(&encoder, &array); if (err == CborNoError) sol_coap_packet_set_payload_used(pkt, encoder.ptr - payload); return err; }