2020-10-30 02:00:14 +01:00
|
|
|
import pyiforce as ifr
|
|
|
|
import serial
|
|
|
|
import pyvjoy
|
2020-10-30 03:39:05 +01:00
|
|
|
import pyvjoy_ffb as ffb
|
2020-10-30 02:00:14 +01:00
|
|
|
|
|
|
|
PORT = 'COM7'
|
|
|
|
BAUD = 38400
|
|
|
|
|
|
|
|
|
|
|
|
def send_pkt(port, command, data):
|
|
|
|
pkt = bytes(ifr.tx_packet(command, data))
|
|
|
|
port.write(pkt)
|
|
|
|
|
2020-10-31 00:48:33 +01:00
|
|
|
|
2020-10-30 02:00:14 +01:00
|
|
|
def hex_print(d):
|
2020-10-31 00:48:33 +01:00
|
|
|
print(' '.join('%02x' % x for x in d))
|
|
|
|
|
2020-10-30 02:00:14 +01:00
|
|
|
|
|
|
|
def query_print(d):
|
2020-10-31 00:48:33 +01:00
|
|
|
print('QUERY[%02x]:%s' %
|
|
|
|
(d['query'], ' '.join('%02x' % x for x in d['data'])))
|
|
|
|
|
2020-10-30 02:00:14 +01:00
|
|
|
|
|
|
|
def setup_wheel(port):
|
|
|
|
ifr.set_handler(ifr.Packet.QUERY, query_print)
|
|
|
|
send_pkt(port, ifr.Packet.QUERY, [ifr.Query.Manufacturer])
|
|
|
|
ifr.rx_pump()
|
|
|
|
send_pkt(port, ifr.Packet.QUERY, [ifr.Query.Product])
|
|
|
|
ifr.rx_pump()
|
|
|
|
send_pkt(port, ifr.Packet.QUERY, [ifr.Query.Version])
|
|
|
|
ifr.rx_pump()
|
|
|
|
send_pkt(port, ifr.Packet.QUERY, [ifr.Query.NumberOfEffects])
|
|
|
|
ifr.rx_pump()
|
|
|
|
send_pkt(port, ifr.Packet.QUERY, [ifr.Query.BufferSize])
|
|
|
|
ifr.rx_pump()
|
|
|
|
|
|
|
|
# send_pkt(port, ifr.Packet.SET_OVERALL, [ifr.OverallControlType.GAIN, 0x80])
|
|
|
|
send_pkt(port, ifr.Packet.QUERY, [ifr.Query.Open])
|
|
|
|
|
|
|
|
|
|
|
|
def serial_reader(sp):
|
|
|
|
while sp.is_open:
|
|
|
|
in_byte = sp.read(1)[0]
|
|
|
|
# print(f'rx:%02X'%in_byte)
|
|
|
|
yield in_byte
|
|
|
|
|
|
|
|
|
|
|
|
with serial.Serial(port=PORT, baudrate=BAUD) as port:
|
|
|
|
|
|
|
|
port.rts = True
|
|
|
|
ifr.create_rx_stream(serial_reader(port))
|
|
|
|
|
|
|
|
setup_wheel(port)
|
|
|
|
|
|
|
|
j = pyvjoy.VJoyDevice(1)
|
2020-10-30 03:39:05 +01:00
|
|
|
ffb.add_ffb(j)
|
|
|
|
|
2020-10-31 00:48:33 +01:00
|
|
|
device_state = 0
|
|
|
|
def handle_ffb(ffb_type, value, packet):
|
|
|
|
global device_state
|
|
|
|
if ffb_type == ffb.FFBPType.PT_EFFREP:
|
|
|
|
print('not implemented: %02x' % ffb_type)
|
|
|
|
elif ffb_type == ffb.FFBPType.PT_ENVREP:
|
|
|
|
print('not implemented: %02x' % ffb_type)
|
|
|
|
elif ffb_type == ffb.FFBPType.PT_CONDREP:
|
|
|
|
print('not implemented: %02x' % ffb_type)
|
|
|
|
elif ffb_type == ffb.FFBPType.PT_PRIDREP:
|
|
|
|
print('not implemented: %02x' % ffb_type)
|
|
|
|
elif ffb_type == ffb.FFBPType.PT_CONSTREP:
|
|
|
|
print('not implemented: %02x' % ffb_type)
|
|
|
|
elif ffb_type == ffb.FFBPType.PT_RAMPREP:
|
|
|
|
print('not implemented: %02x' % ffb_type)
|
|
|
|
elif ffb_type == ffb.FFBPType.PT_CSTMREP:
|
|
|
|
print('not implemented: %02x' % ffb_type)
|
|
|
|
elif ffb_type == ffb.FFBPType.PT_SMPLREP:
|
|
|
|
print('not implemented: %02x' % ffb_type)
|
|
|
|
elif ffb_type == ffb.FFBPType.PT_EFOPREP:
|
|
|
|
print('not implemented: %02x' % ffb_type)
|
|
|
|
elif ffb_type == ffb.FFBPType.PT_BLKFRREP:
|
|
|
|
print('not implemented: %02x' % ffb_type)
|
|
|
|
elif ffb_type == ffb.FFBPType.PT_CTRLREP:
|
|
|
|
if value == ffb.FFB_CTRL.CTRL_ENACT:
|
|
|
|
device_state |= ifr.DeviceState.ENABLE_FFB
|
|
|
|
elif value == ffb.FFB_CTRL.CTRL_DISACT:
|
|
|
|
device_state &= ~ifr.DeviceState.ENABLE_FFB
|
|
|
|
elif value == ffb.FFB_CTRL.CTRL_STOPALL:
|
|
|
|
device_state |= ifr.DeviceState.STOP_ALL
|
|
|
|
elif value == ffb.FFB_CTRL.CTRL_DEVRST:
|
|
|
|
device_state = 0
|
|
|
|
elif value == ffb.FFB_CTRL.CTRL_DEVPAUSE:
|
|
|
|
device_state |= ifr.DeviceState.PAUSE_FFB
|
|
|
|
elif value == ffb.FFB_CTRL.CTRL_DEVCONT:
|
|
|
|
device_state &= ~ifr.DeviceState.PAUSE_FFB
|
|
|
|
send_pkt(port, ifr.Packet.SET_DEVICE_STATE, [device_state])
|
|
|
|
elif ffb_type == ffb.FFBPType.PT_GAINREP:
|
|
|
|
print('not implemented: %02x' % ffb_type)
|
|
|
|
elif ffb_type == ffb.FFBPType.PT_SETCREP:
|
|
|
|
print('not implemented: %02x' % ffb_type)
|
|
|
|
elif ffb_type == ffb.FFBPType.PT_NEWEFREP:
|
|
|
|
print('not implemented: %02x' % ffb_type)
|
|
|
|
elif ffb_type == ffb.FFBPType.PT_BLKLDREP:
|
|
|
|
print('not implemented: %02x' % ffb_type)
|
|
|
|
elif ffb_type == ffb.FFBPType.PT_POOLREP:
|
|
|
|
print('not implemented: %02x' % ffb_type)
|
|
|
|
|
|
|
|
# FFB_CTRL
|
|
|
|
# FFB_DATA
|
|
|
|
# FFB_EFF_COND
|
|
|
|
# FFB_EFF_CONSTANT
|
|
|
|
# FFB_EFF_ENVLP
|
|
|
|
# FFB_EFF_OP
|
|
|
|
# FFB_EFF_PERIOD
|
|
|
|
# FFB_EFF_RAMP
|
|
|
|
# FFB_EFF_REPORT_Dir
|
|
|
|
# FFB_EFF_REPORT
|
|
|
|
# FFB_EFFECTS
|
|
|
|
# FFBEType
|
|
|
|
# FFBOP
|
|
|
|
# FfbPacket
|
|
|
|
# FfbPacketHelper
|
|
|
|
# FFBPType
|
2020-10-30 02:00:14 +01:00
|
|
|
|
|
|
|
# def handle_wheel(w):
|
|
|
|
# j.data.wAxisX = int(0x4000 * (w['axis']['wheel'] + 1))
|
|
|
|
# j.data.wAxisY = int(0x8000 * w['axis']['gas'])
|
|
|
|
# j.data.wAxisZ = int(0x8000 * w['axis']['brake'])
|
|
|
|
# j.data.lButtons = (
|
|
|
|
# 0x0000000000000001 if w['buttons']['A'] else 0) + (
|
|
|
|
# 0x0000000000000002 if w['buttons']['B'] else 0) + (
|
|
|
|
# 0x0000000000000004 if w['buttons']['1_PaddleUp_Start'] else 0) + (
|
|
|
|
# 0x0000000000000008 if w['buttons']['2_PaddleDown'] else 0) + (
|
|
|
|
# 0x0000000000000010 if w['buttons']['3'] else 0) + (
|
|
|
|
# 0x0000000000000020 if w['buttons']['4'] else 0)
|
|
|
|
# j.data.bHats = (
|
|
|
|
# -1 if w['hat']['center'] else
|
|
|
|
# 0 if w['hat']['up'] else
|
|
|
|
# 1 if w['hat']['right'] else
|
|
|
|
# 2 if w['hat']['down'] else
|
|
|
|
# 3 if w['hat']['left'] else -1)
|
|
|
|
# j.update()
|
|
|
|
|
|
|
|
# ifr.set_handler(ifr.Packet.INPUT_WHEEL, handle_wheel)
|
2020-10-30 03:39:05 +01:00
|
|
|
# ifr.set_handler(ifr.Packet.INPUT_WHEEL, print)
|
2020-10-30 02:00:14 +01:00
|
|
|
|
|
|
|
while True:
|
|
|
|
ifr.rx_pump()
|