// jun hirabayashi jun@hirax.net http://www.hirax.net
#include "windows.h"

//.............datum structure......................
typedef struct _ACCELREPORT {
        int      PresentState;        // Current internal state (stable: 0, unstable1: 1: unstable2: 2)
        unsigned short LatestRawAccelDataX; // latest raw acceleration data of X axis    <-- works!
 		unsigned short LatestRawAccelDataY; // latest raw acceleration data of Y axis    <-- works!
 		unsigned short LatestAccelDataX;    // latest acceleration data of X axis (average in 40ms)   <-- Works even better?
 		unsigned short LatestAccelDataY;    // latest acceleration data of Y axis (average in 40ms)   <-- Works even better?
 		char     Temperature;         // latest temperature
 		unsigned short LatestZeroG_X;       // latest zero-G offset of X axis  <-- Seems to be the current notion of "center"
 		unsigned short LatestZeroG_Y;       // latest zero-G offset of Y axis  <-- ""
} ACCELREPORT, *PACCELREPORT;

typedef int SENSOR_API;
typedef SENSOR_API (__stdcall *readSensor_t)(PACCELREPORT  pAcceleration);


//.............加速度取得用クラス...................
class Accelerometer{
    private:
        HINSTANCE lib;
        HINSTANCE hDLLLib;
        ACCELREPORT data;
        readSensor_t sensorFunction;
        int OffsetX;
        int OffsetY;
    protected:
    public:
        Accelerometer();
        ~Accelerometer();
        bool GetAccelerometerData(void);
        int  Status(void);
        int  X;
        int  Y;
        int Temperature;
};
//.............コンストラクタ.......................
Accelerometer::Accelerometer()
{
    try
    {
      HINSTANCE hDLLLib = LoadLibrary("Sensor.dll");
      if(hDLLLib!=NULL) {
        sensorFunction = (readSensor_t) GetProcAddress(hDLLLib, "ShockproofGetAccelerometerData");
      }
    }
    catch(...){}
    OffsetX = 0;
    OffsetY = 0;
    if ( sensorFunction(&data) )
    {
        OffsetX = -data.LatestRawAccelDataX;
        OffsetY = -data.LatestRawAccelDataY;
        GetAccelerometerData();
    }
}
//.............デストラクタ....................
Accelerometer::~Accelerometer()
{
  FreeLibrary(hDLLLib);
}
//.............加速度取得する.....................
bool Accelerometer::GetAccelerometerData(void)
{
    try
    {
        sensorFunction(&data);
        X = data.LatestRawAccelDataX + OffsetX;
        Y = data.LatestRawAccelDataY + OffsetY;
        Temperature = data.Temperature;
        return true;
    }
    catch(...)
    {
        return false;
    }
}
