Exemple #1
0
void haptic_stuff(cvar_t sens)
{
	int i;
	if(!haptic_ok)
		return;
	dhdGetPosition(&axes[0],&axes[1],&axes[2],DHD);
	if(axes[0] == 0 && axes[1] == 0 && axes[2] == 0)
		return;
	for(i=0;i<BTN_CNT;i++)
		buf->buttons[i] = (char)(haptic_btn() == 1<<i);
	if(cnt > 0)
		cnt -= 1;
	if(buf->buttons[0] && cnt < 5)
		cnt += (rand()%5)+3;
	//haptic_print(axes,"sts");
	// 0 -> down
	// 1 -> right -> 3
	buf->views[0] = (float)axes[2] * -15.0 * sens.value;
	buf->views[1] = (float)axes[1];
	//buf->views[0] = (float)axes[2];
	//buf->views[1] = (float)axes[1];
	haptic_move(buf->views,(sens.value)*15.0);
	double Y = axes[0]*100;
	if(Y < 1.0 && Y > -1.0)
		Y = 0;
	else
		Y *= -32.0;
	buf->fmove = ClampChar(Y);
	haptic_joystick(axes,cnt);
	//haptic_force(axes);
	dhdSetForce(axes[0],axes[1],axes[2],DHD);
	return;
}
Exemple #2
0
float haptic_axis(char axis, float m)
{
	double xyz[AXES];
	if(!haptic_ok)
		return 0;
	dhdGetPosition(&xyz[0],&xyz[1],&xyz[2],DHD);
	return (float)(xyz[axis%AXES] * m);
}
Exemple #3
0
void haptic_getpos(double *arr)
{
	int i;
	if(!haptic_ok)
		return;
	if(arr == NULL)
		return;
	if(dhdGetTime() - lt < RI)
	{
		for(i=0;i<AXES;i++)
			arr[i] = 0;
		return;
	}else
		lt = dhdGetTime();
	dhdGetPosition(&arr[0],&arr[1],&arr[2],DHD);
	return;
}
Exemple #4
0
//===========================================================================
int cDeltaDevice::command(int a_command, void* a_data)
{
    // temp variables
    int result = CHAI_MSG_OK;
    double x=0.0,y=0.0,z=0.0;

    // check if device is open
    if (m_systemReady)
    {
        switch (a_command)
        {
            // read position of delta device
            case CHAI_CMD_GET_POS_3D:
            {
                // read position from device
                dhdGetPosition(&x, &y, &z, m_deviceID);
                cVector3d* position = (cVector3d *) a_data;

                // Convert from m to mm
                position->mul(1000.0);
                position->set(x, y, z);
            }
            break;

            // read normalized position of the delta device
            case CHAI_CMD_GET_POS_NORM_3D:
            {
                // read position from device
                dhdGetPosition(&x, &y, &z, m_deviceID);

                // normalize position
                cVector3d* position = (cVector3d *) a_data;
                position->set(x, y, z);
                position->div(m_halfSizeWorkspace);
            }
            break;

            // read orientation angles of delta wrist
            case CHAI_CMD_GET_ROT_ANGLES:
            {
                cVector3d* angles = (cVector3d *) a_data;
                angles->set(0, 0, 0);
                dhdGetOrientationRad(&angles->x, &angles->y, &angles->z, m_deviceID);
            }
            break;

            // read orientation matrix of wrist
            case CHAI_CMD_GET_ROT_MATRIX:
            {
                cMatrix3d frame;
                frame.identity();

                switch (m_deviceType)
                {
                    // delta devices
                    case (DHD_DEVICE_3DOF):
                    case (DHD_DEVICE_6DOF):
                    case (DHD_DEVICE_6DOF_500):
                    {
                        // read angles
                        cVector3d angles;
                        angles.set(0,0,0);
                        dhdGetOrientationRad(&angles.x, &angles.y, &angles.z, m_deviceID);

                        // compute rotation matrix
                        angles.mul(1.5);
                        frame.rotate(cVector3d(1,0,0), angles.x);
                        frame.rotate(cVector3d(0,1,0), angles.y);
                        frame.rotate(cVector3d(0,0,1), angles.z);
                    }
                    break;

                    // omega devices
                    case (DHD_DEVICE_OMEGA):
                    case (DHD_DEVICE_OMEGA3):
                    case (DHD_DEVICE_OMEGA33):
                    case (DHD_DEVICE_OMEGA331):
                    {
                        // read rotation matrix
                        double rot[3][3];
                        rot[0][0] = 1.0; rot[0][1] = 0.0; rot[0][2] = 0.0;
                        rot[1][0] = 0.0; rot[1][1] = 1.0; rot[1][2] = 0.0;
                        rot[2][0] = 0.0; rot[2][1] = 0.0; rot[2][2] = 1.0;

                        dhdGetOrientationFrame(rot, m_deviceID);

                        cMatrix3d result;
                        frame.m[0][0] = rot[0][0];
                        frame.m[0][1] = rot[0][1];
                        frame.m[0][2] = rot[0][2];
                        frame.m[1][0] = rot[1][0];
                        frame.m[1][1] = rot[1][1];
                        frame.m[1][2] = rot[1][2];
                        frame.m[2][0] = rot[2][0];
                        frame.m[2][1] = rot[2][1];
                        frame.m[2][2] = rot[2][2];
                    }
                    break;
                }

                // return result
                cMatrix3d* matrix = (cMatrix3d *) a_data;
                *matrix = frame;

            }
            break;

            // set force to device
            case CHAI_CMD_SET_FORCE_3D:
            {
                cVector3d* force = (cVector3d *) a_data;
                dhdSetForce(force->x, force->y, force->z, m_deviceID);
            }
            break;

            // set torque to device
            case CHAI_CMD_SET_TORQUE_3D:
            {
                cVector3d* torque = (cVector3d *) a_data;
                dhdSetTorque(torque->x, torque->y, torque->z, m_deviceID);
            }
            break;

            // read user switch from wrist
            case CHAI_CMD_GET_SWITCH_0:
            {
                int* result = (int *) a_data;
                *result = getUserSwitch(m_deviceID);
            }
            break;

            // read user switch from wrist
            case CHAI_CMD_GET_SWITCH_MASK:
            {
                int* result = (int *) a_data;

                // Force the result to be 0 or 1, since bit 0 should carry button 0's value
                *result = getUserSwitch(m_deviceID) ? 1 : 0;
            }
            break;

            // read scale factor from normalized coords to mm
            case CHAI_CMD_GET_NORMALIZED_SCALE_FACTOR:
            {
                double* scale = (double*)a_data;

                // Multiply by m_halfSizeWorkspace to get meters back
                *scale = m_halfSizeWorkspace;

                // Then multiply by 1000 to get millimeters
                *scale *= 1000.0;

                result = CHAI_MSG_OK;
            }
            break;

            // function is not implemented for delta devices
            default:
                result = CHAI_MSG_NOT_IMPLEMENTED;
        }
    }
    else
    {
        result = CHAI_MSG_SYSTEM_NOT_READY;
    }
    return (result);
}