예제 #1
0
int main(int argc, char **argv)
{
	int len, ret=EXIT_FAILURE;
	ubx_node_info_t ni;
	ubx_block_t *webif;
	ubx_data_t *d;

	/* initalize the node */
	ubx_node_init(&ni, "c-only");

	/* load the standard types */
	if(ubx_module_load(&ni, "std_types/stdtypes/stdtypes.so") != 0)
		goto out;

	/* load the web-interface block */
	if(ubx_module_load(&ni, "std_blocks/webif/webif.so") != 0)
		goto out;

	/* create a webserver block */
	if((webif = ubx_block_create(&ni, "webif/webif", "webif1"))==NULL)
		goto out;

	/* Configure port of webserver block
	 * this gets the ubx_data_t pointer */
	d = ubx_config_get_data(webif, "port");
	len = strlen(WEBIF_PORT)+1;

	/* resize the char array as necessary and copy the port string */
	ubx_data_resize(d, len);
	strncpy(d->data, WEBIF_PORT, len);

	/* init and start the block */
	if(ubx_block_init(webif) != 0) {
		ERR("failed to init webif");
		goto out;
	}

	if(ubx_block_start(webif) != 0) {
		ERR("failed to start webif");
		goto out;
	}

	printf("webif block lauched on port %s, hit enter to quit\n", WEBIF_PORT);
	getchar();

	ret=EXIT_SUCCESS;
 out:
	/* this cleans up all blocks and unloads all modules */
	ubx_node_cleanup(&ni);
	exit(ret);
}
예제 #2
0
void WorldModel::initializeMicroblx() {
#ifdef BRICS_MICROBLX_ENABLE
	this->microBlxPath = MICROBLX_ROOT_DIR;

	/* init microblx */
	microBlxNodeHandle = new ubx_node_info_t(); // holds all microblx
	std::string microBlxNodeName = "functionBlocks";
	LOG(DEBUG) << "WorldModel::initializeMicroblx handle with name " << microBlxNodeName << " created.";

	if (ubx_node_init(microBlxNodeHandle, microBlxNodeName.c_str()) != 0 ) { //segfaults if started from ubx lua
		LOG(ERROR) << "WorldModel::initialize: Cannot initialize the microblx node handle.";
		microBlxNodeHandle = 0;
	}
	LOG(DEBUG) << "WorldModel::initializeMicroblx ubx node created.";

	/* load the standard types */
	std::string moduleFile = microBlxPath + "std_types/stdtypes/stdtypes.so";
	if(ubx_module_load(microBlxNodeHandle, moduleFile.c_str()) != 0){
		LOG(ERROR) << "WorldModel::initialize: Cannot load the stdtypes.";
	}

	/* load the standard types */
	moduleFile = "/home/sblume/sandbox/brics_3d_function_blocks/lib/rsg_types.so";
	if(ubx_module_load(microBlxNodeHandle, moduleFile.c_str()) != 0){
		LOG(ERROR) << "WorldModel::initialize: Cannot load the rsgtypes.";
	}

	/* load a standard interaction block for sending data */
	moduleFile = microBlxPath + "std_blocks/lfds_buffers/lfds_cyclic.so";
	if(ubx_module_load(microBlxNodeHandle, moduleFile.c_str()) != 0){
		LOG(ERROR) << "WorldModel::initialize: Cannot load the lfds_buffer.";
	}

	/*
	 * Create a single (dummy) fifo interaction block to be used
	 * as default input for any function block
	 */

	/* create the input fifo block */
	std::string name = "inputFifo";
	std::string inputModuleName = "lfds_buffers/cyclic";
	if((inputBlock = ubx_block_create(microBlxNodeHandle, inputModuleName.c_str(), name.c_str())) == 0){
		LOG(ERROR) << "WorldModel::loadFunctionBlock: Cannot create the module "<< name;
		return;
	}
	LOG(DEBUG) << "WorldModel::initialize: Created block with name = " << inputBlock->name;

	/* configure the fifo block */
//	{ .name="type_name", .type_name = "char", .doc="name of registered microblx type to transport" },
//	{ .name="data_len", .type_name = "uint32_t", .doc="array length (multiplier) of data (default: 1)" },
//	{ .name="buffer_len", .type_name = "uint32_t", .doc="max. number of data elements the buffer shall hold" },
	uint32_t dataSize = sizeof(struct rsg_ids); // sizeof(uint32_t); //  sizeof(struct rsg_ids);
	uint32_t bufferSize = 4;

	ubx_data_t* fifoData = ubx_config_get_data(inputBlock, "data_len");
	memcpy(fifoData->data, &dataSize, sizeof(dataSize));

	fifoData = ubx_config_get_data(inputBlock, "buffer_len");
	memcpy(fifoData->data, &bufferSize, sizeof(bufferSize));

	fifoData = ubx_config_get_data(inputBlock, "type_name");
	int len = strlen("struct rsg_ids")+1;
	ubx_data_resize(fifoData, len);
	strncpy((char*)fifoData->data, "struct rsg_ids", len);

	/* initialize the block */
	if(ubx_block_init(inputBlock) != 0){
		LOG(ERROR) << "WorldModel::initialize: Cannot initialize the module "<< name;
		return;
	}

	/* start the block */
	if(ubx_block_start(inputBlock) != 0){
		LOG(ERROR) << "WorldModel::initialize: Cannot start the module "<< name;
		return;
	}

	/*
	 * Create a second  (dummy) fifo interaction block to be used
	 * as default output for any function block
	 */

	/* create the output fifo block */
	name = "outputFifo";
	inputModuleName = "lfds_buffers/cyclic";
	if((outputBlock = ubx_block_create(microBlxNodeHandle, inputModuleName.c_str(), name.c_str())) == 0){
		LOG(ERROR) << "WorldModel::loadFunctionBlock: Cannot create the module "<< name;
		return;
	}
	LOG(DEBUG) << "WorldModel::initialize: Created block with name = " << outputBlock->name;
	dataSize = sizeof(struct rsg_ids);
	bufferSize = 4;

	ubx_data_t* outputFifoData = ubx_config_get_data(outputBlock, "data_len");
	memcpy(outputFifoData->data, &dataSize, sizeof(dataSize));

	outputFifoData = ubx_config_get_data(outputBlock, "buffer_len");
	memcpy(outputFifoData->data, &bufferSize, sizeof(bufferSize));

	outputFifoData = ubx_config_get_data(outputBlock, "type_name");
	len = strlen("struct rsg_ids")+1;  //'rsg_ids' but should be 'struct rsg_ids'
	ubx_data_resize(outputFifoData, len);
	strncpy((char*)outputFifoData->data, "struct rsg_ids", len);

	/* initialize the block */
	if(ubx_block_init(outputBlock) != 0){
		LOG(ERROR) << "WorldModel::initialize: Cannot initialize the module "<< name;
		return;
	}

	/* start the block */
	if(ubx_block_start(outputBlock) != 0){
		LOG(ERROR) << "WorldModel::initialize: Cannot start the module "<< name;
		return;
	}

	outputBlockCopy = outputBlock;
//	WorldModel::microBlxWmHandle = this;

#endif
}