2007-02-27

A mover esas Notebooks!

Desde que Jony me dijo que las ThinkPad nuevas traen un sensor para poder medir la inclinación de la notebook, estoy con ganas de hacer alguna aplicación tonta que lo use.

Resulta que ya hubo gente a la que se le ocurrió, y si buscan en YouTube van a encontrar videos de gente manejando el TuxRace (famoso juego de carrera de pingüino en 3D de Linux) con el movimiento de la ThinkPad.

Habiendo visto esto, me emocioné bastante ya que confirmaba que lo que yo quería se podía hacer perfectamente.

Buscando por internet encontré la pagina de un flaco que hizo un programita de ejemplo en Python que usa el driver de este acelerómetro y obtiene los valores. Buscando un poco mas también pude encontrar casi el mismo ejemplo en C++ y C# (voy a dejar el ejemplo en C++)

El único problema, fue que al ejecutar el DeviceIoControl me tira un error y no puedo leer los valores. Si alguien llega a tener una idea de que puede ser lo que pasa, por favor digame. Igualmente ya le pregunté al flaco que lo hizo en Python, a ver si me puede dar una mano.

El ejemplo en C++ (compilado en VC++ 2005):

#include
"stdafx.h"

#include
<iostream>


 

using
namespace std;


 

//.........jun hirabayashi............................

// this C++ class was ported and modified from C# class

// http://www.ussg.iu.edu/hypermail/linux/kernel/0412.1/0974.html


 

#include
"windows.h"

#include
<iostream>


 

struct ShockData

{


int status;


short
int x0;


short
int y0;


short
int x1;


short
int y1;


short
int x2;


short
int y2;


short
int x3;


short
int y3;


short
int x4;


short
int y4;


short
int x5;


short
int y5;


short
int x6;


short
int y6;


short
int x7;


short
int y7;


short
int x8;


short
int y8;


short
int x9;


short
int y9;


short
int x10;


short
int y10;


short
int x11;


short
int y11;


short
int x12;


short
int y12;


short
int x13;


short
int y13;


short
int unknown0;


short
int unknown1;

};


 

class Accelerometer{


private:

HANDLE hFile;

     ShockData AccelerometerData;


int OffsetX;


int OffsetY;


protected:


public:

Accelerometer();

~Accelerometer();


bool GetAccelerometerData(void);


int Status(void);


int X;


int Y;

};


 

Accelerometer::Accelerometer()

{


try

{

hFile = CreateFile(L"\\\\.\\ShockMgr", GENERIC_READ,

FILE_SHARE_READ | FILE_SHARE_WRITE,

             NULL, OPEN_EXISTING, 0, NULL);


if(hFile == INVALID_HANDLE_VALUE)


throw
"Failed to open ShockMgr.";

}


catch(...){}

OffsetX = 0;

OffsetY = 0;


if ( GetAccelerometerData() )

{

OffsetX = -X;

OffsetY = -Y;

GetAccelerometerData();

}

}


 

Accelerometer::~Accelerometer()

{

CloseHandle(hFile);

}


 

bool Accelerometer::GetAccelerometerData(void)

{


unsigned
long ulRead = 0;


try

{


if( !DeviceIoControl( hFile, 0x733fc, NULL, 0, // via IOCTL(0x733fc)

(void *)&AccelerometerData, 0x24, &ulRead, NULL))


throw
"Failed to DeviceIoControl";

X = AccelerometerData.x0 + OffsetX;

Y = AccelerometerData.y0 + OffsetY;


return
true;

}


catch(...)

{


return
false;

}


return
false;

}


 

int Accelerometer::Status(void)

{


return AccelerometerData.status;

}


 


 

int _tmain(int argc, _TCHAR* argv[])

{

    Accelerometer *pAccel = new Accelerometer();

    pAccel->GetAccelerometerData();


 

    cout << "X: " << pAccel->X << " Y: " << pAccel->Y << endl;


 

    system("pause");

}

Si llego a saber cómo solucionarlo, prometo postearlo.

Zaiden

No hay comentarios.: