summaryrefslogtreecommitdiffhomepage
path: root/FaceTrackNoIR/SCServer.h
blob: 03917401410d18a15ae4b736d82a5e0397f11aad (plain)
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/********************************************************************************
* SCServer		SCServer is the Class, that communicates headpose-data	*
*					to games, using the SimConnect.dll.		         			*
*																				*
* Copyright (C) 2010	Wim Vriend (Developing)									*
*						Ron Hendriks (Testing and Research)						*
*																				*
* This program is free software; you can redistribute it and/or modify it		*
* under the terms of the GNU General Public License as published by the			*
* Free Software Foundation; either version 3 of the License, or (at your		*
* option) any later version.													*
*																				*
* This program is distributed in the hope that it will be useful, but			*
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY	*
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for	*
* more details.																	*
*																				*
* You should have received a copy of the GNU General Public License along		*
* with this program; if not, see <http://www.gnu.org/licenses/>.				*
*																				*
********************************************************************************/
#pragma once
#ifndef INCLUDED_SCSERVER_H
#define INCLUDED_SCSERVER_H

//
// Prevent the SimConnect manifest from being merged in the application-manifest
// This is necessary to run FaceTrackNoIR on a PC without FSX
//
#define SIMCONNECT_H_NOMANIFEST 
#include "FTNoIR_cxx_protocolserver.h"
//#include "Windows.h" 
//#include <stdlib.h>
#include "SimConnect.h"
#include <QApplication>
#include <QString>
#include <QMessageBox>
#include <QSettings>
#include <QFile>
#include <QDebug>
#include <QLibrary>

typedef HRESULT (WINAPI *importSimConnect_Open)(HANDLE * phSimConnect, LPCSTR szName, HWND hWnd, DWORD UserEventWin32, HANDLE hEventHandle, DWORD ConfigIndex);
typedef HRESULT (WINAPI *importSimConnect_Close)(HANDLE hSimConnect);
typedef HRESULT (WINAPI *importSimConnect_CameraSetRelative6DOF)(HANDLE hSimConnect, float fDeltaX, float fDeltaY, float fDeltaZ, float fPitchDeg, float fBankDeg, float fHeadingDeg);
typedef HRESULT (WINAPI *importSimConnect_CallDispatch)(HANDLE hSimConnect, DispatchProc pfcnDispatch, void * pContext);
typedef HRESULT (WINAPI *importSimConnect_SubscribeToSystemEvent)(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, const char * SystemEventName);
typedef HRESULT (WINAPI *importSimConnect_MapClientEventToSimEvent)(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, const char * EventName);
typedef HRESULT (WINAPI *importSimConnect_AddClientEventToNotificationGroup)(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, SIMCONNECT_CLIENT_EVENT_ID EventID, BOOL bMaskable);
typedef HRESULT (WINAPI *importSimConnect_SetNotificationGroupPriority)(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, DWORD uPriority);

using namespace std;
using namespace v4friend::ftnoir;

static const char* SC_CLIENT_FILENAME = "SimConnect.dll";

enum GROUP_ID
{
    GROUP0=0,
};

enum EVENT_ID
{
	EVENT_PING=0,
	EVENT_INIT,
};

enum INPUT_ID
{
    INPUT0=0,
};

class SCServer : public ProtocolServerBase {
	Q_OBJECT

public: 

	// public member methods
	SCServer();
	~SCServer();

	QString GetProgramName();

	// protected member methods
protected:
	bool checkServerInstallationOK( HANDLE handle );
	void sendHeadposeToGame();

private:
	// Private properties
	QString ProgramName;
	QLibrary SCClientLib;

	importSimConnect_Open simconnect_open;							// SimConnect function(s) in DLL
	importSimConnect_Close simconnect_close;
	static importSimConnect_CameraSetRelative6DOF simconnect_set6DOF;
	importSimConnect_CallDispatch simconnect_calldispatch;
	importSimConnect_SubscribeToSystemEvent simconnect_subscribetosystemevent;
	importSimConnect_MapClientEventToSimEvent simconnect_mapclienteventtosimevent;
	importSimConnect_AddClientEventToNotificationGroup simconnect_addclienteventtonotificationgroup;
	importSimConnect_SetNotificationGroupPriority simconnect_setnotificationgrouppriority;

	static HANDLE hSimConnect;										// Handle to SimConnect
	static void CALLBACK processNextSimconnectEvent(SIMCONNECT_RECV* pData, DWORD cbData, void *pContext);

	static float virtSCPosX;
	static float virtSCPosY;
	static float virtSCPosZ;
	
	static float virtSCRotX;
	static float virtSCRotY;
	static float virtSCRotZ;

	static float prevSCPosX;
	static float prevSCPosY;
	static float prevSCPosZ;
	
	static float prevSCRotX;
	static float prevSCRotY;
	static float prevSCRotZ;

	bool blnSimConnectActive;

public:
	void setVirtRotX(float rot) { virtSCRotX = -1.0f * rot; }			// degrees
	void setVirtRotY(float rot) { virtSCRotY = -1.0f * rot; }
	void setVirtRotZ(float rot) { virtSCRotZ = rot; }

	void setVirtPosX(float pos) { virtSCPosX = pos/100.f; }			// cm to meters
	void setVirtPosY(float pos) { virtSCPosY = pos/100.f; }
	void setVirtPosZ(float pos) { virtSCPosZ = -1.0f * pos/100.f; }


};


#endif//INCLUDED_SCSERVER_H
//END