2024-11-09 21:39:20 +08:00
# include <stdio.h>
# include <windows.h>
# include <tchar.h>
# include "USB_Win32_HIDDevice.h"
# include "MagCalibrate.h"
# include "SensorImpl.h"
# include "IMU_CAPI.h"
# include "UsbHid_CAPI.h"
# include "quaternion.h"
# include <setupapi.h>
# include "hidsdi.h"
# include <iostream>
# include <sddl.h>
# include "PipeHMD.h"
# include <conio.h>
# include <windows.h>
# include <stdio.h>
# include <tchar.h>
# include <strsafe.h>
# include "openvr_driver.h"
# include "OVR_CAPI.h"
# include "MagCalibrate.h"
2025-01-27 22:28:36 +08:00
# include "Log.h"
2024-11-09 21:39:20 +08:00
2025-01-27 22:28:36 +08:00
int global_calibration_flag = 0 ; // 0 none 1 gyro 2 acc 3 mag
int global_Show = 0 ; // 0 hide 1 gyro 2acc 3mag 4angle 5Hex
2024-11-09 21:39:20 +08:00
std : : string sCurrent_Device_str ( " null " ) ;
std : : string strGlobalDevicePath ( " null " ) ;
extern " C " int globalpacklen ;
extern " C " BOOL device_is_found ;
extern " C " PSP_DEVICE_INTERFACE_DETAIL_DATA pData ;
extern " C " HANDLE DM_HID_Read_HANDLE ;
extern " C " HANDLE DM_HID_Write_HANDLE ;
extern float gx0 , gy0 , gz0 ;
extern " C " OVERLAPPED usb_read_over_lapped ;
int global_pipeserver = 0 ;
//extern Quaternion Qcorr;
bool global_debug = false ;
# include <fstream>
# include <time.h>
FILE * fpdata ;
# define BUFSIZE 512
# define COMMAND_DEVICE_IS_OPEN 1
# define COMMAND_GET_LEFT_POSE 2
# define COMMAND_GET_RIGHT_POSE 3
# define COMMAND_GET_LEFT_BAT 10
# define COMMAND_GET_RIGHT_BAT 11
# define COMMAND_SET_RUMBLE 20
# define LEFT_HAND 0
# define RIGHT_HAND 1
# define BUFSIZE 512
# define COMMAND_DEVICE_IS_OPEN 1
# define COMMAND_GET_DATA 2
# define COMMAND_DEVICE_CALIBRATION 3
# define COMMAND_DEVICE_GET_PURE_DATA 4
# define COMMAND_DEVICE_ENTER_DFU_MODE 11
# define ENTER_DFU_MODE_SUCCESS 1
# define ENTER_DFU_MODE_FAILED 0
# define CALIBRATION_SUCCESS 1
# define CALIBRATION_FAILED 0
# define FEATURE_OFFSET_SET_GYRO 1
# define FEATURE_OFFSET_SET_ACC 2
# define FEATURE_OFFSET_SET_MAG 3
# define FEATURE_OFFSET_SET_LED 4
# define FEATURE_OFFSET_GET_GYRO 0x11
# define FEATURE_OFFSET_GET_ACC 0x12
# define FEATURE_OFFSET_GET_MAG 0x13
# define LED_COLOR_BLACK 0x00
# define LED_COLOR_WHITE 0x07
# define LED_COLOR_RED 0x04
# define LED_COLOR_GREEN 0x02
# define LED_COLOR_BLUE 0x01
# define LED_COLOR_CYAN 0x03
# define LED_COLOR_MAGENTA 0x06
# define LED_COLOR_YELLOW 0x05
UINT8 LED_COLOR_LIST [ 8 ] = { LED_COLOR_BLACK , LED_COLOR_WHITE , LED_COLOR_RED , LED_COLOR_GREEN ,
LED_COLOR_BLUE , LED_COLOR_CYAN , LED_COLOR_MAGENTA , LED_COLOR_YELLOW , } ;
Quaternion CQGamePad = { 1 , 0 , 0 , 0 } ;
Quaternion CQHMD = { 1 , 0 , 0 , 0 } ;
# define FEATURE_OFFSET_SIZE 52 //3+1+4*12
DWORD WINAPI InstanceThread ( LPVOID ) ;
VOID GetAnswerToRequest ( LPCSTR , LPCSTR , LPDWORD ) ;
BOOL CreatePipeSecurity ( PSECURITY_ATTRIBUTES * ppSa )
{
BOOL fSucceeded = TRUE ;
DWORD dwError = ERROR_SUCCESS ;
PSECURITY_DESCRIPTOR pSd = NULL ;
PSECURITY_ATTRIBUTES pSa = NULL ;
// Define the SDDL for the security descriptor.
LPCSTR szSDDL = " D: " // Discretionary ACL
" (A;OICI;GRGW;;;AU) " // Allow read/write to authenticated users
" (A;OICI;GA;;;BA) " ; // Allow full control to administrators
if ( ! ConvertStringSecurityDescriptorToSecurityDescriptor ( szSDDL ,
SDDL_REVISION_1 , & pSd , NULL ) )
{
fSucceeded = FALSE ;
dwError = GetLastError ( ) ;
goto Cleanup ;
}
// Allocate the memory of SECURITY_ATTRIBUTES.
pSa = ( PSECURITY_ATTRIBUTES ) LocalAlloc ( LPTR , sizeof ( * pSa ) ) ;
if ( pSa = = NULL )
{
fSucceeded = FALSE ;
dwError = GetLastError ( ) ;
goto Cleanup ;
}
pSa - > nLength = sizeof ( * pSa ) ;
pSa - > lpSecurityDescriptor = pSd ;
pSa - > bInheritHandle = FALSE ;
* ppSa = pSa ;
Cleanup :
// Clean up the allocated resources if something is wrong.
if ( ! fSucceeded )
{
if ( pSd )
{
LocalFree ( pSd ) ;
pSd = NULL ;
}
if ( pSa )
{
LocalFree ( pSa ) ;
pSa = NULL ;
}
SetLastError ( dwError ) ;
}
return fSucceeded ;
}
void FreePipeSecurity ( PSECURITY_ATTRIBUTES pSa )
{
if ( pSa )
{
if ( pSa - > lpSecurityDescriptor )
{
LocalFree ( pSa - > lpSecurityDescriptor ) ;
}
LocalFree ( pSa ) ;
}
}
int pipeservermain ( VOID )
{
if ( global_pipeserver ! = 1 )
{
return 0 ;
}
global_pipeserver = 2 ;
BOOL fConnected = FALSE ;
DWORD dwThreadId = 0 ;
HANDLE hPipe = INVALID_HANDLE_VALUE , hThread = NULL ;
//LPCSTR lpszPipename = TEXT("\\\\.\\pipe\\Dematrix_SteamVR");
LPCSTR lpszPipename = TEXT ( " \\ \\ . \\ pipe \\ Dematrix_CTL " ) ;
PSECURITY_ATTRIBUTES pSa ;
if ( ! CreatePipeSecurity ( & pSa ) )
{
printf ( " CreatePipeSecurity pSa FALSE \n " ) ;
FreePipeSecurity ( pSa ) ;
return 0 ;
}
// The main loop creates an instance of the named pipe and
// then waits for a client to connect to it. When the client
// connects, a thread is created to handle communications
// with that client, and this loop is free to wait for the
// next client connect request. It is an infinite loop.
for ( ; ; )
{
if ( global_pipeserver = = - 1 )
{
global_pipeserver = 0 ;
break ;
}
//_tprintf(TEXT("\nPipe Server: Main thread awaiting client connection on %s\n"), lpszPipename);
hPipe = CreateNamedPipe (
lpszPipename , // pipe name
PIPE_ACCESS_DUPLEX , // read/write access
PIPE_TYPE_MESSAGE | // message type pipe
PIPE_READMODE_MESSAGE | // message-read mode
PIPE_WAIT , // blocking mode
PIPE_UNLIMITED_INSTANCES , // max. instances
BUFSIZE , // output buffer size
BUFSIZE , // input buffer size
0 , // client time-out
pSa ) ; // default security attribute
if ( hPipe = = INVALID_HANDLE_VALUE )
{
_tprintf ( TEXT ( " CreateNamedPipe failed, GLE=%d. \n " ) , GetLastError ( ) ) ;
return - 1 ;
}
// Wait for the client to connect; if it succeeds,
// the function returns a nonzero value. If the function
// returns zero, GetLastError returns ERROR_PIPE_CONNECTED.
fConnected = ConnectNamedPipe ( hPipe , NULL ) ?
TRUE : ( GetLastError ( ) = = ERROR_PIPE_CONNECTED ) ;
if ( fConnected )
{
//printf("Client connected, creating a processing thread.\n");
// Create a thread for this client.
hThread = CreateThread (
NULL , // no security attribute
0 , // default stack size
InstanceThread , // thread proc
( LPVOID ) hPipe , // thread parameter
0 , // not suspended
& dwThreadId ) ; // returns thread ID
if ( hThread = = NULL )
{
_tprintf ( TEXT ( " CreateThread failed, GLE=%d. \n " ) , GetLastError ( ) ) ;
return - 1 ;
}
else CloseHandle ( hThread ) ;
}
else
// The client could not connect, so close the pipe.
CloseHandle ( hPipe ) ;
}
printf ( " <EFBFBD> ܵ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֹ....\n " ) ;
return 0 ;
}
DWORD WINAPI InstanceThread ( LPVOID lpvParam )
// This routine is a thread processing function to read from and reply to a client
// via the open pipe connection passed from the main loop. Note this allows
// the main loop to continue executing, potentially creating more threads of
// of this procedure to run concurrently, depending on the number of incoming
// client connections.
{
HANDLE hHeap = GetProcessHeap ( ) ;
CHAR * pchRequest = ( CHAR * ) HeapAlloc ( hHeap , 0 , BUFSIZE * sizeof ( CHAR ) ) ;
CHAR * pchReply = ( CHAR * ) HeapAlloc ( hHeap , 0 , BUFSIZE * sizeof ( CHAR ) ) ;
DWORD cbBytesRead = 0 , cbReplyBytes = 0 , cbWritten = 0 ;
BOOL fSuccess = FALSE ;
HANDLE hPipe = NULL ;
// Do some extra error checking since the app will keep running even if this
// thread fails.
if ( lpvParam = = NULL )
{
// printf("\nERROR - Pipe Server Failure:\n");
// printf(" InstanceThread got an unexpected NULL value in lpvParam.\n");
// printf(" InstanceThread exitting.\n");
if ( pchReply ! = NULL ) HeapFree ( hHeap , 0 , pchReply ) ;
if ( pchRequest ! = NULL ) HeapFree ( hHeap , 0 , pchRequest ) ;
return ( DWORD ) - 1 ;
}
if ( pchRequest = = NULL )
{
// printf("\nERROR - Pipe Server Failure:\n");
// printf(" InstanceThread got an unexpected NULL heap allocation.\n");
// printf(" InstanceThread exitting.\n");
if ( pchReply ! = NULL ) HeapFree ( hHeap , 0 , pchReply ) ;
return ( DWORD ) - 1 ;
}
if ( pchReply = = NULL )
{
// printf("\nERROR - Pipe Server Failure:\n");
// printf(" InstanceThread got an unexpected NULL heap allocation.\n");
// printf(" InstanceThread exitting.\n");
if ( pchRequest ! = NULL ) HeapFree ( hHeap , 0 , pchRequest ) ;
return ( DWORD ) - 1 ;
}
// Print verbose messages. In production code, this should be for debugging only.
//printf("InstanceThread created, receiving and processing messages.\n");
// The thread's parameter is a handle to a pipe object instance.
hPipe = ( HANDLE ) lpvParam ;
// Loop until done reading
while ( 1 )
{
// Read client requests from the pipe. This simplistic code only allows messages
// up to BUFSIZE characters in length.
fSuccess = ReadFile (
hPipe , // handle to pipe
pchRequest , // buffer to receive data
BUFSIZE * sizeof ( TCHAR ) , // size of buffer
& cbBytesRead , // number of bytes read
NULL ) ; // not overlapped I/O
if ( ! fSuccess | | cbBytesRead = = 0 )
{
if ( GetLastError ( ) = = ERROR_BROKEN_PIPE )
{
//_tprintf(TEXT("InstanceThread: client disconnected.\n"), GetLastError());
}
else
{
_tprintf ( TEXT ( " InstanceThread ReadFile failed, GLE=%d. \n " ) , GetLastError ( ) ) ;
}
break ;
}
// Process the incoming message.
GetAnswerToRequest ( pchRequest , pchReply , & cbReplyBytes ) ;
// Write the reply to the pipe.
fSuccess = WriteFile (
hPipe , // handle to pipe
pchReply , // buffer to write from
cbReplyBytes , // number of bytes to write
& cbWritten , // number of bytes written
NULL ) ; // not overlapped I/O
if ( ! fSuccess | | cbReplyBytes ! = cbWritten )
{
_tprintf ( TEXT ( " InstanceThread WriteFile failed, GLE=%d. \n " ) , GetLastError ( ) ) ;
break ;
}
}
// Flush the pipe to allow the client to read the pipe's contents
// before disconnecting. Then disconnect the pipe, and close the
// handle to this pipe instance.
FlushFileBuffers ( hPipe ) ;
DisconnectNamedPipe ( hPipe ) ;
CloseHandle ( hPipe ) ;
HeapFree ( hHeap , 0 , pchRequest ) ;
HeapFree ( hHeap , 0 , pchReply ) ;
//printf("InstanceThread exitting.\n");
return 1 ;
}
void ProcessHMDData ( void * read_buffer , void * write_buffer , LPDWORD pchBytes ) {
unsigned char * writeBuffer = ( unsigned char * ) write_buffer ;
BOOL status = FALSE ;
unsigned int * int_value ;
int_value = ( unsigned int * ) read_buffer ;
memset ( writeBuffer , 0 , 512 ) ;
switch ( int_value [ 0 ] ) {
case COMMAND_DEVICE_IS_OPEN : {
BOOL * result = ( BOOL * ) & writeBuffer [ 0 ] ;
result [ 0 ] = TRUE ;
if ( ! device_is_found )
{
result [ 0 ] = FALSE ;
}
* pchBytes = sizeof ( BOOL ) ;
break ;
}
case COMMAND_GET_DATA : {
ovrSensorState * result = ( ovrSensorState * ) & writeBuffer [ 0 ] ;
Quaternion q = GetPoseQuat ( ) ;
result [ 0 ] . Recorded . Pose . Orientation . w = q . w ;
result [ 0 ] . Recorded . Pose . Orientation . x = q . x ;
result [ 0 ] . Recorded . Pose . Orientation . y = q . y ;
result [ 0 ] . Recorded . Pose . Orientation . z = q . z ;
* pchBytes = sizeof ( ovrSensorState ) ;
break ;
}
case COMMAND_DEVICE_CALIBRATION : {
BOOL * result = ( BOOL * ) & writeBuffer [ 0 ] ;
result [ 0 ] = TRUE ;
if ( ! device_is_found )
{
result [ 0 ] = FALSE ;
}
* pchBytes = sizeof ( BOOL ) ;
break ;
}
// case COMMAND_DEVICE_GET_PURE_DATA:{
// float *result = (float*)&writeBuffer[0];
// result[0] = usbDEV.fBatteryLevel[LEFT_HAND];
// if (!device_is_found)
// {
// result[0] = 0.0f;
// }
// *pchBytes = sizeof(float);
// break;
// }
case COMMAND_DEVICE_ENTER_DFU_MODE : {
BOOL * result = ( BOOL * ) & writeBuffer [ 0 ] ;
result [ 0 ] = TRUE ;
if ( ! device_is_found )
{
result [ 0 ] = FALSE ;
}
* pchBytes = sizeof ( BOOL ) ;
break ;
}
}
}
extern UINT8 global_key [ 4 ] ;
float global_ctlposition [ 3 ] = { 0 , 0 , 0 } ;
void ProcessCtlData ( void * read_buffer , void * write_buffer , LPDWORD pchBytes ) {
unsigned char * writeBuffer = ( unsigned char * ) write_buffer ;
BOOL status = FALSE ;
unsigned int * int_value ;
int_value = ( unsigned int * ) read_buffer ;
memset ( writeBuffer , 0 , 512 ) ;
switch ( int_value [ 0 ] ) {
case COMMAND_DEVICE_IS_OPEN : {
BOOL * result = ( BOOL * ) & writeBuffer [ 0 ] ;
* result = device_is_found ;
* pchBytes = sizeof ( BOOL ) ;
break ;
}
case COMMAND_GET_LEFT_POSE : {
vr : : DriverPose_t * result = ( vr : : DriverPose_t * ) & writeBuffer [ 0 ] ;
//Quaternion q = DM_GetQ();
result [ 0 ] . qRotation . w = 1 ;
result [ 0 ] . qRotation . x = 0 ;
result [ 0 ] . qRotation . y = 0 ;
result [ 0 ] . qRotation . z = 0 ;
* pchBytes = sizeof ( vr : : DriverPose_t ) ;
break ;
}
case COMMAND_GET_RIGHT_POSE : {
vr : : DriverPose_t * result = ( vr : : DriverPose_t * ) & writeBuffer [ 0 ] ;
Quaternion q = QuaternionMulti ( GetPoseQuat ( ) , CQGamePad ) ;
result [ 0 ] . qRotation . w = q . w ;
result [ 0 ] . qRotation . x = q . x ;
result [ 0 ] . qRotation . y = q . y ;
result [ 0 ] . qRotation . z = q . z ;
result [ 0 ] . vecPosition [ 0 ] = global_ctlposition [ 0 ] ;
result [ 0 ] . vecPosition [ 1 ] = global_ctlposition [ 1 ] ;
result [ 0 ] . vecPosition [ 2 ] = global_ctlposition [ 2 ] ;
unsigned char * aAxis = ( unsigned char * ) & result [ 0 ] . vecVelocity [ 3 ] ;
aAxis [ 0 ] = global_key [ 0 ] < < 1 ; //unsigned char K[4] ;//<2F> <> <EFBFBD> <EFBFBD> Ϊ 8<> <38> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> (8bit<69> <74> <EFBFBD> Ρ <EFBFBD> ,<2C> <> ,RB,<2C> <> (<28> ᰴ<EFBFBD> <E1B0B4> ), Y,B,A,X ),x<> <78> ,y<> <79> ,<2C> <> trig
//aAxis[1] = usbDEV.K[hand][1];
//aAxis[2] = usbDEV.K[hand][2];
aAxis [ 3 ] = global_key [ 3 ] ; //<2F> <> ͵<EFBFBD> <CDB5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> İ<EFBFBD> <C4B0> <EFBFBD> ״̬......<2E> <> ˵<EFBFBD> <CBB5> <EFBFBD> <EFBFBD> ҪvecVelocity<74> <79> <EFBFBD> <EFBFBD> ....
* pchBytes = sizeof ( vr : : DriverPose_t ) ;
break ;
}
case COMMAND_GET_LEFT_BAT : {
float * result = ( float * ) & writeBuffer [ 0 ] ;
result [ 0 ] = 0 ;
if ( ! device_is_found )
{
result [ 0 ] = 0.0f ;
}
* pchBytes = sizeof ( float ) ;
break ;
}
case COMMAND_GET_RIGHT_BAT : {
float * result = ( float * ) & writeBuffer [ 0 ] ;
result [ 0 ] = 0.7f ;
if ( ! device_is_found )
{
result [ 0 ] = 0.0f ;
}
* pchBytes = sizeof ( float ) ;
break ;
}
case COMMAND_SET_RUMBLE : {
BOOL * result = ( BOOL * ) & writeBuffer [ 0 ] ;
* result = true ; // TriggerHaptic(*(unsigned int*)a_command.data / 255, 50);
* pchBytes = sizeof ( BOOL ) ;
break ;
}
}
}
VOID GetAnswerToRequest ( LPCSTR pchRequest ,
LPCSTR pchReply ,
LPDWORD pchBytes )
{
// This routine is a simple function to print the client request to the console
// and populate the reply buffer with a default data string. This is where you
// would put the actual client request processing code that runs in the context
// of an instance thread. Keep in mind the main thread will continue to wait for
// and receive other client connections while the instance thread is working.
ProcessCtlData ( ( void * ) pchRequest , ( void * ) pchReply , pchBytes ) ;
}
FILE * Getfpdata ( )
{
return fpdata ;
}
Quaternion CorrectQuaterinonY ( Quaternion q )
{
Quaternion qcorr ;
qcorr . w = q . w ; qcorr . x = 0.0f ;
qcorr . y = q . y ; qcorr . z = 0.0f ;
qcorr = QuaternionInversion ( qcorr ) ;
float mod = QuaternionMod ( qcorr ) ;
qcorr . w = qcorr . w / mod ;
qcorr . x = qcorr . x / mod ;
qcorr . y = qcorr . y / mod ;
qcorr . z = qcorr . z / mod ;
return qcorr ;
}
Quaternion CorrectQuaterinon ( Quaternion q )
{
Quaternion qcorr ;
qcorr . w = q . w ; qcorr . x = 0.0f ;
qcorr . y = q . y ; qcorr . z = 0.0f ;
qcorr = QuaternionInversion ( qcorr ) ;
float mod = QuaternionMod ( qcorr ) ;
qcorr . w = qcorr . w / mod ;
qcorr . x = qcorr . x / mod ;
qcorr . y = qcorr . y / mod ;
qcorr . z = qcorr . z / mod ;
return qcorr ;
}
void ShowHelp ( )
{
printf ( " ============================HELP=========================== \n " ) ;
printf ( " h - <20> <> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD> \n " ) ;
printf ( " c - <20> <> <EFBFBD> <EFBFBD> <EFBFBD> 豸<EFBFBD> <E8B1B8> <EFBFBD> <EFBFBD> \n " ) ;
printf ( " d - <20> <> <EFBFBD> <EFBFBD> DFUģʽ \n " ) ;
printf ( " l - LED <20> <> ɫ<EFBFBD> <C9AB> <EFBFBD> <EFBFBD> \n " ) ;
printf ( " t - У <D0A3> <D7BC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> \n " ) ;
// printf(" - b - ȡ<> <C8A1> У \n");
// printf(" - s - <20> <> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> \n");
// printf(" - - b - <20> <> <EFBFBD> <EFBFBD> \n");
printf ( " p - <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ܵ<EFBFBD> <DCB5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> \n " ) ;
// printf(" - r - <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ܵ<EFBFBD> <DCB5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> \n");
// printf(" - s - <20> رչܵ<D5B9> <DCB5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> \n");
printf ( " g - <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> У \n " ) ;
// printf(" - s - <20> <> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> \n");
// printf(" - - b - <20> <> <EFBFBD> <EFBFBD> \n");
// printf(" - c - У <D0A3> <D7BC> <EFBFBD> <EFBFBD> \n");
// printf(" - r - <20> <> <EFBFBD> <EFBFBD> Ϊ0\n");
// printf(" - g - <20> <> ȡ<EFBFBD> <C8A1> ǰ<EFBFBD> <C7B0> <EFBFBD> <EFBFBD> <EFBFBD> Ǽ<EFBFBD> У <D0A3> <D7BC> <EFBFBD> <EFBFBD> \n");
// printf(" - b - <20> <> <EFBFBD> <EFBFBD> \n");
printf ( " m - <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> У \n " ) ;
// printf(" - g - <20> <> ȡ<EFBFBD> <C8A1> ǰ<EFBFBD> <C7B0> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> У <D0A3> <D7BC> <EFBFBD> <EFBFBD> \n");
// printf(" - s - д<> <D0B4> Ĭ<EFBFBD> ϴ<EFBFBD> <CFB4> <EFBFBD> <EFBFBD> Ʋ<EFBFBD> <C6B2> <EFBFBD> \n");
// printf(" - c - <20> <> ʼ <EFBFBD> <CABC> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ݲ<EFBFBD> д<EFBFBD> <D0B4> data.txt\n");
// printf(" - - f - <20> <> <EFBFBD> ݻ<EFBFBD> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <20> <> Ҫ<EFBFBD> <D2AA> <EFBFBD> <EFBFBD> <EFBFBD> µ<EFBFBD> У <D0A3> <D7BC> <EFBFBD> <EFBFBD> \n");
// printf(" - - c - ȡ<> <C8A1> У \n");
// printf(" - - q - <20> ˳<EFBFBD> У \n");
printf ( " a - <20> <> ʾ ŷ<CABE> <C5B7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> \n " ) ;
// printf(" - b - <20> <> <EFBFBD> <EFBFBD> \n");
printf ( " o - <20> <> ʾ ԭʼ <D4AD> <CABC> <EFBFBD> <EFBFBD> \n " ) ;
// printf(" - b - <20> <> <EFBFBD> <EFBFBD> \n");
printf ( " M - <20> ƶ<EFBFBD> <C6B6> <EFBFBD> <EFBFBD> <EFBFBD> λ<EFBFBD> <CEBB> \n " ) ;
printf ( " cУ <D0A3> <D7BC> <EFBFBD> <EFBFBD> b<> <62> <EFBFBD> <EFBFBD> <20> ո <EFBFBD> <D5B8> <EFBFBD> <EFBFBD> <EFBFBD> \n " ) ;
printf ( " ws ad qe<71> <65> <EFBFBD> <EFBFBD> <EFBFBD> ֱ<EFBFBD> <D6B1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƶ<EFBFBD> <C6B6> <EFBFBD> <EFBFBD> <EFBFBD> λ<EFBFBD> <CEBB> \n " ) ;
printf ( " WS AD QE<51> <45> <EFBFBD> <EFBFBD> ͷ<EFBFBD> <CDB7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƶ<EFBFBD> <C6B6> <EFBFBD> <EFBFBD> <EFBFBD> λ<EFBFBD> <CEBB> \n " ) ;
printf ( " ============================<3D> <> <EFBFBD> <EFBFBD> =========================== \n " ) ;
}
int main ( )
{
// printf("DMGamePad<61> <64> <EFBFBD> Թ<EFBFBD> <D4B9> <EFBFBD> 2016-12-13 02:11:20\n");
// /**
// * <20> <> ʼ <EFBFBD> <CABC> USB_HID
// * <20> <> <EFBFBD> س<EFBFBD> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
// * <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȡ<EFBFBD> ߳<EFBFBD>
// **/globalpacklen = 64;
// USB_HID_Init();
// find_device:
// /*<2A> <> <EFBFBD> <EFBFBD> PID=0x0001<30> <31> VIDΪ0x2833<33> <33> USB<53> 豸*/
// //while (!DM_HIDDeviceEnumerate(0x5750, 0x0483))
// while (!DM_HIDDeviceEnumerate(0x0002, 0x2833))
// {
// printf("<22> Ҳ<EFBFBD> <D2B2> <EFBFBD> 0x0001, 0x2833 USB<53> 豸!\n");
// Sleep(1000);
// // if (_getche()=='q')
// // {
// // return 0;
// // }
// }
Init ( " VID_2833&PID_0002 " ) ;
//system("cls");
ShowHelp ( ) ;
DMPipe : : PipeHMD p ( " \\ \\ . \\ Pipe \\ Dematrix_SteamVR " ) ;
// UINT8 MAG_Info[FEATURE_OFFSET_SIZE] = { 0x0b };
// UINT8 MAG_Set[FEATURE_OFFSET_SIZE] = { 0x0b};
UINT8 FEATURE_OFFSET_Get [ FEATURE_OFFSET_SIZE ] = { 0x0b } ;
UINT8 FEATURE_OFFSET_Set [ FEATURE_OFFSET_SIZE ] = { 0x0b } ;
UINT8 * offset_get_dev = ( UINT8 * ) ( FEATURE_OFFSET_Get + 3 ) ;
float * offset_get_data = ( float * ) ( FEATURE_OFFSET_Get + 4 ) ;
UINT8 * offset_set_dev = ( UINT8 * ) ( FEATURE_OFFSET_Set + 3 ) ;
float * offset_set_data = ( float * ) ( FEATURE_OFFSET_Set + 4 ) ;
while ( 1 )
{
//printf(">>");
* offset_set_dev = * offset_get_dev = 0 ;
memset ( offset_get_data , 0 , FEATURE_OFFSET_SIZE - 4 ) ;
memset ( offset_set_data , 0 , FEATURE_OFFSET_SIZE - 4 ) ;
char s ;
printf ( " >> " ) ; s = _getche ( ) ; printf ( " \n " ) ;
if ( s = = ' c ' ) //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> 豸<EFBFBD> Ƿ<EFBFBD> <C7B7> <EFBFBD> Ч
{
if ( CheckDevice ( ) = = 0 )
{
printf ( " <EFBFBD> 豸<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ...\n " ) ;
}
else
{
printf ( " <EFBFBD> 豸<EFBFBD> Ͽ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ...\n " ) ;
device_is_found = FALSE ;
Sleep ( 1000 ) ;
//goto find_device;
}
}
else if ( s = = ' h ' )
{
ShowHelp ( ) ;
}
else if ( s = = ' a ' )
{
global_Show = 4 ;
while ( global_Show ! = 0 )
{
printf ( " >> " ) ; s = _getche ( ) ; printf ( " \n " ) ;
if ( s = = ' b ' )
{
global_Show = 0 ;
}
}
}
else if ( s = = ' M ' )
{
int _flag = 1 ;
float step = 0.005f ;
//clrscr();
//global_Show = 4;
while ( _flag ! = 0 )
{
printf ( " >> " ) ; s = _getch ( ) ; printf ( " \n " ) ;
MVector3 tmppos = { 0 , 0 , 0 } ;
Quaternion qhmd = { 1 , 0 , 0 , 0 } ;
if ( s = = ' b ' )
{
_flag = 0 ;
}
else if ( s = = ' ' )
{
global_ctlposition [ 0 ] = 0 ;
global_ctlposition [ 1 ] = 0 ;
global_ctlposition [ 2 ] = 0 ;
}
else if ( s = = ' r ' )
{
CQHMD = { 1 , 0 , 0 , 0 } ;
CQGamePad = { 1 , 0 , 0 , 0 } ;
}
else if ( s = = ' c ' )
{
if ( p . IsOpen ( ) )
{
ovrSensorState ss = p . GetSensorData ( ) ;
qhmd = { ss . Recorded . Pose . Orientation . w , 0 , ss . Recorded . Pose . Orientation . y , 0 } ;
CQHMD = CorrectQuaterinonY ( qhmd ) ;
CQGamePad = QuaternionMulti ( CorrectQuaterinonY ( GetPoseQuat ( ) ) , qhmd ) ;
printf ( " Success! \n " ) ;
}
}
else if ( ( s = = ' w ' ) | | ( s = = ' W ' ) )
{
tmppos = { 0 , 0 , - 1 } ; //<2F> <> ǰ -z<> <7A> <EFBFBD> <EFBFBD>
}
else if ( ( s = = ' s ' ) | | ( s = = ' S ' ) )
{
tmppos = { 0 , 0 , 1 } ; //<2F> <> <EFBFBD> <EFBFBD> z<> <7A> <EFBFBD> <EFBFBD>
}
else if ( ( s = = ' a ' ) | | ( s = = ' A ' ) )
{
tmppos = { 0 , 0 , - 1 } ; //<2F> <> <EFBFBD> <EFBFBD> -x<> <78> <EFBFBD> <EFBFBD>
}
else if ( ( s = = ' d ' ) | | ( s = = ' D ' ) )
{
tmppos = { 0 , 0 , 1 } ; //<2F> <> <EFBFBD> <EFBFBD> x<> <78> <EFBFBD> <EFBFBD>
}
else if ( ( s = = ' q ' ) | | ( s = = ' Q ' ) )
{
global_ctlposition [ 1 ] - = step ;
}
else if ( ( s = = ' e ' ) | | ( s = = ' E ' ) )
{
global_ctlposition [ 1 ] + = step ;
}
Quaternion cq ; // = CorrectQuaterinonY(DM_GetQ());
if ( ( s = = ' W ' ) | | ( s = = ' A ' ) | | ( s = = ' S ' ) | | ( s = = ' D ' ) )
{
if ( p . IsOpen ( ) )
{
ovrSensorState ss = p . GetSensorData ( ) ;
qhmd = { ss . Recorded . Pose . Orientation . w , ss . Recorded . Pose . Orientation . x , ss . Recorded . Pose . Orientation . y , ss . Recorded . Pose . Orientation . z } ;
CQHMD = CorrectQuaterinonY ( qhmd ) ;
}
cq = CQHMD ;
}
else if ( ( s = = ' w ' ) | | ( s = = ' a ' ) | | ( s = = ' s ' ) | | ( s = = ' d ' ) )
{
cq = QuaternionMulti ( CorrectQuaterinonY ( GetPoseQuat ( ) ) , CQGamePad ) ;
}
if ( ( s = = ' a ' ) | | ( s = = ' d ' ) | | ( s = = ' A ' ) | | ( s = = ' D ' ) )
{
cq = QuaternionMulti ( cq , CreateQuaternion ( - 90 , { 0 , 1 , 0 } ) ) ;
}
Matrix3 rm3 = QuaternionToMatrix ( cq ) ;
MVector3 posv3 = ComputeRotate ( rm3 , tmppos ) ;
global_ctlposition [ 2 ] + = posv3 . v [ 2 ] * step ;
global_ctlposition [ 0 ] + = posv3 . v [ 0 ] * step ;
printf ( " POS:%f %f %f \n " , global_ctlposition [ 0 ] , global_ctlposition [ 1 ] , global_ctlposition [ 2 ] ) ;
}
}
else if ( s = = ' o ' ) //ԭʼ <D4AD> <CABC> <EFBFBD> <EFBFBD>
{
system ( " cls " ) ;
global_Show = 5 ;
while ( global_Show ! = 0 )
{
printf ( " >> " ) ; s = _getche ( ) ; printf ( " \n " ) ;
if ( s = = ' b ' )
{
global_Show = 0 ;
}
}
}
else if ( s = = ' l ' )
{
printf ( " \n LED <20> <> ɫ<EFBFBD> <C9AB> <EFBFBD> <EFBFBD> \n " ) ;
printf ( " K - BLACK \n " ) ;
printf ( " W - WHITE \n " ) ;
printf ( " R - RED \n " ) ;
printf ( " G - GREEN \n " ) ;
printf ( " B - BLUE \n " ) ;
printf ( " C - CYAN \n " ) ;
printf ( " M - MAGENTA \n " ) ;
printf ( " Y - YELLOW \n " ) ;
printf ( " L - LOOP \n " ) ;
printf ( " >> " ) ; s = _getche ( ) ; printf ( " \n " ) ;
if ( s = = ' L ' | | s = = ' l ' )
{
for ( int i = 0 ; i < 8 ; i + + )
{
* offset_set_dev = FEATURE_OFFSET_SET_LED ;
FEATURE_OFFSET_Set [ 4 ] = LED_COLOR_LIST [ i ] ;
if ( HidD_SetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Set , FEATURE_OFFSET_SIZE ) )
{
//printf("%x ", FEATURE_OFFSET_Set[4]);
}
Sleep ( 250 ) ;
}
* offset_set_dev = FEATURE_OFFSET_SET_LED ;
FEATURE_OFFSET_Set [ 4 ] = LED_COLOR_LIST [ 5 ] ;
if ( HidD_SetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Set , FEATURE_OFFSET_SIZE ) )
{
//printf("%x ", FEATURE_OFFSET_Set[4]);
}
}
else
{
char colorlist [ 8 ] { ' K ' , ' W ' , ' R ' , ' G ' , ' B ' , ' C ' , ' M ' , ' Y ' } ;
for ( int i = 0 ; i < 8 ; i + + )
{
if ( colorlist [ i ] = = s | | colorlist [ i ] = = ( s - 32 ) ) //<2F> <> С д
{
* offset_set_dev = FEATURE_OFFSET_SET_LED ;
FEATURE_OFFSET_Set [ 4 ] = LED_COLOR_LIST [ i ] ;
if ( HidD_SetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Set , FEATURE_OFFSET_SIZE ) )
{
printf ( " Color Set \n " ) ;
//printf("%x ", FEATURE_OFFSET_Set[4]);
}
else
{
printf ( " FAILED \n " ) ;
}
break ;
}
}
}
}
else if ( s = = ' g ' )
{
printf ( " \n <EFBFBD> <EFBFBD> λ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> У \n " ) ;
printf ( " - s - <20> <> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> \n " ) ;
printf ( " - - b - <20> <> <EFBFBD> <EFBFBD> \n " ) ;
printf ( " - c - У <D0A3> <D7BC> <EFBFBD> <EFBFBD> \n " ) ;
printf ( " - r - <20> <> <EFBFBD> <EFBFBD> Ϊ0 \n " ) ;
printf ( " - g - <20> <> ȡ<EFBFBD> <C8A1> ǰ<EFBFBD> <C7B0> <EFBFBD> <EFBFBD> <EFBFBD> Ǽ<EFBFBD> У <D0A3> <D7BC> <EFBFBD> <EFBFBD> \n " ) ;
printf ( " - b - <20> <> <EFBFBD> <EFBFBD> \n " ) ;
printf ( " >> " ) ; s = _getche ( ) ; printf ( " \n " ) ;
if ( s = = ' c ' )
{
//printf("<22> <> λ<EFBFBD> <CEBB> У <D0A3> <D7BC> δʵ<CEB4> <CAB5> \n");
* offset_set_dev = FEATURE_OFFSET_GET_GYRO ;
HidD_SetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Set , FEATURE_OFFSET_SIZE ) ;
UINT8 GYRO_Cali_Last [ FEATURE_OFFSET_SIZE ] = { 0x0B } ;
GYRO_Cali_Last [ 3 ] = FEATURE_OFFSET_GET_GYRO ;
if ( HidD_GetFeature ( DM_HID_Read_HANDLE , GYRO_Cali_Last , FEATURE_OFFSET_SIZE ) )
{
float gyrodefault [ 3 ] = { 0.0f , 0.0f , 0.0f } ;
memcpy ( offset_set_data , gyrodefault , sizeof ( float ) * 3 ) ;
* offset_set_dev = FEATURE_OFFSET_SET_GYRO ;
HidD_SetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Set , FEATURE_OFFSET_SIZE ) ;
global_Show = 1 ;
global_calibration_flag = 1 ;
while ( global_calibration_flag = = 1 ) //<2F> <> ʼ <EFBFBD> <CABC> ȡgyro<72> <6F> <EFBFBD> <EFBFBD>
{
}
global_Show = 0 ;
Sleep ( 500 ) ;
* offset_set_dev = FEATURE_OFFSET_SET_GYRO ;
float gyronew [ 3 ] = { - gx0 , - gz0 , - gy0 } ; //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ת<EFBFBD> <D7AA>
memcpy ( offset_set_data , gyronew , sizeof ( float ) * 3 ) ;
if ( HidD_SetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Set , FEATURE_OFFSET_SIZE ) )
{
for ( int i = 0 ; i < FEATURE_OFFSET_SIZE ; i + + )
{
if ( global_debug ) printf ( " %2x " , FEATURE_OFFSET_Set [ i ] ) ;
}
printf ( " \n " ) ;
printf ( " SetGyroOffset \n " ) ;
}
memset ( offset_get_data , 0 , FEATURE_OFFSET_SIZE - 4 ) ;
* offset_set_dev = FEATURE_OFFSET_GET_GYRO ;
HidD_SetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Set , FEATURE_OFFSET_SIZE ) ;
* offset_get_dev = FEATURE_OFFSET_GET_GYRO ;
if ( HidD_GetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Get , FEATURE_OFFSET_SIZE ) )
{
//<2F> <> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD>
for ( int i = 0 ; i < 3 ; i + + )
{
printf ( " %f " , offset_get_data [ i ] ) ;
}
printf ( " \n " ) ;
}
}
}
else if ( s = = ' g ' ) //<2F> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƫ<EFBFBD> <C6AB> <EFBFBD> <EFBFBD>
{
* offset_set_dev = FEATURE_OFFSET_GET_GYRO ;
HidD_SetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Set , FEATURE_OFFSET_SIZE ) ;
* offset_get_dev = FEATURE_OFFSET_GET_GYRO ;
if ( HidD_GetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Get , FEATURE_OFFSET_SIZE ) )
{
printf ( " GetGyro \n " ) ;
for ( int i = 0 ; i < FEATURE_OFFSET_SIZE ; i + + )
{
if ( global_debug ) printf ( " %2x " , FEATURE_OFFSET_Get [ i ] ) ;
}
printf ( " \n " ) ;
//<2F> <> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD>
//float* f= (float*)(FEATURE_OFFSET_Get + 6);
for ( int i = 0 ; i < 3 ; i + + )
{
printf ( " %f " , offset_get_data [ i ] ) ;
}
printf ( " \n " ) ;
}
}
else if ( s = = ' r ' )
{
* offset_set_dev = FEATURE_OFFSET_SET_GYRO ;
float gyronew [ 3 ] = { 0 , 0 , 0 } ;
memcpy ( offset_set_data , gyronew , sizeof ( float ) * 3 ) ;
if ( HidD_SetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Set , FEATURE_OFFSET_SIZE ) )
{
printf ( " ResetGyroOffset \n " ) ;
}
for ( int i = 0 ; i < 3 ; i + + )
{
printf ( " %f " , offset_set_data [ i ] ) ;
}
printf ( " \n " ) ;
}
else if ( s = = ' s ' )
{
global_Show = 1 ;
while ( global_Show ! = 0 )
{
printf ( " >> " ) ; s = _getche ( ) ; printf ( " \n " ) ;
if ( s = = ' b ' )
{
global_Show = 0 ;
}
}
}
else if ( s = = ' b ' )
{
}
}
else if ( s = = ' t ' )
{
printf ( " \n <EFBFBD> <EFBFBD> λ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> У \n <EFBFBD> 뾲<EFBFBD> <EFBFBD> ͷ<EFBFBD> <EFBFBD> \n <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʼ У <D0A3> <D7BC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> \n " ) ;
printf ( " - b - ȡ<> <C8A1> У \n " ) ;
printf ( " - s - <20> <> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> \n " ) ;
printf ( " - - b - <20> <> <EFBFBD> <EFBFBD> \n " ) ;
printf ( " >> " ) ; s = _getche ( ) ; printf ( " \n " ) ;
if ( s = = ' b ' )
{
printf ( " У ȡ<EFBFBD> <EFBFBD> \n " ) ;
}
else if ( s = = ' s ' )
{
global_Show = 1 ;
while ( global_Show ! = 0 )
{
printf ( " >> " ) ; s = _getche ( ) ; printf ( " \n " ) ;
if ( s = = ' b ' )
{
global_Show = 0 ;
}
}
}
else
{
Sleep ( 1000 ) ;
UINT8 gyrocali [ 5 ] = { 0x08 , 0x00 , 0x00 , 0x10 , 0x26 } ;
if ( HidD_SetFeature ( DM_HID_Read_HANDLE , gyrocali , 5 ) )
{
printf ( " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> У <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ...<2E> 뱣<EFBFBD> <EBB1A3> ͷ<EFBFBD> <CDB7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> !\n " ) ;
Sleep ( 5000 ) ;
printf ( " У <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> dzɹ<EFBFBD> \n " ) ;
}
else
{
printf ( " У <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʧ<EFBFBD> <EFBFBD> \n " ) ;
}
}
}
else if ( s = = ' d ' )
{
printf ( " enter dfu \n " ) ;
UINT8 dfu [ 5 ] = { 0x08 , 0x00 , 0x00 , 0x10 , 0x25 } ;
HidD_SetFeature ( DM_HID_Read_HANDLE , dfu , 5 ) ;
}
else if ( s = = ' i ' )
{
printf ( " chipid \n " ) ;
UINT8 chipid [ 15 ] = { 0x0A } ;
HidD_GetFeature ( DM_HID_Read_HANDLE , chipid , 15 ) ;
for ( int i = 0 ; i < 15 ; i + + )
{
if ( global_debug ) printf ( " %2x " , chipid [ i ] ) ;
}
printf ( " \n " ) ;
}
else if ( s = = ' m ' )
{
printf ( " \n <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> У \n " ) ;
printf ( " - l - <20> <> <EFBFBD> <EFBFBD> 2data.txt " ) ;
printf ( " - r - <20> <> <EFBFBD> <EFBFBD> ΪĬ<CEAA> <C4AC> ֵ \n " ) ;
printf ( " - g - <20> <> ȡ<EFBFBD> <C8A1> ǰ<EFBFBD> <C7B0> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> У <D0A3> <D7BC> <EFBFBD> <EFBFBD> \n " ) ;
printf ( " - s - д<> <D0B4> Ĭ<EFBFBD> ϴ<EFBFBD> <CFB4> <EFBFBD> <EFBFBD> Ʋ<EFBFBD> <C6B2> <EFBFBD> \n " ) ;
printf ( " - c - <20> <> ʼ <EFBFBD> <CABC> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ݲ<EFBFBD> д<EFBFBD> <D0B4> data.txt \n " ) ;
printf ( " - - f - <20> <> <EFBFBD> ݻ<EFBFBD> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <20> <> Ҫ<EFBFBD> <D2AA> <EFBFBD> <EFBFBD> <EFBFBD> µ<EFBFBD> У <D0A3> <D7BC> <EFBFBD> <EFBFBD> \n " ) ;
printf ( " - - c - ȡ<> <C8A1> У \n " ) ;
printf ( " - - q - <20> ˳<EFBFBD> У \n " ) ;
printf ( " >> " ) ; s = _getche ( ) ; printf ( " \n " ) ;
if ( s = = ' l ' )
{
GetMagDataFormFile ( ) ;
}
else if ( s = = ' s ' )
{
printf ( " setreport \n " ) ;
float magcali [ 6 ] = { - 2.018673f , - 2.303837f , 1.989453f , 4.899964f , 4.839235f , 5.541566f } ;
memcpy ( offset_set_data , magcali , sizeof ( float ) * 6 ) ;
* offset_set_dev = FEATURE_OFFSET_SET_MAG ;
for ( int i = 0 ; i < FEATURE_OFFSET_SIZE ; i + + )
{
if ( global_debug ) printf ( " %2x " , FEATURE_OFFSET_Set [ i ] ) ;
}
if ( HidD_SetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Set , FEATURE_OFFSET_SIZE ) )
{
printf ( " success \n " ) ;
}
}
else if ( s = = ' r ' )
{
* offset_set_dev = FEATURE_OFFSET_SET_MAG ;
float magdefault [ 6 ] = { 0.0f , 0.0f , 0.0f , 1.0f , 1.0f , 1.0f } ;
memcpy ( offset_set_data , magdefault , sizeof ( float ) * 6 ) ;
if ( HidD_SetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Set , FEATURE_OFFSET_SIZE ) )
{
printf ( " ResetMagOffset \n " ) ;
}
for ( int i = 0 ; i < 6 ; i + + )
{
printf ( " %f " , offset_set_data [ i ] ) ;
}
printf ( " \n " ) ;
}
else if ( s = = ' g ' )
{
// printf("GetMag\n");
//
// for (int i = 0; i < FEATURE_OFFSET_SIZE; i++)
// {
// if(global_debug) printf("%2x ", FEATURE_OFFSET_Get[i]);
// }
// printf("\nin float\n");
// for (int i = 0; i < 6; i++)
// {
// printf("%f ", offset_get_data[i]);
// }
// printf("\n");
* offset_set_dev = FEATURE_OFFSET_GET_MAG ;
HidD_SetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Set , FEATURE_OFFSET_SIZE ) ;
* offset_get_dev = FEATURE_OFFSET_GET_MAG ;
if ( HidD_GetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Get , FEATURE_OFFSET_SIZE ) )
{
for ( int i = 0 ; i < FEATURE_OFFSET_SIZE ; i + + )
{
if ( global_debug ) printf ( " %2x " , FEATURE_OFFSET_Get [ i ] ) ;
}
printf ( " \n in float \n " ) ;
for ( int i = 0 ; i < 6 ; i + + )
{
printf ( " %f " , offset_get_data [ i ] ) ;
}
printf ( " \n " ) ;
}
}
else if ( s = = ' c ' )
{
global_calibration_flag = 3 ;
if ( global_calibration_flag = = 3 ) //MagConfig
{
* offset_set_dev = FEATURE_OFFSET_GET_MAG ;
HidD_SetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Set , FEATURE_OFFSET_SIZE ) ;
UINT8 MAG_Cali_Last [ FEATURE_OFFSET_SIZE ] = { 0x0B } ;
MAG_Cali_Last [ 3 ] = FEATURE_OFFSET_GET_MAG ;
//if (HidD_GetFeature(DM_HID_Read_HANDLE, MAG_Cali_Last, FEATURE_OFFSET_SIZE))
{
* offset_set_dev = FEATURE_OFFSET_SET_MAG ;
float magdefault [ 6 ] = { 0.0f , 0.0f , 0.0f , 1.0f , 1.0f , 1.0f } ;
memcpy ( offset_set_data , magdefault , sizeof ( float ) * 6 ) ;
//if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
{
remove ( " data.txt " ) ;
fopen_s ( & fpdata , " data.txt " , " w " ) ; //<2F> <> <EFBFBD> <EFBFBD> һ <EFBFBD> <D2BB> <EFBFBD> <EFBFBD> <EFBFBD> ļ<EFBFBD> <C4BC> Խ<EFBFBD> <D4BD> <EFBFBD> д<EFBFBD> 롣<EFBFBD> <EBA1A3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ļ<EFBFBD> <C4BC> <EFBFBD> <EFBFBD> ڣ<EFBFBD> <DAA3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ݽ<EFBFBD> <DDBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ١ <EFBFBD>
if ( fpdata ! = NULL )
{
global_Show = 3 ;
printf ( " <EFBFBD> ļ<EFBFBD> <EFBFBD> <EFBFBD> ʼ <EFBFBD> <EFBFBD> <EFBFBD> ɹ<EFBFBD> !\n " ) ;
//Sleep(100);
}
else
{
printf ( " <EFBFBD> ļ<EFBFBD> <EFBFBD> <EFBFBD> ʼ <EFBFBD> <EFBFBD> ʧ<EFBFBD> <EFBFBD> !\n " ) ;
global_calibration_flag = 0 ;
}
while ( global_calibration_flag = = 3 ) //<2F> <> ʼ <EFBFBD> <CABC> ȡMag<61> <67> <EFBFBD> <EFBFBD>
{
printf ( " >> " ) ; s = _getche ( ) ; printf ( " \n " ) ;
if ( s = = ' f ' | | s = = ' c ' | | s = = ' q ' ) //<2F> <> <EFBFBD> <EFBFBD> /ȡ<> <C8A1> /<2F> ˳<EFBFBD>
{
break ;
}
}
}
global_Show = 0 ;
}
global_calibration_flag = 0 ;
if ( fpdata ! = NULL )
{
CancelIo ( fpdata ) ;
fclose ( fpdata ) ;
}
if ( s = = ' f ' ) //Finished
{
printf ( " д<EFBFBD> <EFBFBD> <EFBFBD> ļ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ݽ<EFBFBD> <EFBFBD> <EFBFBD> ,<2C> ȴ<EFBFBD> <C8B4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> : \n " ) ;
float mag_new_cali [ 6 ] ;
system ( " pause " ) ;
MagCaliParam magcalitmp = GetMagDataFormFile ( ) ;
mag_new_cali [ 0 ] = magcalitmp . xOffset ;
mag_new_cali [ 1 ] = magcalitmp . yOffset ;
mag_new_cali [ 2 ] = magcalitmp . zOffset ;
mag_new_cali [ 3 ] = magcalitmp . xScale ;
mag_new_cali [ 4 ] = magcalitmp . yScale ;
mag_new_cali [ 5 ] = magcalitmp . zScale ;
// for (int i = 0; i < 6; i++)
// {
// printf("<22> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> %d<> <64> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> :", i + 1);
// std::cin >> mag_str_tmp;
// mag_new_cali[i] = atof(mag_str_tmp);
// }
memcpy ( offset_set_data , mag_new_cali , sizeof ( float ) * 6 ) ;
}
else
{
if ( s = = ' c ' )
printf ( " У ȡ<EFBFBD> <EFBFBD> " ) ;
memcpy ( FEATURE_OFFSET_Set , MAG_Cali_Last , FEATURE_OFFSET_SIZE ) ;
}
printf ( " \n " ) ;
* offset_set_dev = FEATURE_OFFSET_SET_MAG ;
if ( HidD_SetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Set , FEATURE_OFFSET_SIZE ) )
{
if ( s = = ' c ' )
printf ( " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> д<EFBFBD> <EFBFBD> <EFBFBD> ɹ<EFBFBD> \n " ) ;
}
//<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȡһ <C8A1> <D2BB>
printf ( " Get \n " ) ;
Sleep ( 100 ) ;
* offset_set_dev = FEATURE_OFFSET_GET_MAG ;
HidD_SetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Set , FEATURE_OFFSET_SIZE ) ;
* offset_get_dev = FEATURE_OFFSET_GET_MAG ;
if ( HidD_GetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Get , FEATURE_OFFSET_SIZE ) )
{
printf ( " <EFBFBD> <EFBFBD> ǰУ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> :\n " ) ;
for ( int i = 0 ; i < 6 ; i + + )
{
printf ( " %f " , offset_get_data [ i ] ) ;
}
printf ( " \n " ) ;
}
}
}
}
else if ( s = = ' p ' )
{
printf ( " <EFBFBD> ܵ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> \n " ) ;
printf ( " - r - <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ܵ<EFBFBD> <DCB5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> \n " ) ;
printf ( " - s - <20> رչܵ<D5B9> <DCB5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> \n " ) ;
printf ( " >> " ) ; s = _getche ( ) ; printf ( " \n " ) ;
if ( s = = ' r ' )
{
if ( global_pipeserver = = 0 )
{
global_pipeserver = 1 ;
printf ( " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ܵ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> .....\n " ) ;
start_thread ( pipeservermain , NULL ) ;
}
else
{
printf ( " <EFBFBD> ܵ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ѿ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ...\n " ) ;
}
}
else if ( s = = ' s ' )
{
if ( global_pipeserver = = 0 )
{
printf ( " <EFBFBD> ܵ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> δ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ...\n " ) ;
}
else
{
global_pipeserver = - 1 ;
}
}
}
}
printf ( " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ⰴ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʼ У ...\n " ) ;
getchar ( ) ;
printf ( " <EFBFBD> <EFBFBD> ʼ д<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ...\n " ) ;
while ( 1 )
{
}
}
//win<69> <6E> Ϣ
# include <Dbt.h>
BOOL bIsRunning = TRUE ;
//transform
# include <algorithm>
# pragma region HID
HDEVINFO device_info_set ;
SP_DEVICE_INTERFACE_DATA device_interface_data ;
HIDP_CAPS dematrix_device_capabilities ;
GUID HidGuid ;
BOOL InitPathFromInterfaceData ( HDEVINFO hdevInfoSet , SP_DEVICE_INTERFACE_DATA * pidata )
{
DWORD detailSize = 0 ;
BOOL Result ;
Result = SetupDiGetDeviceInterfaceDetail ( hdevInfoSet , pidata , NULL , ( DWORD ) NULL , & detailSize , NULL ) ;
pData = ( PSP_DEVICE_INTERFACE_DETAIL_DATA ) malloc ( detailSize ) ;
if ( pData = = NULL ) {
printf ( " <EFBFBD> ڴ治<EFBFBD> 㣡\n " ) ;
SetupDiDestroyDeviceInfoList ( hdevInfoSet ) ;
return FALSE ;
}
pData - > cbSize = sizeof ( SP_DEVICE_INTERFACE_DETAIL_DATA ) ;
Result = SetupDiGetDeviceInterfaceDetail ( hdevInfoSet , pidata , pData , detailSize , NULL , NULL ) ;
if ( Result = = TRUE )
{
//printf("Path = %s\n", (char *)(pData->DevicePath));
return TRUE ;
}
return FALSE ;
}
BOOL DM_HIDDeviceEnumerate ( void )
{
HDEVINFO hdevInfoSet ;
SP_DEVICE_INTERFACE_DATA interfaceData ;
int gamepadcount = 0 ;
int deviceIndex = 0 ;
interfaceData . cbSize = sizeof ( interfaceData ) ;
/* <20> <> ȡ<EFBFBD> <C8A1> GUID */
HidD_GetHidGuid ( & HidGuid ) ;
hdevInfoSet = SetupDiGetClassDevs ( & HidGuid , NULL , NULL , DIGCF_INTERFACEDEVICE | DIGCF_PRESENT ) ;
if ( hdevInfoSet = = INVALID_HANDLE_VALUE ) return FALSE ;
for ( deviceIndex = 0 ;
SetupDiEnumDeviceInterfaces ( hdevInfoSet , NULL , & HidGuid , deviceIndex , & interfaceData ) ;
deviceIndex + + )
{
if ( ! InitPathFromInterfaceData ( hdevInfoSet , & interfaceData ) )
continue ;
//printf("index = %d\n",deviceIndex);
string pathstr ( pData - > DevicePath ) ;
transform ( pathstr . begin ( ) , pathstr . end ( ) , pathstr . begin ( ) , toupper ) ;
std : : size_t found = pathstr . find ( strGlobalDevicePath ) ;
if ( found ! = std : : string : : npos )
{
// printf("Path = %s\n", pathstr.c_str());
sCurrent_Device_str = pathstr ;
//printf("sCurrent_Device_str:\n %s\n", sCurrent_Device_str.c_str());
DM_HID_Read_HANDLE = CreateFileA ( ( char * ) ( pData - > DevicePath ) , ( DWORD ) GENERIC_READ | GENERIC_WRITE , FILE_SHARE_READ |
FILE_SHARE_WRITE , NULL , OPEN_EXISTING ,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED , NULL ) ;
DM_HID_Write_HANDLE = CreateFileA ( ( char * ) ( pData - > DevicePath ) , GENERIC_WRITE , FILE_SHARE_READ | FILE_SHARE_WRITE ,
( LPSECURITY_ATTRIBUTES ) NULL , OPEN_EXISTING , 0 , NULL ) ;
if ( DM_HID_Read_HANDLE ! = INVALID_HANDLE_VALUE )
{
device_is_found = TRUE ;
SetEvent ( usb_read_over_lapped . hEvent ) ;
printf ( " read<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 豸<EFBFBD> ɹ<EFBFBD> <EFBFBD> <EFBFBD> \n >> " ) ;
}
else
{
printf ( " read<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 豸ʧ<EFBFBD> ܣ<EFBFBD> \n >> " ) ;
}
if ( DM_HID_Write_HANDLE ! = INVALID_HANDLE_VALUE )
{
printf ( " write<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 豸<EFBFBD> ɹ<EFBFBD> <EFBFBD> <EFBFBD> \n >> " ) ;
}
else
{
printf ( " write<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 豸ʧ<EFBFBD> ܣ<EFBFBD> \n >> " ) ;
}
break ;
}
else
continue ;
}
SetupDiDestroyDeviceInfoList ( hdevInfoSet ) ;
if ( device_is_found = = TRUE ) return TRUE ;
else
return FALSE ;
}
# pragma endregion
# pragma region WindowsMessage
HWND hMessageWindow ;
HDEVNOTIFY hDeviceNotify ;
bool MessageCallback ( WORD messageType , const std : : string & devicePath )
{
bool rv = true ;
if ( messageType = = DBT_DEVICEARRIVAL )
{
//rv = pNotificationClient->OnMessage(Notifier::DeviceAdded, devicePath);
if ( ! device_is_found )
{
printf ( " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 豸<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ,<2C> <> <EFBFBD> ڳ<EFBFBD> ʼ <EFBFBD> <CABC> !\n >> " ) ;
DM_HIDDeviceEnumerate ( ) ;
rv = device_is_found ;
//TriggerHaptic(1, 50);
//TriggerHaptic(1, 100);
}
else
{
printf ( " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> VID PID <20> <> ͬ<EFBFBD> <CDAC> <EFBFBD> 豸,<2C> <> <EFBFBD> 豸<EFBFBD> Ѿ<EFBFBD> <D1BE> <EFBFBD> ʼ <EFBFBD> <CABC> !\n >> " ) ;
}
}
else if ( messageType = = DBT_DEVICEREMOVECOMPLETE )
{
//pNotificationClient->OnMessage(Notifier::DeviceRemoved, devicePath);
//printf("%s\n%s\n", devicePath.c_str(), sCurrent_Device_str.c_str());
if ( device_is_found )
{
//found = devicePath.find(sCurrent_Device_str);
if ( devicePath . find ( sCurrent_Device_str ) ! = std : : string : : npos )
{
ResetAHRS ( ) ;
device_is_found = FALSE ;
sCurrent_Device_str = " NULL " ;
if ( DM_HID_Read_HANDLE ! = INVALID_HANDLE_VALUE )
{
CloseHandle ( DM_HID_Read_HANDLE ) ;
DM_HID_Read_HANDLE = INVALID_HANDLE_VALUE ;
}
if ( DM_HID_Write_HANDLE ! = INVALID_HANDLE_VALUE )
{
CloseHandle ( DM_HID_Write_HANDLE ) ;
DM_HID_Write_HANDLE = INVALID_HANDLE_VALUE ;
}
printf ( " <EFBFBD> 豸<EFBFBD> Ѱγ <EFBFBD> !\n >> " ) ;
}
else
{
printf ( " <EFBFBD> γ <EFBFBD> <EFBFBD> ˾<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͬ<EFBFBD> <EFBFBD> vid pid<69> <64> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ѿ<EFBFBD> <D1BE> <EFBFBD> <F2BFAAB5> 豸!\n >> " ) ;
}
}
}
else
{
}
return rv ;
}
LRESULT CALLBACK WindowsMessageCallback ( HWND hwnd ,
UINT message ,
WPARAM wParam ,
LPARAM lParam )
{
switch ( message )
{
case WM_CREATE :
{
// Setup window user data with device status object pointer.
LPCREATESTRUCT create_struct = reinterpret_cast < LPCREATESTRUCT > ( lParam ) ;
void * lpCreateParam = create_struct - > lpCreateParams ;
//DeviceStatus *pDeviceStatus = reinterpret_cast<DeviceStatus*>(lpCreateParam);
//printf("create\n");
bIsRunning = TRUE ;
//SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pDeviceStatus));
}
return 0 ; // Return 0 for successfully handled WM_CREATE.
case WM_DEVICECHANGE :
{
WORD loword = LOWORD ( wParam ) ;
if ( loword ! = DBT_DEVICEARRIVAL & &
loword ! = DBT_DEVICEREMOVECOMPLETE )
{
// Ignore messages other than device arrive and remove complete
// (we're not handling intermediate ones).
return TRUE ; // Grant WM_DEVICECHANGE request.
}
DEV_BROADCAST_DEVICEINTERFACE * hdr ;
hdr = ( DEV_BROADCAST_DEVICEINTERFACE * ) lParam ;
if ( hdr - > dbcc_devicetype ! = DBT_DEVTYP_DEVICEINTERFACE )
{
// Ignore non interface device messages.
return TRUE ; // Grant WM_DEVICECHANGE request.
}
//LONG_PTR userData = GetWindowLongPtr(hwnd, GWLP_USERDATA);
//DeviceStatus* pDeviceStatus = (DeviceStatus*)userData;
string devicePath ( hdr - > dbcc_name ) ;
if ( /*pDeviceStatus->*/ HidGuid = = hdr - > dbcc_classguid )
{
transform ( devicePath . begin ( ) , devicePath . end ( ) , devicePath . begin ( ) , toupper ) ;
std : : string str2 ( strGlobalDevicePath ) ;
//printf("devicePath:%s\n", devicePath.c_str());
std : : size_t found = devicePath . find ( str2 ) ;
if ( found ! = std : : string : : npos )
{
if ( ! MessageCallback ( loword , devicePath ) )
{
}
break ;
}
}
}
return TRUE ; // Grant WM_DEVICECHANGE request.
case WM_CLOSE :
{
//LONG_PTR userData = GetWindowLongPtr(hwnd, GWLP_USERDATA);
bIsRunning = FALSE ;
DestroyWindow ( hwnd ) ;
}
return 0 ; // We processed the WM_CLOSE message.
case WM_DESTROY :
PostQuitMessage ( 0 ) ;
return 0 ; // We processed the WM_DESTROY message.
}
return DefWindowProc ( hwnd , message , wParam , lParam ) ;
}
bool WinProcInitialize ( )
{
TCHAR special_name [ ] = TEXT ( " wnd_class_name_usbDMCali_JustFeng_2017 " ) ;
WNDCLASS wndClass ;
wndClass . style = CS_HREDRAW | CS_VREDRAW ;
wndClass . lpfnWndProc = WindowsMessageCallback ;
wndClass . cbClsExtra = 0 ;
wndClass . cbWndExtra = 0 ;
wndClass . hInstance = 0 ;
wndClass . hIcon = LoadIcon ( NULL , IDI_APPLICATION ) ;
wndClass . hCursor = LoadCursor ( NULL , IDC_ARROW ) ;
wndClass . hbrBackground = ( HBRUSH ) ( COLOR_WINDOW + 1 ) ;
wndClass . lpszMenuName = NULL ;
wndClass . lpszClassName = special_name ;
if ( ! RegisterClass ( & wndClass ) )
{
printf ( " Failed to register window class. " ) ;
return false ;
}
// We're going to create a 'message-only' window. This will be hidden, can't be enumerated etc.
// To do this we supply 'HWND_MESSAGE' as the hWndParent.
// http://msdn.microsoft.com/en-us/library/ms632599%28VS.85%29.aspx#message_only
hMessageWindow = CreateWindow ( special_name ,
special_name ,
WS_OVERLAPPEDWINDOW ,
CW_USEDEFAULT ,
CW_USEDEFAULT ,
CW_USEDEFAULT ,
CW_USEDEFAULT ,
HWND_MESSAGE ,
NULL ,
0 ,
NULL ) ; // Pass this object via the CREATESTRUCT mechanism
// so that we can attach it to the window user data.
if ( hMessageWindow = = NULL )
{
printf ( " Failed to create window. " ) ;
return false ;
}
// According to MS, topmost windows receive WM_DEVICECHANGE faster.
: : SetWindowPos ( hMessageWindow , HWND_TOPMOST , 0 , 0 , 0 , 0 , SWP_NOMOVE | SWP_NOSIZE ) ;
UpdateWindow ( hMessageWindow ) ;
// Register notification for additional HID messages.
HidD_GetHidGuid ( & HidGuid ) ;
DEV_BROADCAST_DEVICEINTERFACE notificationFilter ;
ZeroMemory ( & notificationFilter , sizeof ( notificationFilter ) ) ;
notificationFilter . dbcc_size = sizeof ( DEV_BROADCAST_DEVICEINTERFACE ) ;
notificationFilter . dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE ;
//notificationFilter.dbcc_classguid = hidguid;
// We need DEVICE_NOTIFY_ALL_INTERFACE_CLASSES to detect
// HDMI plug/unplug events.
hDeviceNotify = RegisterDeviceNotification (
hMessageWindow ,
& notificationFilter ,
DEVICE_NOTIFY_ALL_INTERFACE_CLASSES | DEVICE_NOTIFY_WINDOW_HANDLE ) ;
if ( hDeviceNotify = = NULL )
{
printf ( " Failed to register for device notifications. " ) ;
return false ;
}
return true ;
}
void ProcessMessages ( )
{
//printf("MSG\n");
if ( hMessageWindow = = NULL )
printf ( " Need to call 'Initialize' before first use. " ) ;
MSG msg ;
// Note WM_DEVICECHANGED messages are dispatched but not retrieved by PeekMessage.
// I think this is because they are pending, non-queued messages.
while ( PeekMessage ( & msg , NULL , 0 , 0 , PM_REMOVE ) )
{
TranslateMessage ( & msg ) ;
DispatchMessage ( & msg ) ;
}
}
# pragma endregion
DWORD Thread_Win_MSG ( )
{
if ( ! WinProcInitialize ( ) )
{
bIsRunning = FALSE ;
}
while ( bIsRunning )
{
Sleep ( 1 ) ;
ProcessMessages ( ) ;
}
return 0 ;
}
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
__declspec ( dllexport ) int Init ( char * devpath )
{
2025-01-27 22:28:36 +08:00
InitLog ( " libdm_log.txt " ) ;
WriteLog ( Info , " DevPath = %s " , devpath ) ;
2024-11-09 21:39:20 +08:00
USB_HID_Init ( ) ;
strGlobalDevicePath = devpath ; //"VID_2833&PID_0002";
globalpacklen = 64 ;
start_thread ( Thread_Win_MSG , 0 ) ;
DM_HIDDeviceEnumerate ( ) ;
return 1 ;
}
__declspec ( dllexport ) int CheckDevice ( void )
{
UINT8 FEATURE_OFFSET_Get [ FEATURE_OFFSET_SIZE ] = { 0x0b } ;
if ( HidD_GetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Get , FEATURE_OFFSET_SIZE ) )
{
printf ( " <EFBFBD> 豸<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ...\n " ) ;
2025-01-27 22:28:36 +08:00
device_is_found = TRUE ;
} else {
2024-11-09 21:39:20 +08:00
printf ( " <EFBFBD> 豸<EFBFBD> Ͽ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ...\n " ) ;
device_is_found = FALSE ;
}
return device_is_found ? 1 : 0 ;
}
__declspec ( dllexport ) int GyroCali ( void )
{
if ( device_is_found )
{
UINT8 gyrocali [ 5 ] = { 0x08 , 0x00 , 0x00 , 0x10 , 0x26 } ;
if ( HidD_SetFeature ( DM_HID_Read_HANDLE , gyrocali , 5 ) )
{
//printf("<22> <> <EFBFBD> <EFBFBD> У <D0A3> <D7BC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ...<2E> 뱣<EFBFBD> <EBB1A3> ͷ<EFBFBD> <CDB7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> !\n");
//Sleep(1000);
return 1 ;
//printf("У <D0A3> <D7BC> <EFBFBD> <EFBFBD> <EFBFBD> dzɹ<C7B3> \n");
}
}
return 0 ;
}
__declspec ( dllexport ) Vector3 GetGyroCali ( void )
{
Vector3 v ;
v . x = v . y = v . z = - 99999.0f ;
if ( ! device_is_found )
return v ;
UINT8 FEATURE_OFFSET_Get [ FEATURE_OFFSET_SIZE ] = { 0x0b } ;
UINT8 FEATURE_OFFSET_Set [ FEATURE_OFFSET_SIZE ] = { 0x0b } ;
UINT8 * offset_get_dev = ( UINT8 * ) ( FEATURE_OFFSET_Get + 3 ) ;
float * offset_get_data = ( float * ) ( FEATURE_OFFSET_Get + 4 ) ;
UINT8 * offset_set_dev = ( UINT8 * ) ( FEATURE_OFFSET_Set + 3 ) ;
float * offset_set_data = ( float * ) ( FEATURE_OFFSET_Set + 4 ) ;
* offset_set_dev = * offset_get_dev = 0 ;
memset ( offset_get_data , 0 , FEATURE_OFFSET_SIZE - 4 ) ;
memset ( offset_set_data , 0 , FEATURE_OFFSET_SIZE - 4 ) ;
* offset_set_dev = FEATURE_OFFSET_GET_GYRO ;
HidD_SetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Set , FEATURE_OFFSET_SIZE ) ;
* offset_get_dev = FEATURE_OFFSET_GET_GYRO ;
if ( HidD_GetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Get , FEATURE_OFFSET_SIZE ) )
{
v . x = offset_get_data [ 0 ] ;
v . y = offset_get_data [ 1 ] ;
v . z = offset_get_data [ 2 ] ;
}
return v ;
}
__declspec ( dllexport ) MagCaliParam GetMagCali ( )
{
MagCaliParam mcp ;
UINT8 FEATURE_OFFSET_Get [ FEATURE_OFFSET_SIZE ] = { 0x0b } ;
UINT8 FEATURE_OFFSET_Set [ FEATURE_OFFSET_SIZE ] = { 0x0b } ;
UINT8 * offset_get_dev = ( UINT8 * ) ( FEATURE_OFFSET_Get + 3 ) ;
float * offset_get_data = ( float * ) ( FEATURE_OFFSET_Get + 4 ) ;
UINT8 * offset_set_dev = ( UINT8 * ) ( FEATURE_OFFSET_Set + 3 ) ;
float * offset_set_data = ( float * ) ( FEATURE_OFFSET_Set + 4 ) ;
* offset_set_dev = FEATURE_OFFSET_GET_MAG ;
HidD_SetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Set , FEATURE_OFFSET_SIZE ) ;
* offset_get_dev = FEATURE_OFFSET_GET_MAG ;
if ( HidD_GetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Get , FEATURE_OFFSET_SIZE ) )
{
mcp . xOffset = offset_get_data [ 0 ] ;
mcp . yOffset = offset_get_data [ 1 ] ;
mcp . zOffset = offset_get_data [ 2 ] ;
mcp . xScale = offset_get_data [ 3 ] ;
mcp . yScale = offset_get_data [ 4 ] ;
mcp . zScale = offset_get_data [ 5 ] ;
printf ( " <EFBFBD> <EFBFBD> ǰУ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> :\n " ) ;
for ( int i = 0 ; i < 6 ; i + + )
{
printf ( " %f " , offset_get_data [ i ] ) ;
}
printf ( " \n " ) ;
}
return mcp ;
}
__declspec ( dllexport ) int SetMagCali ( float x , float y , float z , float x0 , float y0 , float z0 )
{
UINT8 FEATURE_OFFSET_Set [ FEATURE_OFFSET_SIZE ] = { 0x0b } ;
UINT8 * offset_set_dev = ( UINT8 * ) ( FEATURE_OFFSET_Set + 3 ) ;
float * offset_set_data = ( float * ) ( FEATURE_OFFSET_Set + 4 ) ;
* offset_set_dev = FEATURE_OFFSET_SET_MAG ;
float magdefault [ 6 ] = { x , y , z , x0 , y0 , z0 } ;
memcpy ( offset_set_data , magdefault , sizeof ( float ) * 6 ) ;
if ( HidD_SetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Set , FEATURE_OFFSET_SIZE ) )
{
printf ( " SetMagOffset \n " ) ;
return 1 ;
}
return 0 ;
}
int Global_MagCali = 0 ;
__declspec ( dllexport ) int MagCalibrate ( void )
{
if ( global_calibration_flag = = 3 )
{
return 0 ;
}
UINT8 FEATURE_OFFSET_Get [ FEATURE_OFFSET_SIZE ] = { 0x0b } ;
UINT8 FEATURE_OFFSET_Set [ FEATURE_OFFSET_SIZE ] = { 0x0b } ;
UINT8 * offset_get_dev = ( UINT8 * ) ( FEATURE_OFFSET_Get + 3 ) ;
float * offset_get_data = ( float * ) ( FEATURE_OFFSET_Get + 4 ) ;
UINT8 * offset_set_dev = ( UINT8 * ) ( FEATURE_OFFSET_Set + 3 ) ;
float * offset_set_data = ( float * ) ( FEATURE_OFFSET_Set + 4 ) ;
DWORD checkhandle ;
global_calibration_flag = 3 ;
if ( global_calibration_flag = = 3 ) //MagConfig
{
* offset_set_dev = FEATURE_OFFSET_GET_MAG ;
HidD_SetFeature ( DM_HID_Read_HANDLE , FEATURE_OFFSET_Set , FEATURE_OFFSET_SIZE ) ;
UINT8 MAG_Cali_Last [ FEATURE_OFFSET_SIZE ] = { 0x0B } ;
MAG_Cali_Last [ 3 ] = FEATURE_OFFSET_GET_MAG ;
if ( HidD_GetFeature ( DM_HID_Read_HANDLE , MAG_Cali_Last , FEATURE_OFFSET_SIZE ) )
{
* offset_set_dev = FEATURE_OFFSET_SET_MAG ;
if ( SetMagCali ( 0.0f , 0.0f , 0.0f , 1.0f , 1.0f , 1.0f ) )
{
return 1 ;
}
global_Show = 0 ;
}
global_calibration_flag = 0 ;
return 0 ;
}
}
__declspec ( dllexport ) int FinishMagCali ( void )
{
global_calibration_flag = 0 ;
global_Show = 0 ;
return 1 ;
}
2025-01-27 22:28:36 +08:00
2024-11-09 21:39:20 +08:00
__declspec ( dllexport ) MagCaliParam CalculateMagParam ( )
{
return GetMagDataFormFile ( ) ;
}
/* <20> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϣ */
__declspec ( dllexport ) Vector3 GetPoint ( void )
{
if ( ! device_is_found ) {
Vector3 v ;
v . x = v . y = v . z = - 99999.0f ;
return v ;
}
return GetMagData ( ) ;
}
__declspec ( dllexport ) Vector3 GetEulerianAngle ( void )
{
Vector3 v ;
v . x = v . y = v . z = - 99999.0f ;
if ( device_is_found )
{
v . z = DM_GetYaw ( ) ;
v . x = DM_GetPitch ( ) ;
v . y = DM_GetRoll ( ) ;
}
return v ;
}
__declspec ( dllexport ) int Correction ( void )
{
return ResetHeading ( ) ;
}
__declspec ( dllexport ) Quaternion GetQuaternion ( void )
{
return GetPoseQuat ( ) ;
}