コード例 #1
0
void SimSetablePosition::setData(const std::vector<PositionData>& posDataVec)
{
   mPos.setTime();   // Set the time
   addPositionSample(posDataVec);   

   swapPositionBuffers(); // Swap the buffers
}
コード例 #2
0
bool SerialEncoder::sample()
{
   std::vector<gadget::PositionData> positionSample(1);

   positionSample[0].setTime();
   positionSample[0].setValue(mSerialEncoder->getSample());

   addPositionSample(positionSample);

   return true;
}
コード例 #3
0
// Sample data.
bool MotionStar::sample()
{
   bool retval;
   std::vector< gadget::PositionData > cur_samples(mMotionStar.getNumSensors());

   retval = false;

   if ( isActive() == false )
   {
      vprDEBUG(vprDBG_ALL, vprDBG_CRITICAL_LVL)
         << clrSetNORM(clrRED) << "MotionStar ("
         << getAddressName() << ") NOT ACTIVE IN SAMPLE\n"
         << clrRESET << vprDEBUG_FLUSH;
   }
   else
   {
      try
      {
         mMotionStar.sample();

         // get an initial timestamp for this entire sample. we'll copy it into
         // each PositionData for this sample.
         if ( ! cur_samples.empty() )
         {
            cur_samples[0].setTime();

            // For each bird
            for ( unsigned int i = 0; i < mMotionStar.getNumSensors(); ++i )
            {
               // Get the index to the current read buffer
               cur_samples[i].setTime( cur_samples[0].getTime() );
               cur_samples[i].mPosData = mMotionStar.getDeviceData(i);
            }
         }

         // Add the current data as a sample
         addPositionSample(cur_samples);

         retval = true;
      }
      catch (...)
      {
         vprDEBUG(gadgetDBG_INPUT_MGR, vprDBG_CRITICAL_LVL)
            << clrOutNORM(clrRED, "gadget::MotionStar::sample() caught unknown exception")
            << std::endl << vprDEBUG_FLUSH;
         retval = false;
      }
   }

   return retval;
}
コード例 #4
0
ファイル: Vrpn.cpp プロジェクト: Michael-Lfx/vrjuggler
bool Vrpn::sample()
{
   if ( mTrackerNumber > 0 )
   {
      std::vector<PositionData> positions(mTrackerNumber);
      vpr::Guard<vpr::Mutex> g(mTrackerMutex);

      for ( int i = 0; i < mTrackerNumber; ++i )
      {
         gmtl::Matrix44f pos;
         gmtl::setRot(pos, mQuats[i]);
         gmtl::setTrans(pos, mPositions[i]);

         positions[i].setValue(pos);
         positions[i].setTime();
      }

      addPositionSample(positions);
   }

   if ( mButtonNumber > 0 )
   {
      std::vector<DigitalData> buttons(mButtonNumber);
      vpr::Guard<vpr::Mutex> g(mButtonMutex);

      for ( int i = 0; i < mButtonNumber; ++i )
      {
         buttons[i] = mButtons[i];
         buttons[i].setTime();
      }

      addDigitalSample(buttons);
   }

   if ( mAnalogNumber > 0 )
   {
      std::vector<AnalogData> analogs(mAnalogNumber);
      vpr::Guard<vpr::Mutex> g(mAnalogMutex);

      for ( int i = 0; i < mAnalogNumber; ++i )
      {
         analogs[i] = mAnalogs[i];
         analogs[i].setTime();
      }

      addAnalogSample(analogs);
   }

   return true;
}
コード例 #5
0
void SimSetablePosition::setData(const PositionData& posData)
{
   std::vector<PositionData> pos_data_vec;
   pos_data_vec.push_back(posData);

   mPos.setTime();   // Set the time
   addPositionSample(pos_data_vec);   

   swapPositionBuffers(); // Swap the buffers

   //vprDEBUG(gadgetDBG_INPUT_MGR, vprDBG_DETAILED_LVL)
   //   << "[SimSetablePosition::setData()] "
   //   << *(const_cast<PositionData*>(&pos_data)->getPosition()) << std::endl
   //   << vprDEBUG_FLUSH;
}
コード例 #6
0
 /**
  * Updates to the sampled data.
  *
  * @pre None.
  * @post Most recent value is copied over to temp area
  */
 void TrackdSensor::updateData()
 {
    vprASSERT(mTrackdSensors != NULL && "Make sure that trackd sensors has been initialized");
    vprASSERT((unsigned)mTrackdSensors->numSensors() <= mCurSensorValues.size());

    for(int i=0;i<mTrackdSensors->numSensors();i++)
    {
       mCurSensorValues[i].mPosData = mTrackdSensors->getSensorPos(i);
       mCurSensorValues[i].setTime();
    }

    // Update the data buffer
    addPositionSample(mCurSensorValues);
    swapPositionBuffers();
 }
