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
|
/*
Read acc-register
*/
void TForm1::ReadAxes(HANDLE handle)
{
AnsiString lsb, msb, calc;
unsigned char tLSB, tMSB;
short iDouble;
unsigned char LSB[3] = {0x02, 0x04, 0x06};
unsigned char MSB[3] = {0x03, 0x05, 0x07};
char axe[3] = {'X', 'Y', 'Z'};
AnsiString values[3];
HidD_FlushQueue(handle); //clear Hid-Queue
for(int i=0; i<3; i++)
{
tLSB = ReadData(handle, 0x82, LSB[i]);
tMSB = ReadData(handle, 0x82, MSB[i]);
iDouble = CalcMsbLsb(tLSB, tMSB);
calc.Format(_T("%d"), iDouble);
values[i] = calc;
}
Edit4->Text=values[0];
Edit5->Text=values[1];
Edit6->Text=values[2];
};
/*
Read data to device
*/
unsigned char TForm1::ReadData(HANDLE handle, unsigned char cmd, unsigned char addr)
{
unsigned char WriteBuffer[12];
unsigned char ReadBuffer[12];
unsigned char newAddr;
unsigned long BytesWritten = 0;
unsigned long NumberOfBytesRead = 0;
bool Result;
newAddr = 0x80 | addr;
memset(&WriteBuffer, 0, Capabilities.OutputReportByteLength+1);
WriteBuffer[0] = 0x00;
WriteBuffer[1] = cmd;
WriteBuffer[2] = newAddr;
Result = WriteFile(handle, &WriteBuffer, Capabilities.OutputReportByteLength, &BytesWritten, NULL);
if(Result != NULL)
{
memset(&ReadBuffer, 0, Capabilities.InputReportByteLength+1);
ReadBuffer[0] = 0x00;
ReadFile(handle, &ReadBuffer, Capabilities.InputReportByteLength, &NumberOfBytesRead, NULL);
return ReadBuffer[3];
}
else
return 0;
};
/*
Calculate acc-value from MB and LSB into short
*/
short TForm1::CalcMsbLsb(unsigned char lsb, unsigned char msb)
{
short erg;
short LSB, MSB, EXEC;
short TEMP = 0x0000;
EXEC = (msb & 0x80) << 8;
EXEC = EXEC & 0x8000;
/*Calcluate nagative value*/
if(EXEC & 0x8000)
EXEC = EXEC | 0x7C00;
MSB = msb << 2;
MSB = MSB & 0x03FC;
LSB = (lsb & 0xC0) >> 6;
LSB = LSB & 0x0003;
erg = MSB | LSB | EXEC;
return erg;
}; |
Partager