Almost done, although there's a data send collision now

This commit is contained in:
Chloe Fontenot 🏳️‍⚧️ 2020-06-03 12:18:51 -05:00
parent 13139912aa
commit fa6e5d8213
3 changed files with 78 additions and 87 deletions

View File

@ -1,44 +1,23 @@
#!/usr/bin/python #!/usr/bin/python
import socket import socket
import threading import threading
#import pyxinput import pyxinput
from time import sleep from time import sleep
import pickle import pickle
# Define server ip and port # Define server ip and port
ip = '192.168.122.1' ip = '192.168.122.1'
port = 2222 port = 2222
#Define globals # Create virtual controller
decodedServerData = "" MyVirtual = pyxinput.vController()
def recvData(ip, port): # Connect to Server
global decodedServerData client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Connect to Server client.connect((ip, port))
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) while True:
#client.setblocking(False) from_server = client.recv(8144)
client.connect((ip, port))
while True:
from_server = client.recv(4096)
#Decode Sever message #Decode Sever message
decodedServerData = pickle.loads(from_server) decodedServerData = pickle.loads(from_server)
print("Raw Data:", decodedServerData) print("Raw Data:", str(decodedServerData))
MyVirtual.set_value(decodedServerData) # pyxinput will only accept values one at a time, so we need to apply the itme in the dictionary one by one
def virtualController(): for event, state in decodedServerData.items():
MyVirtual = pyxinput.vController() MyVirtual.set_value(event, state)
#Set percent to false so values match the raw data from the server print('\''+event+'\''+',', state)
# MyVirtual.percent = False
MyRead = pyxinput.rController(1)
print(MyRead.gamepad)
'''
while True:
#global decodedServerData
# Init virtual XInput Controller
MyVirtual.set_value('AxisLy', 0)
'''
# Execute all functions as threads
if __name__ == "__main__":
#Create Threads
t1 = threading.Thread(target=recvData, args=(ip, port))
#t2 = threading.Thread(target=virtualController, args=())
t1.start()
#t2.start()

View File

@ -1,4 +1,8 @@
# pyInputStreaming # pyInputStreaming
Python Scripts to stream controller input from a Linux Host to a Windows 10 virtual machine Python Scripts to stream controller input from a Linux Host to a Windows 10 virtual machine
# Dependancies
lol On the server, the following libraries are required:
colored
inputs
On the Client:
PYXInput

View File

@ -14,14 +14,16 @@ print("Gamepads available:")
print(devices.gamepads) print(devices.gamepads)
#Define globals #Define globals
controllerData = "" controllerData = ""
# Show device output, send it in var #Dictionary of of all possible values
#def printInput(): controllerDataDict = {'AxisLx': 0, 'AxisLy': 0, 'AxisRx': 0, 'AxisRy': 0, 'BtnBack': 0, 'BtnStart': 0, 'BtnA': 0, 'BtnB': 0, 'BtnX': 0, 'BtnY': 0, 'BtnThumbL': 0, 'BtnThumbR': 0, 'BtnShoulderL': 0, 'BtnShoulderR': 0, 'Dpad': 0, 'TriggerL': 0, 'TriggerR': 0}
#global controllerData #Lookup table to convert values from the "inputs" library
# Capture device input and send it via a web socket lookup_table = {'ABS_X': 'AxisLx', 'ABS_Y': 'AxisLy', 'ABS_RX': 'AxisRx', 'ABS_RY': 'AxisRy', 'BTN_SELECT': 'BtnBack', 'BTN_START': 'BtnStart', 'BTN_SOUTH': 'BtnA', 'BTN_EAST': 'BtnB', 'BTN_NORTH': 'BtnX', 'BTN_WEST': 'BtnY', 'BTN_THUMBL': 'BtnThumbL', 'BTN_THUMBR': 'BtnThumbR', 'BTN_TL': 'BtnShoulderL', 'BTN_TR': 'BtnShoulderR', 'ABS_Z': 'TriggerL', 'ABS_RZ': 'TriggerR'}
#def inputCapture(ip, port):
#global controllerData
print("Waiting for connection...") print("Waiting for connection...")
''' def sendData():
#Pickle for transmittion
encodedControllerData = pickle.dumps(controllerDataDict)
#print(encodedControllerData)
conn.send(encodedControllerData)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((ip, port)) s.bind((ip, port))
s.listen(1) s.listen(1)
@ -29,14 +31,8 @@ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
conn, addr = s.accept() conn, addr = s.accept()
with conn: with conn:
print(colored('Connected by', 'red'), addr) print(colored('Connected by', 'red'), addr)
''' print(controllerDataDict)
#Dictionary of of all possible values while True:
controllerDataDict = {'AxisLx': 0, 'AxisLy': 0, 'AxisRx': 0, 'AxisRy': 0, 'BtnBack': 0, 'BtnStart': 0, 'BtnA': 0, 'BtnB': 0, 'BtnX': 0, 'BtnY': 0, 'BtnThumbL': 0, 'BtnThumbR': 0, 'BtnShoulderL': 0, 'BtnShoulderR': 0, 'Dpad': 0, 'TriggerL': 0, 'TriggerR,': 0}
# Convert "inputs" library data to our dict
print(controllerDataDict)
#Print value of AxisRx
#print(controllerDataDict['AxisRx'])
while True:
events = get_gamepad() events = get_gamepad()
for event in events: for event in events:
#controllerDataTuple = event.ev_type, event.code, event.state #controllerDataTuple = event.ev_type, event.code, event.state
@ -44,23 +40,35 @@ while True:
controllerData = controllerDataTuple controllerData = controllerDataTuple
#print("controllerData is a", type(controllerData)) #print("controllerData is a", type(controllerData))
print(controllerData) print(controllerData)
print(controllerDataDict)
''' #If event.code is SYN_REPORT, ignore it
#Pickle for transmittion if event.code == "SYN_REPORT":
encodedControllerData = pickle.dumps(controllerDataDict) continue
print(encodedControllerData) if event.code == "BTN_MODE":
conn.send(encodedControllerData) print(colored('The home button is unimplemented on PYXinput, ignoring', 'red'))
#Wait for ok signal from client before continuing... continue
''' #Ugh, PYXinput and inputs handle the Dpad in the most annoying way possible
elif event.code == "ABS_HAT0X":
#if ABS_HAT0X is 0, then there is no input on the dpad
if event.state == 0:
controllerDataDict['Dpad'] = 0 #No input
if event.state == 1:
# Execute all functions as threads controllerDataDict['Dpad'] = 8 #Right
#if __name__ == "__main__": if event.state == -1:
#Create Threads controllerDataDict['Dpad'] = 4 #Left
#t1 = threading.Thread(target=printInput, args=()) sendData()
#t2 = threading.Thread(target=inputCapture, args=(ip, port)) elif event.code == "ABS_HAT0Y":
#t1.start() #if ABS_HAT0Y is 0, then there is no input on the dpad
#t2.start() if event.state == 0:
controllerDataDict['Dpad'] = 0 #No input
if event.state == 1:
controllerDataDict['Dpad'] = 2 #Down
if event.state == -1:
controllerDataDict['Dpad'] = 1 #Up
sendData()
else:
# Add values to controllerDataDict
controllerDataDict[lookup_table[str(event.code)]] = event.state
sendData()
#Execute everything
controllerLoop()