]> rtime.felk.cvut.cz Git - frescor/frsh-forb.git/blob - src/frsh/resources/item/resources_item_frm_item.c
forb: scripts calling binaries and shlibs in path
[frescor/frsh-forb.git] / src / frsh / resources / item / resources_item_frm_item.c
1 /**
2  * @file   frm_item.c
3  * @author Michal Sojka <sojkam1@fel.cvut.cz>
4  * @date   Thu Nov  6 17:21:48 2008
5  * 
6  * @brief  Resource manager for ITEM protocol
7  * 
8  * 
9  */
10 #include <frm_generic.h>
11 #include <forb.h>
12 #include <error.h>
13 #include <errno.h>
14 #include <fres_sa_scenario.h>
15 #include <stdbool.h>
16 #include <ul_log.h>
17 #include <stdio.h>
18 #include <frsh_distributed.h>
19 #include <item.h>
20
21 //ITEM ADD
22 #include "FWSN.h"
23
24
25
26 static inline bool node_present(fres_item_node_mask nodes, int node)
27 {
28         return (nodes & (1LL<<node)) != 0;
29 }
30
31 static inline void node_add(fres_item_node_mask *nodes, int node)
32 {
33         *nodes |= (1LL<<node);
34 }
35
36 static inline void node_del(fres_item_node_mask *nodes, int node)
37 {
38         *nodes &= (~(1LL<<node));
39 }
40
41 static int
42 admission_test(struct fres_sa_scenario *scenario, void *priv, bool *schedulable)
43 {
44         struct fres_sa_contract *c;
45         fres_item_node_mask all_nodes;
46         frsh_rel_time_t min_deadline = fosa_msec_to_rel_time(0);
47
48         /* Find communicating nodes and the most restricting deadline */
49         all_nodes = 0;
50         fres_sa_scenario_for_each_contract(scenario, c) {
51                 fres_block_item_nodes *nodes;
52                 fosa_rel_time_t deadline;
53
54                 nodes = fres_contract_get_item_nodes(c->contract);
55                 if (!nodes) return FRES_ERR_NEEDS_MORE_DATA_IN_CONTRACT;
56                 all_nodes |= nodes->mask;
57
58                 if (fres_contract_get_deadline(&c->contract, &deadline)) {
59                         if (fosa_rel_time_is_null(min_deadline) ||
60                             fosa_rel_time_smaller(deadline, min_deadline)) {
61                                 min_deadline = deadline;
62                         }
63                 }
64         }
65
66         if (!fosa_rel_time_is_null(min_deadline)) {             
67                 /* TODO: Compare number of nodes and min_deadline */
68                 *schedulable = false;
69         } else {                
70                 //ITEM ADD
71                 int i;
72                 int count_nodes;
73                 int free_slots;
74                 count_nodes = 0;
75                 for (i = 0; i <= sizeof(all_nodes)-1; i++)
76                 {
77                         count_nodes = count_nodes + all_nodes(i);
78                 }
79                 free_slots = noOfFreeSlots(min_deadline);
80                 if (free_slots < 0)
81                         *schedulable = false; // adding of new nodes in action or the actual period is higher then the minimum demanded one.
82                 else
83                 {
84                         if (free_slots < count_nodes)
85                                 *schedulable = false;   // too much nodes are demanded
86                 }               
87                 
88                 *schedulable = true;
89         }
90
91         return 0;
92 }
93
94 struct item_status {
95         /** Specifies how many applications want to read from a which
96          * node */
97         int node_requested[64];
98 };
99
100 CORBA_long
101 add_nodes(fres_item_scheduler obj, const fres_item_node_mask mask, CORBA_Environment *ev)
102 {
103         int node;
104         struct item_status *item_status = (struct item_status*)forb_instance_data(obj);
105
106         for (node=2; node<64; node++) {
107                 if (node_present(mask, node)) {
108                         if (item_status->node_requested[node] == 0)
109                         {
110                                 /* TODO: Add node */
111                                 addDevice(node);        //ITEM ADD
112                                 
113                         }
114                         item_status->node_requested[node]++;
115                 }
116         }
117         return /* TODO */ 0;
118 }
119
120 CORBA_long
121 del_nodes(fres_item_scheduler obj, const fres_item_node_mask mask, CORBA_Environment *ev)
122 {
123         struct item_status *item_status = (struct item_status*)forb_instance_data(obj);
124         int node;
125
126         for (node=2; node<64; node++) {
127                 if (node_present(mask, node)) {
128                         item_status->node_requested[node]--;
129                         if (item_status->node_requested[node] == 0)
130                         {
131                                 /* TODO: Remove node */
132                                 removeDevice(node);     //ITEM ADD
133                         }
134                 }
135         }
136         return 0;
137 }
138
139 CORBA_long
140 get_data(fres_item_scheduler obj, const fres_item_node_mask mask, fres_item_data_seq** data, CORBA_Environment *ev)
141 {
142         //struct item_status *item_status = (struct item_status*)forb_instance_data(obj);
143         /* TODO: */
144         return 0;
145 }
146
147 static const struct fres_res_manager frm_item_desc = {
148         .res_type = FRSH_RT_NETWORK,
149         .res_id = FRSH_NETPF_ITEM,
150         .admission_test = admission_test,
151         .priv = NULL,
152 };
153
154 static const struct forb_fres_item_scheduler_impl item_scheduler_impl = {
155         .add_nodes = add_nodes,
156         .del_nodes = del_nodes,
157         .get_data  = get_data,
158 };
159
160 struct item_status item_status;
161
162 int main(int argc, char *argv[])
163 {
164         forb_orb orb;
165         int ret;
166         forb_executor_t executor;
167         fres_resource_manager frm;
168         fres_item_scheduler fis;
169         struct frm_data frm_data;
170 //ITEM ADD
171         pthread_t threadRead;   
172         char device[] ="/dev/ttyUSB0";
173         char platform[]="telosb";       
174         char *parametrsITEM[] ={NULL,device,platform};
175
176         
177         orb = forb_init(&argc, &argv, "frm_item");
178         if (!orb) error(1, errno, "forb_init");
179
180         fres_block_register_item();
181
182         ret = forb_executor_init(&executor);
183         if (ret) error(1, errno, "forb_executor_init failed");
184         
185         frm = frm_register(orb, &frm_data, &executor, &frm_item_desc);
186         if (!frm) {
187                 error(1, errno, "frm_register failed");
188         }
189
190         fis = forb_fres_item_scheduler_new(orb, &item_scheduler_impl, &item_status);
191         if (!fis) error(1, errno, "forb_fres_item_scheduler_new failed");
192
193         ret = forb_register_reference(fis, "item_scheduler");
194         if (ret) error (1, errno, "Cannot register ITEM scheduler");
195
196         forb_executor_register_object(&executor, fis);
197
198         forb_executor_run(&executor);
199         
200         
201 // ITEM ADD     
202         threadRead = init(parametrsITEM);
203         if (threadRead == NULL) error (1, errno, "Cannot run the ITEM PC Manager");
204                 
205         
206         
207         return 0;
208 }