]> rtime.felk.cvut.cz Git - frescor/frsh.git/commitdiff
ITEM: Working demo
authorJiri Trdlicka <xubuntos@xubuntos-tinyos.(none)>
Mon, 9 Feb 2009 19:00:07 +0000 (20:00 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Tue, 10 Feb 2009 14:37:46 +0000 (15:37 +0100)
resources/item/FWSN.c
resources/item/fra_item.c
resources/item/frm_item.c
resources/item/tests/test_item.c

index b6e9db8507356949c42f1b7355da63ff43c2ebb5..11d906366940ba2ffc1d273ceac67730d74d2967 100644 (file)
@@ -66,6 +66,7 @@ pthread_t init(void *argv)
 {
        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);
@@ -154,6 +155,8 @@ void *readData ( void *ptr )
                if (!packet)
                        exit(0);                
                
+               
+               
                dataLengthOld = dataLength;
                dataLength = 0;
                if ((len > 15) && ((len-15)%4 == 1) && (packet[2] == 0x7E))     //parse the received data
@@ -249,6 +252,7 @@ int isFreeSlot(int maxResponseTime)
        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;
@@ -287,6 +291,7 @@ int noOfFreeSlots(int maxResponseTime)
                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;      
@@ -294,8 +299,9 @@ int noOfFreeSlots(int maxResponseTime)
        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.
 }
@@ -321,6 +327,7 @@ int addDevice ( unsigned char id)
        sem_wait(&waitAdd);     
        sem_post(&actionLock);  
        
+       
        if (communication_error == 1)
                return -1;
        return 1;       
index 72b542b54bea804dea838639342300d63e509467..8904e8cf42736318a46e23449d393aae87380ce3 100644 (file)
@@ -103,6 +103,9 @@ int fra_item_receive(frsh_vres_id_t vres, unsigned *data[])
        CORBA_sequence_set_release(seq, CORBA_FALSE);
        ret = seq->_length;
        *data = seq->_buffer;
+       
+
+       
        forb_free(seq);
        return ret;
 }
index df3794b93e186c73762e17bb76cc72e80b98f91b..7a905886d85ec1685a5cbf2344426495c8d626db 100644 (file)
@@ -41,6 +41,7 @@ admission_test(struct fres_sa_scenario *scenario, void *priv, bool *schedulable)
        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) {
@@ -50,6 +51,7 @@ admission_test(struct fres_sa_scenario *scenario, void *priv, bool *schedulable)
                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) ||
@@ -58,30 +60,42 @@ admission_test(struct fres_sa_scenario *scenario, void *priv, bool *schedulable)
                        }
                }
        }
-
+       
                
        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;
        }
        
@@ -99,18 +113,18 @@ add_nodes(fres_item_scheduler obj, const fres_item_node_mask mask, CORBA_Environ
 {
        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
@@ -119,13 +133,13 @@ del_nodes(fres_item_scheduler obj, const fres_item_node_mask mask, CORBA_Environ
        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
                        }
                }
        }
@@ -136,6 +150,7 @@ CORBA_long
 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));
 
@@ -144,6 +159,7 @@ get_data(fres_item_scheduler obj, const fres_item_node_mask mask, fres_item_data
        d->_length = getData(d->_buffer, d->_maximum);
 
        *data = d;
+       
        return 0;
 }
 
@@ -172,38 +188,48 @@ int main(int argc, char *argv[])
        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;
 }
index 9d970c7813f4d2931c3c9cc11efef705f8e4441b..0f9613d2fc5481f12fc48cd1b711df1dd4fd4131 100644 (file)
@@ -6,11 +6,14 @@
 //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[])
 {
@@ -18,7 +21,8 @@ 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");
 
@@ -38,8 +42,13 @@ int main(int argc, char *argv[])
                /* 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 */
@@ -51,27 +60,53 @@ int main(int argc, char *argv[])
 
                /* 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;
 }