]> rtime.felk.cvut.cz Git - frescor/frsh.git/blob - resources/item/resources_item_fra_item.c
bc3d2b0cf290f058fe892d9f6f75beb522811aaa
[frescor/frsh.git] / resources / item / resources_item_fra_item.c
1 #include <item.h>
2 #include <ul_log.h>
3 #include <fra_generic.h>
4 #include <stdio.h>
5 #include <frsh_distributed.h>
6
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);
10
11 struct item {
12         fres_item_scheduler scheduler;
13 };
14
15 static int create_vres(fres_vres_t *vres, void *priv)
16 {
17         struct item *item = priv;
18         fres_block_item_nodes *nodes;
19         CORBA_Environment env;
20         int ret;
21         
22         nodes = fres_contract_get_item_nodes(vres->new);
23         if (!nodes) return FRES_ERR_NEEDS_MORE_DATA_IN_CONTRACT;
24         
25         ret = fres_item_scheduler_add_nodes(item->scheduler, nodes->mask, &env);
26         if (forb_exception_occurred(&env)) return FRES_ERR_FORB_EXCEPTION;
27         if (ret) return ret;
28         return 0;
29 }
30
31 static int cancel_vres(fres_vres_t *vres, void *priv)
32 {
33         struct item *item = priv;
34         fres_block_item_nodes *nodes;
35         CORBA_Environment env;
36         int ret;
37         
38         nodes = fres_contract_get_item_nodes(vres->allocated);
39         if (!nodes) return FRES_ERR_NEEDS_MORE_DATA_IN_CONTRACT;
40         
41         ret = fres_item_scheduler_del_nodes(item->scheduler, nodes->mask, &env);
42         if (forb_exception_occurred(&env)) return FRES_ERR_FORB_EXCEPTION;
43         if (ret) return ret;
44         return 0;
45 }
46
47 static int change_vres(fres_vres_t *vres, void *priv)
48 {
49         return FRSH_ERR_NOT_IMPLEMENTED;
50 }
51
52
53
54 static struct item item;
55
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,
63         .priv = &item
64 };
65
66 int fra_item_init(forb_orb orb, fres_contract_broker fcb, forb_executor_t *executor)
67 {
68         fres_block_register_item();
69         
70         item.scheduler = forb_resolve_reference(orb, "item_scheduler");
71         if (!item.scheduler) {
72                 ul_logerr("forb_resolve_reference(item_scheduler) failed\n");
73                 return errno;
74         }
75         return fra_register(orb, fcb, executor, &item_allocator);
76 }
77
78 /** 
79  * Receives data from sensor network.
80  * 
81  * @param[in] vres
82  * 
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.
86  * 
87  * @return Number of elements returned in @a data array, -1 on error.
88  */
89 int fra_item_receive(frsh_vres_id_t vres, unsigned *data[])
90 {
91         fres_item_data_seq *seq;
92         fres_block_item_nodes *nodes;
93         int ret;
94         CORBA_Environment env;
95         
96         nodes = fres_contract_get_item_nodes(vres->allocated);
97         if (!nodes) return FRES_ERR_NEEDS_MORE_DATA_IN_CONTRACT;
98         
99         fres_item_scheduler_get_data(item.scheduler, nodes->mask, &seq, &env);
100         CORBA_sequence_set_release(seq, CORBA_FALSE);
101         ret = seq->_length;
102         *data = seq->_buffer;
103         forb_free(seq);
104         return ret;
105 }