/** * 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); }
/** * \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); } }