3 * @author Michal Sojka <sojkam1@fel.cvut.cz>
4 * @date Thu Nov 6 17:21:48 2008
6 * @brief Resource manager for ITEM protocol
10 #include <frm_generic.h>
14 #include <fres_sa_scenario.h>
18 #include <frsh_distributed.h>
26 static inline bool node_present(fres_item_node_mask nodes, int node)
28 return (nodes & (1LL<<node)) != 0;
31 static inline void node_add(fres_item_node_mask *nodes, int node)
33 *nodes |= (1LL<<node);
36 static inline void node_del(fres_item_node_mask *nodes, int node)
38 *nodes &= (~(1LL<<node));
42 admission_test(struct fres_sa_scenario *scenario, void *priv, bool *schedulable)
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);
48 /* Find communicating nodes and the most restricting deadline */
50 fres_sa_scenario_for_each_contract(scenario, c) {
51 fres_block_item_nodes *nodes;
52 fosa_rel_time_t deadline;
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;
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;
66 if (!fosa_rel_time_is_null(min_deadline)) {
67 /* TODO: Compare number of nodes and min_deadline */
75 for (i = 0; i <= sizeof(all_nodes)-1; i++)
77 count_nodes = count_nodes + all_nodes(i);
79 free_slots = noOfFreeSlots(min_deadline);
81 *schedulable = false; // adding of new nodes in action or the actual period is higher then the minimum demanded one.
84 if (free_slots < count_nodes)
85 *schedulable = false; // too much nodes are demanded
95 /** Specifies how many applications want to read from a which
97 int node_requested[64];
101 add_nodes(fres_item_scheduler obj, const fres_item_node_mask mask, CORBA_Environment *ev)
104 struct item_status *item_status = (struct item_status*)forb_instance_data(obj);
106 for (node=2; node<64; node++) {
107 if (node_present(mask, node)) {
108 if (item_status->node_requested[node] == 0)
111 addDevice(node); //ITEM ADD
114 item_status->node_requested[node]++;
121 del_nodes(fres_item_scheduler obj, const fres_item_node_mask mask, CORBA_Environment *ev)
123 struct item_status *item_status = (struct item_status*)forb_instance_data(obj);
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)
131 /* TODO: Remove node */
132 removeDevice(node); //ITEM ADD
140 get_data(fres_item_scheduler obj, const fres_item_node_mask mask, fres_item_data_seq** data, CORBA_Environment *ev)
142 //struct item_status *item_status = (struct item_status*)forb_instance_data(obj);
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,
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,
160 struct item_status item_status;
162 int main(int argc, char *argv[])
166 forb_executor_t executor;
167 fres_resource_manager frm;
168 fres_item_scheduler fis;
169 struct frm_data frm_data;
171 pthread_t threadRead;
172 char device[] ="/dev/ttyUSB0";
173 char platform[]="telosb";
174 char *parametrsITEM[] ={NULL,device,platform};
177 orb = forb_init(&argc, &argv, "frm_item");
178 if (!orb) error(1, errno, "forb_init");
180 fres_block_register_item();
182 ret = forb_executor_init(&executor);
183 if (ret) error(1, errno, "forb_executor_init failed");
185 frm = frm_register(orb, &frm_data, &executor, &frm_item_desc);
187 error(1, errno, "frm_register failed");
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");
193 ret = forb_register_reference(fis, "item_scheduler");
194 if (ret) error (1, errno, "Cannot register ITEM scheduler");
196 forb_executor_register_object(&executor, fis);
198 forb_executor_run(&executor);
202 threadRead = init(parametrsITEM);
203 if (threadRead == NULL) error (1, errno, "Cannot run the ITEM PC Manager");