/usr/include/projects/Haptic/lib/HapticMapping.h is in libsofa1-dev 1.0~beta4-12.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | /******************************************************************************
* SOFA, Simulation Open-Framework Architecture, version 1.0 beta 4 *
* (c) 2006-2009 MGH, INRIA, USTL, UJF, CNRS *
* *
* This program is free software; you can redistribute it and/or modify it *
* under the terms of the GNU General Public License as published by the Free *
* Software Foundation; either version 2 of the License, or (at your option) *
* any later version. *
* *
* This program is distributed in the hope that it will be useful, but WITHOUT *
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or *
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
* more details. *
* *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., 51 *
* Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
*******************************************************************************
* SOFA :: Applications *
* *
* Authors: M. Adam, J. Allard, B. Andre, P-J. Bensoussan, S. Cotin, C. Duriez,*
* H. Delingette, F. Falipou, F. Faure, S. Fonteneau, L. Heigeas, C. Mendoza, *
* M. Nesme, P. Neumann, J-P. de la Plata Alcade, F. Poyer and F. Roy *
* *
* Contact information: contact@sofa-framework.org *
******************************************************************************/
#ifndef SOFA_COMPONENT_MAPPING_HAPTICMAPPING_H
#define SOFA_COMPONENT_MAPPING_HAPTICMAPPING_H
#include "ChaiDevice.h"
#include "sofa/core/componentmodel/behavior/MechanicalMapping.h"
#include "sofa/component/mapping/RigidRigidMapping.h"
using sofa::core::objectmodel::ChaiDevice;
using sofa::component::mapping::RigidRigidMapping;
using sofa::core::componentmodel::behavior::MechanicalMapping;
using sofa::core::componentmodel::behavior::MechanicalState;
namespace sofa{
namespace component{
namespace mapping{
/**
* \brief specialized rigid to rigid mapping which link
* an haptic device and a rigid mechanical object
*
* It's a special extension of a RigidRigidMapping, where the IN object
* isn't used, and is dynamicaly replace by the haptic device datas
*
* You need to specialized it with the type of your rigid mechanical object
* that represent your device in SOFA
*
*/
template <class DeviceType>
class HapticMapping
:
public RigidRigidMapping< MechanicalMapping< MechanicalState<DeviceType>, MechanicalState<DeviceType> > >{
private :
/// The haptic device
ChaiDevice* chaiDevice;
/// Catch the OpenGlInitializedEvent to activate the mapping
/// (GL_MODELVIEW_MATRIX must be initialize to apply the mapping)
///
/// see apply method for more detail about this feature
void handleEvent(core::objectmodel::Event *);
/// Indicate if openGl is initialized (GL_MODELVIEW_MATRIX must be initialize to apply the mapping)
///
/// see apply method for more detail about this feature
Data< bool > openGlInitialized;
public :
typedef MechanicalState<DeviceType> Out;
/// Constructor taking the device DOF (the Output model) as parameter
HapticMapping(MechanicalState<DeviceType>* device);
/// Destructor
///
/// Delete the device in order to stop the haptic loop
~HapticMapping();
/// Apply the mapping on position vectors. overwrited from Mapping
///
/// We don't use the second parameter (the input model) wich is replace by the physical device
/// When OpenGl is initialized, this function convert the device position in the sofa world position,
/// in order that your device always move in the same axes, in front of the user
void apply( typename DeviceType::VecCoord& device, const typename DeviceType::VecCoord& /* notUsed */);
/// Apply the reverse mapping on force vectors. overwrited from Mapping
///
/// Does nothing yet
void applyJT( typename DeviceType::VecDeriv& /*device*/, const typename DeviceType::VecDeriv& /*notUsed*/) {};
/// Apply the mapping on derived (velocity, displacement) vectors. overwrited from Mapping
///
/// Does nothing yet
void applyJ( typename DeviceType::VecDeriv& /*device*/, const typename DeviceType::VecDeriv& /*notUsed*/) {};
// **********************************************************
// The two method following (canCreate & create) can't be removed
// from .h file because of the template of the output
// **********************************************************
/// Pre-construction check method called by ObjectFactory. Overtwrited from Mapping.
///
/// This implementation read the object2 attributes and check
/// if it is compatible with the output model types of this
/// mapping. We jump over the test of the input model
template<class T>
static bool canCreate( T*& obj,
core::objectmodel::BaseContext* /* context */,
core::objectmodel::BaseObjectDescription* arg)
{
if (arg->findObject(arg->getAttribute("object2","..")) == NULL)
std::cerr << "Cannot create "<<className(obj)<<" as object2 is missing.\n";
if (dynamic_cast<Out*>(arg->findObject(arg->getAttribute("object2",".."))) == NULL)
return false;
return true;
}
/// Construction method called by ObjectFactory. Overtwrited from Mapping.
///
/// This implementation read the object2 attributes to
/// find the output models of this mapping.
template<class T>
static void create( T*& obj,
core::objectmodel::BaseContext* context,
core::objectmodel::BaseObjectDescription* arg)
{
obj = new T((arg?dynamic_cast<Out*>(arg->findObject(arg->getAttribute("object2",".."))):NULL));
if (context) context->addObject(obj);
if ((arg) && (arg->getAttribute("object2")))
{
obj->object2.setValue( arg->getAttribute("object2") );
arg->removeAttribute("object2");
}
if (arg) obj->parse(arg);
}
}; // class HapticMapping
} // namespace mapping
} // namespace component
} // namespace sofa
#endif
|