3 #include <frs_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"};
11 fres_item_scheduler scheduler;
14 static int create_vres(fres_vres_t *vres, void *priv)
16 struct item *item = priv;
17 fres_block_item_nodes *nodes;
18 CORBA_Environment env;
21 nodes = fres_contract_get_block(vres->new, FRES_BLOCK_ITEM_NODES);
22 if (!nodes) return FRES_ERR_NEEDS_MORE_DATA_IN_CONTRACT;
24 ret = fres_item_scheduler_add_nodes(item->scheduler, nodes->mask, &env);
25 if (forb_exception_occurred(&env)) return FRES_ERR_FORB_EXCEPTION;
30 static int cancel_vres(fres_vres_t *vres, void *priv)
32 struct item *item = priv;
33 fres_block_item_nodes *nodes;
34 CORBA_Environment env;
37 nodes = fres_contract_get_block(vres->allocated, FRES_BLOCK_ITEM_NODES);
38 if (!nodes) return FRES_ERR_NEEDS_MORE_DATA_IN_CONTRACT;
40 ret = fres_item_scheduler_del_nodes(item->scheduler, nodes->mask, &env);
41 if (forb_exception_occurred(&env)) return FRES_ERR_FORB_EXCEPTION;
46 static int change_vres(fres_vres_t *vres, void *priv)
48 return FRSH_ERR_NOT_IMPLEMENTED;
53 static struct item item;
55 static struct fres_scheduler item_scheduler = {
56 .res_type = FRSH_RT_NETWORK,
57 .res_id = FRSH_NETPF_ITEM,
58 /* Here we are using the "simple interface" */
59 .create_vres = create_vres,
60 .cancel_vres = cancel_vres,
61 .change_vres = change_vres,
65 int frs_item_init(forb_orb orb, fres_contract_broker fcb, forb_executor_t *executor)
67 fres_block_register_item();
69 item.scheduler = forb_resolve_reference(orb, "item_scheduler");
70 if (!item.scheduler) {
71 ul_logerr("forb_resolve_reference(item_scheduler) failed\n");
74 return frs_register(orb, fcb, executor, &item_scheduler);
78 * Receives data from sensor network.
82 * @param[out] data Where to store pointer to the array with received
83 * data. The programmer should free the returned array via
84 * forb_free(), when the data are not needed anymore.
86 * @return Number of elements returned in @a data array, -1 on error.
88 int frs_item_receive(frsh_vres_id_t vres, unsigned *data[])
90 fres_item_data_seq *seq;
91 fres_block_item_nodes *nodes;
93 CORBA_Environment env;
95 nodes = fres_contract_get_block(vres->allocated, FRES_BLOCK_ITEM_NODES);
96 if (!nodes) return FRES_ERR_NEEDS_MORE_DATA_IN_CONTRACT;
98 fres_item_scheduler_get_data(item.scheduler, nodes->mask, &seq, &env);
99 CORBA_sequence_set_release(seq, CORBA_FALSE);
101 *data = seq->_buffer;