Skip to content

Commit d1c2bdf

Browse files
committed
Update v1.13
1 parent 1bb3655 commit d1c2bdf

3 files changed

Lines changed: 103 additions & 55 deletions

File tree

NetInput.Capture/NetInput.Capture.cpp

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,23 @@
1313
#include <stdint.h>
1414
#include <fstream>
1515

16-
1716
#define PAD_OUT_SIZE 5
1817
#define PAD_ONLINE 0x00
1918
#define PAD_VIBRA 0x01
2019

2120
SOCKET sock;
2221
struct sockaddr_in addr;
2322
XINPUT_STATE lastSentInputStates[XUSER_MAX_COUNT];
23+
time_t updatetime[XUSER_MAX_COUNT];
2424

2525
void CheckControllerMessage()
26-
{
26+
{
2727
while (true)
28-
{
29-
if (GetKeyState(VK_ESCAPE) & 0x8000)
30-
break;
31-
28+
{
3229
char packet[PAD_OUT_SIZE];
3330
int addr_size = sizeof(addr);
34-
int bytesReceived = recvfrom(sock, (char*)&packet, sizeof(packet), 0, (struct sockaddr*)&addr, &addr_size);
31+
int bytesReceived = recvfrom(sock, (char*)&packet, sizeof(packet), 0, (struct sockaddr*)&addr, &addr_size);
32+
3533
if (bytesReceived == PAD_OUT_SIZE){
3634
uint8_t i = (uint8_t)packet[1];
3735
if ((i >= 0) && (i < XUSER_MAX_COUNT)) {
@@ -77,10 +75,18 @@ void PollControllers()
7775
{
7876
memset(&state, 0, sizeof(XINPUT_STATE));
7977
if (XInputGetState(i, &state) != ERROR_SUCCESS)
80-
continue;
78+
continue;
79+
80+
if (time(NULL) - updatetime[i] >= 5)
81+
{
82+
uint8_t packet[] = { 0xFEu ,i };
83+
if (sendto(sock, (const char*)&packet, sizeof(packet), 0, (struct sockaddr*)&addr, sizeof(addr)) != sizeof(packet))
84+
printf("Failed to CheckUpdateTimeOut!\n");
85+
updatetime[i] = time(NULL);
86+
}
8187

8288
if (memcmp(lastSentInputStates + i, &state, sizeof(XINPUT_STATE)) == 0)
83-
continue;
89+
continue;
8490

8591
uint8_t packet[sizeof(XINPUT_STATE) + 1];
8692
packet[0] = (uint8_t)i;
@@ -152,18 +158,17 @@ int main(int argc, char* argv[])
152158
printf("Sending reset...\n");
153159
SendResetControllers();
154160
printf("Done.\n");
155-
printf("Waiting for gamepad input, press ESC to exit...\n");
156-
157-
std::thread message(CheckControllerMessage); // new thread for vibra notify
161+
printf("Waiting for gamepad input, press Ctrl+C to exit...\n");
162+
163+
std::thread message(CheckControllerMessage); // new thread for message
158164

159165
memset(lastSentInputStates, 0, sizeof(lastSentInputStates));
160166
while (true)
161167
{
162-
if (GetKeyState(VK_ESCAPE) & 0x8000)
163-
break;
164168
PollControllers();
165169
std::this_thread::sleep_for(std::chrono::milliseconds(1));
166170
}
171+
167172
printf("Wait For Closing...\n");
168173
SendResetControllers();
169174
closesocket(sock);

NetInput.Player/NetInput.Player.cpp

Lines changed: 68 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
#include <winsock2.h>
66
#include <ws2tcpip.h>
77
#include <objbase.h>
8-
8+
#include <thread>
9+
#include <chrono>
910
#include <iostream>
1011
#include <stdint.h>
1112

@@ -14,6 +15,7 @@ typedef struct _TARGET_PADS
1415
uint8_t Pid;
1516
PVIGEM_TARGET Pad;
1617
SOCKADDR_IN Addr;
18+
time_t Utime;
1719
} TARGET_PADS, * PTARGET_PADS;
1820

1921
#define PAD_OUT_SIZE 5
@@ -36,7 +38,6 @@ VOID CALLBACK gamepad_callback(PVIGEM_CLIENT Client, PVIGEM_TARGET Target, UCHAR
3638
packet[2] = LargeMotor;
3739
packet[3] = SmallMotor;
3840
packet[4] = LedNumber;
39-
4041
if (sendto(sock, (const char*)&packet, sizeof(packet), 0, (struct sockaddr*)&pads[i].Addr, sizeof(pads[i].Addr)) != sizeof(packet))
4142
printf("Failed to Send Notify message \n");
4243
break;
@@ -45,6 +46,28 @@ VOID CALLBACK gamepad_callback(PVIGEM_CLIENT Client, PVIGEM_TARGET Target, UCHAR
4546
}
4647
}
4748

49+
void CheckPadUpdateTimeOut() {
50+
51+
while (true)
52+
{
53+
for (int i = 0; i < XUSER_MAX_COUNT; i++)
54+
{
55+
if (pads[i].Pad == nullptr)
56+
continue;
57+
58+
if (time(NULL) - pads[i].Utime >= 15)
59+
{
60+
auto pad = pads[i].Pad;
61+
pads[i].Pad = nullptr;
62+
vigem_target_remove(client, pad);
63+
vigem_target_x360_unregister_notification(pad);
64+
vigem_target_free(pad);
65+
}
66+
}
67+
68+
std::this_thread::sleep_for(std::chrono::milliseconds(5000));
69+
}
70+
}
4871

4972
void SetGamepadOnline(SOCKADDR_IN ClientAddr, uint8_t Pid, uint8_t Pindex) {
5073

@@ -55,18 +78,13 @@ void SetGamepadOnline(SOCKADDR_IN ClientAddr, uint8_t Pid, uint8_t Pindex) {
5578
packet[2] = 0;
5679
packet[3] = 0;
5780
packet[4] = Pindex;
58-
81+
5982
if (sendto(sock, (const char*)&packet, sizeof(packet), 0, (struct sockaddr*)&ClientAddr, sizeof(ClientAddr)) != sizeof(packet))
6083
printf("Failed to Send Online message \n");
6184
}
6285

6386

64-
65-
66-
67-
68-
69-
int GetPadIndex(uint8_t pid, SOCKADDR_IN ClientAddr)
87+
int GetNewPadIndex(uint8_t pid, SOCKADDR_IN ClientAddr)
7088
{
7189
int index = -1;
7290
for (int i = 0; i < XUSER_MAX_COUNT; i++)
@@ -75,7 +93,25 @@ int GetPadIndex(uint8_t pid, SOCKADDR_IN ClientAddr)
7593
{
7694
index = i;
7795

78-
}else if ( pads[i].Pid == pid && pads[i].Addr.sin_addr.S_un.S_addr == ClientAddr.sin_addr.S_un.S_addr)
96+
}else if ( pads[i].Pid == pid && pads[i].Addr.sin_addr.S_un.S_addr == ClientAddr.sin_addr.S_un.S_addr && pads[i].Addr.sin_port == ClientAddr.sin_port)
97+
{
98+
index = i;
99+
break;
100+
}
101+
}
102+
return index;
103+
}
104+
105+
106+
int CheckPadIndex(uint8_t pid, SOCKADDR_IN ClientAddr)
107+
{
108+
int index = -1;
109+
for (int i = 0; i < XUSER_MAX_COUNT; i++)
110+
{
111+
if (pads[i].Pad == nullptr)
112+
continue;
113+
114+
if (pads[i].Pid == pid && pads[i].Addr.sin_addr.S_un.S_addr == ClientAddr.sin_addr.S_un.S_addr && pads[i].Addr.sin_port == ClientAddr.sin_port)
79115
{
80116
index = i;
81117
break;
@@ -91,7 +127,7 @@ void ResetGamepad(SOCKADDR_IN ClientAddr)
91127
if (pads[i].Pad == nullptr)
92128
continue;
93129

94-
if (pads[i].Addr.sin_addr.S_un.S_addr == ClientAddr.sin_addr.S_un.S_addr)
130+
if (pads[i].Addr.sin_addr.S_un.S_addr == ClientAddr.sin_addr.S_un.S_addr && pads[i].Addr.sin_port== ClientAddr.sin_port)
95131
{
96132
auto pad = pads[i].Pad;
97133
pads[i].Pad = nullptr;
@@ -181,31 +217,27 @@ int main(int argc, char* argv[])
181217
}
182218

183219
printf("Done.\n");
184-
185220
printf("Waiting for data...\n");
186221

222+
223+
std::thread checktimeout(CheckPadUpdateTimeOut);
224+
187225
uint8_t packet[sizeof(XINPUT_STATE) + 1];
188226
struct sockaddr_in clientAddr;
189227

190228
while (true)
191229
{
192-
if (GetKeyState(VK_ESCAPE) & 0x8000)
193-
break;
194-
195230
memset(&clientAddr, 0, sizeof(clientAddr));
196-
int addr_len = sizeof(clientAddr);
231+
int addr_len = sizeof(clientAddr);
197232
int bytesReceived = recvfrom(sock, (char*)&packet, sizeof(packet), 0, (struct sockaddr*)&clientAddr, &addr_len);
198233

199234
if (bytesReceived == 1 && packet[0] == (uint8_t)0xFFu)
200235
{
201236
printf("Reset signal received, controllers will be reset.\n");
202237
ResetGamepad(clientAddr);
203-
}
204-
else if (bytesReceived == sizeof(packet) && packet[0] >= 0 && packet[0] < XUSER_MAX_COUNT)
238+
}else if (bytesReceived == 2 && packet[0] == (uint8_t)0xFEu)
205239
{
206-
uint8_t pindex = GetPadIndex((uint8_t)packet[0], clientAddr);
207-
XINPUT_STATE* state = (XINPUT_STATE*)(packet + 1);
208-
240+
uint8_t pindex = GetNewPadIndex((uint8_t)packet[1], clientAddr);
209241
if (pindex >= 0 && pindex < XUSER_MAX_COUNT)
210242
{
211243
if (pads[pindex].Pad == nullptr) {
@@ -217,9 +249,10 @@ int main(int argc, char* argv[])
217249

218250
pads[pindex].Pad = pad;
219251
pads[pindex].Addr = clientAddr;
220-
pads[pindex].Pid = (uint8_t)packet[0];
252+
pads[pindex].Pid = (uint8_t)packet[1];
253+
pads[pindex].Utime = time(NULL);
221254

222-
SetGamepadOnline(clientAddr, (uint8_t)packet[0], pindex);
255+
SetGamepadOnline(clientAddr, (uint8_t)packet[1], pindex);
223256

224257
const auto retval = vigem_target_x360_register_notification(client, pad, &gamepad_callback, nullptr);
225258

@@ -241,10 +274,18 @@ int main(int argc, char* argv[])
241274
}
242275
}
243276

244-
if (pads[pindex].Pad!= nullptr) {
245-
vigem_target_x360_update(client, pads[pindex].Pad, *reinterpret_cast<XUSB_REPORT*>(&state->Gamepad));
246-
}
247-
277+
if (pads[pindex].Pad != nullptr)
278+
pads[pindex].Utime = time(NULL);
279+
}
280+
}
281+
else if (bytesReceived == sizeof(packet) && packet[0] >= 0 && packet[0] < XUSER_MAX_COUNT)
282+
{
283+
uint8_t pindex = CheckPadIndex((uint8_t)packet[0], clientAddr);
284+
XINPUT_STATE* state = (XINPUT_STATE*)(packet + 1);
285+
if (pindex >= 0 && pindex < XUSER_MAX_COUNT && pads[pindex].Pad != nullptr)
286+
{
287+
pads[pindex].Utime = time(NULL);
288+
vigem_target_x360_update(client, pads[pindex].Pad, *reinterpret_cast<XUSB_REPORT*>(&state->Gamepad));
248289
}
249290
}
250291
}

README.md

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,20 +38,22 @@ The Player will see if a gamepad with that index is connected. If not, a new vir
3838
- ViGEmBus https://github.com/ViGEm/ViGEmBus/releases
3939

4040
# Thank usertoroot
41-
# 1.12 By QeeAI
42-
43-
2023.1.31
44-
45-
1. Server : netinput.paly.exe 0-65536 (Default 4313)
46-
2. Client : netinput.capture.exe 192.168.1.31 (for example) 0-65536 (Default 4313) , "target.txt" never use .
47-
3. Support Xbox360/One/XSS Vibration
48-
4. Pads re-Arrays depended By ClientIP and Local XboxId。
49-
50-
2023年1月31日
51-
1. 服务端 增加自定义端口 netinput.paly.exe 4313(0-65536)
52-
2. 客户端 增加自定义IP和端口,取消target.txt的参数文件, netinput.capture.exe 192.168.1.31(自定义) 4313(0-65536)
53-
3. 现在可以完美支持XBOX手柄震动。
54-
4. 服务端的手柄分组ID现在按IP和本地XBOXID共同决定。
41+
# 1.13 By QeeAI
42+
43+
2023.2.2
44+
45+
1. Server (Custom Port) : netinput.paly.exe 0-65536 (Default 4313)
46+
2. Client (Custom IPV4/Port) : netinput.capture.exe 192.168.1.31 (for example) 0-65536 (Default 4313) , "target.txt" never use .
47+
3. Support Xbox360/X1S/XSS Vibration
48+
4. GamePads Arrays depended By Client IP ,Port, and Local Xbox controller Index Id 。
49+
5. Add UDP Client HeartBreak every 5s, TimeOut 15s to break.
50+
51+
2023年2月2日
52+
1. 服务端 (自定义端口) : netinput.paly.exe 4313(0-65536)
53+
2. 客户端 (自定义IP和端口) : netinput.capture.exe 192.168.1.31(自定义) 4313(0-65536) , target.txt 不再使用。
54+
3. 现在可以完美支持Xbox360/X1S/XSS手柄震动。
55+
4. 服务端的手柄分组现在按IP,端口和本地XBOX手柄序号共同决定。
56+
5. 增加客户端手柄的心跳连接每5秒1次,超时15秒自动断开。
5557

5658

5759

0 commit comments

Comments
 (0)