]> rtime.felk.cvut.cz Git - frescor/frsh.git/commitdiff
Finished integration of ITEM
authorMichal Sojka <sojkam1@fel.cvut.cz>
Fri, 7 Nov 2008 12:45:00 +0000 (13:45 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Fri, 7 Nov 2008 12:45:00 +0000 (13:45 +0100)
But it is still not tested because of some bug(s) in fcb.

frsh_api/Makefile.omk
frsh_api/frsh_core.c
resources/item/Makefile.omk
resources/item/frm_item.c
resources/item/frs_item.c [new file with mode: 0644]
resources/item/item.h
resources/item/item_blocks.c
resources/item/tests/Makefile [new file with mode: 0644]
resources/item/tests/Makefile.omk [new file with mode: 0644]
resources/item/tests/test_item.c [new file with mode: 0644]

index cbc2af8cb975006e08270cece60feec998bc9dab..6fe21ef999c11b6593ea985a5937d1b74557d84d 100644 (file)
@@ -6,10 +6,10 @@ include_HEADERS = frsh_opaque_types.h frsh_forb.h
 frsh_LIBS = fna fcb_client forb contract frs ulut fosa $(scheduler-libs-y)
 
 config_include_HEADERS = frsh_resources.h
-frsh_resources_DEFINES = CONFIG_RESOURCE_DUMMY CONFIG_FWP
+frsh_resources_DEFINES = CONFIG_RESOURCE_DUMMY \
+                        CONFIG_FWP \
+                        CONFIG_RESOURCE_ITEM
 
 scheduler-libs-$(CONFIG_RESOURCE_DUMMY) += frs_dummy
+scheduler-libs-$(CONFIG_RESOURCE_ITEM) += frs_item
 scheduler-libs-$(CONFIG_FWP) += frsh_fwp fwp
-
-
-
index 1ccc46d96d8ae7a587e89a457bf913e63c403f6c..91e6bc2a991339b6dcc4560a1f09b1dbb78c9d67 100644 (file)
 #include <res_dummy.h>
 #endif
 
+#ifdef CONFIG_RESOURCE_ITEM
+#include <item.h>
+#endif
+
 struct frsh_forb frsh_forb_global;
 
 static void *sch_executor_thread(void *arg)
@@ -51,6 +55,12 @@ int frsh_init()
        ret = frsh_distributed_init();
        if (ret) goto err;
 #endif
+
+#ifdef CONFIG_RESOURCE_ITEM
+       ret = frs_item_init(frsh_forb_global.orb, frsh_forb_global.fcb,
+                           &frsh_forb_global.sch_executor);
+       if (ret) goto err;
+#endif
        /* Run resource schedulers */
        fosa_thread_create(&frsh_forb_global.sch_executor_thread, NULL,
                           sch_executor_thread, NULL);
index 67afb2e9766d3840d33e82ef71643079ebd88a95..af407d96afb26a9d17a1409eac0f1bbd7710809a 100644 (file)
@@ -1,5 +1,6 @@
 default_CONFIG = CONFIG_RESOURCE_ITEM=y
 
+ifeq ($(CONFIG_RESOURCE_ITEM),y)
 CFLAGS += -std=gnu99
 
 bin_PROGRAMS = frm_item
@@ -8,9 +9,12 @@ frm_item_SERVER_IDL = item_idl.idl
 frm_item_LIBS = frm forb contract fosa rt ulut fcb_client m
 
 shared_LIBRARIES = frs_item
-frs_item_SOURCES = item_blocks.c frs_item.c
+frs_item_SOURCES = item_blocks.c frs_item.c
 frs_item_LIBS = frs
 frs_item_CLIENT_IDL = item_idl.idl
 
 include_HEADERS = item.h
 include_GEN_HEADERS = item_idl.h
+
+SUBDIRS=tests
+endif
index b106a5966a98f2ad6e1bc907c555521dc798a5a3..5d26dbb5c488441ca197c0cf6a75ffe45f439531 100644 (file)
@@ -162,15 +162,15 @@ int main(int argc, char *argv[])
        if (ret) error(1, errno, "forb_executor_init failed");
        
        frm = frm_register(orb, &frm_data, &executor, &frm_item_desc);
-       if (frm != 0) {
+       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, "Cannot create item scheduler");
+       if (!fis) error(1, errno, "forb_fres_item_scheduler_new failed");
 
        ret = forb_register_reference(fis, "item_scheduler");
-       if (ret==0) error (1, errno, "Cannot register ITEM scheduler");
+       if (ret) error (1, errno, "Cannot register ITEM scheduler");
 
        forb_executor_register_object(&executor, fis);
 
diff --git a/resources/item/frs_item.c b/resources/item/frs_item.c
new file mode 100644 (file)
index 0000000..83f73bd
--- /dev/null
@@ -0,0 +1,104 @@
+#include <item.h>
+#include <ul_log.h>
+#include <frs_generic.h>
+#include <stdio.h>
+#include <frsh_distributed.h>
+
+UL_LOG_CUST(ulogd_frs_item);
+ul_log_domain_t ulogd_frs_item = {UL_LOGL_MSG, "frs_item"};
+
+struct item {
+       fres_item_scheduler scheduler;
+};
+
+static int create_vres(fres_vres_t *vres, void *priv)
+{
+       struct item *item = priv;
+       fres_block_item_nodes *nodes;
+       CORBA_Environment env;
+       int ret;
+       
+       nodes = fres_contract_get_block(vres->new, FRES_BLOCK_ITEM_NODES);
+       if (!nodes) return FRES_ERR_NEEDS_MORE_DATA_IN_CONTRACT;
+       
+       ret = fres_item_scheduler_add_nodes(item->scheduler, nodes->mask, &env);
+       if (forb_exception_occured(&env)) return FRES_ERR_FORB_EXCEPTION;
+       if (ret) return ret;
+       return 0;
+}
+
+static int cancel_vres(fres_vres_t *vres, void *priv)
+{
+       struct item *item = priv;
+       fres_block_item_nodes *nodes;
+       CORBA_Environment env;
+       int ret;
+       
+       nodes = fres_contract_get_block(vres->allocated, FRES_BLOCK_ITEM_NODES);
+       if (!nodes) return FRES_ERR_NEEDS_MORE_DATA_IN_CONTRACT;
+       
+       ret = fres_item_scheduler_del_nodes(item->scheduler, nodes->mask, &env);
+       if (forb_exception_occured(&env)) return FRES_ERR_FORB_EXCEPTION;
+       if (ret) return ret;
+       return 0;
+}
+
+static int change_vres(fres_vres_t *vres, void *priv)
+{
+       return FRSH_ERR_NOT_IMPLEMENTED;
+}
+
+
+
+static struct item item;
+
+static struct fres_scheduler item_scheduler = {
+       .res_type = FRSH_RT_NETWORK,
+       .res_id = FRSH_NETPF_ITEM,
+       /* Here we are using the "simple interface" */
+       .create_vres = create_vres,
+       .cancel_vres = cancel_vres,
+       .change_vres = change_vres,
+       .priv = &item
+};
+
+int frs_item_init(forb_orb orb, fres_contract_broker fcb, forb_executor_t *executor)
+{
+       fres_block_register_item();
+       
+       item.scheduler = forb_resolve_reference(orb, "item_scheduler");
+       if (!item.scheduler) {
+               ul_logerr("forb_resolve_reference(item_scheduler) failed\n");
+               return errno;
+       }
+       return frs_register(orb, fcb, executor, &item_scheduler);
+}
+
+/** 
+ * Receives data from sensor network.
+ * 
+ * @param[in] vres
+ * 
+ * @param[out] data Where to store pointer to the array with received
+ * data. The programmer should free the returned array via
+ * forb_free(), when the data are not needed anymore.
+ * 
+ * @return Number of elements returned in @a data array, -1 on error.
+ */
+int frs_item_receive(frsh_vres_id_t vres, unsigned *data[])
+{
+       fres_item_data_seq *seq;
+       fres_block_item_nodes *nodes;
+       int ret;
+       CORBA_Environment env;
+       
+       nodes = fres_contract_get_block(vres->allocated, FRES_BLOCK_ITEM_NODES);
+       if (!nodes) return FRES_ERR_NEEDS_MORE_DATA_IN_CONTRACT;
+       
+       fres_item_scheduler_get_data(item.scheduler, nodes->mask, &seq, &env);
+       CORBA_sequence_set_release(seq, CORBA_FALSE);
+       ret = seq->_length;
+       *data = seq->_buffer;
+       forb_free(seq);
+       return ret;
+}
index eecdeac9b341aa725acddf94867e892d6459d097..e103d088a11490bf35f884285eafacad8029ebc7 100644 (file)
@@ -2,9 +2,12 @@
 #define ITEM_H
 
 #include <item_idl.h>
-
+#include <forb.h>
+#include <fcb.h>
 
 int fres_block_register_item();
+int frs_item_init(forb_orb orb, fres_contract_broker fcb, forb_executor_t *executor);
+int frs_item_receive(frsh_vres_id_t vres, unsigned *data[]);
 
 
 #endif
index c11110ca26cfe4b77d260710f0712a17ad8c14e3..be2d564d861c7911b16a4ece15a20bd712d978ed 100644 (file)
@@ -3,12 +3,13 @@
  * @author Michal Sojka <sojkam1@fel.cvut.cz>
  * @date   Fri Oct 31 17:23:25 2008
  * 
- * @brief  Description contract blocks specific to ITEM resource.
+ * @brief  Description of contract blocks specific to the ITEM resource.
  */
 #include <item.h>
 #include <fres_container.h>
 
 static const struct fres_block_desc item_nodes_desc = {
+       .name = "item nodes",
        .size = sizeof(fres_block_item_nodes),
        .serialize = (fres_block_serialize_fnc_t*)fres_block_item_nodes_serialize,
        .deserialize = (fres_block_deserialize_fnc_t*)fres_block_item_nodes_deserialize,
diff --git a/resources/item/tests/Makefile b/resources/item/tests/Makefile
new file mode 100644 (file)
index 0000000..b22a357
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/resources/item/tests/Makefile.omk b/resources/item/tests/Makefile.omk
new file mode 100644 (file)
index 0000000..853ad6b
--- /dev/null
@@ -0,0 +1,3 @@
+test_PROGRAMS += test_item
+test_item_SOURCES = test_item.c
+lib_LOADLIBES += pthread rt frsh 
diff --git a/resources/item/tests/test_item.c b/resources/item/tests/test_item.c
new file mode 100644 (file)
index 0000000..446d4b2
--- /dev/null
@@ -0,0 +1,69 @@
+#include <frsh.h>
+#include <error.h>
+#include <item.h>
+#include <fres_contract.h>
+
+#define N 3
+
+int contract_deadline_sec[N] = { 8, 8, 4 };
+int contract_nodes[N] = { 0x01, 0x03, 0x02 };
+
+int main(int argc, char *argv[])
+{
+       int ret;
+       frsh_contract_t contract[N];
+       frsh_vres_id_t vres[N];
+       int i;
+
+       ret = frsh_init();
+       if (ret) PERROR_AND_EXIT(ret, "frsh_init");
+
+       /* Negotiate N contracts */
+       for (i=0; i<N; i++) {
+               frsh_rel_time_t deadline;
+               frsh_signal_info_t si;
+               fres_block_item_nodes *nodes;
+               ret = frsh_contract_init(&contract[i]);
+               if (ret) PERROR_AND_EXIT(ret, "frsh_contract_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_block(contract[i], FRES_BLOCK_ITEM_NODES,
+                                             nodes);
+               if (ret) PERROR_AND_EXIT(ret, "Cannot add item_nodes block\n");
+
+               /* Set deadline */
+               deadline = fosa_msec_to_rel_time(contract_deadline_sec[i]*1000);
+               ret = frsh_contract_set_timing_reqs(&contract[i],
+                                                   false, &deadline,
+                                           0, si, 0, si);
+               if (ret) PERROR_AND_EXIT(ret, "frsh_contract_set_timing_reqs");
+
+               /* Negotiate the contract */
+               ret = frsh_contract_negotiate(&contract[i], &vres[i]);
+               if (ret) PERROR_AND_EXIT(ret, "frsh_contract_negotiate");
+       }
+       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 = frs_item_receive(vres[j], &data);
+                       if (ret == -1) PERROR_AND_EXIT(errno, "frs_item_receive");
+                       
+                       /* TODO: Do something with the received data */
+
+                       forb_free(data);
+               }
+               sleep(1);
+       }
+
+/*     for (i=0; i<N; i++) { */
+/*             frsh_cancel_contract(vres[i]); */
+/*     }        */
+       return 0;
+}