File: ChaiDevice.cpp

package info (click to toggle)
sofa-framework 1.0~beta4-4
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 88,224 kB
  • ctags: 26,759
  • sloc: cpp: 151,113; ansic: 2,387; xml: 581; sh: 431; makefile: 101
file content (136 lines) | stat: -rw-r--r-- 4,275 bytes parent folder | download | duplicates (5)
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
/******************************************************************************
*       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                             *
******************************************************************************/
/*
*   ChaiDevice
*
*   Abstraction of an Haptic Device interfaced through CHAI3D library
*   It initialize the device, launch the haptic loop in a thread
*   and provide function to get Device information in sofa primitives
*   ( position for example )
*
*   version 0.1
*   author Gurvan Le Moigno
*
*   // TO FIX : Can't instantiate twice the device, the chai initialisation crash
*/
#include "ChaiDevice.h"


// include needed by Chai
#include "Chai3D/CWorld.h"
#include "Chai3D/CPrecisionTimer.h"
#include "Chai3D/CVector3d.h"
#include "Chai3D/CMeta3dofPointer.h"



namespace sofa{
namespace core{
namespace objectmodel{



// haptic timer callback for the thread loop
cPrecisionTimer timer;



/**
 *  Really simple haptic loop which update the position of the device
 * 
 */
void hapticsLoop(void *a_pUserData)
{	
	cMeta3dofPointer* device = static_cast<cMeta3dofPointer*>(a_pUserData);
	device->updatePose();	
};


/**
 * Constructor
 * Initialise the device in a chai3D world and launch the haptic loop
 */
ChaiDevice::ChaiDevice(){


	cWorld* world = new cWorld();
	
	// Try to get a device
	// see chai3D documentation
	this->device = new cMeta3dofPointer(world, 0);
	
	// try to initialize device
	int isInitialize = device->initialize();
	if( isInitialize == -1){
		std::cerr << "Can't initialize Haptic Device" << std::endl;
	}
	
	world->addChild(device);
	
	// Fit the best with our SOFA world
	// TODO : perhaps have to calculate/ get this information from SOFA
	device->setWorkspace(10,10,10);

	// open communication to the device
	device->start();
	
	// start haptic timer callback
	// 0 means maximum rate as possible
	timer.set(0, hapticsLoop, device);
};


/**
 * Destructor
 * stop the haptic loop
 */
ChaiDevice::~ChaiDevice(){
	timer.stop();
	device->stop();
	delete device;
};


/**
* Link between SOFA and CHAI3D
* It convert the device position in the chai3D world
* into a SOFA Vector3 primitive
*
*/
Vector3 ChaiDevice::getCoord(){
	cVector3d pos = device->m_deviceGlobalPos;
	// not the same axes between chai and sofa !!
	// x -> z
	// y -> x
	// z -> y
	return Vector3(pos.y,pos.z,pos.x);
};


} // namespace objectmodel
} // namespace core
} // namespace sofa