/**
 * When receiver set up trigger, then sender sends particle position
 * each frame.
 */
static void verse_send_data(void)
{
	if(ctx->sender == NULL) return;

	pthread_mutex_lock(&ctx->sender->timer->mutex);

	if(ctx->sender->timer->run == 1) {
		uint16 item_id;

		/* Send position for current frame */
		if(ctx->sender->timer->frame >=0 &&
				ctx->sender->timer->frame < ctx->pd->frame_count)
		{

			/* Send current frame */
			vrs_send_tag_set_value(ctx->verse.session_id,
					VRS_DEFAULT_PRIORITY,
					ctx->sender->sender_node->node_id,
					ctx->sender->sender_node->particle_taggroup_id,
					ctx->sender->sender_node->particle_frame_tag_id,
					VRS_VALUE_TYPE_UINT16,
					1,
					&ctx->sender->timer->frame);

			/* For all particles of sender ... */
			for(item_id = 0; item_id < ctx->pd->particle_count; item_id++) {
				/* Send all active particles */
				if(ctx->pd->particles[item_id].states[ctx->sender->timer->frame].state == PARTICLE_STATE_ACTIVE) {
					vrs_send_layer_set_value(ctx->verse.session_id,
							VRS_DEFAULT_PRIORITY,
							ctx->sender->sender_node->node_id,
							ctx->sender->sender_node->particle_layer_id,
							item_id,
							VRS_VALUE_TYPE_REAL32,
							3,
							ctx->pd->particles[item_id].states[ctx->sender->timer->frame].pos);
				}
			}
		}

		/* When animation is at the end, then "delete" particles */
		if(ctx->sender->timer->tot_frame >=0 &&
				ctx->sender->timer->frame == 0)
		{
			/* For all particles of sender ... */
			for(item_id = 0; item_id < ctx->pd->particle_count; item_id++) {
				/* Unset value (delete position) */
				vrs_send_layer_unset_value(ctx->verse.session_id,
						VRS_DEFAULT_PRIORITY,
						ctx->sender->sender_node->node_id,
						ctx->sender->sender_node->particle_layer_id,
						item_id);
			}
		}
	}

	pthread_mutex_unlock(&ctx->sender->timer->mutex);
}
示例#2
0
/**
 * \brief The callback function for command layer_set_value
 */
static void cb_receive_layer_set_value(const uint8_t session_id,
	     const uint32_t node_id,
	     const uint16_t layer_id,
	     const uint32_t item_id,
	     const uint8_t data_type,
	     const uint8_t count,
	     const void *value)
{
	int i;

	printf("%s(): session_id: %u, node_id: %u, layer_id: %d, item_id: %d, data_type: %d, count: %d, value(s): ",
			__FUNCTION__, session_id, node_id, layer_id, item_id, data_type, count);

	switch(data_type) {
	case VRS_VALUE_TYPE_UINT8:
		for(i=0; i<count; i++) {
			printf("%d, ", ((uint8_t*)value)[i]);
		}
		break;
	case VRS_VALUE_TYPE_UINT16:
		for(i=0; i<count; i++) {
			printf("%d, ", ((uint16_t*)value)[i]);
		}
		break;
	case VRS_VALUE_TYPE_UINT32:
		for(i=0; i<count; i++) {
			printf("%d, ", ((uint32_t*)value)[i]);
		}
		break;
	case VRS_VALUE_TYPE_UINT64:
		for(i=0; i<count; i++) {
#ifdef __APPLE__
			printf("%llu, ", ((uint64_t*)value)[i]);
#else
			printf("%lu, ", ((uint64_t*)value)[i]);
#endif
		}
		break;
	case VRS_VALUE_TYPE_REAL16:
		for(i=0; i<count; i++) {
			/* TODO: convert half-float to float and print it as float value */
			printf("%x, ", ((uint16_t*)value)[i]);
		}
		break;
	case VRS_VALUE_TYPE_REAL32:
		for(i=0; i<count; i++) {
			printf("%6.3f, ", ((float*)value)[i]);
		}
		break;
	case VRS_VALUE_TYPE_REAL64:
		for(i=0; i<count; i++) {
			printf("%6.3f, ", ((double*)value)[i]);
		}
		break;
	default:
		printf("Unknown type");
		break;
	}
	printf("\n");

	if(node_id == my_test_node_id && layer_id == my_test_layer_id) {
		/* Test of sending layer unset value */
		vrs_send_layer_unset_value(session_id, my_test_node_prio, node_id, layer_id, item_id);
	}
}