コード例 #7
0
bool P5GloveWrapper::sample()
{
    P5GloveStandalone::Record rec;
    bool sample_read = mGlove->readRecordsFromHardware(rec);

    if ( sample_read )
    {
// Furst, we set the flexion of the gloves
        mAnalogP5[0] = rec.thumb;     // Thumb (0.0 - 1.0)
        mAnalogP5[1] = rec.index;     // Index
        mAnalogP5[2] = rec.middle;    // Middle
        mAnalogP5[3] = rec.ring;     // Ring
        mAnalogP5[4] = rec.pinky;    // Pinky
        addAnalogSample(mAnalogP5);
        swapAnalogBuffers();

// Then, we define the buttons of the glove
        mDigitalP5[0] = static_cast<DigitalState::State>(rec.buttonA);
        mDigitalP5[1] = static_cast<DigitalState::State>(rec.buttonB);
        mDigitalP5[2] = static_cast<DigitalState::State>(rec.buttonC);
        addDigitalSample(mDigitalP5);
        swapDigitalBuffers();

// Finally, we set the position of the glove ...
        const gmtl::AxisAnglef rotation(rec.rotationAngle, rec.rotationAxis[0],
                                        rec.rotationAxis[1],
                                        rec.rotationAxis[2]);
        const gmtl::Vec3f translation(static_cast<float>(rec.position[0]),
                                      static_cast<float>(rec.position[1]),
                                      static_cast<float>(rec.position[2]));
        gmtl::Matrix44f position = gmtl::makeTrans<gmtl::Matrix44f>(translation);
        position = position * gmtl::make<gmtl::Matrix44f>(rotation);
        mPositionP5[0].setValue(position);
        addPositionSample(mPositionP5);
        swapPositionBuffers();
    }

    return true;
}
コード例 #8
0
bool Flock::sample()
{
    std::vector<gadget::PositionData> cur_samples(mFlockOfBirds.getNumSensors());

    if ( !isActive() )
    {
        return false;
    }

    mFlockOfBirds.sample();

    // get an initial timestamp for this entire sample. we'll copy it into
    // each PositionData for this sample.
    if (!cur_samples.empty())
    {
        cur_samples[0].setTime();
    }

    vpr::Thread::yield();

    // For each bird
    for (unsigned i=0; i < mFlockOfBirds.getNumSensors(); ++i)
    {
        // Transforms between the cord frames
        gmtl::Matrix44f transmitter_T_reciever = mFlockOfBirds.getSensorPosition(i);

        // Set timestamp & Store the corrected xform back into buffer.
        cur_samples[i].mPosData = transmitter_T_reciever;
        cur_samples[i].setTime (cur_samples[0].getTime());
    }

    // Add data sample
    addPositionSample(cur_samples);

    return true;
}
コード例 #9
0
ファイル: DTrack.cpp プロジェクト: Michael-Lfx/vrjuggler
bool DTrack::sample()
{
	bool stat;
	int i, j, id;
	int nbt, nvt;
	int num_body, num_flystick, num_meatool;

	if(!thrRunning){
		return false;
	}
	
	stat = standalone->receive();  // receive data from DTrack (blocking with timeout)

	if(!stat){
		return false;
	}

	static int known_num_body = 0;
	num_body = standalone->get_num_body();
	num_flystick = standalone->get_num_flystick();
	num_meatool = standalone->get_num_meatool();
	
	if (known_num_body != num_body) {
		vprDEBUG(vprDBG_ALL, vprDBG_CONFIG_LVL)
			<< "[DTrack] Change in the number of known bodies - "
			<< "was " << known_num_body << ", now is " << num_body
			<< std::endl << vprDEBUG_FLUSH;
		known_num_body = num_body;
	}
	
	resize_curPosition(num_flystick + num_meatool + num_body);
	resize_curDigital(num_flystick * BUTTONS_PER_FLYSTICK + num_meatool * BUTTONS_PER_MEATOOL);
	resize_curAnalog(num_flystick * VALUATORS_PER_FLYSTICK);

	// get 'Flystick' data:

	for(i=0; i<num_flystick; i++){
		dtrack_flystick_type dat = standalone->get_flystick(i);
		
		if(dat.quality >= 0){  // check if Flystick position is tracked
			curPosition[i].setValue(getpos(dat));
			curPosition[i].setTime();
		}                      // otherwise keep last valid position

		// Flystick buttons:

		nbt = dat.num_button;
		
		if(nbt > BUTTONS_PER_FLYSTICK){
			nbt = BUTTONS_PER_FLYSTICK;
		}
		
		for(j=0; j<nbt; j++){
			id = j + i * BUTTONS_PER_FLYSTICK;  // VRJuggler id number
			
			curDigital[id] =
                           static_cast<DigitalState::State>(dat.button[j]);
			curDigital[id].setTime();
		}
		
		// Flystick valuators ('HAT switch' or 'joystick'):
		
		nvt = dat.num_joystick;
		
		if(nvt > VALUATORS_PER_FLYSTICK){
			nvt = VALUATORS_PER_FLYSTICK;
		}
		
		for(j=0; j<nvt; j++){
			id = j + i * VALUATORS_PER_FLYSTICK;  // VRJuggler id number
			
			curAnalog[id] = dat.joystick[j];
			curAnalog[id].setTime();
		}
	}

	// get 'measurement tool' data:

	for(i=0; i<num_meatool; i++){
		dtrack_meatool_type dat = standalone->get_meatool(i);
		
		if(dat.quality >= 0){  // check if position is tracked
			id = i + num_flystick;  // VRJuggler id number
			
			curPosition[id].setValue(getpos(dat));
			curPosition[id].setTime();
		}                      // otherwise keep last valid position

		// measurement tool buttons:

		nbt = dat.num_button;
		
		if(nbt > BUTTONS_PER_MEATOOL){
			nbt = BUTTONS_PER_MEATOOL;
		}
		
		for(j=0; j<nbt; j++){
			id = j + i * BUTTONS_PER_MEATOOL + num_flystick * BUTTONS_PER_FLYSTICK;  // VRJuggler id number
			
			curDigital[id] =
                           static_cast<DigitalState::State>(dat.button[j]);
			curDigital[id].setTime();
		}
	}

	// get 'standard body' data:

	for(i=0; i<num_body; i++){
		dtrack_body_type dat = standalone->get_body(i);

		if(dat.quality >= 0){  // check if position is tracked
			id = i + num_flystick + num_meatool;  // VRJuggler id number

			curPosition[id].setValue(getpos(dat));
			curPosition[id].setTime();
		}                      // otherwise keep last valid position
	}

	// update buffers:

	addPositionSample(curPosition);
	addDigitalSample(curDigital);
	addAnalogSample(curAnalog);
	
	return true;
}
コード例 #10
0
ファイル: DTrack.cpp プロジェクト: rpavlik/vrjuggler-2.2-debs
bool DTrack::sample()
{
	bool stat;
	int i, j, id;
	int nbt, nvt;
	int num_body, num_flystick, num_meatool;

	if(!thrRunning){
		return false;
	}
	
	stat = standalone->receive();  // receive data from DTrack (blocking with timeout)

	if(!stat){
		return false;
	}

	num_body = standalone->get_num_body();
	num_flystick = standalone->get_num_flystick();
	num_meatool = standalone->get_num_meatool();
	
	resize_curPosition(num_flystick + num_meatool + num_body);
	resize_curDigital(num_flystick * BUTTONS_PER_FLYSTICK + num_meatool * BUTTONS_PER_MEATOOL);
	resize_curAnalog(num_flystick * VALUATORS_PER_FLYSTICK);

	// get 'Flystick' data:

	for(i=0; i<num_flystick; i++){
		dtrack_flystick_type dat = standalone->get_flystick(i);
		
		if(dat.quality >= 0){  // check if Flystick position is tracked
			curPosition[i].mPosData = getpos(dat);
			curPosition[i].setTime();
		}                      // otherwise keep last valid position

		// Flystick buttons:

		nbt = dat.num_button;
		
		if(nbt > BUTTONS_PER_FLYSTICK){
			nbt = BUTTONS_PER_FLYSTICK;
		}
		
		for(j=0; j<nbt; j++){
			id = j + i * BUTTONS_PER_FLYSTICK;  // VRJuggler id number
			
			curDigital[id] = dat.button[j];
			curDigital[id].setTime();
		}
		
		// Flystick valuators ('HAT switch' or 'joystick'):
		
		nvt = dat.num_joystick;
		
		if(nvt > VALUATORS_PER_FLYSTICK){
			nvt = VALUATORS_PER_FLYSTICK;
		}
		
		for(j=0; j<nvt; j++){
			id = j + i * VALUATORS_PER_FLYSTICK;  // VRJuggler id number
			
			curAnalog[id] = dat.joystick[j] / 2.0 + 0.5;  // normalizing
			curAnalog[id].setTime();
		}
	}

	// get 'measurement tool' data:

	for(i=0; i<num_meatool; i++){
		dtrack_meatool_type dat = standalone->get_meatool(i);
		
		if(dat.quality >= 0){  // check if position is tracked
			id = i + num_flystick;  // VRJuggler id number
			
			curPosition[id].mPosData = getpos(dat);
			curPosition[id].setTime();
		}                      // otherwise keep last valid position

		// measurement tool buttons:

		nbt = dat.num_button;
		
		if(nbt > BUTTONS_PER_MEATOOL){
			nbt = BUTTONS_PER_MEATOOL;
		}
		
		for(j=0; j<nbt; j++){
			id = j + i * BUTTONS_PER_MEATOOL + num_flystick * BUTTONS_PER_FLYSTICK;  // VRJuggler id number
			
			curDigital[id] = dat.button[j];
			curDigital[id].setTime();
		}
	}

	// get 'standard body' data:

	for(i=0; i<num_body; i++){
		dtrack_body_type dat = standalone->get_body(i);

		if(dat.quality >= 0){  // check if position is tracked
			id = i + num_flystick + num_meatool;  // VRJuggler id number

			curPosition[id].mPosData = getpos(dat);
			curPosition[id].setTime();
		}                      // otherwise keep last valid position
	}

	// update buffers:

	addPositionSample(curPosition);
	addDigitalSample(curDigital);
	addAnalogSample(curAnalog);
	
	return true;
}
コード例 #11
0
ファイル: IntersenseAPI.cpp プロジェクト: baibaiwei/vrjuggler
bool IntersenseAPI::sample()
{
   // If we are not active, then don't try to sample.
   if (!isActive())
   {
      return false;
   }

   // Check to see if we have new data to pull
   if ( ! mTracker.updateData() )
   {
       vprDEBUG(gadgetDBG_INPUT_MGR, vprDBG_CRITICAL_LVL)
         << clrOutBOLD(clrRED, "[gadget::IntersenseAPI::sample()]")
         << ": Could not read data from InterSense API driver!\n"
         << vprDEBUG_FLUSH;
      return false;
   }


// This is the some code for the beginnings of trying to eliminate 
// the sleep in the control loop. Needs more testing.
/*
   bool has_new_data(false);
   for ( unsigned int i = 0 ; i < mStations.size() ; ++i )
   {
      // Make sure station is enabled and tracker has updated data.
      if( mStations[i].enabled && mTracker.hasData(mStations[i].stationIndex) )
      {
         has_new_data = true;
         break;
      }
   }

   // If there wasn't any new data then reliquish control to the cpu and return
   if( ! has_new_data )
   {
      vpr::Thread::yield();
      vpr::System::msleep(10);
   }
*/

   // Create the data buffers to put the new data into.
   std::vector<gadget::PositionData> cur_pos_samples(mStations.size());
   std::vector<gadget::DigitalData>  cur_digital_samples;
   std::vector<gadget::AnalogData>   cur_analog_samples;

   // get an initial timestamp for this entire sample. we'll copy it into
   // each PositionData for this sample.
   if ( ! cur_pos_samples.empty() )
   {
      cur_pos_samples[0].setTime();
   }

   for ( unsigned int i = 0 ; i < mStations.size() ; ++i )
   {
      // Get the station index for the given station.
      int stationIndex = mStations[i].stationIndex;


      // Set the time of each PositionData to match the first.
      cur_pos_samples[i].setTime( cur_pos_samples[0].getTime() );

      // Don't process data from disabled stations
      if( ! mStations[i].enabled )
      {
         continue;
      }

      gmtl::Matrix44f& pos_data(cur_pos_samples[i].editValue());
      gmtl::identity(pos_data);

      // If the Intersense is returning data in Euler format. Otherwise we
      // assume that it is returning data in quaternion format.
      if ( mTracker.getAngleFormat(stationIndex) == ISD_EULER )
      {
         gmtl::EulerAngleZYXf euler(
            gmtl::Math::deg2Rad(mTracker.zRot(stationIndex)),
            gmtl::Math::deg2Rad(mTracker.yRot(stationIndex)),
            gmtl::Math::deg2Rad(mTracker.xRot(stationIndex))
         );
         gmtl::setRot(pos_data, euler);
      }
      else
      {
         gmtl::Quatf quatValue(mTracker.xQuat(stationIndex),
                               mTracker.yQuat(stationIndex),
                               mTracker.zQuat(stationIndex),
                               mTracker.wQuat(stationIndex));
         gmtl::setRot(pos_data, quatValue);
      }

      gmtl::setTrans(pos_data,
                     gmtl::Vec3f(mTracker.xPos(stationIndex),
                                 mTracker.yPos(stationIndex),
                                 mTracker.zPos(stationIndex)));

      // We start at the index of the first digital item (set in the config
      // files) and we copy the digital data from this station to the
      // InterSense device for range (min -> min+count-1).

      if (mStations[i].useDigital)
      {
         for ( int j = 0; j < mStations[i].dig_num; ++j )
         {
            DigitalData new_digital(mTracker.buttonState(stationIndex, j));
            new_digital.setTime();
            cur_digital_samples.push_back(new_digital);
         }
      }

      // Analog works the same as the digital
      if (mStations[i].useAnalog)
      {
         for ( int j = 0; j < mStations[i].ana_num; ++j )
         {
            AnalogData new_analog(mTracker.analogData(stationIndex, j));
            new_analog.setTime();
            cur_analog_samples.push_back(new_analog);
         }
      }
   }

   // Lock and then swap the buffers.
   addAnalogSample(cur_analog_samples);
   addDigitalSample(cur_digital_samples);
   addPositionSample(cur_pos_samples);
   return true;
}