{
pthread_t threadRead;
//initialize semaphors for add/remove node control
+
sem_init(&waitAdd, 0, 0);
sem_init(&waitRemove, 0, 0);
sem_init(&actionLock, 0, 1);
if (!packet)
exit(0);
+
+
dataLengthOld = dataLength;
dataLength = 0;
if ((len > 15) && ((len-15)%4 == 1) && (packet[2] == 0x7E)) //parse the received data
int maxFrameLength;
int queuedDev;
// compute the demanded framelength of the ITEM according the demanded maximum commuication delay.
+
maxFrameLength = floor((float)maxResponseTime/(float)slotTime);
if (maxFrameLength < 4) return -1;
if (maxFrameLength >= 8) maxFrameLength = 8;
return -2; // node adding in process, not posiyble to determine the number of free slots
+
// compute the demanded framelength of the ITEM according the demanded maximum commuication delay.
maxFrameLength = floor((float)maxResponseTime/(float)slotTime);
if (maxFrameLength < 4) return -1;
else
maxFrameLength = 4;
+
if (frameLength > maxFrameLength) return -1; // actual period is higher than the demanded one.
- freeSlots = maxFrameLength;// - numberOfSlots -1; //nubmer of free slots
+ freeSlots = maxFrameLength-1;// - numberOfSlots -1; //nubmer of free slots
return freeSlots; // !!!!!!!!!! number of free slots in the frame length. Does not depend on number of ocupied slots.
}
sem_wait(&waitAdd);
sem_post(&actionLock);
+
if (communication_error == 1)
return -1;
return 1;
fres_item_node_mask all_nodes;
frsh_rel_time_t min_deadline = fosa_msec_to_rel_time(0);
+
/* Find communicating nodes and the most restricting deadline */
all_nodes = 0;
fres_sa_scenario_for_each_contract(scenario, c) {
nodes = fres_contract_get_item_nodes(c->contract);
if (!nodes) return FRES_ERR_NEEDS_MORE_DATA_IN_CONTRACT;
all_nodes |= nodes->mask;
+
if (fres_contract_get_deadline(&c->contract, &deadline)) {
if (fosa_rel_time_is_null(min_deadline) ||
}
}
}
-
+
if (!fosa_rel_time_is_null(min_deadline)) {
- /* TODO: Compare number of nodes and min_deadline */
- *schedulable = false;
- } else {
+ /* Compare number of nodes and min_deadline */
//ITEM ADD
- /* int i;
+ int i;
int count_nodes;
int free_slots;
+ fres_item_node_mask counting_var;
+
+ counting_var =1;
count_nodes = 0;
- for (i = 0; i <= sizeof(all_nodes)-1; i++)
+ *schedulable = true;
+
+ for (i = 0; i <= sizeof(all_nodes)-1; i++) //FIXME Number of bits
{
- count_nodes = count_nodes + all_nodes(i);
+ //printf("JOP 5 - %i\n",aa);
+ if ((all_nodes & counting_var) > 0)
+ count_nodes = count_nodes + 1;
+ counting_var = counting_var<<1;
}
- free_slots = noOfFreeSlots(min_deadline);
- if (free_slots < 0)
+
+ free_slots = noOfFreeSlots(fosa_rel_time_to_msec(min_deadline));
+
+ if (free_slots < 0)
+ {
*schedulable = false; // adding of new nodes in action or the actual period is higher then the minimum demanded one.
+ }
else
- {
+ {
if (free_slots < count_nodes)
*schedulable = false; // too much nodes are demanded
}
- */
+
+ }
+ else {
*schedulable = true;
}
{
int node;
struct item_status *item_status = (struct item_status*)forb_instance_data(obj);
-
- for (node=2; node<64; node++) {
+
+ for (node=1; node<64; node++) {
if (node_present(mask, node)) {
if (item_status->node_requested[node] == 0)
{
- /* TODO: Add node */
- //addDevice(node); //ITEM ADD
+ /* Add node */
+ addDevice(node); //ITEM ADD
}
item_status->node_requested[node]++;
}
}
- return /* TODO */ 0;
+ return 0;
}
CORBA_long
struct item_status *item_status = (struct item_status*)forb_instance_data(obj);
int node;
- for (node=2; node<64; node++) {
+ for (node=1; node<64; node++) {
if (node_present(mask, node)) {
item_status->node_requested[node]--;
if (item_status->node_requested[node] == 0)
{
- /* TODO: Remove node */
- //removeDevice(node); //ITEM ADD
+ /* Remove node */
+ removeDevice(node); //ITEM ADD
}
}
}
get_data(fres_item_scheduler obj, const fres_item_node_mask mask, fres_item_data_seq** data, CORBA_Environment *ev)
{
unsigned max = 256;
+ int len;
//struct item_status *item_status = (struct item_status*)forb_instance_data(obj);
fres_item_data_seq *d = forb_malloc(sizeof(*d));
d->_length = getData(d->_buffer, d->_maximum);
*data = d;
+
return 0;
}
struct frm_data frm_data;
//ITEM ADD
- /* pthread_t threadRead;
+ pthread_t threadRead;
char device[] ="/dev/ttyUSB0";
char platform[]="telosb";
char *parametrsITEM[] ={NULL,device,platform};
-*/
+
+
orb = forb_init(&argc, &argv, "frm_item");
if (!orb) error(1, errno, "forb_init");
+
fres_block_register_item();
+
ret = forb_executor_init(&executor);
if (ret) error(1, errno, "forb_executor_init failed");
+
frm = frm_register(orb, &frm_data, &executor, &frm_item_desc);
if (!frm) {
error(1, errno, "frm_register failed");
}
+
fis = forb_fres_item_scheduler_new(orb, &item_scheduler_impl, &item_status);
if (!fis) error(1, errno, "forb_fres_item_scheduler_new failed");
+
ret = forb_register_reference(fis, "item_scheduler");
if (ret) error (1, errno, "Cannot register ITEM scheduler");
+
forb_executor_register_object(&executor, fis);
+
+ // ITEM ADD
+ threadRead = init(parametrsITEM);
+ if (threadRead == NULL) error (1, errno, "Cannot run the ITEM PC Manager"); //TODO fix the worning
+
+
forb_executor_run(&executor);
- // ITEM ADD
- /* threadRead = init(parametrsITEM);
- if (threadRead == NULL) error (1, errno, "Cannot run the ITEM PC Manager");
- */
+
return 0;
}
//ITEM ADD
//#include "FWSN.h"
-#define N 3
+#define N 4
+//#define N 3
-int contract_deadline_sec[N] = { 8, 8, 4 };
+int contract_deadline_sec[N] = { 4,4,4,4 };
+//int contract_deadline_sec[N] = {2,2,2};
//int contract_deadline_sec[N] = { 8*SLOT_TIME, 8*SLOT_TIME, 4*SLOT_TIME }; //ITEM ADD
-int contract_nodes[N] = { 0x01, 0x03, 0x02 };
+int contract_nodes[N] = { 0x04, 0x05, 0x02 ,0x03};
+//int contract_nodes[N] = { 0x02,0x03,0x04};
int main(int argc, char *argv[])
{
frsh_contract_t contract[N];
frsh_vres_id_t vres[N];
int i;
-
+
+
ret = frsh_init();
if (ret) PERROR_AND_EXIT(ret, "frsh_init");
/* Set nodes we want to receive data from */
nodes = malloc(sizeof(*nodes));
if (!nodes) PERROR_AND_EXIT(errno, "malloc");
- nodes->mask = contract_nodes[i];
- ret = fres_contract_add_item_nodes(contract[i], nodes);
+ //nodes->mask = contract_nodes[i];
+
+ nodes->mask =1;
+ nodes->mask = nodes->mask << (contract_nodes[i]);
+
+
+ ret = fres_contract_add_item_nodes(contract[i], nodes);
if (ret) PERROR_AND_EXIT(ret, "Cannot add item_nodes block\n");
/* Set deadline */
/* Negotiate the contract */
ret = frsh_contract_negotiate(&contract[i], &vres[i]);
- if (ret) PERROR_AND_EXIT(ret, "frsh_contract_negotiate");
+ //if (ret) PERROR_AND_EXIT(ret, "frsh_contract_negotiate");
+ if (ret) printf(" \n frsh_contract_negotiate - NOT ACCEPTED \n");
}
printf("Contracts negotiated\n");
- for (i=0; i<10; i++) {
- int j;
- printf("Reading data\n");
- for (j=0; j<N; j++) {
- unsigned *data;
- ret = fra_item_receive(vres[j], &data);
+ for (i=0; i<30; i++) {
+ //int j;
+ //printf("Reading data\n");
+ //for (j=0; j<N; j++) {
+ unsigned char *data;
+ int len;
+ // int k;
+ ret = fra_item_receive(vres[1], &data);
if (ret == -1) PERROR_AND_EXIT(errno, "frs_item_receive");
+ len = ret;
+
+ /* Do something with the received data */
+
+ /* printf("JOP 89 : %i - ",len);
+ for (k = 0; k < len-1; k++)
+ {
+ printf("%02x ", data[k]);
+ if (k%4 == 3)
+ printf(" | ");
+ }
+ putchar('\n');*/
+
+ int l;
+ int m;
+ for (l=1; l < len/4; l++)
+ {
+ for(m=1; m < 20; m++)
+ {
+ if (data[4*l-1] > 6*m) putchar('*');
+ else putchar(' ');
+ }
+ printf(" | ");
+ }
+ putchar('\n');
- /* TODO: Do something with the received data */
-
forb_free(data);
- }
+ //}
sleep(1);
- }
+ }
-/* for (i=0; i<N; i++) { */
-/* frsh_cancel_contract(vres[i]); */
-/* } */
+ for (i=0; i<N; i++) {
+ frsh_contract_cancel(vres[i]);
+ }
return 0;
}