void PhasespaceCore::readAndPublish() {
  // queries the server for new markers data and returns the number of current active markers (0 means old data)
  int num_markers = owlGetMarkers(markers_, init_marker_count_);
  if (owlGetError() != OWL_NO_ERROR) {
    ROS_FATAL_STREAM("[PhaseSpace] Error while reading markers' positions: " << owlGetError());
    throw excp_;
  }

  // waits for available data
  if (num_markers == 0) {
    return;
  }

  ros::Time current_time = ros::Time::now();

  // please, make sure that a node does not use both this function and 'gloveMessageCallback(&msg)' one
  num_data_retrieved_++;
  partial_num_data_retrieved_++;

  // counts how many markers are visible at the moment
  int* markers_count = markers_count_->data();
  int num_visible_markers = 0;
  for (int i=0; i<num_markers; i++) {
    if (markers_[i].cond > 0) {
      markers_count[i]++;
      num_visible_markers++;
    }
  }

  publishMessage(current_time, num_visible_markers, num_markers);
}
int vrpn_Tracker_PhaseSpace::read_frame(void)
{
  int ret = 0;
  char buffer[1024];
  OWLEvent e = owlGetEvent();
  switch(e.type) {
  case 0:
    break;
  case OWL_DONE:
    owlRunning = false;
    send_text_message("owl stopped\n", timestamp, vrpn_TEXT_ERROR);
    return 0;
  case OWL_FREQUENCY:
    owlGetFloatv(OWL_FREQUENCY, &frequency);
    fprintf(stdout, "frequency: %d\n", frequency);
    break;
  case OWL_BUTTONS: break;
  case OWL_MARKERS:
    markers.resize(VRPN_PHASESPACE_MAXMARKERS);
    ret = owlGetMarkers(&markers.front(), markers.size());
    if(ret > 0) markers.resize(ret);
    break;
  case OWL_RIGIDS:
    rigids.resize(VRPN_PHASESPACE_MAXRIGIDS);
    ret = owlGetRigids(&rigids.front(), rigids.size());
    if(ret > 0) rigids.resize(ret);
    break;
  case OWL_COMMDATA:
    owlGetString(OWL_COMMDATA, buffer);
    break;
  case OWL_TIMESTAMP:
    owlGetIntegerv(OWL_TIMESTAMP, &ret);
    break;
  case OWL_PLANES:
    planes.resize(VRPN_PHASESPACE_MAXPLANES);
    ret = owlGetPlanes(&planes.front(), planes.size());
    if(ret > 0) planes.resize(ret);
    break;
  case OWL_DETECTORS:
    detectors.resize(VRPN_PHASESPACE_MAXDETECTORS);
    ret = owlGetDetectors(&detectors.front(), detectors.size());
    if(ret > 0) detectors.resize(ret);
    break;
  case OWL_PEAKS:
    peaks.resize(VRPN_PHASESPACE_MAXPEAKS);
    ret = owlGetPeaks(&peaks.front(), peaks.size());
    if(ret > 0) peaks.resize(ret);
    break;
  case OWL_IMAGES:
    images.resize(VRPN_PHASESPACE_MAXIMAGES);
    ret = owlGetImages(&images.front(), images.size());
    if(ret > 0) images.resize(ret);
    break;
  case OWL_CAMERAS:
    cameras.resize(VRPN_PHASESPACE_MAXCAMERAS);
    ret = owlGetCameras(&cameras.front(), cameras.size());
    if(ret > 0) cameras.resize(ret);
    break;
  case OWL_STATUS_STRING: break;
  case OWL_CUSTOM_STRING: break;
  case OWL_FRAME_NUMBER:
    if(owlGetIntegerv(OWL_FRAME_NUMBER, &ret))
      frame = ret;
    break;
  default:
    fprintf(stderr, "unsupported OWLEvent type: 0x%x\n", e.type);
    break;
  }
  return e.type;
}