But it is still not tested because of some bug(s) in fcb.
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
-
-
-
#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)
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);
default_CONFIG = CONFIG_RESOURCE_ITEM=y
+ifeq ($(CONFIG_RESOURCE_ITEM),y)
CFLAGS += -std=gnu99
bin_PROGRAMS = frm_item
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
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);
--- /dev/null
+#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;
+}
#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
* @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,
--- /dev/null
+# 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
+
--- /dev/null
+test_PROGRAMS += test_item
+test_item_SOURCES = test_item.c
+lib_LOADLIBES += pthread rt frsh
--- /dev/null
+#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;
+}