3 #include <fra_generic.h>
5 #include <frsh_distributed.h>
7 UL_LOG_CUST(ulogd_frs_item);
8 ul_log_domain_t ulogd_frs_item = {UL_LOGL_MSG, "frs_item"};
9 UL_LOGREG_SINGLE_DOMAIN_INIT_FUNCTION(frs_item_logreg_domains, ulogd_frs_item);
12 fres_item_scheduler scheduler;
15 static int create_vres(fres_vres_t *vres, void *priv)
17 struct item *item = priv;
18 fres_block_item_nodes *nodes;
19 CORBA_Environment env;
22 nodes = fres_contract_get_item_nodes(vres->new);
23 if (!nodes) return FRES_ERR_NEEDS_MORE_DATA_IN_CONTRACT;
25 ret = fres_item_scheduler_add_nodes(item->scheduler, nodes->mask, &env);
26 if (forb_exception_occurred(&env)) return FRES_ERR_FORB_EXCEPTION;
31 static int cancel_vres(fres_vres_t *vres, void *priv)
33 struct item *item = priv;
34 fres_block_item_nodes *nodes;
35 CORBA_Environment env;
38 nodes = fres_contract_get_item_nodes(vres->allocated);
39 if (!nodes) return FRES_ERR_NEEDS_MORE_DATA_IN_CONTRACT;
41 ret = fres_item_scheduler_del_nodes(item->scheduler, nodes->mask, &env);
42 if (forb_exception_occurred(&env)) return FRES_ERR_FORB_EXCEPTION;
47 static int change_vres(fres_vres_t *vres, void *priv)
49 return FRSH_ERR_NOT_IMPLEMENTED;
54 static struct item item;
56 static struct fres_allocator item_allocator = {
57 .res_type = FRSH_RT_NETWORK,
58 .res_id = FRSH_NETPF_ITEM,
59 /* Here we are using the "simple interface" */
60 .create_vres = create_vres,
61 .cancel_vres = cancel_vres,
62 .change_vres = change_vres,
66 int fra_item_init(forb_orb orb, fres_contract_broker fcb, forb_executor_t *executor)
68 fres_block_register_item();
70 item.scheduler = forb_resolve_reference(orb, "item_scheduler");
71 if (!item.scheduler) {
72 ul_logerr("forb_resolve_reference(item_scheduler) failed\n");
75 return fra_register(orb, fcb, executor, &item_allocator);
79 * Receives data from sensor network.
83 * @param[out] data Where to store pointer to the array with received
84 * data. The programmer should free the returned array via
85 * forb_free(), when the data are not needed anymore.
87 * @return Number of elements returned in @a data array, -1 on error.
89 int fra_item_receive(frsh_vres_id_t vres, unsigned *data[])
91 fres_item_data_seq *seq;
92 fres_block_item_nodes *nodes;
94 CORBA_Environment env;
96 nodes = fres_contract_get_item_nodes(vres->allocated);
97 if (!nodes) return FRES_ERR_NEEDS_MORE_DATA_IN_CONTRACT;
99 fres_item_scheduler_get_data(item.scheduler, nodes->mask, &seq, &env);
100 CORBA_sequence_set_release(seq, CORBA_FALSE);
102 *data = seq->_buffer;